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 strunzone(weaponarenastring);
35 if(weaponarenastring_cvar)
36 strunzone(weaponarenastring_cvar);
38 weaponarenastring_cvar = strzone(s);
40 n = tokenize_console(s);
42 for(int j = 0; j < n; ++j)
44 FOREACH(Weapons, it != WEP_Null, {
45 if(argv(j) == it.netname)
46 s = cons_mid(s, " & ", it.m_name);
49 s = sprintf(_("%s Arena"), s);
51 weaponarenastring = strzone(s);
53 return weaponarenastring;
56 string XonoticMutatorsDialog_toString(entity me)
60 s = cons_mid(s, ", ", _("Dodging"));
61 if(cvar("g_instagib"))
62 s = cons_mid(s, ", ", _("InstaGib"));
63 if(cvar("g_new_toys"))
64 s = cons_mid(s, ", ", _("New Toys"));
66 s = cons_mid(s, ", ", _("NIX"));
67 if(cvar("g_rocket_flying"))
68 s = cons_mid(s, ", ", _("Rocket Flying"));
69 if(cvar("g_invincible_projectiles"))
70 s = cons_mid(s, ", ", _("Invincible Projectiles"));
71 if(cvar_string("g_weaponarena") != "0")
72 s = cons_mid(s, ", ", WeaponArenaString());
73 else if(cvar("g_balance_blaster_weaponstartoverride") == 0)
74 s = cons_mid(s, ", ", _("No start weapons"));
75 if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
76 s = cons_mid(s, ", ", _("Low gravity"));
78 s = cons_mid(s, ", ", _("Cloaked"));
79 if(cvar("g_grappling_hook"))
80 s = cons_mid(s, ", ", _("Hook"));
82 s = cons_mid(s, ", ", _("Midair"));
83 if(cvar("g_melee_only"))
84 s = cons_mid(s, ", ", _("Melee only"));
86 s = cons_mid(s, ", ", _("Vampire"));
88 s = cons_mid(s, ", ", _("Piñata"));
89 if(cvar("g_weapon_stay"))
90 s = cons_mid(s, ", ", _("Weapons stay"));
91 if(cvar("g_bloodloss") > 0)
92 s = cons_mid(s, ", ", _("Blood loss"));
94 s = cons_mid(s, ", ", _("Jet pack"));
95 if(cvar("g_buffs") > 0)
96 s = cons_mid(s, ", ", _("Buffs"));
97 if(cvar("g_overkill"))
98 s = cons_mid(s, ", ", _("Overkill"));
99 if(cvar("g_powerups") == 0)
100 s = cons_mid(s, ", ", _("No powerups"));
101 if(cvar("g_powerups") > 0)
102 s = cons_mid(s, ", ", _("Powerups"));
103 if(cvar("g_touchexplode") > 0)
104 s = cons_mid(s, ", ", _("Touch explode"));
105 if(cvar("g_walljump"))
106 s = cons_mid(s, ", ", _("Wall jumping"));
108 return ZCTX(_("MUT^None"));
113 float checkCompatibility_pinata(entity me)
115 if(cvar("g_instagib"))
119 if(cvar("g_overkill"))
121 if(cvar("g_melee_only"))
123 if(cvar_string("g_weaponarena") != "0")
127 float checkCompatibility_weaponstay(entity me)
129 return checkCompatibility_pinata(me);
131 float checkCompatibility_newtoys(entity me)
133 if(cvar("g_instagib"))
135 if(cvar_string("g_weaponarena") == "most")
137 if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
139 if(cvar_string("g_weaponarena") != "0")
143 float checkCompatibility_weaponarena_weapon(entity me)
145 if(cvar("g_instagib"))
147 if(cvar_string("g_weaponarena") == "most")
149 if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
151 if(cvar_string("g_weaponarena") == "0")
153 if(cvar_string("g_balance_blaster_weaponstartoverride") == "0")
158 void XonoticMutatorsDialog_fill(entity me)
163 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
166 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_dodging", _("Dodging"),
167 _("Enable dodging")));
170 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_touchexplode", _("Touch explode")));
173 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
174 _("All players are almost invisible")));
177 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
178 e.cvarOffValue = "-1"; // TODO: make this a radio button?
181 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_midair", _("Midair"),
182 _("Only possible to inflict damage on your enemy while they're airborne")));
185 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_vampire", _("Vampire"),
186 _("Damage done to your enemy gets added to your own health")));
187 setDependent(e, "g_instagib", 0, 0);
190 s = makeXonoticSlider_T(10, 50, 1, "g_bloodloss",
191 _("Amount of health below which your player gets stunned because of blood loss"));
192 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(0, 1, s, _("Blood loss")));
193 setDependent(e, "g_instagib", 0, 0);
196 me.TD(me, 1, 1.6, s);
199 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
200 _("Make things fall to the ground slower, lower value means lower gravity"));
202 s.valueDisplayMultiplier = 0.125; // show gravity in percent
203 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(800, 1, s, _("Low gravity")));
204 e.savedValue = 200; // good on silvercity
207 me.TD(me, 1, 1.6, s);
209 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
212 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_grappling_hook", _("Grappling hook"),
213 _("Players spawn with the grappling hook")));
216 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_jetpack", _("Jet pack"),
217 _("Players spawn with the jetpack")));
220 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles")));
221 setDependent(e, "g_instagib", 0, 0);
224 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_new_toys", _("New Toys")));
225 setDependentWeird(e, checkCompatibility_newtoys);
228 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
229 setDependent(e, "g_instagib", 0, 0);
232 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_pinata", _("Piñata"),
233 _("Players will drop all weapons they possessed when they are killed")));
234 setDependentWeird(e, checkCompatibility_pinata);
237 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_weapon_stay", _("Weapons stay"),
238 _("Weapons stay after they are picked up")));
239 setDependentWeird(e, checkCompatibility_weaponstay);
242 me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
243 me.TD(me, 1, 2, e = makeXonoticRadioButton(1, string_null, string_null, _("Regular (no arena)")));
244 string weaponarena_tooltip = strzone(_("Players will be given a set of weapons at spawn as well as unlimited ammo, without weapon pickups"));
246 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon arenas:")));
249 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "menu_weaponarena", _("Custom weapons"), weaponarena_tooltip));
250 e.cvarValueIsAnotherCvar = true;
251 e.cvarOffValue = "0";
253 me.TDempty(me, 0.1); // fix initial position
254 for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
257 if(w.spawnflags & WEP_FLAG_HIDDEN)
266 me.TD(me, 1, 1.7, 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);