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