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, string theTooltip)
28 e.configureXonoticTextSlider(e, string_null, string_null);
30 e.disabled = l.disabled = true;
34 e.configureXonoticTextSlider(e, pCvar, theTooltip);
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_T("timelimit_override",
79 _("Timelimit in minutes that when hit, will end the match")));
80 e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
81 e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
82 e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
83 e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
84 e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
85 e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
86 e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
87 e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
88 e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
89 e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
90 e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
91 e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
92 e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
93 e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
94 e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
95 e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
96 e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
97 e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
98 e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
99 e.configureXonoticTextSliderValues(e);
101 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
102 me.TD(me, 1, 2, e = me.sliderFraglimit = makeXonoticTextSlider("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, e = makeXonoticSlider_T(1, 32, 1, "menu_maxplayers",
115 _("The maximum amount of players or bots that can be connected to your server at once")));
117 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
118 me.TD(me, 1, 2, e = makeXonoticSlider_T(0, 9, 1, "bot_number",
119 _("Amount of bots on your server")));
121 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
122 setDependent(e, "bot_number", 0, -1);
123 me.TD(me, 1, 2, e = makeXonoticTextSlider_T("skill",
124 _("Specify how experienced the bots will be")));
125 e.addValue(e, _("Botlike"), "0");
126 e.addValue(e, _("Beginner"), "1");
127 e.addValue(e, _("You will win"), "2");
128 e.addValue(e, _("You can win"), "3");
129 e.addValue(e, _("You might win"), "4");
130 e.addValue(e, _("Advanced"), "5");
131 e.addValue(e, _("Expert"), "6");
132 e.addValue(e, _("Pro"), "7");
133 e.addValue(e, _("Assassin"), "8");
134 e.addValue(e, _("Unhuman"), "9");
135 e.addValue(e, _("Godlike"), "10");
136 e.configureXonoticTextSliderValues(e);
137 setDependent(e, "bot_number", 0, -1);
139 me.gotoRC(me, me.rows - 3.8, 0);
140 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
141 e0.textEntity = main.mutatorsDialog;
145 // mapListBox is in the right column but the ref is needed for mutators dialog here
146 me.mapListBox = makeXonoticMapList();
147 // here we use the following line instead of me.TR(me) for better visual spacing;
148 // this decision was made in this poll: http://forums.xonotic.org/showthread.php?tid=5445
149 me.gotoRC(me, me.rows - 2.5, 0);
151 me.TD(me, 1, 2, e = makeXonoticButton_T(_("Mutators..."), '0 0 0',
152 _("Mutators and weapon arenas")));
153 e.onClick = DialogOpenButton_Click;
154 e.onClickEntity = main.mutatorsDialog;
155 main.mutatorsDialog.refilterEntity = me.mapListBox;
157 // The right half begins here
159 me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
161 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
162 makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
164 // we use 5.8 here to visually match the bottom line of the component on the left (Bot Skill)
165 me.TD(me, me.rows - 6.8, 3, me.mapListBox);
167 me.gotoRC(me, me.rows - 4.5, me.firstColumn);
168 // string filter label and box
169 me.TD(me, 1, 0.35, e = makeXonoticTextLabel(1, _("Filter:")));
170 me.mapListBox.stringFilterBox = makeXonoticInputBox_T(0, string_null,
171 _("Click here or Ctrl-F to provide a keyword to narrow down the maplist above. Ctrl-Delete to clear; Enter when done."));
172 me.TD(me, 1, me.columns - me.firstColumn - 0.35, e = me.mapListBox.stringFilterBox);
173 e.onChange = MapList_StringFilterBox_Change;
174 e.keyDown = MapList_StringFilterBox_keyDown;
175 e.onChangeEntity = me.mapListBox;
176 me.mapListBox.controlledTextbox = e;
178 me.gotoRC(me, me.rows - 3.5, me.firstColumn);
179 // the selection buttons
181 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Add shown"), '0 0 0',
182 _("Add the maps shown in Maplist above to your selection")));
183 e.onClick = MapList_Add_Shown;
184 e.onClickEntity = me.mapListBox;
185 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Remove shown"), '0 0 0',
186 _("Remove the maps shown in Maplist above from your selection")));
187 e.onClick = MapList_Remove_Shown;
188 e.onClickEntity = me.mapListBox;
189 me.gotoRC(me, me.rows - 2.5, me.firstColumn);
191 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Add all"), '0 0 0',
192 _("Add every available map to your selection")));
193 e.onClick = MapList_Add_All;
194 e.onClickEntity = me.mapListBox;
195 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Remove all"), '0 0 0',
196 _("Remove all the maps from your selection")));
197 e.onClick = MapList_Remove_All;
198 e.onClickEntity = me.mapListBox;
200 // The big button at the bottom
202 me.gotoRC(me, me.rows - 1, 0);
203 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
204 e.onClick = MapList_LoadMap;
205 e.onClickEntity = me.mapListBox;
206 me.mapListBox.startButton = e;
208 me.gameTypeChangeNotify(me);
211 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
213 // tell the map list to update
216 gt = MapInfo_CurrentGametype();
217 e = me.sliderFraglimit;
218 l = me.labelFraglimit;
222 case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, _("Capture limit:"), 1, 20, 1, "capturelimit_override", string_null); break;
223 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "g_domination_point_limit", string_null); break;
224 case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit", string_null); break;
225 case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, _("Lives:"), 3, 50, 1, "g_lms_lives_override", string_null); break;
226 case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(e, l, _("Laps:"), 1, 25, 1, "g_race_laps_limit", string_null); break;
227 case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(e, l, _("Goals:"), 1, 50, 1, "g_nexball_goallimit", string_null); break;
228 case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "", string_null); break;
229 case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "", string_null); break;
230 case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "", string_null); break;
231 case MAPINFO_TYPE_INVASION: GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 0, 5, "", string_null); break;
232 case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 100, 5, "g_tdm_point_limit", string_null); break;
233 default: GameType_ConfigureSliders(e, l, _("Frag limit:"), 5, 100, 5, "fraglimit_override", _("The amount of frags needed before the match will end")); break;
236 string x = string_null;
237 string theTooltip = string_null;
241 // old tooltip: _("Override the default amount of teams in teamgames")
242 case MAPINFO_TYPE_CA: x = "g_ca_teams_override"; break;
243 case MAPINFO_TYPE_DOMINATION: x = "g_domination_teams_override"; break;
244 case MAPINFO_TYPE_FREEZETAG: x = "g_freezetag_teams_override"; break;
245 case MAPINFO_TYPE_KEYHUNT: x = "g_keyhunt_teams_override"; break;
246 case MAPINFO_TYPE_TEAM_DEATHMATCH: x = "g_tdm_teams_override"; break;
248 e.configureXonoticTextSlider(e, x, theTooltip);
249 e.configureXonoticTextSliderValues(e);
250 me.sliderTeams.disabled = me.labelTeams.disabled = !x;
252 me.mapListBox.refilter(me.mapListBox);
255 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
257 me.setFocus(me, me.mapListBox);