1 #include "dialog_multiplayer_create_mutators.qh"
2 #include <common/weapons/_all.qh>
4 #include "weaponarenacheckbox.qh"
7 #include "textlabel.qh"
8 #include "checkbox_slider_invalid.qh"
9 #include "radiobutton.qh"
12 void XonoticMutatorsDialog_showNotify(entity me)
14 SUPER(XonoticMutatorsDialog).showNotify(me);
18 string weaponarenastring;
19 string weaponarenastring_cvar;
20 string WeaponArenaString()
24 s = cvar_string("g_weaponarena");
27 if(s == "all" || s == "1")
28 return _("All Weapons Arena");
30 return _("Most Weapons Arena");
31 if(s == weaponarenastring_cvar)
32 return weaponarenastring;
34 strcpy(weaponarenastring_cvar, s);
36 n = tokenize_console(s);
38 for(int j = 0; j < n; ++j)
40 Weapon wep = Weapons_fromstr(argv(j));
43 s = cons_mid(s, " & ", wep.m_name);
46 s = sprintf(_("%s Arena"), s);
48 strcpy(weaponarenastring, s);
50 return weaponarenastring;
53 string XonoticMutatorsDialog_toString(entity me)
57 s = cons_mid(s, ", ", _("Dodging"));
58 if(cvar("g_instagib"))
59 s = cons_mid(s, ", ", _("InstaGib"));
60 if(cvar("g_new_toys"))
61 s = cons_mid(s, ", ", _("New Toys"));
63 s = cons_mid(s, ", ", _("NIX"));
64 if(cvar("g_rocket_flying"))
65 s = cons_mid(s, ", ", _("Rocket Flying"));
66 if(cvar("g_invincible_projectiles"))
67 s = cons_mid(s, ", ", _("Invincible Projectiles"));
68 if(cvar_string("g_weaponarena") != "0")
69 s = cons_mid(s, ", ", WeaponArenaString());
70 else if(cvar("g_balance_blaster_weaponstartoverride") == 0)
71 s = cons_mid(s, ", ", _("No start weapons"));
72 if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
73 s = cons_mid(s, ", ", _("Low gravity"));
75 s = cons_mid(s, ", ", _("Cloaked"));
76 if(cvar("g_grappling_hook"))
77 s = cons_mid(s, ", ", _("Hook"));
79 s = cons_mid(s, ", ", _("Midair"));
80 if(cvar("g_melee_only"))
81 s = cons_mid(s, ", ", _("Melee only"));
83 s = cons_mid(s, ", ", _("Vampire"));
85 s = cons_mid(s, ", ", _("Piñata"));
86 if(cvar("g_weapon_stay"))
87 s = cons_mid(s, ", ", _("Weapons stay"));
88 if(cvar("g_bloodloss") > 0)
89 s = cons_mid(s, ", ", _("Blood loss"));
91 s = cons_mid(s, ", ", _("Jetpack"));
92 if(cvar("g_buffs") > 0)
93 s = cons_mid(s, ", ", _("Buffs"));
94 if(cvar("g_overkill"))
95 s = cons_mid(s, ", ", _("Overkill"));
96 if(cvar("g_powerups") == 0)
97 s = cons_mid(s, ", ", _("No powerups"));
98 if(cvar("g_powerups") > 0)
99 s = cons_mid(s, ", ", _("Powerups"));
100 if(cvar("g_touchexplode") > 0)
101 s = cons_mid(s, ", ", _("Touch explode"));
102 if(cvar("g_walljump"))
103 s = cons_mid(s, ", ", _("Wall jumping"));
105 return ZCTX(_("MUT^None"));
110 float checkCompatibility_pinata(entity me)
112 if(cvar("g_instagib"))
116 if(cvar("g_overkill"))
118 if(cvar("g_melee_only"))
120 if(cvar_string("g_weaponarena") != "0")
124 float checkCompatibility_weaponstay(entity me)
126 return checkCompatibility_pinata(me);
128 float checkCompatibility_newtoys(entity me)
130 if(cvar("g_instagib"))
132 if(cvar_string("g_weaponarena") == "most")
134 if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
136 if(cvar_string("g_weaponarena") != "0")
140 float checkCompatibility_weaponarena_weapon(entity me)
142 if(cvar("g_instagib"))
144 if(cvar_string("g_weaponarena") == "most")
146 if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
148 if(cvar_string("g_weaponarena") == "0")
150 if(cvar_string("g_balance_blaster_weaponstartoverride") == "0")
155 void XonoticMutatorsDialog_fill(entity me)
160 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
163 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_dodging", _("Dodging"),
164 _("Enable dodging (quick acceleration in a given direction). Double-tap a directional key to dodge")));
167 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_touchexplode", _("Touch explode"),
168 _("An explosion occurs when two players collide")));
171 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
172 _("All players are almost invisible")));
175 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_buffs", _("Buffs"),
176 _("Enable buff pickups (random bonuses like Medic, Invisible, etc.) on the maps that support it")));
177 e.cvarOffValue = "-1"; // TODO: make this a radio button?
180 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_midair", _("Midair"),
181 _("Only possible to inflict damage on your enemy while they're airborne")));
184 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_vampire", _("Vampire"),
185 _("Damage done to your enemy gets added to your own health")));
186 setDependent(e, "g_instagib", 0, 0);
189 s = makeXonoticSlider_T(10, 50, 1, "g_bloodloss",
190 _("Amount of health below which players start bleeding out (health rots and they can't jump)"));
191 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(0, 1, s, _("Blood loss")));
192 setDependent(e, "g_instagib", 0, 0);
195 me.TD(me, 1, 1.6, s);
198 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
199 _("Make things fall to the ground slower (percentage of normal gravity)"));
201 s.valueDisplayMultiplier = 0.125; // show gravity in percent
202 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(800, 1, s, _("Low gravity")));
203 e.savedValue = 200; // good on silvercity
206 me.TD(me, 1, 1.6, s);
208 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
211 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_grappling_hook", _("Grappling hook"),
212 _("Players spawn with the grappling hook. Press the 'hook' key to use it")));
215 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_jetpack", _("Jetpack"),
216 _("Players spawn with the jetpack. Double-tap 'jump' or press the 'jetpack' key to use it")));
219 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_invincible_projectiles", _("Invincible Projectiles"),
220 _("Projectiles can't be destroyed. However, Electro combos still work")));
221 setDependent(e, "g_instagib", 0, 0);
224 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_new_toys", _("New Toys"),
225 _("Some weapon spawns will be randomly replaced with new weapons: Heavy Laser Assault Cannon, Mine Layer, Rifle, T.A.G. Seeker")));
226 setDependentWeird(e, checkCompatibility_newtoys);
229 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_rocket_flying", _("Rocket Flying"),
230 _("Devastator rockets can be detonated instantly (otherwise, there's a short delay). This allows players to fire and detonate a Devastator rocket while in the air for a strong mid-air boost even while moving fast")));
231 setDependent(e, "g_instagib", 0, 0);
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);
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);
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 string weaponarena_tooltip = strzone(_("Players will be given a set of weapons at spawn as well as unlimited ammo, without weapon pickups"));
248 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon arenas:")));
251 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "menu_weaponarena", _("Custom weapons"), weaponarena_tooltip));
252 e.cvarValueIsAnotherCvar = true;
253 e.cvarOffValue = "0";
255 me.TDempty(me, 0.1); // fix initial position
256 for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
259 if (w.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK))
266 me.TD(me, 1, 1.2, e = makeXonoticWeaponarenaCheckBox(strzone(w.netname), strzone(w.m_name)));
267 setDependentWeird(e, checkCompatibility_weaponarena_weapon);
273 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "most", _("Most weapons"), weaponarena_tooltip));
274 e.cvarOffValue = "0";
277 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "all", _("All weapons"), weaponarena_tooltip));
278 e.cvarOffValue = "0";
280 me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Special arenas:")));
283 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_instagib", "1", _("InstaGib"),
284 _("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.")));
285 e.cvarOffValue = "0";
288 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_nix", "1", _("NIX"),
289 _("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.")));
290 e.cvarOffValue = "0";
293 me.TD(me, 1, 1.6, e = makeXonoticCheckBox_T(0, "g_nix_with_blaster", _("with blaster"),
294 _("Always carry the blaster as an additional weapon in Nix")));
295 setDependent(e, "g_nix", 1, 1);
298 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_balance_blaster_weaponstartoverride", "0", _("No start weapons"), "-"));
299 e.cvarOffValue = "-1";
300 makeMulti(e, "g_balance_shotgun_weaponstartoverride g_balance_machinegun_weaponstartoverride g_balance_devastator_weaponstartoverride g_balance_minelayer_weaponstartoverride g_balance_electro_weaponstartoverride g_balance_crylink_weaponstartoverride g_balance_hagar_weaponstartoverride g_balance_porto_weaponstartoverride g_balance_vaporizer_weaponstartoverride g_balance_hook_weaponstartoverride g_balance_rifle_weaponstartoverride g_balance_fireball_weaponstartoverride g_balance_seeker_weaponstartoverride g_balance_tuba_weaponstartoverride g_balance_arc_weaponstartoverride g_balance_vortex_weaponstartoverride g_balance_mortar_weaponstartoverride");
302 me.gotoRC(me, me.rows - 1, 0);
303 me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
304 e.onClick = Dialog_Close;
305 e.onClickEntity = me;
308 .void(entity) refilter;
310 void XonoticMutatorsDialog_close(entity me)
312 if(me.refilterEntity)
313 me.refilterEntity.refilter(me.refilterEntity);
314 SUPER(XonoticMutatorsDialog).close(me);