]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc
Merge branch 'master' into Lyberta/KillSound
[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         if(weaponarenastring)
34                 strunzone(weaponarenastring);
35         if(weaponarenastring_cvar)
36                 strunzone(weaponarenastring_cvar);
37
38         weaponarenastring_cvar = strzone(s);
39
40         n = tokenize_console(s);
41         s = "";
42         for(int j = 0; j < n; ++j)
43         {
44                 FOREACH(Weapons, it != WEP_Null, {
45                         if(argv(j) == it.netname)
46                                 s = cons_mid(s, " & ", it.m_name);
47                 });
48         }
49         s = sprintf(_("%s Arena"), s);
50
51         weaponarenastring = strzone(s);
52
53         return weaponarenastring;
54 }
55
56 string XonoticMutatorsDialog_toString(entity me)
57 {
58         string s = "";
59         if(cvar("g_dodging"))
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"));
65         if(cvar("g_nix"))
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"));
77         if(cvar("g_cloaked"))
78                 s = cons_mid(s, ", ", _("Cloaked"));
79         if(cvar("g_grappling_hook"))
80                 s = cons_mid(s, ", ", _("Hook"));
81         if(cvar("g_midair"))
82                 s = cons_mid(s, ", ", _("Midair"));
83         if(cvar("g_melee_only"))
84                 s = cons_mid(s, ", ", _("Melee only"));
85         if(cvar("g_vampire"))
86                 s = cons_mid(s, ", ", _("Vampire"));
87         if(cvar("g_pinata"))
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"));
93         if(cvar("g_jetpack"))
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"));
107         if(s == "")
108                 return ZCTX(_("MUT^None"));
109         else
110                 return s;
111 }
112
113 float checkCompatibility_pinata(entity me)
114 {
115         if(cvar("g_instagib"))
116                 return 0;
117         if(cvar("g_nix"))
118                 return 0;
119         if(cvar("g_overkill"))
120                 return 0;
121         if(cvar("g_melee_only"))
122                 return 0;
123         if(cvar_string("g_weaponarena") != "0")
124                 return 0;
125         return 1;
126 }
127 float checkCompatibility_weaponstay(entity me)
128 {
129         return checkCompatibility_pinata(me);
130 }
131 float checkCompatibility_newtoys(entity me)
132 {
133         if(cvar("g_instagib"))
134                 return 0;
135         if(cvar_string("g_weaponarena") == "most")
136                 return 1;
137         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
138                 return 1;
139         if(cvar_string("g_weaponarena") != "0")
140                 return 0;
141         return 1;
142 }
143 float checkCompatibility_weaponarena_weapon(entity me)
144 {
145         if(cvar("g_instagib"))
146                 return 0;
147         if(cvar_string("g_weaponarena") == "most")
148                 return 0;
149         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
150                 return 0;
151         if(cvar_string("g_weaponarena") == "0")
152                 return 0;
153         if(cvar_string("g_balance_blaster_weaponstartoverride") == "0")
154                 return 0;
155         return 1;
156 }
157
158 void XonoticMutatorsDialog_fill(entity me)
159 {
160         entity e, s, w;
161         float i, j;
162         me.TR(me);
163                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
164         me.TR(me);
165                 me.TDempty(me, 0.2);
166                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_dodging", _("Dodging"),
167                         _("Enable dodging")));
168         me.TR(me);
169                 me.TDempty(me, 0.2);
170                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_touchexplode", _("Touch explode")));
171         me.TR(me);
172                 me.TDempty(me, 0.2);
173                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
174                         _("All players are almost invisible")));
175         me.TR(me);
176                 me.TDempty(me, 0.2);
177                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
178                         e.cvarOffValue = "-1"; // TODO: make this a radio button?
179         me.TR(me);
180                 me.TDempty(me, 0.2);
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")));
183         me.TR(me);
184                 me.TDempty(me, 0.2);
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);
188         me.TR(me);
189                 me.TDempty(me, 0.2);
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);
194         me.TR(me);
195                 me.TDempty(me, 0.4);
196                 me.TD(me, 1, 1.6, s);
197         me.TR(me);
198                 me.TDempty(me, 0.2);
199                 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
200                         _("Make things fall to the ground slower, lower value means lower gravity"));
201                         s.valueDigits = 0;
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
205         me.TR(me);
206                 me.TDempty(me, 0.4);
207                 me.TD(me, 1, 1.6, s);
208         me.TR(me);
209                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
210         me.TR(me);
211                 me.TDempty(me, 0.2);
212                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_grappling_hook", _("Grappling hook"),
213                         _("Players spawn with the grappling hook")));
214         me.TR(me);
215                 me.TDempty(me, 0.2);
216                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_jetpack", _("Jet pack"),
217                         _("Players spawn with the jetpack")));
218         me.TR(me);
219                 me.TDempty(me, 0.2);
220                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles")));
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(0, "g_new_toys", _("New Toys")));
225                         setDependentWeird(e, checkCompatibility_newtoys);
226         me.TR(me);
227                 me.TDempty(me, 0.2);
228                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
229                         setDependent(e, "g_instagib", 0, 0);
230         me.TR(me);
231                 me.TDempty(me, 0.2);
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);
235         me.TR(me);
236                 me.TDempty(me, 0.2);
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);
240         me.TR(me);
241
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"));
245         me.TR(me);
246                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon arenas:")));
247         me.TR(me);
248                 me.TDempty(me, 0.2);
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";
252
253                 me.TDempty(me, 0.1); // fix initial position
254         for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
255         {
256                 w = Weapons_from(i);
257                 if(w.spawnflags & WEP_FLAG_HIDDEN)
258                         continue;
259                 if((j & 1) == 0)
260                         me.TDempty(me, 0.2);
261                 else
262                 {
263                         me.TR(me);
264                         me.TDempty(me, 0.4);
265                 }
266                 me.TD(me, 1, 1.7, 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 }