]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
Mutators --> Mutators...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create.qc
1 #ifndef DIALOG_MULTIPLAYER_CREATE_H
2 #define DIALOG_MULTIPLAYER_CREATE_H
3 #include "tab.qc"
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
11
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();
20 #endif
21
22 #ifdef IMPLEMENTATION
23
24 void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
25 {
26         if(pCvar == "")
27         {
28                 e.configureXonoticTextSlider(e, string_null);
29                 l.setText(l, pLabel);
30                 e.disabled = l.disabled = true;
31         }
32         else
33         {
34                 e.configureXonoticTextSlider(e, pCvar);
35
36                 // clear old values
37                 int i;
38                 for(i = 0; i <= e.nValues; ++i);
39                 {
40                         if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
41                         if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
42                 }
43                 e.clearValues(e);
44
45                 // set new values
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);
50
51                 // set text field
52                 l.setText(l, pLabel);
53                 e.disabled = l.disabled = false;
54         }
55 }
56
57 entity makeXonoticServerCreateTab()
58 {
59         entity me;
60         me = NEW(XonoticServerCreateTab);
61         me.configureDialog(me);
62         return me;
63 }
64
65 void XonoticServerCreateTab_fill(entity me)
66 {
67         entity e, e0;
68
69         // the left half begins here
70
71         me.gotoRC(me, 0.5, 0);
72                 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
73         me.TR(me);
74                 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
75
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);
99         me.TR(me);
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");
103
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);
112         me.TR(me);
113                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
114                 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
115         me.TR(me);
116                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
117                 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
118         me.TR(me);
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);
135
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;
139                         e0.allowCut = 1;
140                         //e0.allowWrap = 1;
141
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);
147                 me.TDempty(me, 0.5);
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;
152
153         // The right half begins here
154
155         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
156                 // the maplistbox
157                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
158                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
159         me.TR(me);
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);
162
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;
173
174         me.gotoRC(me, me.rows - 3.5, me.firstColumn);
175                 // the selection buttons
176                 me.TDempty(me, 0.2);
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);
184                 me.TDempty(me, 0.2);
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;
191
192         // The big button at the bottom
193
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;
199
200         me.gameTypeChangeNotify(me);
201 }
202
203 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
204 {
205         // tell the map list to update
206         float gt;
207         entity e, l;
208         gt = MapInfo_CurrentGametype();
209         e = me.sliderFraglimit;
210         l = me.labelFraglimit;
211
212         switch(gt)
213         {
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;
226         }
227
228         string x = string_null;
229         e = me.sliderTeams;
230         switch(gt)
231         {
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;
237         }
238         e.configureXonoticTextSlider(e, x);
239         e.configureXonoticTextSliderValues(e);
240         if(!x)
241                 e.value = 0;
242         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
243
244         me.mapListBox.refilter(me.mapListBox);
245 }
246
247 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
248 {
249         me.setFocus(me, me.mapListBox);
250 }
251
252 #endif