]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
Fix compilation units
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create.qc
1 #include "dialog_multiplayer_create.qh"
2
3 #include "dialog_multiplayer_create_mapinfo.qh"
4 #include "dialog_multiplayer_create_mutators.qh"
5
6 #include "gametypelist.qh"
7 #include "maplist.qh"
8 #include <common/mapinfo.qh>
9
10 #include "image.qh"
11 #include "textslider.qh"
12 #include "textlabel.qh"
13 #include "slider.qh"
14 #include "mainwindow.qh"
15 #include "button.qh"
16 #include "commandbutton.qh"
17 #include "inputbox.qh"
18
19 void GameType_ConfigureSliders(entity me, string pLabel, float pMin, float pMax, float pStep, string pCvar, string tCvar, string pTooltip)
20 {
21         int i;
22         entity e = me.sliderFraglimit;
23         entity l = me.labelFraglimit;
24         e.configureXonoticTextSlider(e, pCvar, pTooltip);
25         e.disabled = l.disabled = !pCvar;
26         l.setText(l, pLabel);
27
28         // clear old values
29         for(i = 0; i < e.nValues; ++i);
30         {
31                 strfree(e.(valueStrings[i]));
32                 strfree(e.(valueIdentifiers[i]));
33         }
34         e.clearValues(e);
35
36         if(pCvar != "")
37         {
38                 // set new values
39                 e.addValue(e, strzone(_("Default")), strzone("-1"));
40                 for(i = pMin; i <= pMax; i += pStep) { e.addValue(e, strzone(ftos(i)), strzone(ftos(i))); }
41                 e.addValue(e, strzone(_("Unlimited")), strzone("0"));
42         }
43         e.configureXonoticTextSliderValues(e);
44
45
46         entity t = me.sliderTeams;
47         entity tl = me.labelTeams;
48         t.configureXonoticTextSlider(t, tCvar, string_null);
49         tl.disabled = t.disabled = !tCvar;
50         t.nValues = (tCvar == "") ? 0 : 4; // instead of clearing / readding the very same values
51         t.configureXonoticTextSliderValues(t);
52 }
53
54 void GameType_ConfigureSliders_for_CurrentGametype(entity me)
55 {
56         Gametype gt = MapInfo_CurrentGametype();
57         gt.m_configuremenu(gt, me, GameType_ConfigureSliders);
58 }
59
60 entity makeXonoticServerCreateTab()
61 {
62         entity me;
63         me = NEW(XonoticServerCreateTab);
64         me.configureDialog(me);
65         return me;
66 }
67
68 .entity quitGameButton;
69 void XonoticServerCreateTab_draw(entity me)
70 {
71         entity e = me.quitGameButton;
72         e.disabled = !(gamestatus & (GAME_ISSERVER | GAME_CONNECTED));
73         if(cvar("g_campaign"))
74                 e.setText(e, _("Quit campaign"));
75         else
76                 e.setText(e, _("Quit current game"));
77         SUPER(XonoticServerCreateTab).draw(me);
78 }
79
80 void XonoticServerCreateTab_fill(entity me)
81 {
82         entity e, e0;
83
84         // the left half begins here
85
86         me.gotoRC(me, 0.5, 0);
87                 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
88         me.TR(me);
89                 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
90
91         me.gotoRC(me, 12.5, 0);
92                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
93                 me.TD(me, 1, 2, e = makeXonoticTextSlider_T("timelimit_override",
94                         _("Timelimit in minutes that when hit, will end the match")));
95                         #define ADDVALUE_MINUTES(i) e.addValue(e, strzone(sprintf(_("%d minutes"), i)), #i)
96                         e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
97                         e.addValue(e, _("1 minute"), "1");
98                         ADDVALUE_MINUTES(2);
99                         ADDVALUE_MINUTES(3);
100                         ADDVALUE_MINUTES(4);
101                         ADDVALUE_MINUTES(5);
102                         ADDVALUE_MINUTES(6);
103                         ADDVALUE_MINUTES(7);
104                         ADDVALUE_MINUTES(8);
105                         ADDVALUE_MINUTES(9);
106                         ADDVALUE_MINUTES(10);
107                         ADDVALUE_MINUTES(15);
108                         ADDVALUE_MINUTES(20);
109                         ADDVALUE_MINUTES(25);
110                         ADDVALUE_MINUTES(30);
111                         ADDVALUE_MINUTES(40);
112                         ADDVALUE_MINUTES(50);
113                         ADDVALUE_MINUTES(60);
114                         e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
115                         e.configureXonoticTextSliderValues(e);
116                         #undef ADDVALUE_MINUTES
117         me.TR(me);
118                 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
119                 me.TD(me, 1, 2, e = me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
120
121         me.gotoRC(me, 15, 0);
122                 me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
123                 me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
124                         e.addValue(e, _("Default"), "0");
125                         e.addValue(e, _("2 teams"), "2");
126                         e.addValue(e, _("3 teams"), "3");
127                         e.addValue(e, _("4 teams"), "4");
128                         e.configureXonoticTextSliderValues(e);
129         me.TR(me);
130                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
131                 me.TD(me, 1, 2, e = makeXonoticSlider_T(1, 32, 1, "menu_maxplayers",
132                         _("The maximum amount of players or bots that can be connected to your server at once")));
133         me.TR(me);
134                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
135                 me.TD(me, 1, 2, e = makeXonoticSlider_T(0, 9, 1, "bot_number",
136                         _("Amount of bots on your server")));
137         me.TR(me);
138                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
139                         setDependent(e, "bot_number", 0, -1);
140                 me.TD(me, 1, 2, e = makeXonoticTextSlider_T("skill",
141                         _("Specify how experienced the bots will be")));
142                         e.addValue(e, _("Botlike"), "0");
143                         e.addValue(e, _("Beginner"), "1");
144                         e.addValue(e, _("You will win"), "2");
145                         e.addValue(e, _("You can win"), "3");
146                         e.addValue(e, _("You might win"), "4");
147                         e.addValue(e, _("Advanced"), "5");
148                         e.addValue(e, _("Expert"), "6");
149                         e.addValue(e, _("Pro"), "7");
150                         e.addValue(e, _("Assassin"), "8");
151                         e.addValue(e, _("Unhuman"), "9");
152                         e.addValue(e, _("Godlike"), "10");
153                         e.configureXonoticTextSliderValues(e);
154                         setDependent(e, "bot_number", 0, -1);
155
156         me.gotoRC(me, me.rows - 3.8, 0);
157                 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
158                         e0.textEntity = main.mutatorsDialog;
159                         e0.allowCut = 1;
160                         //e0.allowWrap = 1;
161
162         // mapListBox is in the right column but the ref is needed for mutators dialog here
163         me.mapListBox = makeXonoticMapList();
164         // here we use the following line instead of me.TR(me) for better visual spacing;
165         // this decision was made in this poll: http://forums.xonotic.org/showthread.php?tid=5445
166         me.gotoRC(me, me.rows - 2.5, 0);
167                 me.TDempty(me, 0.5);
168                 me.TD(me, 1, 2, e = makeXonoticButton_T(_("Mutators..."), '0 0 0',
169                         _("Mutators and weapon arenas")));
170                         e.onClick = DialogOpenButton_Click;
171                         e.onClickEntity = main.mutatorsDialog;
172                         main.mutatorsDialog.refilterEntity = me.mapListBox;
173
174         // The right half begins here
175
176         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
177                 // the maplistbox
178                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
179                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
180         me.TR(me);
181                 // we use 5.8 here to visually match the bottom line of the component on the left (Bot Skill)
182                 me.TD(me, me.rows - 6.8, 3, me.mapListBox);
183
184         me.gotoRC(me, me.rows - 4.5, me.firstColumn);
185                 // string filter label and box
186                 me.TD(me, 1, 0.35, e = makeXonoticTextLabel(1, _("Filter:")));
187                 me.mapListBox.stringFilterBox = makeXonoticInputBox_T(0, string_null,
188                         _("Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-Delete to clear; Enter when done."));
189                 me.TD(me, 1, me.columns - me.firstColumn - 0.35, e = me.mapListBox.stringFilterBox);
190                         e.onChange = MapList_StringFilterBox_Change;
191                         e.keyDown = MapList_StringFilterBox_keyDown;
192                         e.onChangeEntity = me.mapListBox;
193
194         me.gotoRC(me, me.rows - 3.5, me.firstColumn);
195                 // the selection buttons
196                 me.TDempty(me, 0.2);
197                 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Add shown"), '0 0 0',
198                         _("Add the maps shown in the list to your selection")));
199                         e.onClick = MapList_Add_Shown;
200                         e.onClickEntity = me.mapListBox;
201                 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Remove shown"), '0 0 0',
202                         _("Remove the maps shown in the list from your selection")));
203                         e.onClick = MapList_Remove_Shown;
204                         e.onClickEntity = me.mapListBox;
205         me.gotoRC(me, me.rows - 2.5, me.firstColumn);
206                 me.TDempty(me, 0.2);
207                 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Add all"), '0 0 0',
208                         _("Add every available map to your selection")));
209                         e.onClick = MapList_Add_All;
210                         e.onClickEntity = me.mapListBox;
211                 me.TD(me, 1, 1.3, e = makeXonoticButton_T(_("Remove all"), '0 0 0',
212                         _("Remove all the maps from your selection")));
213                         e.onClick = MapList_Remove_All;
214                         e.onClickEntity = me.mapListBox;
215
216         // bottom row
217         me.gotoRC(me, me.rows - 1, 0);
218                 me.TDempty(me, me.columns * 1/12);
219                 me.TD(me, 1, me.columns * 5/12, me.quitGameButton = makeXonoticCommandButton(string_null, '0 0 0', QUITGAME_CMD, 0));
220                 me.TD(me, 1, me.columns * 5/12, e = makeXonoticButton(_("Start multiplayer!"), '0 0 0'));
221                         e.onClick = MapList_LoadMap;
222                         e.onClickEntity = me.mapListBox;
223                         me.mapListBox.startButton = e;
224
225         GameType_ConfigureSliders_for_CurrentGametype(me);
226 }
227
228 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
229 {
230         GameType_ConfigureSliders_for_CurrentGametype(me);
231
232         me.mapListBox.refilter(me.mapListBox);
233 }
234
235 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
236 {
237         me.setFocus(me, me.mapListBox);
238 }