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 me.gotoRC(me, 0.5, 0);
70 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
72 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
74 me.gotoRC(me, 12.5, 0);
75 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
76 me.TD(me, 1, 2, e = makeXonoticTextSlider("timelimit_override"));
77 e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
78 e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
79 e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
80 e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
81 e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
82 e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
83 e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
84 e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
85 e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
86 e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
87 e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
88 e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
89 e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
90 e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
91 e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
92 e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
93 e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
94 e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
95 e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
96 e.configureXonoticTextSliderValues(e);
98 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
99 me.TD(me, 1, 2, me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
100 GameType_ConfigureSliders(me.sliderFraglimit, me.labelFraglimit, _("Frag limit:"), 5, 100, 5, "fraglimit_override");
102 me.gotoRC(me, 15, 0);
103 me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
104 me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
105 e.addValue(e, _("Default"), "0");
106 e.addValue(e, _("2 teams"), "2");
107 e.addValue(e, _("3 teams"), "3");
108 e.addValue(e, _("4 teams"), "4");
109 e.configureXonoticTextSliderValues(e);
111 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
112 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
114 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
115 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
117 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
118 setDependent(e, "bot_number", 0, -1);
119 me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
120 e.addValue(e, _("Botlike"), "0");
121 e.addValue(e, _("Beginner"), "1");
122 e.addValue(e, _("You will win"), "2");
123 e.addValue(e, _("You can win"), "3");
124 e.addValue(e, _("You might win"), "4");
125 e.addValue(e, _("Advanced"), "5");
126 e.addValue(e, _("Expert"), "6");
127 e.addValue(e, _("Pro"), "7");
128 e.addValue(e, _("Assassin"), "8");
129 e.addValue(e, _("Unhuman"), "9");
130 e.addValue(e, _("Godlike"), "10");
131 e.configureXonoticTextSliderValues(e);
132 setDependent(e, "bot_number", 0, -1);
134 me.gotoRC(me, me.rows - 3.5, 0);
135 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
136 e0.textEntity = main.mutatorsDialog;
141 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
142 e.onClick = DialogOpenButton_Click;
143 e.onClickEntity = main.mutatorsDialog;
144 main.mutatorsDialog.refilterEntity = me.mapListBox;
146 me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
147 me.mapListBox = makeXonoticMapList();
148 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
149 makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
151 me.TD(me, me.rows - 4, 3, me.mapListBox);
152 me.gotoRC(me, me.rows - 2.5, 3.2);
153 me.TDempty(me, 0.375);
154 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
155 e.onClick = MapList_All;
156 e.onClickEntity = me.mapListBox;
157 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
158 e.onClick = MapList_None;
159 e.onClickEntity = me.mapListBox;
161 me.gotoRC(me, me.rows - 1, 0);
162 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
163 e.onClick = MapList_LoadMap;
164 e.onClickEntity = me.mapListBox;
165 me.mapListBox.startButton = e;
167 me.gameTypeChangeNotify(me);
170 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
172 // tell the map list to update
175 gt = MapInfo_CurrentGametype();
176 e = me.sliderFraglimit;
177 l = me.labelFraglimit;
181 case MAPINFO_TYPE_CTF: GameType_ConfigureSliders(e, l, _("Capture limit:"), 1, 20, 1, "capturelimit_override"); break;
182 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, "g_domination_point_limit"); break;
183 case MAPINFO_TYPE_KEYHUNT: GameType_ConfigureSliders(e, l, _("Point limit:"), 200, 1500, 50, "g_keyhunt_point_limit"); break;
184 case MAPINFO_TYPE_LMS: GameType_ConfigureSliders(e, l, _("Lives:"), 3, 50, 1, "g_lms_lives_override"); break;
185 case MAPINFO_TYPE_RACE: GameType_ConfigureSliders(e, l, _("Laps:"), 1, 25, 1, "g_race_laps_limit"); break;
186 case MAPINFO_TYPE_NEXBALL: GameType_ConfigureSliders(e, l, _("Goals:"), 1, 50, 1, "g_nexball_goallimit"); break;
187 case MAPINFO_TYPE_ASSAULT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
188 case MAPINFO_TYPE_ONSLAUGHT: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
189 case MAPINFO_TYPE_CTS: GameType_ConfigureSliders(e, l, _("Point limit:"), 50, 500, 10, ""); break;
190 case MAPINFO_TYPE_INVASION: GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 0, 5, ""); break;
191 case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"), 5, 100, 5, "g_tdm_point_limit"); break;
192 default: GameType_ConfigureSliders(e, l, _("Frag limit:"), 5, 100, 5, "fraglimit_override"); break;
195 string x = string_null;
199 case MAPINFO_TYPE_CA: x = "g_ca_teams_override"; break;
200 case MAPINFO_TYPE_DOMINATION: x = "g_domination_teams_override"; break;
201 case MAPINFO_TYPE_FREEZETAG: x = "g_freezetag_teams_override"; break;
202 case MAPINFO_TYPE_KEYHUNT: x = "g_keyhunt_teams_override"; break;
203 case MAPINFO_TYPE_TEAM_DEATHMATCH: x = "g_tdm_teams_override"; break;
205 e.configureXonoticTextSlider(e, x);
206 e.configureXonoticTextSliderValues(e);
209 me.sliderTeams.disabled = me.labelTeams.disabled = !x;
211 me.mapListBox.refilter(me.mapListBox);
214 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
216 me.setFocus(me, me.mapListBox);