]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_new_toys.qc
Rename minstanex to vaporizer
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_new_toys.qc
index 8a1eeabdd9a58eaa4195152b1a7d46c9aaf868ff..4a891e59f76033d29de0635ee8971174dc33ba2a 100644 (file)
@@ -1,10 +1,10 @@
 /*
 
 CORE    laser   nex     lg      rl      cry     gl      elec    hagar   fireb   hook
-                                                                       minsta  porto
+                                                                       vaporizer  porto
                                                                        tuba
 
-NEW             rifle   hlac    minel                           seeker   
+NEW             rifle   hlac    minel                           seeker
 IDEAS                                   OPEN    flak    OPEN            FUN FUN FUN FUN
 
 
@@ -13,7 +13,7 @@ How this mutator works:
  =======================
 
 When a gun tries to spawn, this mutator is called. It will provide alternate
-default values of weaponreplace lists.
+weaponreplace lists.
 
 Entity:
 
@@ -41,6 +41,8 @@ There will be two default replacements selectable: "replace all" and "replace ra
 In "replace all" mode, e.g. Nex will have the default replacement "rifle".
 In "replace random" mode, Nex will have the default replacement "nex rifle".
 
+This mutator's replacements run BEFORE regular weaponreplace!
+
 The New Toys guns do NOT get a spawn function, so they can only ever be spawned
 when this mutator is active.
 
@@ -53,13 +55,175 @@ Outside this mutator, they still can be spawned by:
 - weaponreplace
 - weaponarena (but all and most weapons arena again won't include them)
 
-Also, this mutator performs the default replacements on the DEFAULTS of the
+This mutator performs the default replacements on the DEFAULTS of the
 start weapon selection.
 
-Also: these weapons appear in the menu's priority list, BUT get a suffix
+These weapons appear in the menu's priority list, BUT get a suffix
 "(Mutator weapon)".
 
 Picking up a "new toys" weapon will not play standard weapon pickup sound, but
 roflsound "New toys, new toys!" sound.
 
 */
+
+.string new_toys;
+
+float autocvar_g_new_toys_autoreplace;
+#define NT_AUTOREPLACE_NEVER 0
+#define NT_AUTOREPLACE_ALWAYS 1
+#define NT_AUTOREPLACE_RANDOM 2
+
+MUTATOR_HOOKFUNCTION(nt_SetModname)
+{
+       modname = "NewToys";
+       return 0;
+}
+
+float nt_IsNewToy(float w)
+{
+       switch(w)
+       {
+               case WEP_SEEKER:
+               case WEP_MINE_LAYER:
+               case WEP_HLAC:
+               case WEP_RIFLE:
+               case WEP_SHOTGUN:
+                       return TRUE;
+               default:
+                       return FALSE;
+       }
+}
+
+string nt_GetFullReplacement(string w)
+{
+       switch(w)
+       {
+               case "hagar": return "seeker";
+               case "rocketlauncher": return "minelayer";
+               case "uzi": return "hlac";
+               case "nex": return "rifle";
+               case "shockwave": return "shotgun";
+               default: return string_null;
+       }
+}
+
+string nt_GetReplacement(string w, float m)
+{
+       if(m == NT_AUTOREPLACE_NEVER)
+               return w;
+       string s = nt_GetFullReplacement(w);
+       if (!s)
+               return w;
+       if(m == NT_AUTOREPLACE_RANDOM)
+               s = strcat(w, " ", s);
+       return s;
+}
+
+MUTATOR_HOOKFUNCTION(nt_SetStartItems)
+{
+       // rearrange start_weapon_default
+       // apply those bits that are set by start_weapon_defaultmask
+       // same for warmup
+
+       float i, j, k, n;
+
+       WepSet newdefault;
+       WepSet warmup_newdefault;
+
+       newdefault = '0 0 0';
+       warmup_newdefault = '0 0 0';
+
+       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+       {
+               entity e = get_weaponinfo(i);
+               if(!e.weapon)
+                       continue;
+
+               n = tokenize_console(nt_GetReplacement(e.netname, autocvar_g_new_toys_autoreplace));
+
+               for(j = 0; j < n; ++j)
+                       for(k = WEP_FIRST; k <= WEP_LAST; ++k)
+                               if(get_weaponinfo(k).netname == argv(j))
+                               {
+                                       if(start_weapons & WepSet_FromWeapon(i))
+                                               newdefault |= WepSet_FromWeapon(k);
+                                       if(warmup_start_weapons & WepSet_FromWeapon(i))
+                                               warmup_newdefault |= WepSet_FromWeapon(k);
+                               }
+       }
+
+       newdefault &= start_weapons_defaultmask;
+       start_weapons &= ~start_weapons_defaultmask;
+       start_weapons |= newdefault;
+
+       warmup_newdefault &= warmup_start_weapons_defaultmask;
+       warmup_start_weapons &= ~warmup_start_weapons_defaultmask;
+       warmup_start_weapons |= warmup_newdefault;
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nt_SetWeaponreplace)
+{
+       // otherwise, we do replace
+       if(self.new_toys)
+       {
+               // map defined replacement:
+               ret_string = self.new_toys;
+       }
+       else
+       {
+               // auto replacement:
+               ret_string = nt_GetReplacement(other.netname, autocvar_g_new_toys_autoreplace);
+       }
+
+       // apply regular weaponreplace
+       ret_string = W_Apply_Weaponreplace(ret_string);
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nt_FilterItem)
+{
+       if(nt_IsNewToy(self.weapon))
+               self.item_pickupsound = "weapons/weaponpickup_new_toys.wav";
+       return 0;
+}
+
+MUTATOR_DEFINITION(mutator_new_toys)
+{
+       MUTATOR_HOOK(SetModname, nt_SetModname, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SetStartItems, nt_SetStartItems, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SetWeaponreplace, nt_SetWeaponreplace, CBC_ORDER_LAST);
+       MUTATOR_HOOK(FilterItem, nt_FilterItem, CBC_ORDER_ANY);
+
+       MUTATOR_ONADD
+       {
+               if(time > 1) // game loads at time 1
+                       error("This cannot be added at runtime\n");
+
+               precache_sound("weapons/weaponpickup_new_toys.wav");
+
+               // mark the guns as ok to use by e.g. impulse 99
+               float i;
+               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+                       if(nt_IsNewToy(i))
+                               get_weaponinfo(i).spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
+       }
+
+       MUTATOR_ONROLLBACK_OR_REMOVE
+       {
+               float i;
+               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+                       if(nt_IsNewToy(i))
+                               get_weaponinfo(i).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
+       }
+
+       MUTATOR_ONREMOVE
+       {
+               print("This cannot be removed at runtime\n");
+               return -1;
+       }
+
+       return 0;
+}