]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
added comments explaining poll decision on the spacing
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create.qc
1 #ifdef INTERFACE
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
10
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();
19 #endif
20
21 #ifdef IMPLEMENTATION
22
23 void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
24 {
25         if(pCvar == "")
26         {
27                 e.configureXonoticTextSlider(e, string_null);
28                 l.setText(l, pLabel);
29                 e.disabled = l.disabled = true;
30         }
31         else
32         {
33                 e.configureXonoticTextSlider(e, pCvar);
34
35                 // clear old values
36                 float i;
37                 for(i = 0; i <= e.nValues; ++i);
38                 {
39                         if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
40                         if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
41                 }
42                 e.clearValues(e);
43
44                 // set new values
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);
49
50                 // set text field
51                 l.setText(l, pLabel);
52                 e.disabled = l.disabled = false;
53         }
54 }
55
56 entity makeXonoticServerCreateTab()
57 {
58         entity me;
59         me = spawnXonoticServerCreateTab();
60         me.configureDialog(me);
61         return me;
62 }
63
64 void XonoticServerCreateTab_fill(entity me)
65 {
66         entity e, e0;
67
68         // the left half begins here
69
70         me.gotoRC(me, 0.5, 0);
71                 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
72         me.TR(me);
73                 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
74
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);
98         me.TR(me);
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");
102
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);
111         me.TR(me);
112                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
113                 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
114         me.TR(me);
115                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
116                 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
117         me.TR(me);
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);
134
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;
138                         e0.allowCut = 1;
139                         //e0.allowWrap = 1;
140
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);
146                 me.TDempty(me, 0.5);
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;
151
152         // The right half begins here
153
154         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
155                 // the maplistbox
156                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
157                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
158         me.TR(me);
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);
161
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;
172
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;
186
187         // The big button at the bottom
188
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;
194
195         me.gameTypeChangeNotify(me);
196 }
197
198 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
199 {
200         // tell the map list to update
201         float gt;
202         entity e, l;
203         gt = MapInfo_CurrentGametype();
204         e = me.sliderFraglimit;
205         l = me.labelFraglimit;
206
207         switch(gt)
208         {
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;
221         }
222
223         string x = string_null;
224         e = me.sliderTeams;
225         switch(gt)
226         {
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;
232         }
233         e.configureXonoticTextSlider(e, x);
234         e.configureXonoticTextSliderValues(e);
235         if(!x)
236                 e.value = 0;
237         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
238
239         me.mapListBox.refilter(me.mapListBox);
240 }
241
242 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
243 {
244         me.setFocus(me, me.mapListBox);
245 }
246
247 #endif