]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
add hotkeys for better usability
[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.5, 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         me.mapListBox = makeXonoticMapList();
142         me.TR(me);
143                 me.TDempty(me, 0.5);
144                 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
145                         e.onClick = DialogOpenButton_Click;
146                         e.onClickEntity = main.mutatorsDialog;
147                         main.mutatorsDialog.refilterEntity = me.mapListBox;
148
149         // The right half begins here
150
151         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
152                 // the maplistbox
153                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
154                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
155         me.TR(me);
156                 me.TD(me, me.rows - 6, 3, me.mapListBox);
157
158         me.gotoRC(me, me.rows - 3.5, me.firstColumn);
159                 // string filter label and box
160                 me.TD(me, 1, 0.35, e = makeXonoticTextLabel(1, _("Filter:")));
161                 me.mapListBox.stringFilterBox = makeXonoticMapListStringFilterBox(me, 0, string_null);
162                 me.TD(me, 1, me.columns - me.firstColumn - 0.35, e = me.mapListBox.stringFilterBox);
163                         e.onChange = MapList_StringFilterBox_Change;
164                         e.keyDown = MapList_StringFilterBox_keyDown;
165                         e.onChangeEntity = me.mapListBox;
166                         me.mapListBox.controlledTextbox = e;
167
168         me.TR(me);
169                 // the selection buttons
170                 me.TD(me, 1, 1, e = makeXonoticButton(_("Add shown"), '0 0 0'));
171                         e.onClick = MapList_Add_Shown;
172                         e.onClickEntity = me.mapListBox;
173                 me.TD(me, 1, 1, e = makeXonoticButton(_("Remove shown"), '0 0 0'));
174                         e.onClick = MapList_Remove_Shown;
175                         e.onClickEntity = me.mapListBox;
176                 me.TD(me, 1, 1, e = makeXonoticButton(_("Clear all"), '0 0 0'));
177                         e.onClick = MapList_Clear_All;
178                         e.onClickEntity = me.mapListBox;
179
180         // The big button at the bottom
181
182         me.gotoRC(me, me.rows - 1, 0);
183                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
184                         e.onClick = MapList_LoadMap;
185                         e.onClickEntity = me.mapListBox;
186                         me.mapListBox.startButton = e;
187
188         me.gameTypeChangeNotify(me);
189 }
190
191 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
192 {
193         // tell the map list to update
194         float gt;
195         entity e, l;
196         gt = MapInfo_CurrentGametype();
197         e = me.sliderFraglimit;
198         l = me.labelFraglimit;
199
200         switch(gt)
201         {
202                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
203                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
204                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
205                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
206                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
207                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
208                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
209                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
210                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
211                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
212         case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit");        break;
213                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
214         }
215
216         string x = string_null;
217         e = me.sliderTeams;
218         switch(gt)
219         {
220                 case MAPINFO_TYPE_CA:               x = "g_ca_teams_override";          break;
221                 case MAPINFO_TYPE_DOMINATION:       x = "g_domination_teams_override";  break;
222                 case MAPINFO_TYPE_FREEZETAG:        x = "g_freezetag_teams_override";   break;
223                 case MAPINFO_TYPE_KEYHUNT:          x = "g_keyhunt_teams_override";     break;
224                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = "g_tdm_teams_override";         break;
225         }
226         e.configureXonoticTextSlider(e, x);
227         e.configureXonoticTextSliderValues(e);
228         if(!x)
229                 e.value = 0;
230         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
231
232         me.mapListBox.refilter(me.mapListBox);
233 }
234
235 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
236 {
237         me.setFocus(me, me.mapListBox);
238 }
239
240 #endif