]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc
Update default video settings
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_create_mutators.qc
1 #include "dialog_multiplayer_create_mutators.qh"
2 #include <common/weapons/_all.qh>
3
4 #include "weaponarenacheckbox.qh"
5 #include "checkbox.qh"
6 #include "slider.qh"
7 #include "textlabel.qh"
8 #include "checkbox_slider_invalid.qh"
9 #include "radiobutton.qh"
10 #include "button.qh"
11
12 void XonoticMutatorsDialog_showNotify(entity me)
13 {
14         SUPER(XonoticMutatorsDialog).showNotify(me);
15         loadAllCvars(me);
16 }
17
18 string weaponarenastring;
19 string weaponarenastring_cvar;
20 string WeaponArenaString()
21 {
22         string s;
23         float n;
24         s = cvar_string("g_weaponarena");
25         if(s == "0")
26                 return "";
27         if(s == "all" || s == "1")
28                 return _("All Weapons Arena");
29         if(s == "most")
30                 return _("Most Weapons Arena");
31         if(s == weaponarenastring_cvar)
32                 return weaponarenastring;
33
34         strcpy(weaponarenastring_cvar, s);
35
36         n = tokenize_console(s);
37         s = "";
38         for(int j = 0; j < n; ++j)
39         {
40                 Weapon wep = Weapon_from_name(argv(j));
41                 if(wep != WEP_Null)
42                 {
43                         s = cons_mid(s, " & ", wep.m_name);
44                 }
45         }
46         s = sprintf(_("%s Arena"), s);
47
48         strcpy(weaponarenastring, s);
49
50         return weaponarenastring;
51 }
52
53 string XonoticMutatorsDialog_toString(entity me)
54 {
55         string s = "";
56         if(cvar("g_dodging"))
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"));
62         if(cvar("g_nix"))
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"));
74         if(cvar("g_cloaked"))
75                 s = cons_mid(s, ", ", _("Cloaked"));
76         if(cvar("g_grappling_hook"))
77                 s = cons_mid(s, ", ", _("Hook"));
78         if(cvar("g_midair"))
79                 s = cons_mid(s, ", ", _("Midair"));
80         if(cvar("g_melee_only"))
81                 s = cons_mid(s, ", ", _("Melee only"));
82         if(cvar("g_vampire"))
83                 s = cons_mid(s, ", ", _("Vampire"));
84         if(cvar("g_pinata"))
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"));
90         if(cvar("g_jetpack"))
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"));
104         if(s == "")
105                 return ZCTX(_("MUT^None"));
106         else
107                 return s;
108 }
109
110 float checkCompatibility_pinata(entity me)
111 {
112         if(cvar("g_instagib"))
113                 return 0;
114         if(cvar("g_nix"))
115                 return 0;
116         if(cvar("g_overkill"))
117                 return 0;
118         if(cvar("g_melee_only"))
119                 return 0;
120         if(cvar_string("g_weaponarena") != "0")
121                 return 0;
122         return 1;
123 }
124 float checkCompatibility_weaponstay(entity me)
125 {
126         return checkCompatibility_pinata(me);
127 }
128 float checkCompatibility_newtoys(entity me)
129 {
130         if(cvar("g_instagib"))
131                 return 0;
132         if(cvar_string("g_weaponarena") == "most")
133                 return 1;
134         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
135                 return 1;
136         if(cvar_string("g_weaponarena") != "0")
137                 return 0;
138         return 1;
139 }
140 float checkCompatibility_weaponarena_weapon(entity me)
141 {
142         if(cvar("g_instagib"))
143                 return 0;
144         if(cvar_string("g_weaponarena") == "most")
145                 return 0;
146         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
147                 return 0;
148         if(cvar_string("g_weaponarena") == "0")
149                 return 0;
150         if(cvar_string("g_balance_blaster_weaponstartoverride") == "0")
151                 return 0;
152         return 1;
153 }
154
155 void XonoticMutatorsDialog_fill(entity me)
156 {
157         entity e, s, w;
158         float i, j;
159         me.TR(me);
160                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
161         me.TR(me);
162                 me.TDempty(me, 0.2);
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")));
165         me.TR(me);
166                 me.TDempty(me, 0.2);
167                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_touchexplode", _("Touch explode"),
168                         _("An explosion occurs when two players collide")));
169         me.TR(me);
170                 me.TDempty(me, 0.2);
171                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
172                         _("All players are almost invisible")));
173         me.TR(me);
174                 me.TDempty(me, 0.2);
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?
178         me.TR(me);
179                 me.TDempty(me, 0.2);
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")));
182         me.TR(me);
183                 me.TDempty(me, 0.2);
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);
187         me.TR(me);
188                 me.TDempty(me, 0.2);
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);
193         me.TR(me);
194                 me.TDempty(me, 0.4);
195                 me.TD(me, 1, 1.6, s);
196         me.TR(me);
197                 me.TDempty(me, 0.2);
198                 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
199                         _("Make things fall to the ground slower (percentage of normal gravity)"));
200                         s.valueDigits = 0;
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
204         me.TR(me);
205                 me.TDempty(me, 0.4);
206                 me.TD(me, 1, 1.6, s);
207         me.TR(me);
208                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
209         me.TR(me);
210                 me.TDempty(me, 0.2);
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")));
213         me.TR(me);
214                 me.TDempty(me, 0.2);
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")));
217         me.TR(me);
218                 me.TDempty(me, 0.2);
219                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_invincible_projectiles", _("Invincible Projectiles"),
220                         _("Projectiles can't be destroyed. However, you can still explode Electro orbs with the Electro primary fire")));
221                         setDependent(e, "g_instagib", 0, 0);
222         me.TR(me);
223                 me.TDempty(me, 0.2);
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);
227         me.TR(me);
228                 me.TDempty(me, 0.2);
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);
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         string weaponarena_tooltip = strzone(_("Players will be given a set of weapons at spawn as well as unlimited ammo, without weapon pickups"));
247         me.TR(me);
248                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon arenas:")));
249         me.TR(me);
250                 me.TDempty(me, 0.2);
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";
254
255                 me.TDempty(me, 0.1); // fix initial position
256         for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
257         {
258                 w = REGISTRY_GET(Weapons, i);
259                 if (w.spawnflags & (WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK))
260                         continue;
261                 if ((j % 3) == 0)
262                 {
263                         me.TR(me);
264                         me.TDempty(me, 0.4);
265                 }
266                 me.TD(me, 1, 1.2, e = makeXonoticWeaponarenaCheckBox(strzone(w.netname), strzone(w.m_name)));
267                         setDependentWeird(e, checkCompatibility_weaponarena_weapon);
268                 ++j;
269         }
270
271         me.TR(me);
272                 me.TDempty(me, 0.2);
273                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "most", _("Most weapons"), weaponarena_tooltip));
274                         e.cvarOffValue = "0";
275         me.TR(me);
276                 me.TDempty(me, 0.2);
277                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "all", _("All weapons"), weaponarena_tooltip));
278                         e.cvarOffValue = "0";
279         me.TR(me);
280                 me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Special arenas:")));
281         me.TR(me);
282                 me.TDempty(me, 0.2);
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";
286         me.TR(me);
287                 me.TDempty(me, 0.2);
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";
291         me.TR(me);
292                 me.TDempty(me, 0.4);
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);
296         me.TR(me);
297                 me.TDempty(me, 0.2);
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");
301
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;
306 }
307
308 .void(entity) refilter;
309
310 void XonoticMutatorsDialog_close(entity me)
311 {
312         if(me.refilterEntity)
313                 me.refilterEntity.refilter(me.refilterEntity);
314         SUPER(XonoticMutatorsDialog).close(me);
315 }