9da8419a3360da209018834844ddf76f4cf93424
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create.c
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, e = makeXonoticTextLabel(0.5, _("Gametype")));
70                         e.isBold = TRUE;
71                         e.alpha = 0.5;
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 = makeXonoticTextLabel(0.5, _("Maplist")));
150                         e.isBold = TRUE;
151                         e.alpha = 0.5;
152                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
153         me.TR(me);
154                 me.TD(me, me.rows - 4, 3, me.mapListBox);
155         me.gotoRC(me, me.rows - 2.5, 3.2);
156                 me.TDempty(me, 0.375);
157                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
158                         e.onClick = MapList_All;
159                         e.onClickEntity = me.mapListBox;
160                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
161                         e.onClick = MapList_None;
162                         e.onClickEntity = me.mapListBox;
163
164         me.gotoRC(me, me.rows - 1, 0);
165                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
166                         e.onClick = MapList_LoadMap;
167                         e.onClickEntity = me.mapListBox;
168                         me.mapListBox.startButton = e;
169
170         me.gameTypeChangeNotify(me);
171 }
172
173 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
174 {
175         // tell the map list to update
176         float gt;
177         entity e, l;
178         gt = MapInfo_CurrentGametype();
179         e = me.sliderFraglimit;
180         l = me.labelFraglimit;
181
182         switch(gt)
183         {
184                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
185                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
186                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
187                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
188                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
189                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
190                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
191                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
192                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, _("Point limit:"),    50,  500, 10, "");                         break;
193                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, _("Point limit:"),     5,    0,  5, "");                         break;
194                 default:                      GameType_ConfigureSliders(e, l, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
195         }
196
197         float x = FALSE;
198         e = me.sliderTeams;
199         switch(gt)
200         {
201                 case MAPINFO_TYPE_CA:               x = TRUE; e.configureXonoticTextSlider(e, "g_ca_teams_override");          break;
202                 case MAPINFO_TYPE_DOMINATION:       x = TRUE; e.configureXonoticTextSlider(e, "g_domination_teams_override");  break;
203                 case MAPINFO_TYPE_FREEZETAG:        x = TRUE; e.configureXonoticTextSlider(e, "g_freezetag_teams_override");   break;
204                 case MAPINFO_TYPE_KEEPAWAY:         x = TRUE; e.configureXonoticTextSlider(e, "g_keepaway_teams_override");    break;
205                 case MAPINFO_TYPE_KEYHUNT:          x = TRUE; e.configureXonoticTextSlider(e, "g_keyhunt_teams_override");     break;
206                 case MAPINFO_TYPE_TEAM_DEATHMATCH:  x = TRUE; e.configureXonoticTextSlider(e, "g_tdm_teams_override");         break;
207
208                 default: x = FALSE; e.configureXonoticTextSlider(e, string_null); break;
209         }
210         e.configureXonoticTextSliderValues(e);
211         e.value = 0;
212         me.sliderTeams.disabled = me.labelTeams.disabled = !x;
213
214         me.mapListBox.refilter(me.mapListBox);
215 }
216
217 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
218 {
219         me.setFocus(me, me.mapListBox);
220 }
221
222 #endif