Merge branch 'terencehill/listbox_item_highlight' into 'master'
[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, title, string, _("Create"))
9         ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9)
10         ATTRIB(XonoticServerCreateTab, rows, float, 23)
11         ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space
12
13         ATTRIB(XonoticServerCreateTab, mapListBox, entity, NULL)
14         ATTRIB(XonoticServerCreateTab, sliderFraglimit, entity, NULL)
15         ATTRIB(XonoticServerCreateTab, sliderTeams, entity, NULL)
16         ATTRIB(XonoticServerCreateTab, sliderTimelimit, entity, NULL)
17         ATTRIB(XonoticServerCreateTab, labelFraglimit, entity, NULL)
18         ATTRIB(XonoticServerCreateTab, labelTeams, entity, NULL)
19 ENDCLASS(XonoticServerCreateTab)
20 entity makeXonoticServerCreateTab();
21 #endif
22
23 #ifdef IMPLEMENTATION
24
25 void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
26 {
27         if(pCvar == "")
28         {
29                 e.configureXonoticTextSlider(e, string_null);
30                 l.setText(l, pLabel);
31                 e.disabled = l.disabled = true;
32         }
33         else
34         {
35                 e.configureXonoticTextSlider(e, pCvar);
36
37                 // clear old values
38                 int i;
39                 for(i = 0; i <= e.nValues; ++i);
40                 {
41                         if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
42                         if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
43                 }
44                 e.clearValues(e);
45
46                 // set new values
47                 e.addValue(e, strzone(_("Default")), strzone("-1"));
48                 for(i = pMin; i <= pMax; i += pStep) { e.addValue(e, strzone(ftos(i)), strzone(ftos(i))); }
49                 e.addValue(e, strzone(_("Unlimited")), strzone("0"));
50                 e.configureXonoticTextSliderValues(e);
51
52                 // set text field
53                 l.setText(l, pLabel);
54                 e.disabled = l.disabled = false;
55         }
56 }
57
58 entity makeXonoticServerCreateTab()
59 {
60         entity me;
61         me = NEW(XonoticServerCreateTab);
62         me.configureDialog(me);
63         return me;
64 }
65
66 void XonoticServerCreateTab_fill(entity me)
67 {
68         entity e, e0;
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         me.TR(me);
141                 me.TDempty(me, 0.5);
142                 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
143                         e.onClick = DialogOpenButton_Click;
144                         e.onClickEntity = main.mutatorsDialog;
145                         main.mutatorsDialog.refilterEntity = me.mapListBox;
146
147         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
148                 me.mapListBox = makeXonoticMapList();
149                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
150                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
151         me.TR(me);
152                 me.TD(me, me.rows - 4, 3, me.mapListBox);
153         me.gotoRC(me, me.rows - 2.5, 3.2);
154                 me.TDempty(me, 0.375);
155                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
156                         e.onClick = MapList_All;
157                         e.onClickEntity = me.mapListBox;
158                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
159                         e.onClick = MapList_None;
160                         e.onClickEntity = me.mapListBox;
161
162         me.gotoRC(me, me.rows - 1, 0);
163                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
164                         e.onClick = MapList_LoadMap;
165                         e.onClickEntity = me.mapListBox;
166                         me.mapListBox.startButton = e;
167
168         me.gameTypeChangeNotify(me);
169 }
170
171 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
172 {
173         // tell the map list to update
174         float gt;
175         entity e, l;
176         gt = MapInfo_CurrentGametype();
177         e = me.sliderFraglimit;
178         l = me.labelFraglimit;
179
180         switch(gt)
181         {
182                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
183                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
184                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
185                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
186                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
187                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
188                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
189                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
190                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
191                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
192         case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit");        break;
193                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
194         }
195
196         string x = string_null;
197         e = me.sliderTeams;
198         switch(gt)
199         {
200                 case MAPINFO_TYPE_CA:               x = "g_ca_teams_override";          break;
201                 case MAPINFO_TYPE_DOMINATION:       x = "g_domination_teams_override";  break;
202                 case MAPINFO_TYPE_FREEZETAG:        x = "g_freezetag_teams_override";   break;
203                 case MAPINFO_TYPE_KEYHUNT:          x = "g_keyhunt_teams_override";     break;
204                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = "g_tdm_teams_override";         break;
205         }
206         e.configureXonoticTextSlider(e, x);
207         e.configureXonoticTextSliderValues(e);
208         if(!x)
209                 e.value = 0;
210         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
211
212         me.mapListBox.refilter(me.mapListBox);
213 }
214
215 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
216 {
217         me.setFocus(me, me.mapListBox);
218 }
219
220 #endif