Makefile: use `-I.`
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create_mutators.qc
1 #include <common/weapons/all.qh>
2
3 #ifndef DIALOG_MULTIPLAYER_CREATE_MUTATORS_H
4 #define DIALOG_MULTIPLAYER_CREATE_MUTATORS_H
5 #include "dialog.qc"
6 CLASS(XonoticMutatorsDialog, XonoticDialog)
7         METHOD(XonoticMutatorsDialog, toString, string(entity));
8         METHOD(XonoticMutatorsDialog, fill, void(entity));
9         METHOD(XonoticMutatorsDialog, showNotify, void(entity));
10         METHOD(XonoticMutatorsDialog, close, void(entity));
11         ATTRIB(XonoticMutatorsDialog, title, string, _("Mutators"))
12         ATTRIB(XonoticMutatorsDialog, color, vector, SKINCOLOR_DIALOG_MUTATORS)
13         ATTRIB(XonoticMutatorsDialog, intendedWidth, float, 0.9)
14         ATTRIB(XonoticMutatorsDialog, rows, float, 20)
15         ATTRIB(XonoticMutatorsDialog, columns, float, 6)
16         ATTRIB(XonoticMutatorsDialog, refilterEntity, entity, NULL)
17 ENDCLASS(XonoticMutatorsDialog)
18 #endif
19
20 #ifdef IMPLEMENTATION
21 void XonoticMutatorsDialog_showNotify(entity me)
22 {
23         loadAllCvars(me);
24 }
25
26 string weaponarenastring;
27 string weaponarenastring_cvar;
28 string WeaponArenaString()
29 {
30         string s;
31         float n, i;
32         s = cvar_string("g_weaponarena");
33         if(s == "0")
34                 return "";
35         if(s == "all" || s == "1")
36                 return _("All Weapons Arena");
37         if(s == "most")
38                 return _("Most Weapons Arena");
39         if(s == weaponarenastring_cvar)
40                 return weaponarenastring;
41         if(weaponarenastring)
42                 strunzone(weaponarenastring);
43         if(weaponarenastring_cvar)
44                 strunzone(weaponarenastring_cvar);
45
46         weaponarenastring_cvar = strzone(s);
47
48         n = tokenize_console(s);
49         s = "";
50         for(i = 0; i < n; ++i)
51         {
52                 FOREACH(Weapons, it != WEP_Null, LAMBDA(
53                         if(argv(i) == it.netname)
54                                 s = strcat(s, " & ", it.m_name);
55                 ));
56         }
57         s = sprintf(_("%s Arena"), substring(s, 3, strlen(s) - 3));
58
59         weaponarenastring = strzone(s);
60
61         return weaponarenastring;
62 }
63
64 AUTOCVAR(g_grappling_hook, bool, _("let players spawn with the grappling hook which allows them to pull themselves up"));
65
66 string XonoticMutatorsDialog_toString(entity me)
67 {
68         string s;
69         s = "";
70         if(cvar("g_dodging"))
71                 s = strcat(s, ", ", _("Dodging"));
72         if(cvar("g_instagib"))
73                 s = strcat(s, ", ", _("InstaGib"));
74         if(cvar("g_new_toys"))
75                 s = strcat(s, ", ", _("New Toys"));
76         if(cvar("g_nix"))
77                 s = strcat(s, ", ", _("NIX"));
78         if(cvar("g_rocket_flying"))
79                 s = strcat(s, ", ", _("Rocket Flying"));
80         if(cvar("g_invincible_projectiles"))
81                 s = strcat(s, ", ", _("Invincible Projectiles"));
82         if(cvar_string("g_weaponarena") != "0")
83                 s = strcat(s, ", ", WeaponArenaString());
84         else if(cvar("g_balance_blaster_weaponstart") == 0)
85                 s = strcat(s, ", ", _("No start weapons"));
86         if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
87                 s = strcat(s, ", ", _("Low gravity"));
88         if(cvar("g_cloaked"))
89                 s = strcat(s, ", ", _("Cloaked"));
90         if(autocvar_g_grappling_hook)
91                 s = strcat(s, ", ", _("Hook"));
92         if(cvar("g_midair"))
93                 s = strcat(s, ", ", _("Midair"));
94         if(cvar("g_vampire"))
95                 s = strcat(s, ", ", _("Vampire"));
96         if(cvar("g_pinata"))
97                 s = strcat(s, ", ", _("Piñata"));
98         if(cvar("g_weapon_stay"))
99                 s = strcat(s, ", ", _("Weapons stay"));
100         if(cvar("g_bloodloss") > 0)
101                 s = strcat(s, ", ", _("Blood loss"));
102         if(cvar("g_jetpack"))
103                 s = strcat(s, ", ", _("Jet pack"));
104         if(cvar("g_buffs"))
105                 s = strcat(s, ", ", _("Buffs"));
106         if(cvar("g_overkill"))
107                 s = strcat(s, ", ", _("Overkill"));
108         if(cvar("g_powerups") == 0)
109                 s = strcat(s, ", ", _("No powerups"));
110         if(cvar("g_powerups") > 0)
111                 s = strcat(s, ", ", _("Powerups"));
112         if(cvar("g_touchexplode") > 0)
113                 s = strcat(s, ", ", _("Touch explode"));
114         if(s == "")
115                 return ZCTX(_("MUT^None"));
116         else
117                 return substring(s, 2, strlen(s) - 2);
118 }
119
120 float checkCompatibility_pinata(entity me)
121 {
122         if(cvar("g_instagib"))
123                 return 0;
124         if(cvar("g_nix"))
125                 return 0;
126         if(cvar_string("g_weaponarena") != "0")
127                 return 0;
128         return 1;
129 }
130 float checkCompatibility_weaponstay(entity me)
131 {
132         return checkCompatibility_pinata(me);
133 }
134 float checkCompatibility_newtoys(entity me)
135 {
136         if(cvar("g_instagib"))
137                 return 0;
138         if(cvar_string("g_weaponarena") == "most")
139                 return 1;
140         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
141                 return 1;
142         if(cvar_string("g_weaponarena") != "0")
143                 return 0;
144         return 1;
145 }
146 float checkCompatibility_weaponarena_weapon(entity me)
147 {
148         if(cvar("g_instagib"))
149                 return 0;
150         if(cvar_string("g_weaponarena") == "most")
151                 return 0;
152         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
153                 return 0;
154         if(cvar_string("g_weaponarena") == "0")
155                 return 0;
156         if(cvar_string("g_balance_blaster_weaponstart") == "0")
157                 return 0;
158         return 1;
159 }
160
161 void XonoticMutatorsDialog_fill(entity me)
162 {
163         entity e, s, w;
164         float i, j;
165         me.TR(me);
166                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
167         me.TR(me);
168                 me.TDempty(me, 0.2);
169                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_dodging", _("Dodging"),
170                         _("Enable dodging")));
171         me.TR(me);
172                 me.TDempty(me, 0.2);
173                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_touchexplode", _("Touch explode")));
174         me.TR(me);
175                 me.TDempty(me, 0.2);
176                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
177                         _("All players are almost invisible")));
178         me.TR(me);
179                 me.TDempty(me, 0.2);
180                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
181         me.TR(me);
182                 me.TDempty(me, 0.2);
183                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_midair", _("Midair"),
184                         _("Only possible to inflict damage on your enemy while he's airborne")));
185         me.TR(me);
186                 me.TDempty(me, 0.2);
187                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_vampire", _("Vampire"),
188                         _("Damage done to your enemy gets added to your own health")));
189                         setDependent(e, "g_instagib", 0, 0);
190         me.TR(me);
191                 me.TDempty(me, 0.2);
192                 s = makeXonoticSlider_T(10, 50, 1, "g_bloodloss",
193                         _("Amount of health below which your player gets stunned because of blood loss"));
194                 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(0, 1, s, _("Blood loss")));
195                         setDependent(e, "g_instagib", 0, 0);
196         me.TR(me);
197                 me.TDempty(me, 0.4);
198                 me.TD(me, 1, 1.6, s);
199         me.TR(me);
200                 me.TDempty(me, 0.2);
201                 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
202                         _("Make things fall to the ground slower, lower value means lower gravity"));
203                         s.valueDigits = 0;
204                         s.valueDisplayMultiplier = 0.125; // show gravity in percent
205                 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(800, 1, s, _("Low gravity")));
206                         e.savedValue = 200; // good on silvercity
207         me.TR(me);
208                 me.TDempty(me, 0.4);
209                 me.TD(me, 1, 1.6, s);
210         me.TR(me);
211                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
212         me.TR(me);
213                 me.TDempty(me, 0.2);
214                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_grappling_hook", _("Grappling hook"),
215                         _("Players spawn with the grappling hook")));
216         me.TR(me);
217                 me.TDempty(me, 0.2);
218                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_jetpack", _("Jet pack"),
219                         _("Players spawn with the jetpack")));
220         me.TR(me);
221                 me.TDempty(me, 0.2);
222                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles")));
223                         setDependent(e, "g_instagib", 0, 0);
224         me.TR(me);
225                 me.TDempty(me, 0.2);
226                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_new_toys", _("New Toys")));
227                         setDependentWeird(e, checkCompatibility_newtoys);
228         me.TR(me);
229                 me.TDempty(me, 0.2);
230                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
231                         setDependent(e, "g_instagib", 0, 0);
232         me.TR(me);
233                 me.TDempty(me, 0.2);
234                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_pinata", _("Piñata"),
235                         _("Players will drop all weapons they possessed when they are killed")));
236                         setDependentWeird(e, checkCompatibility_pinata);
237         me.TR(me);
238                 me.TDempty(me, 0.2);
239                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_weapon_stay", _("Weapons stay"),
240                         _("Weapons stay after they are picked up")));
241                         setDependentWeird(e, checkCompatibility_weaponstay);
242         me.TR(me);
243
244         me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
245                 me.TD(me, 1, 2, e = makeXonoticRadioButton(1, string_null, string_null, _("Regular (no arena)")));
246         me.TR(me);
247                 me.TD(me, 1, 2, e = makeXonoticRadioButton_T(1, "g_weaponarena", "menu_weaponarena", _("Weapon arenas:"),
248                         _("Selecting a weapon arena will give all players that weapon at spawn as well as unlimited ammo, and disable all other weapon pickups.")));
249                         e.cvarValueIsAnotherCvar = true;
250                         e.cvarOffValue = "0";
251         for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
252         {
253                 w = Weapons_from(i);
254                 if(w.spawnflags & WEP_FLAG_HIDDEN)
255                         continue;
256                 if((j & 1) == 0)
257                         me.TR(me);
258                 me.TDempty(me, 0.2);
259                 me.TD(me, 1, 1.8, e = makeXonoticWeaponarenaCheckBox(strzone(w.netname), strzone(w.m_name)));
260                         setDependentWeird(e, checkCompatibility_weaponarena_weapon);
261                 ++j;
262         }
263         me.TR(me);
264                 me.TDempty(me, 0.2);
265                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "most", _("Most weapons"),
266                         _("Selecting a weapon arena will give all players that weapon at spawn as well as unlimited ammo, and disable all other weapon pickups.")));
267                         e.cvarOffValue = "0";
268         me.TR(me);
269                 me.TDempty(me, 0.2);
270                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "all", _("All weapons"),
271                         _("Selecting a weapon arena will give all players that weapon at spawn as well as unlimited ammo, and disable all other weapon pickups.")));
272                         e.cvarOffValue = "0";
273         me.TR(me);
274                 me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Special arenas:")));
275         me.TR(me);
276                 me.TDempty(me, 0.2);
277                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_instagib", "1", _("InstaGib"),
278                         _("Players will be given only one weapon, which can instantly kill the opponent with a single shot. If the player runs out of ammo, he will have 10 seconds to find some or if he fails to do so, face death. The secondary fire mode does not inflict any damage but is good for doing trickjumps.")));
279                         e.cvarOffValue = "0";
280         me.TR(me);
281                 me.TDempty(me, 0.2);
282                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_nix", "1", _("NIX"),
283                         _("No items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon.")));
284                         e.cvarOffValue = "0";
285         me.TR(me);
286                 me.TDempty(me, 0.4);
287                 me.TD(me, 1, 1.6, e = makeXonoticCheckBox_T(0, "g_nix_with_blaster", _("with blaster"),
288                         _("Always carry the blaster as an additional weapon in Nix")));
289                         setDependent(e, "g_nix", 1, 1);
290         me.TR(me);
291                 me.TDempty(me, 0.2);
292                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_balance_blaster_weaponstart", "0", _("No start weapons"), "-"));
293                         e.cvarOffValue = "-1";
294                         makeMulti(e, "g_balance_shotgun_weaponstart g_balance_machinegun_weaponstart g_balance_devastator_weaponstart g_balance_minelayer_weaponstart g_balance_electro_weaponstart g_balance_crylink_weaponstart g_balance_hagar_weaponstart g_balance_porto_weaponstart g_balance_vaporizer_weaponstart g_balance_hook_weaponstart g_balance_rifle_weaponstart g_balance_fireball_weaponstart g_balance_seeker_weaponstart g_balance_tuba_weaponstart g_balance_arc_weaponstart g_balance_vortex_weaponstart g_balance_mortar_weaponstart");
295
296         me.gotoRC(me, me.rows - 1, 0);
297                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
298                         e.onClick = Dialog_Close;
299                         e.onClickEntity = me;
300 }
301
302 void XonoticMutatorsDialog_close(entity me)
303 {
304         if(me.refilterEntity)
305                 me.refilterEntity.refilter(me.refilterEntity);
306         SUPER(XonoticMutatorsDialog).close(me);
307 }
308 #endif