]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create.qc
add ctrl-f hotkey; fix variable name consistency
[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         me.gotoRC(me, 0.5, 0);
69                 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
70         me.TR(me);
71                 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
72
73         me.gotoRC(me, 12.5, 0);
74                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
75                 me.TD(me, 1, 2, e = makeXonoticTextSlider("timelimit_override"));
76                         e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
77                         e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
78                         e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
79                         e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
80                         e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
81                         e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
82                         e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
83                         e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
84                         e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
85                         e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
86                         e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
87                         e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
88                         e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
89                         e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
90                         e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
91                         e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
92                         e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
93                         e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
94                         e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
95                         e.configureXonoticTextSliderValues(e);
96         me.TR(me);
97                 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
98                 me.TD(me, 1, 2, me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
99                         GameType_ConfigureSliders(me.sliderFraglimit, me.labelFraglimit, _("Frag limit:"), 5, 100, 5, "fraglimit_override");
100
101         me.gotoRC(me, 15, 0);
102                 me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
103                 me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
104                         e.addValue(e, _("Default"), "0");
105                         e.addValue(e, _("2 teams"), "2");
106                         e.addValue(e, _("3 teams"), "3");
107                         e.addValue(e, _("4 teams"), "4");
108                         e.configureXonoticTextSliderValues(e);
109         me.TR(me);
110                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
111                 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
112         me.TR(me);
113                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
114                 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
115         me.TR(me);
116                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
117                         setDependent(e, "bot_number", 0, -1);
118                 me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
119                         e.addValue(e, _("Botlike"), "0");
120                         e.addValue(e, _("Beginner"), "1");
121                         e.addValue(e, _("You will win"), "2");
122                         e.addValue(e, _("You can win"), "3");
123                         e.addValue(e, _("You might win"), "4");
124                         e.addValue(e, _("Advanced"), "5");
125                         e.addValue(e, _("Expert"), "6");
126                         e.addValue(e, _("Pro"), "7");
127                         e.addValue(e, _("Assassin"), "8");
128                         e.addValue(e, _("Unhuman"), "9");
129                         e.addValue(e, _("Godlike"), "10");
130                         e.configureXonoticTextSliderValues(e);
131                         setDependent(e, "bot_number", 0, -1);
132
133         me.gotoRC(me, me.rows - 3.5, 0);
134                 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
135                         e0.textEntity = main.mutatorsDialog;
136                         e0.allowCut = 1;
137                         //e0.allowWrap = 1;
138         me.TR(me);
139                 me.TDempty(me, 0.5);
140                 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
141                         e.onClick = DialogOpenButton_Click;
142                         e.onClickEntity = main.mutatorsDialog;
143                         main.mutatorsDialog.refilterEntity = me.mapListBox;
144
145         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
146                 me.mapListBox = makeXonoticMapList();
147                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
148                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
149
150         // TODO can somebody help check TD and gotoRC size/position parameters (till the end of this function)?
151         me.TR(me);
152                 me.TD(me, me.rows - 6, 3, me.mapListBox);
153         me.gotoRC(me, me.rows - 3.7, 3.2);
154                 /* map string filter */
155                 me.TD(me, 1, 0.6, e = makeXonoticTextLabel(1, _("Filter:")));
156                 me.mapListBox.stringFilterBox = makeXonoticMapListStringFilterBox(me, 0, string_null);
157                 me.TD(me, 1, 2.2, e = me.mapListBox.stringFilterBox);
158                         e.onChange = MapList_StringFilter_Change;
159                         e.onChangeEntity = me.mapListBox;
160                         me.mapListBox.controlledTextbox = e;
161
162         me.gotoRC(me, me.rows - 2.5, 3.2);
163                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
164                         e.onClick = MapList_All;
165                         e.onClickEntity = me.mapListBox;
166                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
167                         e.onClick = MapList_None;
168                         e.onClickEntity = me.mapListBox;
169
170         me.gotoRC(me, me.rows - 1, 0);
171                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
172                         e.onClick = MapList_LoadMap;
173                         e.onClickEntity = me.mapListBox;
174                         me.mapListBox.startButton = e;
175
176         me.gameTypeChangeNotify(me);
177 }
178
179 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
180 {
181         // tell the map list to update
182         float gt;
183         entity e, l;
184         gt = MapInfo_CurrentGametype();
185         e = me.sliderFraglimit;
186         l = me.labelFraglimit;
187
188         switch(gt)
189         {
190                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
191                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
192                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
193                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
194                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
195                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
196                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
197                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
198                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
199                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
200         case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit");        break;
201                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
202         }
203
204         string x = string_null;
205         e = me.sliderTeams;
206         switch(gt)
207         {
208                 case MAPINFO_TYPE_CA:               x = "g_ca_teams_override";          break;
209                 case MAPINFO_TYPE_DOMINATION:       x = "g_domination_teams_override";  break;
210                 case MAPINFO_TYPE_FREEZETAG:        x = "g_freezetag_teams_override";   break;
211                 case MAPINFO_TYPE_KEYHUNT:          x = "g_keyhunt_teams_override";     break;
212                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = "g_tdm_teams_override";         break;
213         }
214         e.configureXonoticTextSlider(e, x);
215         e.configureXonoticTextSliderValues(e);
216         if(!x)
217                 e.value = 0;
218         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
219
220         me.mapListBox.refilter(me.mapListBox);
221 }
222
223 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
224 {
225         me.setFocus(me, me.mapListBox);
226 }
227
228 #endif