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