Merge branch 'nyov/samual/combined_updates' into nyov/combined_updates/effects
[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, 22)
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, sliderTimelimit, entity, NULL)
14         ATTRIB(XonoticServerCreateTab, checkboxFraglimit, entity, NULL)
15         ATTRIB(XonoticServerCreateTab, checkboxFraglimitMapinfo, entity, NULL)
16 ENDCLASS(XonoticServerCreateTab)
17 entity makeXonoticServerCreateTab();
18 #endif
19
20 #ifdef IMPLEMENTATION
21
22 entity makeXonoticServerCreateTab()
23 {
24         entity me;
25         me = spawnXonoticServerCreateTab();
26         me.configureDialog(me);
27         return me;
28 }
29
30 void XonoticServerCreateTab_fill(entity me)
31 {
32         entity e, e0;
33
34         me.TR(me);
35                 me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Game type:")));
36         me.TR(me);
37                 me.TD(me, 8, 3, e = makeXonoticGametypeList());
38         me.TR(me);
39         me.TR(me);
40         me.TR(me);
41         me.TR(me);
42         me.TR(me);
43         me.TR(me);
44         me.TR(me);
45         me.TR(me);
46                 //me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Match settings:"))); // pointless, overcrowds the dialog imo
47         me.TR(me);
48                 me.sliderTimelimit = makeXonoticSlider(1.0, 60.0, 1, "timelimit_override");
49                 me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderTimelimit, _("Time limit:")));
50                 me.TD(me, 1, 2, me.sliderTimelimit);
51         me.TR(me);
52                 me.TDempty(me, 0.2);
53                 me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderTimelimit, _("Use map specified default")));
54         me.TR(me);
55                 me.sliderFraglimit = makeXonoticSlider(1.0, 2000.0, 5, "fraglimit_override");
56                 me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, me.sliderFraglimit, _("Point limit:")));
57                         me.checkboxFraglimit = e;
58                 me.TD(me, 1, 2, me.sliderFraglimit);
59         me.TR(me);
60                 me.TDempty(me, 0.2);
61                 me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderFraglimit, _("Use map specified default")));
62                         me.checkboxFraglimitMapinfo = e;
63         me.TR(me);
64                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Player slots:")));
65                 me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
66         me.TR(me);
67                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Number of bots:")));
68                 me.TD(me, 1, 2, makeXonoticSlider(0, 9, 1, "bot_number"));
69         me.TR(me);
70                 me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Bot skill:")));
71                         setDependent(e, "bot_number", 0, -1);
72                 me.TD(me, 1, 2, e = makeXonoticTextSlider("skill"));
73                         e.addValue(e, _("Botlike"), "0");
74                         e.addValue(e, _("Beginner"), "1");
75                         e.addValue(e, _("You will win"), "2");
76                         e.addValue(e, _("You can win"), "3");
77                         e.addValue(e, _("You might win"), "4");
78                         e.addValue(e, _("Advanced"), "5");
79                         e.addValue(e, _("Expert"), "6");
80                         e.addValue(e, _("Pro"), "7");
81                         e.addValue(e, _("Assassin"), "8");
82                         e.addValue(e, _("Unhuman"), "9");
83                         e.addValue(e, _("Godlike"), "10");
84                         e.configureXonoticTextSliderValues(e);
85                         setDependent(e, "bot_number", 0, -1);
86         me.TR(me);
87         me.TR(me);
88                 me.TD(me, 1, 1, e = makeXonoticButton(_("Mutators..."), '0 0 0'));
89                         e.onClick = DialogOpenButton_Click;
90                         e.onClickEntity = main.mutatorsDialog;
91                         main.mutatorsDialog.refilterEntity = me.mapListBox;
92                 me.TD(me, 1, 2, e0 = makeXonoticTextLabel(0, string_null));
93                         e0.textEntity = main.mutatorsDialog;
94                         e0.allowCut = 1;
95         me.TR(me);
96                 me.TDempty(me, 0.5);
97                 me.TD(me, 1, 2, e = makeXonoticButton(_("Advanced settings..."), '0 0 0'));
98                         e.onClick = DialogOpenButton_Click;
99                         e.onClickEntity = main.advancedDialog;
100                         main.advancedDialog.refilterEntity = me.mapListBox;
101
102         me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
103                 me.mapListBox = makeXonoticMapList();
104                 me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Map list:")));
105                         makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
106         me.TR(me);
107                 me.TD(me, me.rows - 4, 3, me.mapListBox);
108         me.gotoRC(me, me.rows - 3, 3.5);
109                 me.TDempty(me, 0.25);
110                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select all"), '0 0 0'));
111                         e.onClick = MapList_All;
112                         e.onClickEntity = me.mapListBox;
113                 me.TD(me, 1, 1.125, e = makeXonoticButton(_("Select none"), '0 0 0'));
114                         e.onClick = MapList_None;
115                         e.onClickEntity = me.mapListBox;
116                 me.TDempty(me, 0.25);
117
118         me.gotoRC(me, me.rows - 1, 0);
119                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("Start Multiplayer!"), '0 0 0'));
120                         e.onClick = MapList_LoadMap;
121                         e.onClickEntity = me.mapListBox;
122                         me.mapListBox.startButton = e;
123
124         me.gameTypeChangeNotify(me);
125 }
126
127 void GameType_ConfigureSliders(entity e, entity l, entity l2, string pLabel, float pMin, float pMax, float pStep, string pCvar)
128 {
129         if(pCvar == "")
130         {
131                 e.configureXonoticSlider(e, pMin, pMax, pStep, string_null);
132                 l.setText(l, pLabel);
133                 e.disabled = l.disabled = l2.disabled = TRUE;
134         }
135         else
136         {
137                 e.configureXonoticSlider(e, pMin, pMax, pStep, pCvar);
138                 l.setText(l, pLabel);
139                 e.disabled = l.disabled = l2.disabled = FALSE;
140         }
141 }
142
143 void XonoticServerCreateTab_gameTypeChangeNotify(entity me)
144 {
145         // tell the map list to update
146         float gt;
147         entity e, l, l2;
148         gt = MapInfo_CurrentGametype();
149         e = me.sliderFraglimit;
150         l = me.checkboxFraglimit;
151         l2 = me.checkboxFraglimitMapinfo;
152         switch(gt)
153         {
154                 case MAPINFO_TYPE_CTF:        GameType_ConfigureSliders(e, l, l2, _("Capture limit:"),   1,   20, 1, "capturelimit_override");     break;
155                 case MAPINFO_TYPE_DOMINATION: GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "g_domination_point_limit"); break;
156                 case MAPINFO_TYPE_KEYHUNT:    GameType_ConfigureSliders(e, l, l2, _("Point limit:"),   200, 1500, 50, "g_keyhunt_point_limit");    break;
157                 case MAPINFO_TYPE_LMS:        GameType_ConfigureSliders(e, l, l2, _("Lives:"),           3,   50,  1, "g_lms_lives_override");     break;
158                 case MAPINFO_TYPE_RACE:       GameType_ConfigureSliders(e, l, l2, _("Laps:"),            1,   25,  1, "g_race_laps_limit");        break;
159                 case MAPINFO_TYPE_NEXBALL:    GameType_ConfigureSliders(e, l, l2, _("Goals:"),           1,   50,  1, "g_nexball_goallimit");      break;
160                 case MAPINFO_TYPE_ASSAULT:    GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
161                 case MAPINFO_TYPE_ONSLAUGHT:  GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
162                 case MAPINFO_TYPE_CTS:        GameType_ConfigureSliders(e, l, l2, _("Point limit:"),    50,  500, 10, "");                         break;
163                 case MAPINFO_TYPE_INVASION:   GameType_ConfigureSliders(e, l, l2, _("Point limit:"),     5,    0,  5, "");                         break;
164                 default:                      GameType_ConfigureSliders(e, l, l2, _("Frag limit:"),      5,  100,  5, "fraglimit_override");       break;
165         }
166         me.mapListBox.refilter(me.mapListBox);
167 }
168
169 void XonoticServerCreateTab_gameTypeSelectNotify(entity me)
170 {
171         me.setFocus(me, me.mapListBox);
172 }
173
174 #endif