]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc
Merge branch 'master' into Lyberta/TeamplayOverhaul
[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                 FOREACH(Weapons, it != WEP_Null, {
41                         if(argv(j) == it.netname)
42                                 s = cons_mid(s, " & ", it.m_name);
43                 });
44         }
45         s = sprintf(_("%s Arena"), s);
46
47         strcpy(weaponarenastring, s);
48
49         return weaponarenastring;
50 }
51
52 string XonoticMutatorsDialog_toString(entity me)
53 {
54         string s = "";
55         if(cvar("g_dodging"))
56                 s = cons_mid(s, ", ", _("Dodging"));
57         if(cvar("g_instagib"))
58                 s = cons_mid(s, ", ", _("InstaGib"));
59         if(cvar("g_new_toys"))
60                 s = cons_mid(s, ", ", _("New Toys"));
61         if(cvar("g_nix"))
62                 s = cons_mid(s, ", ", _("NIX"));
63         if(cvar("g_rocket_flying"))
64                 s = cons_mid(s, ", ", _("Rocket Flying"));
65         if(cvar("g_invincible_projectiles"))
66                 s = cons_mid(s, ", ", _("Invincible Projectiles"));
67         if(cvar_string("g_weaponarena") != "0")
68                 s = cons_mid(s, ", ", WeaponArenaString());
69         else if(cvar("g_balance_blaster_weaponstartoverride") == 0)
70                 s = cons_mid(s, ", ", _("No start weapons"));
71         if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
72                 s = cons_mid(s, ", ", _("Low gravity"));
73         if(cvar("g_cloaked"))
74                 s = cons_mid(s, ", ", _("Cloaked"));
75         if(cvar("g_grappling_hook"))
76                 s = cons_mid(s, ", ", _("Hook"));
77         if(cvar("g_midair"))
78                 s = cons_mid(s, ", ", _("Midair"));
79         if(cvar("g_melee_only"))
80                 s = cons_mid(s, ", ", _("Melee only"));
81         if(cvar("g_vampire"))
82                 s = cons_mid(s, ", ", _("Vampire"));
83         if(cvar("g_pinata"))
84                 s = cons_mid(s, ", ", _("Piñata"));
85         if(cvar("g_weapon_stay"))
86                 s = cons_mid(s, ", ", _("Weapons stay"));
87         if(cvar("g_bloodloss") > 0)
88                 s = cons_mid(s, ", ", _("Blood loss"));
89         if(cvar("g_jetpack"))
90                 s = cons_mid(s, ", ", _("Jet pack"));
91         if(cvar("g_buffs") > 0)
92                 s = cons_mid(s, ", ", _("Buffs"));
93         if(cvar("g_overkill"))
94                 s = cons_mid(s, ", ", _("Overkill"));
95         if(cvar("g_powerups") == 0)
96                 s = cons_mid(s, ", ", _("No powerups"));
97         if(cvar("g_powerups") > 0)
98                 s = cons_mid(s, ", ", _("Powerups"));
99         if(cvar("g_touchexplode") > 0)
100                 s = cons_mid(s, ", ", _("Touch explode"));
101         if(cvar("g_walljump"))
102                 s = cons_mid(s, ", ", _("Wall jumping"));
103         if(s == "")
104                 return ZCTX(_("MUT^None"));
105         else
106                 return s;
107 }
108
109 float checkCompatibility_pinata(entity me)
110 {
111         if(cvar("g_instagib"))
112                 return 0;
113         if(cvar("g_nix"))
114                 return 0;
115         if(cvar("g_overkill"))
116                 return 0;
117         if(cvar("g_melee_only"))
118                 return 0;
119         if(cvar_string("g_weaponarena") != "0")
120                 return 0;
121         return 1;
122 }
123 float checkCompatibility_weaponstay(entity me)
124 {
125         return checkCompatibility_pinata(me);
126 }
127 float checkCompatibility_newtoys(entity me)
128 {
129         if(cvar("g_instagib"))
130                 return 0;
131         if(cvar_string("g_weaponarena") == "most")
132                 return 1;
133         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
134                 return 1;
135         if(cvar_string("g_weaponarena") != "0")
136                 return 0;
137         return 1;
138 }
139 float checkCompatibility_weaponarena_weapon(entity me)
140 {
141         if(cvar("g_instagib"))
142                 return 0;
143         if(cvar_string("g_weaponarena") == "most")
144                 return 0;
145         if(cvar_string("g_weaponarena") == "all" || cvar_string("g_weaponarena") == "1")
146                 return 0;
147         if(cvar_string("g_weaponarena") == "0")
148                 return 0;
149         if(cvar_string("g_balance_blaster_weaponstartoverride") == "0")
150                 return 0;
151         return 1;
152 }
153
154 void XonoticMutatorsDialog_fill(entity me)
155 {
156         entity e, s, w;
157         float i, j;
158         me.TR(me);
159                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Gameplay mutators:")));
160         me.TR(me);
161                 me.TDempty(me, 0.2);
162                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_dodging", _("Dodging"),
163                         _("Enable dodging")));
164         me.TR(me);
165                 me.TDempty(me, 0.2);
166                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_touchexplode", _("Touch explode")));
167         me.TR(me);
168                 me.TDempty(me, 0.2);
169                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_cloaked", _("Cloaked"),
170                         _("All players are almost invisible")));
171         me.TR(me);
172                 me.TDempty(me, 0.2);
173                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
174                         e.cvarOffValue = "-1"; // TODO: make this a radio button?
175         me.TR(me);
176                 me.TDempty(me, 0.2);
177                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_midair", _("Midair"),
178                         _("Only possible to inflict damage on your enemy while they're airborne")));
179         me.TR(me);
180                 me.TDempty(me, 0.2);
181                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_vampire", _("Vampire"),
182                         _("Damage done to your enemy gets added to your own health")));
183                         setDependent(e, "g_instagib", 0, 0);
184         me.TR(me);
185                 me.TDempty(me, 0.2);
186                 s = makeXonoticSlider_T(10, 50, 1, "g_bloodloss",
187                         _("Amount of health below which your player gets stunned because of blood loss"));
188                 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(0, 1, s, _("Blood loss")));
189                         setDependent(e, "g_instagib", 0, 0);
190         me.TR(me);
191                 me.TDempty(me, 0.4);
192                 me.TD(me, 1, 1.6, s);
193         me.TR(me);
194                 me.TDempty(me, 0.2);
195                 s = makeXonoticSlider_T(80, 400, 8, "sv_gravity",
196                         _("Make things fall to the ground slower, lower value means lower gravity"));
197                         s.valueDigits = 0;
198                         s.valueDisplayMultiplier = 0.125; // show gravity in percent
199                 me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(800, 1, s, _("Low gravity")));
200                         e.savedValue = 200; // good on silvercity
201         me.TR(me);
202                 me.TDempty(me, 0.4);
203                 me.TD(me, 1, 1.6, s);
204         me.TR(me);
205                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon & item mutators:")));
206         me.TR(me);
207                 me.TDempty(me, 0.2);
208                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_grappling_hook", _("Grappling hook"),
209                         _("Players spawn with the grappling hook")));
210         me.TR(me);
211                 me.TDempty(me, 0.2);
212                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_jetpack", _("Jet pack"),
213                         _("Players spawn with the jetpack")));
214         me.TR(me);
215                 me.TDempty(me, 0.2);
216                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles")));
217                         setDependent(e, "g_instagib", 0, 0);
218         me.TR(me);
219                 me.TDempty(me, 0.2);
220                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_new_toys", _("New Toys")));
221                         setDependentWeird(e, checkCompatibility_newtoys);
222         me.TR(me);
223                 me.TDempty(me, 0.2);
224                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
225                         setDependent(e, "g_instagib", 0, 0);
226         me.TR(me);
227                 me.TDempty(me, 0.2);
228                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_pinata", _("Piñata"),
229                         _("Players will drop all weapons they possessed when they are killed")));
230                         setDependentWeird(e, checkCompatibility_pinata);
231         me.TR(me);
232                 me.TDempty(me, 0.2);
233                 me.TD(me, 1, 1.8, e = makeXonoticCheckBox_T(0, "g_weapon_stay", _("Weapons stay"),
234                         _("Weapons stay after they are picked up")));
235                         setDependentWeird(e, checkCompatibility_weaponstay);
236         me.TR(me);
237
238         me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
239                 me.TD(me, 1, 2, e = makeXonoticRadioButton(1, string_null, string_null, _("Regular (no arena)")));
240         string weaponarena_tooltip = strzone(_("Players will be given a set of weapons at spawn as well as unlimited ammo, without weapon pickups"));
241         me.TR(me);
242                 me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon arenas:")));
243         me.TR(me);
244                 me.TDempty(me, 0.2);
245                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "menu_weaponarena", _("Custom weapons"), weaponarena_tooltip));
246                         e.cvarValueIsAnotherCvar = true;
247                         e.cvarOffValue = "0";
248
249                 me.TDempty(me, 0.1); // fix initial position
250         for(i = WEP_FIRST, j = 0; i <= WEP_LAST; ++i)
251         {
252                 w = Weapons_from(i);
253                 if(w.spawnflags & WEP_FLAG_HIDDEN)
254                         continue;
255                 if((j & 1) == 0)
256                         me.TDempty(me, 0.2);
257                 else
258                 {
259                         me.TR(me);
260                         me.TDempty(me, 0.4);
261                 }
262                 me.TD(me, 1, 1.7, e = makeXonoticWeaponarenaCheckBox(strzone(w.netname), strzone(w.m_name)));
263                         setDependentWeird(e, checkCompatibility_weaponarena_weapon);
264                 ++j;
265         }
266
267         me.TR(me);
268                 me.TDempty(me, 0.2);
269                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "most", _("Most weapons"), weaponarena_tooltip));
270                         e.cvarOffValue = "0";
271         me.TR(me);
272                 me.TDempty(me, 0.2);
273                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_weaponarena", "all", _("All weapons"), weaponarena_tooltip));
274                         e.cvarOffValue = "0";
275         me.TR(me);
276                 me.TD(me, 1, 4, makeXonoticTextLabel(0, _("Special arenas:")));
277         me.TR(me);
278                 me.TDempty(me, 0.2);
279                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_instagib", "1", _("InstaGib"),
280                         _("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.")));
281                         e.cvarOffValue = "0";
282         me.TR(me);
283                 me.TDempty(me, 0.2);
284                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_nix", "1", _("NIX"),
285                         _("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.")));
286                         e.cvarOffValue = "0";
287         me.TR(me);
288                 me.TDempty(me, 0.4);
289                 me.TD(me, 1, 1.6, e = makeXonoticCheckBox_T(0, "g_nix_with_blaster", _("with blaster"),
290                         _("Always carry the blaster as an additional weapon in Nix")));
291                         setDependent(e, "g_nix", 1, 1);
292         me.TR(me);
293                 me.TDempty(me, 0.2);
294                 me.TD(me, 1, 1.8, e = makeXonoticRadioButton_T(1, "g_balance_blaster_weaponstartoverride", "0", _("No start weapons"), "-"));
295                         e.cvarOffValue = "-1";
296                         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");
297
298         me.gotoRC(me, me.rows - 1, 0);
299                 me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
300                         e.onClick = Dialog_Close;
301                         e.onClickEntity = me;
302 }
303
304 .void(entity) refilter;
305
306 void XonoticMutatorsDialog_close(entity me)
307 {
308         if(me.refilterEntity)
309                 me.refilterEntity.refilter(me.refilterEntity);
310         SUPER(XonoticMutatorsDialog).close(me);
311 }