Merge branch 'terencehill/menu_remove_tab_title' 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, intendedWidth, float, 0.9)
9         ATTRIB(XonoticServerCreateTab, rows, float, 23)
10         ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space
11
12         ATTRIB(XonoticServerCreateTab, mapListBox, entity, NULL)
13         ATTRIB(XonoticServerCreateTab, sliderFraglimit, entity, NULL)
14         ATTRIB(XonoticServerCreateTab, sliderTeams, entity, NULL)
15         ATTRIB(XonoticServerCreateTab, sliderTimelimit, entity, NULL)
16         ATTRIB(XonoticServerCreateTab, labelFraglimit, entity, NULL)
17         ATTRIB(XonoticServerCreateTab, labelTeams, entity, NULL)
18 ENDCLASS(XonoticServerCreateTab)
19 entity makeXonoticServerCreateTab();
20 #endif
21
22 #ifdef IMPLEMENTATION
23
24 void GameType_ConfigureSliders(entity e, entity l, string pLabel, float pMin, float pMax, float pStep, string pCvar)
25 {
26         if(pCvar == "")
27         {
28                 e.configureXonoticTextSlider(e, string_null);
29                 l.setText(l, pLabel);
30                 e.disabled = l.disabled = true;
31         }
32         else
33         {
34                 e.configureXonoticTextSlider(e, pCvar);
35
36                 // clear old values
37                 int i;
38                 for(i = 0; i <= e.nValues; ++i);
39                 {
40                         if(e.(valueStrings[i])) { strunzone(e.(valueStrings[i])); }
41                         if(e.(valueIdentifiers[i])) { strunzone(e.(valueIdentifiers[i])); }
42                 }
43                 e.clearValues(e);
44
45                 // set new values
46                 e.addValue(e, strzone(_("Default")), strzone("-1"));
47                 for(i = pMin; i <= pMax; i += pStep) { e.addValue(e, strzone(ftos(i)), strzone(ftos(i))); }
48                 e.addValue(e, strzone(_("Unlimited")), strzone("0"));
49                 e.configureXonoticTextSliderValues(e);
50
51                 // set text field
52                 l.setText(l, pLabel);
53                 e.disabled = l.disabled = false;
54         }
55 }
56
57 entity makeXonoticServerCreateTab()
58 {
59         entity me;
60         me = NEW(XonoticServerCreateTab);
61         me.configureDialog(me);
62         return me;
63 }
64
65 void XonoticServerCreateTab_fill(entity me)
66 {
67         entity e, e0;
68
69         me.gotoRC(me, 0.5, 0);
70                 me.TD(me, 1, 3, makeXonoticHeaderLabel(_("Gametype")));
71         me.TR(me);
72                 me.TD(me, 10.5, 3, e = makeXonoticGametypeList());
73
74         me.gotoRC(me, 12.5, 0);
75                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Time limit:")));
76                 me.TD(me, 1, 2, e = makeXonoticTextSlider("timelimit_override"));
77                         e.addValue(e, ZCTX(_("TIMLIM^Default")), "-1");
78                         e.addValue(e, ZCTX(_("TIMLIM^1 minute")), "1");
79                         e.addValue(e, ZCTX(_("TIMLIM^2 minutes")), "2");
80                         e.addValue(e, ZCTX(_("TIMLIM^3 minutes")), "3");
81                         e.addValue(e, ZCTX(_("TIMLIM^4 minutes")), "4");
82                         e.addValue(e, ZCTX(_("TIMLIM^5 minutes")), "5");
83                         e.addValue(e, ZCTX(_("TIMLIM^6 minutes")), "6");
84                         e.addValue(e, ZCTX(_("TIMLIM^7 minutes")), "7");
85                         e.addValue(e, ZCTX(_("TIMLIM^8 minutes")), "8");
86                         e.addValue(e, ZCTX(_("TIMLIM^9 minutes")), "9");
87                         e.addValue(e, ZCTX(_("TIMLIM^10 minutes")), "10");
88                         e.addValue(e, ZCTX(_("TIMLIM^15 minutes")), "15");
89                         e.addValue(e, ZCTX(_("TIMLIM^20 minutes")), "20");
90                         e.addValue(e, ZCTX(_("TIMLIM^25 minutes")), "25");
91                         e.addValue(e, ZCTX(_("TIMLIM^30 minutes")), "30");
92                         e.addValue(e, ZCTX(_("TIMLIM^40 minutes")), "40");
93                         e.addValue(e, ZCTX(_("TIMLIM^50 minutes")), "50");
94                         e.addValue(e, ZCTX(_("TIMLIM^60 minutes")), "60");
95                         e.addValue(e, ZCTX(_("TIMLIM^Infinite")), "0");
96                         e.configureXonoticTextSliderValues(e);
97         me.TR(me);
98                 me.TD(me, 1, 1, me.labelFraglimit = makeXonoticTextLabel(0, _("Frag limit:")));
99                 me.TD(me, 1, 2, me.sliderFraglimit = makeXonoticTextSlider("fraglimit_override"));
100                         GameType_ConfigureSliders(me.sliderFraglimit, me.labelFraglimit, _("Frag limit:"), 5, 100, 5, "fraglimit_override");
101
102         me.gotoRC(me, 15, 0);
103                 me.TD(me, 1, 1, me.labelTeams = makeXonoticTextLabel(0, _("Teams:")));
104                 me.TD(me, 1, 2, e = me.sliderTeams = makeXonoticTextSlider(string_null));
105                         e.addValue(e, _("Default"), "0");
106                         e.addValue(e, _("2 teams"), "2");
107                         e.addValue(e, _("3 teams"), "3");
108                         e.addValue(e, _("4 teams"), "4");
109                         e.configureXonoticTextSliderValues(e);
110         me.TR(me);
111                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
112                 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
113         me.TR(me);
114                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
115                 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
116         me.TR(me);
117                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
118                         setDependent(e, "bot_number", 0, -1);
119                 me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
120                         e.addValue(e, _("Botlike"), "0");
121                         e.addValue(e, _("Beginner"), "1");
122                         e.addValue(e, _("You will win"), "2");
123                         e.addValue(e, _("You can win"), "3");
124                         e.addValue(e, _("You might win"), "4");
125                         e.addValue(e, _("Advanced"), "5");
126                         e.addValue(e, _("Expert"), "6");
127                         e.addValue(e, _("Pro"), "7");
128                         e.addValue(e, _("Assassin"), "8");
129                         e.addValue(e, _("Unhuman"), "9");
130                         e.addValue(e, _("Godlike"), "10");
131                         e.configureXonoticTextSliderValues(e);
132                         setDependent(e, "bot_number", 0, -1);
133
134         me.gotoRC(me, me.rows - 3.5, 0);
135                 me.TD(me, 1, 3, e0 = makeXonoticTextLabel(0.5, string_null));
136                         e0.textEntity = main.mutatorsDialog;
137                         e0.allowCut = 1;
138                         //e0.allowWrap = 1;
139         me.TR(me);
140                 me.TDempty(me, 0.5);
141                 me.TD(me, 1, 2, e = makeXonoticButton(_("Mutators"), '0 0 0'));
142                         e.onClick = DialogOpenButton_Click;
143                         e.onClickEntity = main.mutatorsDialog;
144                         main.mutatorsDialog.refilterEntity = me.mapListBox;
145
146         me.gotoRC(me, 0.5, 3.2); me.setFirstColumn(me, me.currentColumn);
147                 me.mapListBox = makeXonoticMapList();
148                 me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Maplist")));
149                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
150         me.TR(me);
151                 me.TD(me, me.rows - 4, 3, me.mapListBox);
152         me.gotoRC(me, me.rows - 2.5, 3.2);
153                 me.TDempty(me, 0.375);
154                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
155                         e.onClick = MapList_All;
156                         e.onClickEntity = me.mapListBox;
157                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
158                         e.onClick = MapList_None;
159                         e.onClickEntity = me.mapListBox;
160
161         me.gotoRC(me, me.rows - 1, 0);
162                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
163                         e.onClick = MapList_LoadMap;
164                         e.onClickEntity = me.mapListBox;
165                         me.mapListBox.startButton = e;
166
167         me.gameTypeChangeNotify(me);
168 }
169
170 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
171 {
172         // tell the map list to update
173         float gt;
174         entity e, l;
175         gt = MapInfo_CurrentGametype();
176         e = me.sliderFraglimit;
177         l = me.labelFraglimit;
178
179         switch(gt)
180         {
181                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
182                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
183                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
184                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
185                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
186                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
187                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
188                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
189                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
190                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
191         case MAPINFO_TYPE_TEAM_DEATHMATCH:GameType_ConfigureSliders(e, l, _("Point limit:"),     5,  100,  5, "g_tdm_point_limit");        break;
192                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
193         }
194
195         string x = string_null;
196         e = me.sliderTeams;
197         switch(gt)
198         {
199                 case MAPINFO_TYPE_CA:               x = "g_ca_teams_override";          break;
200                 case MAPINFO_TYPE_DOMINATION:       x = "g_domination_teams_override";  break;
201                 case MAPINFO_TYPE_FREEZETAG:        x = "g_freezetag_teams_override";   break;
202                 case MAPINFO_TYPE_KEYHUNT:          x = "g_keyhunt_teams_override";     break;
203                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = "g_tdm_teams_override";         break;
204         }
205         e.configureXonoticTextSlider(e, x);
206         e.configureXonoticTextSliderValues(e);
207         if(!x)
208                 e.value = 0;
209         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
210
211         me.mapListBox.refilter(me.mapListBox);
212 }
213
214 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
215 {
216         me.setFocus(me, me.mapListBox);
217 }
218
219 #endif