]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add ability for +VVEDIT users to scale damage/healing in the game (#35255)
authorSlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Tue, 18 Feb 2025 07:28:42 +0000 (08:28 +0100)
committerGitHub <noreply@github.com>
Tue, 18 Feb 2025 07:28:42 +0000 (08:28 +0100)
* Initial commit

* Add universal modifier for all damage/heals, make guidebooks work.

* help text

16 files changed:
Content.Client/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs
Content.Server/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs
Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs
Content.Server/EntityEffects/Effects/HealthChange.cs
Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs
Content.Server/Medical/HealingSystem.cs
Content.Server/Projectiles/ProjectileSystem.cs
Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs
Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs
Content.Server/Weapons/Ranged/Systems/GunSystem.cs
Content.Shared/CCVar/CCVars.Playtest.cs [new file with mode: 0644]
Content.Shared/Chemistry/SharedChemistryGuideDataSystem.cs
Content.Shared/Damage/Systems/DamageableSystem.cs
Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs
Resources/Locale/en-US/cvar/cvar-help.ftl

index 7c7d824ee981aafbb66e1a722cbe809e4074bf66..4c3a583b2aacffd416b92f292e979809e06440e5 100644 (file)
@@ -141,6 +141,11 @@ public sealed class ChemistryGuideDataSystem : SharedChemistryGuideDataSystem
     {
         return _reagentSources.GetValueOrDefault(id) ?? new List<ReagentSourceData>();
     }
+
+    // Is handled on server and updated on client via ReagentGuideRegistryChangedEvent
+    public override void ReloadAllReagentPrototypes()
+    {
+    }
 }
 
 /// <summary>
index e2cd72030de7cc5cb56b8bf0752702b74f8e9aa5..e72fd34cd88f0a4a505ab9efc87e2200c9da6d90 100644 (file)
@@ -64,4 +64,9 @@ public sealed class ChemistryGuideDataSystem : SharedChemistryGuideDataSystem
         var ev = new ReagentGuideRegistryChangedEvent(changeset);
         RaiseNetworkEvent(ev);
     }
+
+    public override void ReloadAllReagentPrototypes()
+    {
+        InitializeServerRegistry();
+    }
 }
index 50c69f382973e93812608dcd32c43cfc9982e227..b1f5365b016eacddd3b2730157c4f6a3c620c67f 100644 (file)
@@ -37,7 +37,7 @@ namespace Content.Server.Damage.Systems
             if (TerminatingOrDeleted(args.Target))
                 return;
 
-            var dmg = _damageable.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances, origin: args.Component.Thrower);
+            var dmg = _damageable.TryChangeDamage(args.Target, component.Damage * _damageable.UniversalThrownDamageModifier, component.IgnoreResistances, origin: args.Component.Thrower);
 
             // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying.
             if (dmg != null && HasComp<MobStateComponent>(args.Target))
@@ -58,7 +58,7 @@ namespace Content.Server.Damage.Systems
 
         private void OnDamageExamine(EntityUid uid, DamageOtherOnHitComponent component, ref DamageExamineEvent args)
         {
-            _damageExamine.AddDamageExamine(args.Message, component.Damage, Loc.GetString("damage-throw"));
+            _damageExamine.AddDamageExamine(args.Message, _damageable.ApplyUniversalAllModifiers(component.Damage * _damageable.UniversalThrownDamageModifier), Loc.GetString("damage-throw"));
         }
 
         /// <summary>
index fd2a658745b678e36cb115cbf11c09dce5f7d8de..71021ce4ac932c5169068fdbde478b1510233da3 100644 (file)
@@ -44,6 +44,26 @@ namespace Content.Server.EntityEffects.Effects
 
             var damageSpec = new DamageSpecifier(Damage);
 
+            var universalReagentDamageModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentDamageModifier;
+            var universalReagentHealModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentHealModifier;
+
+            if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
+            {
+                foreach (var (type, val) in damageSpec.DamageDict)
+                {
+                    if (val < 0f)
+                    {
+                        damageSpec.DamageDict[type] = val * universalReagentHealModifier;
+                    }
+                    if (val > 0f)
+                    {
+                        damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
+                    }
+                }
+            }
+
+            damageSpec = entSys.GetEntitySystem<DamageableSystem>().ApplyUniversalAllModifiers(damageSpec);
+
             foreach (var group in prototype.EnumeratePrototypes<DamageGroupPrototype>())
             {
                 if (!damageSpec.TryGetDamageInGroup(group, out var amount))
@@ -114,17 +134,37 @@ namespace Content.Server.EntityEffects.Effects
         public override void Effect(EntityEffectBaseArgs args)
         {
             var scale = FixedPoint2.New(1);
+            var damageSpec = new DamageSpecifier(Damage);
 
             if (args is EntityEffectReagentArgs reagentArgs)
             {
                 scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale;
             }
 
-            args.EntityManager.System<DamageableSystem>().TryChangeDamage(
-                args.TargetEntity,
-                Damage * scale,
-                IgnoreResistances,
-                interruptsDoAfters: false);
+            var universalReagentDamageModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentDamageModifier;
+            var universalReagentHealModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentHealModifier;
+
+            if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
+            {
+                foreach (var (type, val) in damageSpec.DamageDict)
+                {
+                    if (val < 0f)
+                    {
+                        damageSpec.DamageDict[type] = val * universalReagentHealModifier;
+                    }
+                    if (val > 0f)
+                    {
+                        damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
+                    }
+                }
+            }
+
+            args.EntityManager.System<DamageableSystem>()
+                .TryChangeDamage(
+                    args.TargetEntity,
+                    damageSpec * scale,
+                    IgnoreResistances,
+                    interruptsDoAfters: false);
         }
     }
 }
index 90b777178d96dbdb3d6e897ac08fef82faf2e17e..8ea2d5dfd99fc7ffdb8b6657e272111e7c7d022d 100644 (file)
@@ -464,7 +464,7 @@ public sealed partial class ExplosionSystem
                 }
 
                 // TODO EXPLOSIONS turn explosions into entities, and pass the the entity in as the damage origin.
-                _damageableSystem.TryChangeDamage(entity, damage, ignoreResistances: true);
+                _damageableSystem.TryChangeDamage(entity, damage * _damageableSystem.UniversalExplosionDamageModifier, ignoreResistances: true);
 
             }
         }
index 6c1a7f2c8512d895cd9049908f31cb638f6e227c..b3318b8c2a9c325115b9297cbee1d862f463ee55 100644 (file)
@@ -83,7 +83,7 @@ public sealed class HealingSystem : EntitySystem
         if (healing.ModifyBloodLevel != 0)
             _bloodstreamSystem.TryModifyBloodLevel(entity.Owner, healing.ModifyBloodLevel);
 
-        var healed = _damageable.TryChangeDamage(entity.Owner, healing.Damage, true, origin: args.Args.User);
+        var healed = _damageable.TryChangeDamage(entity.Owner, healing.Damage * _damageable.UniversalTopicalsHealModifier, true, origin: args.Args.User);
 
         if (healed == null && healing.BloodlossModifier != 0)
             return;
index 57601c3e9f25f2189e88f253efa6479350056e06..f1df25d58c77356517a8ade6ea2e392f9783bb43 100644 (file)
@@ -44,7 +44,7 @@ public sealed class ProjectileSystem : SharedProjectileSystem
             return;
         }
 
-        var ev = new ProjectileHitEvent(component.Damage, target, component.Shooter);
+        var ev = new ProjectileHitEvent(component.Damage * _damageableSystem.UniversalProjectileDamageModifier, target, component.Shooter);
         RaiseLocalEvent(uid, ref ev);
 
         var otherName = ToPrettyString(target);
index 3c8314041f4f8053cdf4d775d18475cd63432517..ff975c47146413ac8c835382ceaefcbdf445e130 100644 (file)
@@ -53,7 +53,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
         if (damageSpec.Empty)
             return;
 
-        _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-melee"));
+        _damageExamine.AddDamageExamine(args.Message, Damageable.ApplyUniversalAllModifiers(damageSpec), Loc.GetString("damage-melee"));
     }
 
     protected override bool ArcRaySuccessful(EntityUid targetUid,
index 0dcd92f94170f38f0358da9504686b9dc6f73133..ad4bb714d938d464db89aa05bf513aaeddbd23d5 100644 (file)
@@ -73,7 +73,7 @@ public sealed partial class GunSystem
             _ => throw new ArgumentOutOfRangeException(),
         };
 
-        _damageExamine.AddDamageExamine(args.Message, damageSpec, damageType);
+        _damageExamine.AddDamageExamine(args.Message, Damageable.ApplyUniversalAllModifiers(damageSpec), damageType);
     }
 
     private DamageSpecifier? GetDamage(BatteryAmmoProviderComponent component)
@@ -87,7 +87,7 @@ public sealed partial class GunSystem
 
                 if (!p.Damage.Empty)
                 {
-                    return p.Damage;
+                    return p.Damage * Damageable.UniversalProjectileDamageModifier;
                 }
             }
 
@@ -96,7 +96,8 @@ public sealed partial class GunSystem
 
         if (component is HitscanBatteryAmmoProviderComponent hitscan)
         {
-            return ProtoManager.Index<HitscanPrototype>(hitscan.Prototype).Damage;
+            var dmg = ProtoManager.Index<HitscanPrototype>(hitscan.Prototype).Damage;
+            return dmg == null ? dmg : dmg * Damageable.UniversalHitscanDamageModifier;
         }
 
         return null;
index e7bd3683d382f0917a743e13b164fe8b107761ed..c1df560cb7d524396c5547497391a685df12f6b2 100644 (file)
@@ -24,7 +24,7 @@ public sealed partial class GunSystem
         if (damageSpec == null)
             return;
 
-        _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-projectile"));
+        _damageExamine.AddDamageExamine(args.Message, Damageable.ApplyUniversalAllModifiers(damageSpec), Loc.GetString("damage-projectile"));
     }
 
     private DamageSpecifier? GetProjectileDamage(string proto)
@@ -39,7 +39,7 @@ public sealed partial class GunSystem
 
             if (!p.Damage.Empty)
             {
-                return p.Damage;
+                return p.Damage * Damageable.UniversalProjectileDamageModifier;
             }
         }
 
index fe0447c4c73e40985da27d71645521a3f126a77c..86be82d1c3fd9a89faef0cf9d72e2b4ff6a99e90 100644 (file)
@@ -212,7 +212,7 @@ public sealed partial class GunSystem : SharedGunSystem
 
                         var hitName = ToPrettyString(hitEntity);
                         if (dmg != null)
-                            dmg = Damageable.TryChangeDamage(hitEntity, dmg, origin: user);
+                            dmg = Damageable.TryChangeDamage(hitEntity, dmg * Damageable.UniversalHitscanDamageModifier, origin: user);
 
                         // check null again, as TryChangeDamage returns modified damage values
                         if (dmg != null)
diff --git a/Content.Shared/CCVar/CCVars.Playtest.cs b/Content.Shared/CCVar/CCVars.Playtest.cs
new file mode 100644 (file)
index 0000000..5b5bea7
--- /dev/null
@@ -0,0 +1,80 @@
+using Content.Shared.Administration;
+using Content.Shared.CCVar.CVarAccess;
+using Content.Shared.Roles;
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+        /// <summary>
+        ///     Scales all damage dealt in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestAllDamageModifier =
+            CVarDef.Create("playtest.all_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales all healing done in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestAllHealModifier =
+            CVarDef.Create("playtest.all_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the damage dealt by all melee attacks in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestMeleeDamageModifier =
+            CVarDef.Create("playtest.melee_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the damage dealt by all projectiles in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestProjectileDamageModifier =
+            CVarDef.Create("playtest.projectile_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the damage dealt by all hitscan attacks in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestHitscanDamageModifier =
+            CVarDef.Create("playtest.hitscan_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the damage dealt by all thrown weapons in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestThrownDamageModifier =
+            CVarDef.Create("playtest.thrown_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the healing given by all topicals in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestTopicalsHealModifier =
+            CVarDef.Create("playtest.topicals_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the damage dealt by all reagents in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestReagentDamageModifier =
+            CVarDef.Create("playtest.reagent_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the healing given by all reagents in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestReagentHealModifier =
+            CVarDef.Create("playtest.reagent_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Scales the explosion damage dealt in the game.
+        /// </summary>
+        [CVarControl(AdminFlags.VarEdit)]
+        public static readonly CVarDef<float> PlaytestExplosionDamageModifier =
+            CVarDef.Create("playtest.explosion_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED);
+
+}
index 391134bcf054fdeb67ebcf9f4b6d7a0d43e3e61d..7d36641ccf34682cf4a8e4c3cf1727e2e6ac95e3 100644 (file)
@@ -14,6 +14,9 @@ public abstract class SharedChemistryGuideDataSystem : EntitySystem
     protected readonly Dictionary<string, ReagentGuideEntry> Registry = new();
 
     public IReadOnlyDictionary<string, ReagentGuideEntry> ReagentGuideRegistry => Registry;
+
+    // Only ran on the server
+    public abstract void ReloadAllReagentPrototypes();
 }
 
 [Serializable, NetSerializable]
index 814609444a18b3f20e5d1cbbe9130736aafec35b..d5938db9af3e73c669275c09581188563025e13f 100644 (file)
@@ -1,4 +1,6 @@
 using System.Linq;
+using Content.Shared.CCVar;
+using Content.Shared.Chemistry;
 using Content.Shared.Damage.Prototypes;
 using Content.Shared.FixedPoint;
 using Content.Shared.Inventory;
@@ -7,6 +9,7 @@ using Content.Shared.Mobs.Components;
 using Content.Shared.Mobs.Systems;
 using Content.Shared.Radiation.Events;
 using Content.Shared.Rejuvenate;
+using Robust.Shared.Configuration;
 using Robust.Shared.GameStates;
 using Robust.Shared.Network;
 using Robust.Shared.Prototypes;
@@ -20,11 +23,24 @@ namespace Content.Shared.Damage
         [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
         [Dependency] private readonly INetManager _netMan = default!;
         [Dependency] private readonly MobThresholdSystem _mobThreshold = default!;
+        [Dependency] private readonly IConfigurationManager _config = default!;
+        [Dependency] private readonly SharedChemistryGuideDataSystem _chemistryGuideData = default!;
 
         private EntityQuery<AppearanceComponent> _appearanceQuery;
         private EntityQuery<DamageableComponent> _damageableQuery;
         private EntityQuery<MindContainerComponent> _mindContainerQuery;
 
+        public float UniversalAllDamageModifier { get; private set; } = 1f;
+        public float UniversalAllHealModifier { get; private set; } = 1f;
+        public float UniversalMeleeDamageModifier { get; private set; } = 1f;
+        public float UniversalProjectileDamageModifier { get; private set; } = 1f;
+        public float UniversalHitscanDamageModifier { get; private set; } = 1f;
+        public float UniversalReagentDamageModifier { get; private set; } = 1f;
+        public float UniversalReagentHealModifier { get; private set; } = 1f;
+        public float UniversalExplosionDamageModifier { get; private set; } = 1f;
+        public float UniversalThrownDamageModifier { get; private set; } = 1f;
+        public float UniversalTopicalsHealModifier { get; private set; } = 1f;
+
         public override void Initialize()
         {
             SubscribeLocalEvent<DamageableComponent, ComponentInit>(DamageableInit);
@@ -36,6 +52,36 @@ namespace Content.Shared.Damage
             _appearanceQuery = GetEntityQuery<AppearanceComponent>();
             _damageableQuery = GetEntityQuery<DamageableComponent>();
             _mindContainerQuery = GetEntityQuery<MindContainerComponent>();
+
+            // Damage modifier CVars are updated and stored here to be queried in other systems.
+            // Note that certain modifiers requires reloading the guidebook.
+            Subs.CVar(_config, CCVars.PlaytestAllDamageModifier, value =>
+            {
+                UniversalAllDamageModifier = value;
+                _chemistryGuideData.ReloadAllReagentPrototypes();
+            }, true);
+            Subs.CVar(_config, CCVars.PlaytestAllHealModifier, value =>
+            {
+                UniversalAllHealModifier = value;
+                _chemistryGuideData.ReloadAllReagentPrototypes();
+            }, true);
+            Subs.CVar(_config, CCVars.PlaytestProjectileDamageModifier, value => UniversalProjectileDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestMeleeDamageModifier, value => UniversalMeleeDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestProjectileDamageModifier, value => UniversalProjectileDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestHitscanDamageModifier, value => UniversalHitscanDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestReagentDamageModifier, value =>
+            {
+                UniversalReagentDamageModifier = value;
+                _chemistryGuideData.ReloadAllReagentPrototypes();
+            }, true);
+            Subs.CVar(_config, CCVars.PlaytestReagentHealModifier, value =>
+            {
+                 UniversalReagentHealModifier = value;
+                 _chemistryGuideData.ReloadAllReagentPrototypes();
+            }, true);
+            Subs.CVar(_config, CCVars.PlaytestExplosionDamageModifier, value => UniversalExplosionDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestThrownDamageModifier, value => UniversalThrownDamageModifier = value, true);
+            Subs.CVar(_config, CCVars.PlaytestTopicalsHealModifier, value => UniversalTopicalsHealModifier = value, true);
         }
 
         /// <summary>
@@ -164,6 +210,8 @@ namespace Content.Shared.Damage
                 }
             }
 
+            damage = ApplyUniversalAllModifiers(damage);
+
             // TODO DAMAGE PERFORMANCE
             // Consider using a local private field instead of creating a new dictionary here.
             // Would need to check that nothing ever tries to cache the delta.
@@ -191,6 +239,37 @@ namespace Content.Shared.Damage
             return delta;
         }
 
+        /// <summary>
+        /// Applies the two univeral "All" modifiers, if set.
+        /// Individual damage source modifiers are set in their respective code.
+        /// </summary>
+        /// <param name="damage">The damage to be changed.</param>
+        public DamageSpecifier ApplyUniversalAllModifiers(DamageSpecifier damage)
+        {
+            // Checks for changes first since they're unlikely in normal play.
+            if (UniversalAllDamageModifier == 1f && UniversalAllHealModifier == 1f)
+                return damage;
+
+            foreach (var (key, value) in damage.DamageDict)
+            {
+                if (value == 0)
+                    continue;
+
+                if (value > 0)
+                {
+                    damage.DamageDict[key] *= UniversalAllDamageModifier;
+                    continue;
+                }
+
+                if (value < 0)
+                {
+                    damage.DamageDict[key] *= UniversalAllHealModifier;
+                }
+            }
+
+            return damage;
+        }
+
         /// <summary>
         ///     Sets all damage types supported by a <see cref="DamageableComponent"/> to the specified value.
         /// </summary>
index 15b00e4610a58f632c424e4f570a787dc78063b2..43be9a5b14a0049676308c2b2658f7ec0b4dfc3f 100644 (file)
@@ -216,7 +216,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (!Resolve(uid, ref component, false))
             return new DamageSpecifier();
 
-        var ev = new GetMeleeDamageEvent(uid, new(component.Damage), new(), user, component.ResistanceBypass);
+        var ev = new GetMeleeDamageEvent(uid, new(component.Damage * Damageable.UniversalMeleeDamageModifier), new(), user, component.ResistanceBypass);
         RaiseLocalEvent(uid, ref ev);
 
         return DamageSpecifier.ApplyModifierSets(ev.Damage, ev.Modifiers);
@@ -249,7 +249,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (!Resolve(uid, ref component))
             return false;
 
-        var ev = new GetMeleeDamageEvent(uid, new(component.Damage), new(), user, component.ResistanceBypass);
+        var ev = new GetMeleeDamageEvent(uid, new(component.Damage * Damageable.UniversalMeleeDamageModifier), new(), user, component.ResistanceBypass);
         RaiseLocalEvent(uid, ref ev);
 
         return ev.ResistanceBypass;
index a0738fb5cbce5681354e3c1076f2c08bc300edef..39f7c7636b587efdd945e4c9673363ff49a092fb 100644 (file)
@@ -1,2 +1,23 @@
 changecvar-simple-debug_test_cvar = Does nothing.
 changecvar-full-debug_test_cvar = Just a simple testing cvar. Does nothing.
+
+changecvar-simple-playtest_all_damage_modifier = Multiplier for all damage dealt.
+changecvar-full-playtest_all_damage_modifier = Multiplier for all damage dealt.
+changecvar-simple-playtest_all_heal_modifier = Multiplier for all healing done.
+changecvar-full-playtest_all_heal_modifier = Multiplier for all healing done.
+changecvar-simple-playtest_melee_damage_modifier = Multiplier affecting melee weapon damage.
+changecvar-full-playtest_melee_damage_modifier = Multiplier affecting all damage dealt by melee attacks.
+changecvar-simple-playtest_projectile_damage_modifier = Multiplier affecting projectile damage.
+changecvar-full-playtest_projectile_damage_modifier = Multiplier affecting all damage dealt by projectiles.
+changecvar-simple-playtest_hitscan_damage_modifier = Multiplier affecting hitscan damage.
+changecvar-full-playtest_hitscan_damage_modifier = Multiplier affecting all damage dealt by hitscan weapons.
+changecvar-simple-playtest_thrown_damage_modifier = Multiplier affecting thrown weapon damage.
+changecvar-full-playtest_thrown_damage_modifier = Multiplier affecting all damage dealt by thrown weapons.
+changecvar-simple-playtest_topicals_heal_modifier = Multiplier affecting topical healing.
+changecvar-full-playtest_topicals_heal_modifier = Multiplier affecting all healing done by topicals.
+changecvar-simple-playtest_reagent_damage_modifier = Multiplier affecting reagent damage.
+changecvar-full-playtest_reagent_damage_modifier = Multiplier affecting all damage dealt by reagents.
+changecvar-simple-playtest_reagent_heal_modifier = Multiplier affecting reagent healing.
+changecvar-full-playtest_reagent_heal_modifier = Multiplier affecting all healing done by reagents.
+changecvar-simple-playtest_explosion_damage_modifier = Multiplier affecting explosion damage.
+changecvar-full-playtest_explosion_damage_modifier = Multiplier affecting all damage dealt by explosives.