]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add buffs, powerups, and items to the guide
authorotta8634 <k9wolf@pm.me>
Thu, 19 Dec 2024 08:45:08 +0000 (16:45 +0800)
committerotta8634 <k9wolf@pm.me>
Thu, 19 Dec 2024 08:45:08 +0000 (16:45 +0800)
Descriptions of buffs/powerups were somewhat based on https://gitlab.com/xonotic/xonotic/-/wikis/Buffs and https://gitlab.com/xonotic/xonotic/-/wikis/Powerups.

13 files changed:
qcsrc/common/items/item.qh
qcsrc/common/items/item/ammo.qh
qcsrc/common/items/item/armor.qh
qcsrc/common/items/item/health.qh
qcsrc/common/items/item/jetpack.qh
qcsrc/common/mutators/mutator/buffs/all.inc
qcsrc/common/mutators/mutator/buffs/buffs.qh
qcsrc/common/mutators/mutator/instagib/items.qh
qcsrc/common/mutators/mutator/powerups/powerup/invisibility.qh
qcsrc/common/mutators/mutator/powerups/powerup/shield.qh
qcsrc/common/mutators/mutator/powerups/powerup/speed.qh
qcsrc/common/mutators/mutator/powerups/powerup/strength.qh
qcsrc/common/mutators/mutator/powerups/powerups.qh

index 1b29d71bd526f773b2d0153e3e009dec3903ee39..b67c52371caf2866f655fe068c4a1e7726641c99 100644 (file)
@@ -132,6 +132,11 @@ CLASS(GameItem, Object)
     ATTRIB(GameItem, m_glow, bool, false);
     ATTRIB(GameItem, m_respawnsound, Sound, SND_ITEMRESPAWN);
 #endif
+    METHOD(GameItem, describe, string(GameItem this))
+    {
+        TC(GameItem, this);
+        return SUPER(Object).describe(this);
+    }
     METHOD(GameItem, display, void(GameItem this, void(string name, string icon) returns))
     {
         TC(GameItem, this);
index c9688a282330c8fb97f926132f0ac7139e4a4b34..5b2b8fdf43d18ec446dea6453db96231979f6410 100644 (file)
@@ -23,6 +23,11 @@ CLASS(Ammo, Pickup)
     ATTRIB(Ammo, m_respawntimejitter, float(), GET(g_pickup_respawntimejitter_ammo));
     ATTRIB(Ammo, m_pickupanyway, float(), GET(g_pickup_ammo_anyway));
 #endif
+    METHOD(Ammo, describe, string(Ammo this))
+    {
+        TC(Ammo, this);
+        return SUPER(Pickup).describe(this);
+    }
 ENDCLASS(Ammo)
 
 
@@ -44,6 +49,11 @@ void ammo_shells_init(Pickup this, entity item)
 #endif
 
 CLASS(Shells, Ammo)
+    METHOD(Shells, describe, string(Shells this))
+    {
+        TC(Shells, this);
+        return _("The Shells ammo type is used by the Shotgun and Overkill Shotgun");
+    }
 ENDCLASS(Shells)
 
 REGISTER_ITEM(Shells, Shells) {
@@ -80,6 +90,11 @@ void ammo_bullets_init(Pickup this, entity item)
 #endif
 
 CLASS(Bullets, Ammo)
+    METHOD(Bullets, describe, string(Bullets this))
+    {
+        TC(Bullets, this);
+        return _("The Bullets ammo type is used by the MachineGun, Rifle, Overkill MachineGun, and Overkill Heavy Machine Gun");
+    }
 ENDCLASS(Bullets)
 
 REGISTER_ITEM(Bullets, Bullets) {
@@ -114,7 +129,16 @@ void ammo_rockets_init(Pickup this, entity item)
         SetResourceExplicit(item, RES_ROCKETS, g_pickup_rockets);
 }
 #endif
-REGISTER_ITEM(Rockets, Ammo) {
+
+CLASS(Rockets, Ammo)
+    METHOD(Rockets, describe, string(Rockets this))
+    {
+        TC(Rockets, this);
+        return _("The Rockets ammo type is used by the Devastator, Mortar, Mine Layer, Hagar, T.A.G. Seeker, and Overkill Rocket Propelled Chainsaw");
+    }
+ENDCLASS(Rockets)
+
+REGISTER_ITEM(Rockets, Rockets) {
     this.m_canonical_spawnfunc = "item_rockets";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -146,7 +170,16 @@ void ammo_cells_init(Pickup this, entity item)
         SetResourceExplicit(item, RES_CELLS, g_pickup_cells);
 }
 #endif
-REGISTER_ITEM(Cells, Ammo) {
+
+CLASS(Cells, Ammo)
+    METHOD(Cells, describe, string(Cells this))
+    {
+        TC(Cells, this);
+        return _("The Cells ammo type is used by the Vortex, Crylink, Electro, Heavy Laser Assault Cannon, Arc, and Vaporizer");
+    }
+ENDCLASS(Cells)
+
+REGISTER_ITEM(Cells, Cells) {
     this.m_canonical_spawnfunc = "item_cells";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
index b8c3b408f942c6816e7d67c74680a712cc16a18c..c45079f10683d78683e8a6f9a1d99a4dccbc90c7 100644 (file)
@@ -12,6 +12,7 @@ ENDCLASS(Armor)
     #include <server/items/items.qh>
 #endif
 
+// small armor
 #ifdef GAMEQC
 MODEL(ArmorSmall_ITEM, Item_Model("item_armor_small.md3"));
 SOUND(ArmorSmall, Item_Sound("armor1"));
@@ -29,7 +30,16 @@ void item_armorsmall_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(ArmorSmall, Armor) {
+CLASS(ArmorSmall, Armor)
+    METHOD(ArmorSmall, describe, string(ArmorSmall this))
+    {
+        TC(ArmorSmall, this);
+        return _("The Small armor provides you a small amount of armor when picked up, "
+                 "protecting you from damage by absorbing incoming hits until it is depleted");
+    }
+ENDCLASS(ArmorSmall)
+
+REGISTER_ITEM(ArmorSmall, ArmorSmall) {
     this.m_canonical_spawnfunc = "item_armor_small";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -56,6 +66,7 @@ REGISTER_ITEM(ArmorSmall, Armor) {
 
 SPAWNFUNC_ITEM(item_armor_small, ITEM_ArmorSmall)
 
+// medium armor
 #ifdef GAMEQC
 MODEL(ArmorMedium_ITEM, Item_Model("item_armor_medium.md3"));
 SOUND(ArmorMedium, Item_Sound("armor10"));
@@ -73,7 +84,16 @@ void item_armormedium_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(ArmorMedium, Armor) {
+CLASS(ArmorMedium, Armor)
+    METHOD(ArmorMedium, describe, string(ArmorMedium this))
+    {
+        TC(ArmorMedium, this);
+        return _("The Medium armor provides you a medium amount of armor when picked up, "
+                 "protecting you from damage by absorbing incoming hits until it is depleted");
+    }
+ENDCLASS(ArmorMedium)
+
+REGISTER_ITEM(ArmorMedium, ArmorMedium) {
     this.m_canonical_spawnfunc = "item_armor_medium";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -100,6 +120,7 @@ REGISTER_ITEM(ArmorMedium, Armor) {
 
 SPAWNFUNC_ITEM(item_armor_medium, ITEM_ArmorMedium)
 
+// big armor
 #ifdef GAMEQC
 MODEL(ArmorBig_ITEM, Item_Model("item_armor_big.md3"));
 SOUND(ArmorBig, Item_Sound("armor17_5"));
@@ -117,7 +138,16 @@ void item_armorbig_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(ArmorBig, Armor) {
+CLASS(ArmorBig, Armor)
+    METHOD(ArmorBig, describe, string(ArmorBig this))
+    {
+        TC(ArmorBig, this);
+        return _("The Big armor provides you a large amount of armor when picked up, "
+                 "protecting you from damage by absorbing incoming hits until it is depleted");
+    }
+ENDCLASS(ArmorBig)
+
+REGISTER_ITEM(ArmorBig, ArmorBig) {
     this.m_canonical_spawnfunc = "item_armor_big";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -144,6 +174,7 @@ REGISTER_ITEM(ArmorBig, Armor) {
 
 SPAWNFUNC_ITEM(item_armor_big, ITEM_ArmorBig)
 
+// mega armor
 #ifdef GAMEQC
 MODEL(ArmorMega_ITEM, Item_Model("item_armor_large.md3"));
 SOUND(ArmorMega, Item_Sound("armor25"));
@@ -161,7 +192,17 @@ void item_armormega_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(ArmorMega, Armor) {
+CLASS(ArmorMega, Armor)
+    METHOD(ArmorMega, describe, string(ArmorMega this))
+    {
+        TC(ArmorMega, this);
+        return _("The Mega armor provides you a huge amount of armor when picked up, "
+                 "protecting you from damage by absorbing incoming hits until it is depleted\n\n"
+                        "It tends to be one of the most highly contested items on a map, particularly in game modes like Duel");
+    }
+ENDCLASS(ArmorMega)
+
+REGISTER_ITEM(ArmorMega, ArmorMega) {
     this.m_canonical_spawnfunc = "item_armor_mega";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
index a028f28c33142b7a10136b015868ce05c2800bc0..5a85beb97e376f0f16836ac846897c3a23b8d13d 100644 (file)
@@ -12,6 +12,7 @@ ENDCLASS(Health)
     #include <server/items/items.qh>
 #endif
 
+// small health
 #ifdef GAMEQC
 MODEL(HealthSmall_ITEM, Item_Model("g_h1.md3"));
 SOUND(HealthSmall, Item_Sound("minihealth"));
@@ -29,7 +30,16 @@ void item_healthsmall_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(HealthSmall, Health) {
+CLASS(HealthSmall, Health)
+    METHOD(HealthSmall, describe, string(HealthSmall this))
+    {
+        TC(HealthSmall, this);
+        return _("The Small health restores a small amount of health when picked up, "
+                 "helping you recover from damage taken during combat");
+    }
+ENDCLASS(HealthSmall)
+
+REGISTER_ITEM(HealthSmall, HealthSmall) {
     this.m_canonical_spawnfunc = "item_health_small";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -51,12 +61,12 @@ REGISTER_ITEM(HealthSmall, Health) {
     this.m_respawntimejitter    =   GET(g_pickup_respawntimejitter_health_small);
     this.m_pickupanyway         =   GET(g_pickup_healthsmall_anyway);
     this.m_iteminit             =   item_healthsmall_init;
-
 #endif
 }
 
 SPAWNFUNC_ITEM(item_health_small, ITEM_HealthSmall)
 
+// medium health
 #ifdef GAMEQC
 MODEL(HealthMedium_ITEM, Item_Model("g_h25.md3"));
 SOUND(HealthMedium, Item_Sound("mediumhealth"));
@@ -74,7 +84,16 @@ void item_healthmedium_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(HealthMedium, Health) {
+CLASS(HealthMedium, Health)
+    METHOD(HealthMedium, describe, string(HealthMedium this))
+    {
+        TC(HealthMedium, this);
+        return _("The Medium health restores a medium amount of health when picked up, "
+                 "helping you recover from damage taken during combat");
+    }
+ENDCLASS(HealthMedium)
+
+REGISTER_ITEM(HealthMedium, HealthMedium) {
     this.m_canonical_spawnfunc = "item_health_medium";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -101,6 +120,7 @@ REGISTER_ITEM(HealthMedium, Health) {
 
 SPAWNFUNC_ITEM(item_health_medium, ITEM_HealthMedium)
 
+// big health
 #ifdef GAMEQC
 MODEL(HealthBig_ITEM, Item_Model("g_h50.md3"));
 SOUND(HealthBig, Item_Sound("mediumhealth"));
@@ -118,7 +138,16 @@ void item_healthbig_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(HealthBig, Health) {
+CLASS(HealthBig, Health)
+    METHOD(HealthBig, describe, string(HealthBig this))
+    {
+        TC(HealthBig, this);
+        return _("The Big health restores a large amount of health when picked up, "
+                 "helping you recover from damage taken during combat");
+    }
+ENDCLASS(HealthBig)
+
+REGISTER_ITEM(HealthBig, HealthBig) {
     this.m_canonical_spawnfunc = "item_health_big";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -162,7 +191,17 @@ void item_healthmega_init(Pickup this, entity item)
 }
 #endif
 
-REGISTER_ITEM(HealthMega, Health) {
+CLASS(HealthMega, Health)
+    METHOD(HealthMega, describe, string(HealthMega this))
+    {
+        TC(HealthMega, this);
+        return _("The Mega health restores a huge amount of health when picked up, "
+                 "helping you recover from damage taken during combat\n\n"
+                        "It tends to be one of the most highly contested items on a map, particularly in game modes like Duel");
+    }
+ENDCLASS(HealthMega)
+
+REGISTER_ITEM(HealthMega, HealthMega) {
     this.m_canonical_spawnfunc = "item_health_mega";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
index ca52f5466111e28b0429d64cbeb4714d211d1124..1f6ad365bbfd00cd907393066a316e4a5c6c4a89 100644 (file)
@@ -11,6 +11,7 @@
 .int m_itemid;
 #endif
 
+// jetpack powerup
 #ifdef GAMEQC
 MODEL(Jetpack_ITEM, Item_Model("g_jetpack.md3"));
 #endif
@@ -29,6 +30,13 @@ void powerup_jetpack_init(Pickup def, entity item)
 #endif
 
 CLASS(Jetpack, Powerup)
+    METHOD(Jetpack, describe, string(Jetpack this))
+    {
+        TC(Jetpack, this);
+        return _("The Jetpack allows you to fly around the map for a short period, "
+                 "providing increased mobility, maneuverability, and the ability to reach higher ground\n\n"
+                 "It consumes Fuel ammo while operating, so make sure you don't run out when you're high up!");
+    }
 ENDCLASS(Jetpack)
 
 REGISTER_ITEM(Jetpack, Jetpack) {
@@ -53,10 +61,19 @@ REGISTER_ITEM(Jetpack, Jetpack) {
 
 SPAWNFUNC_ITEM(item_jetpack, ITEM_Jetpack)
 
+// fuel ammo
 #ifdef GAMEQC
 MODEL(JetpackFuel_ITEM, Item_Model("g_fuel.md3"));
 #endif
 
+CLASS(JetpackFuel, Ammo)
+    METHOD(JetpackFuel, describe, string(JetpackFuel this))
+    {
+        TC(JetpackFuel, this);
+        return _("The Fuel ammo type is used by the Jetpack");
+    }
+ENDCLASS(JetpackFuel)
+
 #ifdef SVQC
 PROPERTY(int, g_pickup_fuel);
 void ammo_fuel_init(Pickup this, entity item)
@@ -65,7 +82,7 @@ void ammo_fuel_init(Pickup this, entity item)
         SetResourceExplicit(item, RES_FUEL, g_pickup_fuel);
 }
 #endif
-REGISTER_ITEM(JetpackFuel, Ammo) {
+REGISTER_ITEM(JetpackFuel, JetpackFuel) {
     this.m_canonical_spawnfunc = "item_fuel";
 #ifdef GAMEQC
        this.spawnflags = ITEM_FLAG_NORMAL | ITEM_FLAG_RESOURCE;
@@ -83,6 +100,7 @@ REGISTER_ITEM(JetpackFuel, Ammo) {
 
 SPAWNFUNC_ITEM(item_fuel, ITEM_JetpackFuel)
 
+// fuel regenerator powerup
 #ifdef GAMEQC
 MODEL(JetpackRegen_ITEM, Item_Model("g_fuelregen.md3"));
 #endif
@@ -97,6 +115,13 @@ void powerup_fuelregen_init(Pickup def, entity item)
 #endif
 
 CLASS(JetpackRegen, Powerup)
+    METHOD(JetpackRegen, describe, string(JetpackRegen this))
+    {
+        TC(JetpackRegen, this);
+        return _("The Fuel Regenerator powerup regenerates Fuel needed for the Jetpack until the powerup expires, "
+                 "so you can continue flying around for longer"
+                 "Since it is a powerup, it will drop if you die while holding it");
+    }
 ENDCLASS(JetpackRegen)
 
 REGISTER_ITEM(JetpackRegen, JetpackRegen) {
index a5127a1539818e44d7c48e86cf244262b402d9dc..7ec8cfc228d00aee1ff7de541330558820ff050f 100644 (file)
@@ -21,8 +21,13 @@ CLASS(AmmoBuff, Buff)
     ATTRIB(AmmoBuff, m_icon, string, "buff_ammo");
     ATTRIB(AmmoBuff, m_skin, int, 3);
     ATTRIB(AmmoBuff, m_color, vector, '0.76 1 0.1');
+    METHOD(AmmoBuff, describe, string(AmmoBuff this))
+    {
+        TC(AmmoBuff, this);
+        return _("The Ammo Buff gives you infinite ammo until the buff expires, so you don't need to worry about running out of ammo");
+    }
 ENDCLASS(AmmoBuff)
-REGISTER_BUFF(AMMO, NEW(AmmoBuff));
+REGISTER_BUFF(AMMO, AmmoBuff);
 BUFF_SPAWNFUNCS(ammo, BUFF_AMMO)
 BUFF_SPAWNFUNC_Q3COMPAT(item_ammoregen, BUFF_AMMO)
 
@@ -32,8 +37,13 @@ CLASS(ResistanceBuff, Buff)
     ATTRIB(ResistanceBuff, m_icon, string, "buff_resistance");
     ATTRIB(ResistanceBuff, m_skin, int, 0);
     ATTRIB(ResistanceBuff, m_color, vector, '0.36 1 0.07');
+    METHOD(ResistanceBuff, describe, string(ResistanceBuff this))
+    {
+        TC(ResistanceBuff, this);
+        return _("The Resistance Buff greatly reduces your damage taken while the buff is active");
+    }
 ENDCLASS(ResistanceBuff)
-REGISTER_BUFF(RESISTANCE, NEW(ResistanceBuff));
+REGISTER_BUFF(RESISTANCE, ResistanceBuff);
 BUFF_SPAWNFUNCS(resistance, BUFF_RESISTANCE)
 BUFF_SPAWNFUNC_Q3COMPAT(item_guard, BUFF_RESISTANCE)
 
@@ -43,8 +53,14 @@ CLASS(MedicBuff, Buff)
     ATTRIB(MedicBuff, m_icon, string, "buff_medic");
     ATTRIB(MedicBuff, m_skin, int, 1);
     ATTRIB(MedicBuff, m_color, vector, '1 0.12 0');
+    METHOD(MedicBuff, describe, string(MedicBuff this))
+    {
+        TC(MedicBuff, this);
+        return _("The Medic Buff increases health regeneration speed, increases the maximum health you can have before health starts to rot, and reduces health rot speed until the buff expires\n\n"
+                 "It also gives you a chance to survive a fatal hit, with a small amount of health left over");
+    }
 ENDCLASS(MedicBuff)
-REGISTER_BUFF(MEDIC, NEW(MedicBuff));
+REGISTER_BUFF(MEDIC, MedicBuff);
 BUFF_SPAWNFUNCS(medic, BUFF_MEDIC)
 BUFF_SPAWNFUNC_Q3COMPAT(item_regen, BUFF_MEDIC)
 BUFF_SPAWNFUNC_Q3COMPAT(item_revival, BUFF_MEDIC)
@@ -55,8 +71,14 @@ CLASS(BashBuff, Buff)
     ATTRIB(BashBuff, m_icon, string, "buff_bash");
     ATTRIB(BashBuff, m_skin, int, 5);
     ATTRIB(BashBuff, m_color, vector, '1 0.39 0');
+    METHOD(BashBuff, describe, string(BashBuff this))
+    {
+        TC(BashBuff, this);
+        return _("The Bash Buff increases knockback force you deal, and makes you immune to knockback while the buff is active\n\n"
+                 "It also slightly increases knockback you deal to yourself");
+    }
 ENDCLASS(BashBuff)
-REGISTER_BUFF(BASH, NEW(BashBuff));
+REGISTER_BUFF(BASH, BashBuff);
 BUFF_SPAWNFUNCS(bash, BUFF_BASH)
 BUFF_SPAWNFUNC_Q3COMPAT(item_scout, BUFF_BASH)
 
@@ -66,8 +88,13 @@ CLASS(VampireBuff, Buff)
     ATTRIB(VampireBuff, m_icon, string, "buff_vampire");
     ATTRIB(VampireBuff, m_skin, int, 2);
     ATTRIB(VampireBuff, m_color, vector, '1 0 0.24');
+    METHOD(VampireBuff, describe, string(VampireBuff this))
+    {
+        TC(VampireBuff, this);
+        return _("The Vampire Buff converts some of the damage you deal to enemies and monsters into health for yourself, until the buff expires");
+    }
 ENDCLASS(VampireBuff)
-REGISTER_BUFF(VAMPIRE, NEW(VampireBuff));
+REGISTER_BUFF(VAMPIRE, VampireBuff);
 BUFF_SPAWNFUNCS(vampire, BUFF_VAMPIRE)
 BUFF_SPAWNFUNC_Q3COMPAT(holdable_invulnerability, BUFF_VAMPIRE)
 
@@ -77,8 +104,14 @@ CLASS(DisabilityBuff, Buff)
     ATTRIB(DisabilityBuff, m_icon, string, "buff_disability");
     ATTRIB(DisabilityBuff, m_skin, int, 7);
     ATTRIB(DisabilityBuff, m_color, vector, '0.94 0.3 1');
+    METHOD(DisabilityBuff, describe, string(DisabilityBuff this))
+    {
+        TC(DisabilityBuff, this);
+        return _("The Disability Buff causes your enemies and monsters to slow down for a few seconds when you attack them, while the buff is active\n\n"
+                 "This is particularly useful against speedy players, especially in Capture The Flag");
+    }
 ENDCLASS(DisabilityBuff)
-REGISTER_BUFF(DISABILITY, NEW(DisabilityBuff));
+REGISTER_BUFF(DISABILITY, DisabilityBuff);
 BUFF_SPAWNFUNCS(disability, BUFF_DISABILITY)
 
 CLASS(VengeanceBuff, Buff)
@@ -87,8 +120,13 @@ CLASS(VengeanceBuff, Buff)
     ATTRIB(VengeanceBuff, m_icon, string, "buff_vengeance");
     ATTRIB(VengeanceBuff, m_skin, int, 15);
     ATTRIB(VengeanceBuff, m_color, vector, '1 0.23 0.61');
+    METHOD(VengeanceBuff, describe, string(VengeanceBuff this))
+    {
+        TC(VengeanceBuff, this);
+        return _("The Vengeance Buff reciprocates a portion of the damage enemies deal to you onto them, until the buff expires");
+    }
 ENDCLASS(VengeanceBuff)
-REGISTER_BUFF(VENGEANCE, NEW(VengeanceBuff));
+REGISTER_BUFF(VENGEANCE, VengeanceBuff);
 BUFF_SPAWNFUNCS(vengeance, BUFF_VENGEANCE)
 BUFF_SPAWNFUNC_Q3COMPAT(holdable_kamikaze, BUFF_VENGEANCE)
 
@@ -98,8 +136,13 @@ CLASS(JumpBuff, Buff)
     ATTRIB(JumpBuff, m_icon, string, "buff_jump");
     ATTRIB(JumpBuff, m_skin, int, 10);
     ATTRIB(JumpBuff, m_color, vector, '0.24 0.78 1');
+    METHOD(JumpBuff, describe, string(JumpBuff this))
+    {
+        TC(JumpBuff, this);
+        return _("The Jump Buff greatly increases your jump height, while the buff is active");
+    }
 ENDCLASS(JumpBuff)
-REGISTER_BUFF(JUMP, NEW(JumpBuff));
+REGISTER_BUFF(JUMP, JumpBuff);
 BUFF_SPAWNFUNCS(jump, BUFF_JUMP)
 BUFF_SPAWNFUNC_Q3COMPAT(item_jumper, BUFF_JUMP)
 
@@ -109,8 +152,13 @@ CLASS(InfernoBuff, Buff)
     ATTRIB(InfernoBuff, m_icon, string, "buff_inferno");
     ATTRIB(InfernoBuff, m_skin, int, 16);
     ATTRIB(InfernoBuff, m_color, vector, '1 0.62 0');
+    METHOD(InfernoBuff, describe, string(InfernoBuff this))
+    {
+        TC(InfernoBuff, this);
+        return _("The Inferno Buff sets any enemies or monsters you attack alight, dealing burn damage to them for several seconds until the buff expires");
+    }
 ENDCLASS(InfernoBuff)
-REGISTER_BUFF(INFERNO, NEW(InfernoBuff));
+REGISTER_BUFF(INFERNO, InfernoBuff);
 BUFF_SPAWNFUNCS(inferno, BUFF_INFERNO)
 BUFF_SPAWNFUNC_Q3COMPAT(item_doubler, BUFF_INFERNO)
 
@@ -120,8 +168,14 @@ CLASS(SwapperBuff, Buff)
     ATTRIB(SwapperBuff, m_icon, string, "buff_swapper");
     ATTRIB(SwapperBuff, m_skin, int, 17);
     ATTRIB(SwapperBuff, m_color, vector, '0.63 0.36 1');
+    METHOD(SwapperBuff, describe, string(SwapperBuff this))
+    {
+        TC(SwapperBuff, this);
+        return _("The Swapper Buff allows you to press the \"dropweapon\" bind to switch places with a nearby enemy once\n\n"
+                 "A common usage of this Buff is to jump over the map's void, then swap with an enemy, to cause them to fall into the void");
+    }
 ENDCLASS(SwapperBuff)
-REGISTER_BUFF(SWAPPER, NEW(SwapperBuff));
+REGISTER_BUFF(SWAPPER, SwapperBuff);
 BUFF_SPAWNFUNCS(swapper, BUFF_SWAPPER)
 BUFF_SPAWNFUNC_Q3COMPAT(holdable_teleporter, BUFF_SWAPPER)
 
@@ -131,8 +185,13 @@ CLASS(MagnetBuff, Buff)
     ATTRIB(MagnetBuff, m_icon, string, "buff_magnet");
     ATTRIB(MagnetBuff, m_skin, int, 18);
     ATTRIB(MagnetBuff, m_color, vector, '1 0.95 0.18');
+    METHOD(MagnetBuff, describe, string(MagnetBuff this))
+    {
+        TC(MagnetBuff, this);
+        return _("The Magnet Buff greatly increases your item pickup range, collecting nearby items for you while the buff is active");
+    }
 ENDCLASS(MagnetBuff)
-REGISTER_BUFF(MAGNET, NEW(MagnetBuff));
+REGISTER_BUFF(MAGNET, MagnetBuff);
 BUFF_SPAWNFUNCS(magnet, BUFF_MAGNET)
 
 CLASS(LuckBuff, Buff)
@@ -141,8 +200,13 @@ CLASS(LuckBuff, Buff)
     ATTRIB(LuckBuff, m_icon, string, "buff_luck");
     ATTRIB(LuckBuff, m_skin, int, 19);
     ATTRIB(LuckBuff, m_color, vector, '1 0.23 0.44');
+    METHOD(LuckBuff, describe, string(LuckBuff this))
+    {
+        TC(LuckBuff, this);
+        return _("While you have the Luck Buff, each attack has a chance of being a critical hit with greatly increased damage");
+    }
 ENDCLASS(LuckBuff)
-REGISTER_BUFF(LUCK, NEW(LuckBuff));
+REGISTER_BUFF(LUCK, LuckBuff);
 BUFF_SPAWNFUNCS(luck, BUFF_LUCK)
 
 CLASS(FlightBuff, Buff)
@@ -151,7 +215,12 @@ CLASS(FlightBuff, Buff)
     ATTRIB(FlightBuff, m_icon, string, "buff_flight");
     ATTRIB(FlightBuff, m_skin, int, 11);
     ATTRIB(FlightBuff, m_color, vector, '0.23 0.44 1');
+    METHOD(FlightBuff, describe, string(FlightBuff this))
+    {
+        TC(FlightBuff, this);
+        return _("While you have the Flight Buff, you can crouch while midair to switch your gravity, allowing flight");
+    }
 ENDCLASS(FlightBuff)
-REGISTER_BUFF(FLIGHT, NEW(FlightBuff));
+REGISTER_BUFF(FLIGHT, FlightBuff);
 BUFF_SPAWNFUNCS(flight, BUFF_FLIGHT)
 BUFF_SPAWNFUNC_Q3COMPAT(item_flight, BUFF_FLIGHT)
index a14ad6bb8cdb4e6062cbae72c7244b527bee6177..ca58b15d4dd84bd9c23105f10a113d108e934bb3 100644 (file)
@@ -8,8 +8,7 @@
 #include <common/mutators/mutator/waypoints/all.qh>
 #endif
 
-#define REGISTER_BUFF(id, inst) \
-    REGISTER(StatusEffect, BUFF_##id, m_id, inst)
+#define REGISTER_BUFF(id, class) REGISTER(StatusEffect, BUFF_##id, m_id, NEW(class))
 
 #include <common/mutators/mutator/status_effects/_mod.qh>
 CLASS(Buff, StatusEffects)
@@ -28,8 +27,14 @@ CLASS(Buff, StatusEffects)
        }
 #ifdef SVQC
        METHOD(Buff, m_time, float(Buff this))
-       { return cvar(strcat("g_buffs_", this.netname, "_time")); }
+       {
+               return cvar(strcat("g_buffs_", this.netname, "_time"));
+       }
 #endif
+       METHOD(Buff, describe, string(Buff this)) {
+               TC(Buff, this);
+               return SUPER(Object).describe(this);
+       }
 ENDCLASS(Buff)
 
 STATIC_INIT(REGISTER_BUFFS) {
index 9be156bb30da9e518e7a2a6026fbe439a23759e3..1ac8d1b3019528e6540e0d3e15d01f87cb25f8bf 100644 (file)
@@ -22,7 +22,16 @@ void ammo_vaporizercells_init(Pickup this, entity item)
         SetResourceExplicit(item, RES_CELLS, autocvar_g_instagib_ammo_drop);
 }
 #endif
-REGISTER_ITEM(VaporizerCells, Ammo) {
+
+CLASS(VaporizerCells, Ammo)
+    METHOD(VaporizerCells, describe, string(VaporizerCells this))
+    {
+        TC(VaporizerCells, this);
+        return _("The Vaporizer ammo is sometimes present on maps when InstaGib is enabled, providing ammo for the Vaporizer");
+    }
+ENDCLASS(VaporizerCells)
+
+REGISTER_ITEM(VaporizerCells, VaporizerCells) {
     this.m_canonical_spawnfunc = "item_vaporizer_cells";
 #ifdef GAMEQC
     this.spawnflags = ITEM_FLAG_MUTATORBLOCKED;
@@ -49,7 +58,16 @@ MODEL(ExtraLife_ITEM, Item_Model("g_h100.md3"));
 SOUND(ExtraLife, Item_Sound("megahealth"));
 #endif
 
-REGISTER_ITEM(ExtraLife, Powerup) {
+CLASS(ExtraLife, Powerup)
+    METHOD(ExtraLife, describe, string(ExtraLife this))
+    {
+        TC(ExtraLife, this);
+        return _("The Extra Life powerup acts as armor in InstaGib. "
+                 "If a player is shot while having one or more Extra Lives, they will survive the shot but suffer strong knockback");
+    }
+ENDCLASS(ExtraLife)
+
+REGISTER_ITEM(ExtraLife, ExtraLife) {
     this.m_canonical_spawnfunc = "item_extralife";
 #ifdef GAMEQC
        this.m_model                =   MDL_ExtraLife_ITEM;
index 690abb5ca2fe207b7fb41bd7c6ac7af82bcc7786..dabf7f48c4b1e1bd7f4d84f0f9b3b403016acc42 100644 (file)
@@ -58,5 +58,12 @@ CLASS(Invisibility, Powerups)
     ATTRIB(Invisibility, m_name, string, _("Invisibility"));
     ATTRIB(Invisibility, m_color, vector, '0.5 0.5 1');
     ATTRIB(Invisibility, m_icon, string, "buff_invisible");
+    METHOD(Invisibility, describe, string(Invisibility this))
+    {
+        TC(Invisibility, this);
+        return _("The Invisibility powerup increases your translucency while the powerup is active, making it more difficult for enemies to see you. "
+                 "This powerup is often present in InstaGib\n\n"
+                 "Since it is a powerup, it will drop if you die while holding it");
+    }
 ENDCLASS(Invisibility)
 REGISTER_STATUSEFFECT(Invisibility, NEW(Invisibility));
index de2f5dc29a40b544cce37631070c358460b731fb..4e184eb1ecfbaba71e1ddaad38bb7ee3c91a4ac6 100644 (file)
@@ -55,5 +55,12 @@ CLASS(Shield, Powerups)
     ATTRIB(Shield, netname, string, "invincible"); // NOTE: referring to as invincible so that it matches the powerup item
     ATTRIB(Shield, m_name, string, _("Shield"));
     ATTRIB(Shield, m_icon, string, "shield");
+    METHOD(Shield, describe, string(Shield this))
+    {
+        TC(Shield, this);
+        return _("The Shield powerup greatly decreases the damage you take until the powerup expires, having a compounding effect with armor. "
+                 "It also makes you more resistant to knockback\n\n"
+                 "Since it is a powerup, it will drop if you die while holding it");
+    }
 ENDCLASS(Shield)
 REGISTER_STATUSEFFECT(Shield, NEW(Shield));
index 38010e480b1c723b5d0449ef0616ad0629cd3c4b..633c7b1bfc50082ea39d0aeaf6fa216fc3ad8118 100644 (file)
@@ -59,5 +59,12 @@ CLASS(Speed, Powerups)
     ATTRIB(Speed, m_name, string, _("Speed"));
     ATTRIB(Speed, m_color, vector, '0.1 1 0.84');
     ATTRIB(Speed, m_icon, string, "buff_speed");
+    METHOD(Speed, describe, string(Speed this))
+    {
+        TC(Speed, this);
+        return _("The Speed powerup increases your movement speed, attack speed, and health regeneration speed while the powerup is active. "
+                 "However, it also makes you a bit more vulnerable to incoming attacks\n\n"
+                 "Since it is a powerup, it will drop if you die while holding it");
+    }
 ENDCLASS(Speed)
 REGISTER_STATUSEFFECT(Speed, NEW(Speed));
index 79ef229f1cbbf751b5b0a39ac5b76ab7f6fa70d4..a3af05f5eb4befc7f9e4cf5d0990e7df04684daf 100644 (file)
@@ -56,5 +56,13 @@ CLASS(Strength, Powerups)
     ATTRIB(Strength, netname, string, "strength");
     ATTRIB(Strength, m_name, string, _("Strength"));
     ATTRIB(Strength, m_icon, string, "strength");
+    METHOD(Strength, describe, string(Strength this))
+    {
+        TC(Strength, this);
+        return _("The Strength powerup greatly increases the damage you deal, until the powerup expires. "
+                 "It also increases the knockback that your attacks deal\n\n"
+                 "The damage and knockback you deal to yourself also increases but by a smaller amount\n\n"
+                 "Since it is a powerup, it will drop if you die while holding it");
+    }
 ENDCLASS(Strength)
 REGISTER_STATUSEFFECT(Strength, NEW(Strength));
index ecd754672d3bbed1e9fbe544a71b4065e8b2bd2c..745842fcc51e43ee56d94f4042f1d2d286af7ddf 100644 (file)
@@ -16,4 +16,9 @@ CLASS(Powerups, StatusEffects)
 #ifdef GAMEQC
     ATTRIB(Powerups, m_sound_rm, Sound, SND_POWEROFF);
 #endif
+    METHOD(Powerups, describe, string(Powerups this))
+    {
+        TC(Powerups, this);
+        return SUPER(Object).describe(this);
+    }
 ENDCLASS(Powerups)