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