1 #ifndef DIALOG_MULTIPLAYER_CREATE_H
2 #define DIALOG_MULTIPLAYER_CREATE_H
4 CLASS(XonoticServerCreateTab, XonoticTab)
5 METHOD(XonoticServerCreateTab, fill, void(entity));
6 METHOD(XonoticServerCreateTab, gameTypeChangeNotify, void(entity));
7 METHOD(XonoticServerCreateTab, gameTypeSelectNotify, void(entity));
8 ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9)
9 ATTRIB(XonoticServerCreateTab, rows, float, 23)
10 ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space
12 ATTRIB(XonoticServerCreateTab, mapListBox, entity, NULL)
13 ATTRIB(XonoticServerCreateTab, sliderFraglimit, entity, NULL)
14 ATTRIB(XonoticServerCreateTab, sliderTeams, entity, NULL)
15 ATTRIB(XonoticServerCreateTab, sliderTimelimit, entity, NULL)
16 ATTRIB(XonoticServerCreateTab, labelFraglimit, entity, NULL)
17 ATTRIB(XonoticServerCreateTab, labelTeams, entity, NULL)
18 ENDCLASS(XonoticServerCreateTab)
19 entity makeXonoticServerCreateTab();
24 void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
28 e.configureXonoticTextSlider(e, string_null);
30 e.disabled = l.disabled = true;
34 e.configureXonoticTextSlider(e, pCvar);
38 for(i = 0; i <= e.nValues; ++i);
40 if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
41 if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
46 e.addValue(e, strzone(_("Default")), strzone("-1"));
47 for(i = pMin; i <= pMax; i += pStep) { e.addValue(e, strzone(ftos(i)), strzone(ftos(i))); }
48 e.addValue(e, strzone(_("Unlimited")), strzone("0"));
49 e.configureXonoticTextSliderValues(e);
53 e.disabled = l.disabled = false;
57 entity makeXonoticServerCreateTab()
60 me = NEW(XonoticServerCreateTab);
61 me.configureDialog(me);
65 void XonoticServerCreateTab_fill(entity me)
69 // the left half begins here
71 me.gotoRC(me, 0.5, 0);
72 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
74 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
76 me.gotoRC(me, 12.5, 0);
77 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
78 me.TD(me, 1, 2, e = makeXonoticTextSlider("timelimit_override"));
79 e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
80 e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
81 e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
82 e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
83 e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
84 e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
85 e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
86 e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
87 e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
88 e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
89 e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
90 e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
91 e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
92 e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
93 e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
94 e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
95 e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
96 e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
97 e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
98 e.configureXonoticTextSliderValues(e);
100 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
101 me.TD(me, 1, 2, me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
102 GameType_ConfigureSliders(me.sliderFraglimit, me.labelFraglimit, _("Frag limit:"), 5, 100, 5, "fraglimit_override");
104 me.gotoRC(me, 15, 0);
105 me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
106 me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
107 e.addValue(e, _("Default"), "0");
108 e.addValue(e, _("2 teams"), "2");
109 e.addValue(e, _("3 teams"), "3");
110 e.addValue(e, _("4 teams"), "4");
111 e.configureXonoticTextSliderValues(e);
113 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
114 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
116 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
117 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
119 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
120 setDependent(e, "bot_number", 0, -1);
121 me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
122 e.addValue(e, _("Botlike"), "0");
123 e.addValue(e, _("Beginner"), "1");
124 e.addValue(e, _("You will win"), "2");
125 e.addValue(e, _("You can win"), "3");
126 e.addValue(e, _("You might win"), "4");
127 e.addValue(e, _("Advanced"), "5");
128 e.addValue(e, _("Expert"), "6");
129 e.addValue(e, _("Pro"), "7");
130 e.addValue(e, _("Assassin"), "8");
131 e.addValue(e, _("Unhuman"), "9");
132 e.addValue(e, _("Godlike"), "10");
133 e.configureXonoticTextSliderValues(e);
134 setDependent(e, "bot_number", 0, -1);
136 me.gotoRC(me, me.rows - 3.8, 0);
137 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
138 e0.textEntity = main.mutatorsDialog;
142 // mapListBox is in the right column but the ref is needed for mutators dialog here
143 me.mapListBox = makeXonoticMapList();
144 // here we use the following line instead of me.TR(me) for better visual spacing;
145 // this decision was made in this poll: http://forums.xonotic.org/showthread.php?tid=5445
146 me.gotoRC(me, me.rows - 2.5, 0);
148 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators..."), '0 0 0'));
149 e.onClick = DialogOpenButton_Click;
150 e.onClickEntity = main.mutatorsDialog;
151 main.mutatorsDialog.refilterEntity = me.mapListBox;
153 // The right half begins here
155 me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
157 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
158 makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
160 // we use 5.8 here to visually match the bottom line of the component on the left (Bot Skill)
161 me.TD(me, me.rows - 6.8, 3, me.mapListBox);
163 me.gotoRC(me, me.rows - 4.5, me.firstColumn);
164 // string filter label and box
165 me.TD(me, 1, 0.35, e = makeXonoticTextLabel(1, _("Filter:")));
166 me.mapListBox.stringFilterBox = makeXonoticMapListStringFilterBox(me, 0, string_null);
167 me.mapListBox.stringFilterBox.tooltip = getZonedTooltipForIdentifier("XonoticMultiplayerDialog_StringFilterBox");
168 me.TD(me, 1, me.columns - me.firstColumn - 0.35, e = me.mapListBox.stringFilterBox);
169 e.onChange = MapList_StringFilterBox_Change;
170 e.keyDown = MapList_StringFilterBox_keyDown;
171 e.onChangeEntity = me.mapListBox;
172 me.mapListBox.controlledTextbox = e;
174 me.gotoRC(me, me.rows - 3.5, me.firstColumn);
175 // the selection buttons
177 me.TD(me, 1, 1.3, e = makeXonoticButton(_("Add shown"), '0 0 0'));
178 e.onClick = MapList_Add_Shown;
179 e.onClickEntity = me.mapListBox;
180 me.TD(me, 1, 1.3, e = makeXonoticButton(_("Remove shown"), '0 0 0'));
181 e.onClick = MapList_Remove_Shown;
182 e.onClickEntity = me.mapListBox;
183 me.gotoRC(me, me.rows - 2.5, me.firstColumn);
185 me.TD(me, 1, 1.3, e = makeXonoticButton(_("Add all"), '0 0 0'));
186 e.onClick = MapList_Add_All;
187 e.onClickEntity = me.mapListBox;
188 me.TD(me, 1, 1.3, e = makeXonoticButton(_("Remove all"), '0 0 0'));
189 e.onClick = MapList_Remove_All;
190 e.onClickEntity = me.mapListBox;
192 // The big button at the bottom
194 me.gotoRC(me, me.rows - 1, 0);
195 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
196 e.onClick = MapList_LoadMap;
197 e.onClickEntity = me.mapListBox;
198 me.mapListBox.startButton = e;
200 me.gameTypeChangeNotify(me);
203 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
205 // tell the map list to update
208 gt = MapInfo_CurrentGametype();
209 e = me.sliderFraglimit;
210 l = me.labelFraglimit;
214 case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, _("Capture limit:"), 1, 20, 1, "capturelimit_override"); break;
215 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "g_domination_point_limit"); break;
216 case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit"); break;
217 case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, _("Lives:"), 3, 50, 1, "g_lms_lives_override"); break;
218 case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(e, l, _("Laps:"), 1, 25, 1, "g_race_laps_limit"); break;
219 case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(e, l, _("Goals:"), 1, 50, 1, "g_nexball_goallimit"); break;
220 case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
221 case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
222 case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
223 case MAPINFO_TYPE_INVASION: GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 0, 5, ""); break;
224 case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 100, 5, "g_tdm_point_limit"); break;
225 default: GameType_ConfigureSliders(e, l, _("Frag limit:"), 5, 100, 5, "fraglimit_override"); break;
228 string x = string_null;
232 case MAPINFO_TYPE_CA: x = "g_ca_teams_override"; break;
233 case MAPINFO_TYPE_DOMINATION: x = "g_domination_teams_override"; break;
234 case MAPINFO_TYPE_FREEZETAG: x = "g_freezetag_teams_override"; break;
235 case MAPINFO_TYPE_KEYHUNT: x = "g_keyhunt_teams_override"; break;
236 case MAPINFO_TYPE_TEAM_DEATHMATCH: x = "g_tdm_teams_override"; break;
238 e.configureXonoticTextSlider(e, x);
239 e.configureXonoticTextSliderValues(e);
242 me.sliderTeams.disabled = me.labelTeams.disabled = !x;
244 me.mapListBox.refilter(me.mapListBox);
247 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
249 me.setFocus(me, me.mapListBox);