]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
Merge branch 'master' into BuddyFriendGuy/mapStringFilter
[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.mapListBox.stringFilterBox.tooltip = getZonedTooltipForIdentifier("XonoticMultiplayerDialog_StringFilterBox");
163                 me.TD(me, 1, me.columns - me.firstColumn - 0.35, e = me.mapListBox.stringFilterBox);
164                         e.onChange = MapList_StringFilterBox_Change;
165                         e.keyDown = MapList_StringFilterBox_keyDown;
166                         e.onChangeEntity = me.mapListBox;
167                         me.mapListBox.controlledTextbox = e;
168
169         me.TR(me);
170                 // the selection buttons
171                 me.TD(me, 1, 1, e = makeXonoticButton(_("Add shown"), '0 0 0'));
172                         e.onClick = MapList_Add_Shown;
173                         e.onClickEntity = me.mapListBox;
174                 me.TD(me, 1, 1, e = makeXonoticButton(_("Remove shown"), '0 0 0'));
175                         e.onClick = MapList_Remove_Shown;
176                         e.onClickEntity = me.mapListBox;
177                 me.TD(me, 1, 1, e = makeXonoticButton(_("Remove all"), '0 0 0'));
178                         e.onClick = MapList_Remove_All;
179                         e.onClickEntity = me.mapListBox;
180
181         // The big button at the bottom
182
183         me.gotoRC(me, me.rows - 1, 0);
184                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
185                         e.onClick = MapList_LoadMap;
186                         e.onClickEntity = me.mapListBox;
187                         me.mapListBox.startButton = e;
188
189         me.gameTypeChangeNotify(me);
190 }
191
192 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
193 {
194         // tell the map list to update
195         float gt;
196         entity e, l;
197         gt = MapInfo_CurrentGametype();
198         e = me.sliderFraglimit;
199         l = me.labelFraglimit;
200
201         switch(gt)
202         {
203                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
204                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
205                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
206                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
207                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
208                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
209                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
210                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
211                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
212                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
213         case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit");        break;
214                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
215         }
216
217         string x = string_null;
218         e = me.sliderTeams;
219         switch(gt)
220         {
221                 case MAPINFO_TYPE_CA:               x = "g_ca_teams_override";          break;
222                 case MAPINFO_TYPE_DOMINATION:       x = "g_domination_teams_override";  break;
223                 case MAPINFO_TYPE_FREEZETAG:        x = "g_freezetag_teams_override";   break;
224                 case MAPINFO_TYPE_KEYHUNT:          x = "g_keyhunt_teams_override";     break;
225                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = "g_tdm_teams_override";         break;
226         }
227         e.configureXonoticTextSlider(e, x);
228         e.configureXonoticTextSliderValues(e);
229         if(!x)
230                 e.value = 0;
231         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
232
233         me.mapListBox.refilter(me.mapListBox);
234 }
235
236 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
237 {
238         me.setFocus(me, me.mapListBox);
239 }
240
241 #endif