From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Tue, 18 Feb 2025 07:28:42 +0000 (+0100) Subject: Add ability for +VVEDIT users to scale damage/healing in the game (#35255) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=3200ba88a5062ac000593c3d321e8c5383bbd41b;p=space-station-14.git Add ability for +VVEDIT users to scale damage/healing in the game (#35255) * Initial commit * Add universal modifier for all damage/heals, make guidebooks work. * help text --- diff --git a/Content.Client/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs b/Content.Client/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs index 7c7d824ee9..4c3a583b2a 100644 --- a/Content.Client/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs +++ b/Content.Client/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs @@ -141,6 +141,11 @@ public sealed class ChemistryGuideDataSystem : SharedChemistryGuideDataSystem { return _reagentSources.GetValueOrDefault(id) ?? new List(); } + + // Is handled on server and updated on client via ReagentGuideRegistryChangedEvent + public override void ReloadAllReagentPrototypes() + { + } } /// diff --git a/Content.Server/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs index e2cd72030d..e72fd34cd8 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemistryGuideDataSystem.cs @@ -64,4 +64,9 @@ public sealed class ChemistryGuideDataSystem : SharedChemistryGuideDataSystem var ev = new ReagentGuideRegistryChangedEvent(changeset); RaiseNetworkEvent(ev); } + + public override void ReloadAllReagentPrototypes() + { + InitializeServerRegistry(); + } } diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs index 50c69f3829..b1f5365b01 100644 --- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs +++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs @@ -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(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")); } /// diff --git a/Content.Server/EntityEffects/Effects/HealthChange.cs b/Content.Server/EntityEffects/Effects/HealthChange.cs index fd2a658745..71021ce4ac 100644 --- a/Content.Server/EntityEffects/Effects/HealthChange.cs +++ b/Content.Server/EntityEffects/Effects/HealthChange.cs @@ -44,6 +44,26 @@ namespace Content.Server.EntityEffects.Effects var damageSpec = new DamageSpecifier(Damage); + var universalReagentDamageModifier = entSys.GetEntitySystem().UniversalReagentDamageModifier; + var universalReagentHealModifier = entSys.GetEntitySystem().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().ApplyUniversalAllModifiers(damageSpec); + foreach (var group in prototype.EnumeratePrototypes()) { 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().TryChangeDamage( - args.TargetEntity, - Damage * scale, - IgnoreResistances, - interruptsDoAfters: false); + var universalReagentDamageModifier = args.EntityManager.System().UniversalReagentDamageModifier; + var universalReagentHealModifier = args.EntityManager.System().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() + .TryChangeDamage( + args.TargetEntity, + damageSpec * scale, + IgnoreResistances, + interruptsDoAfters: false); } } } diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 90b777178d..8ea2d5dfd9 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -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); } } diff --git a/Content.Server/Medical/HealingSystem.cs b/Content.Server/Medical/HealingSystem.cs index 6c1a7f2c85..b3318b8c2a 100644 --- a/Content.Server/Medical/HealingSystem.cs +++ b/Content.Server/Medical/HealingSystem.cs @@ -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; diff --git a/Content.Server/Projectiles/ProjectileSystem.cs b/Content.Server/Projectiles/ProjectileSystem.cs index 57601c3e9f..f1df25d58c 100644 --- a/Content.Server/Projectiles/ProjectileSystem.cs +++ b/Content.Server/Projectiles/ProjectileSystem.cs @@ -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); diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 3c8314041f..ff975c4714 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -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, diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs index 0dcd92f941..ad4bb714d9 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs @@ -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(hitscan.Prototype).Damage; + var dmg = ProtoManager.Index(hitscan.Prototype).Damage; + return dmg == null ? dmg : dmg * Damageable.UniversalHitscanDamageModifier; } return null; diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs index e7bd3683d3..c1df560cb7 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs @@ -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; } } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index fe0447c4c7..86be82d1c3 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -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 index 0000000000..5b5bea7d94 --- /dev/null +++ b/Content.Shared/CCVar/CCVars.Playtest.cs @@ -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 +{ + /// + /// Scales all damage dealt in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestAllDamageModifier = + CVarDef.Create("playtest.all_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales all healing done in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestAllHealModifier = + CVarDef.Create("playtest.all_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the damage dealt by all melee attacks in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestMeleeDamageModifier = + CVarDef.Create("playtest.melee_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the damage dealt by all projectiles in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestProjectileDamageModifier = + CVarDef.Create("playtest.projectile_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the damage dealt by all hitscan attacks in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestHitscanDamageModifier = + CVarDef.Create("playtest.hitscan_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the damage dealt by all thrown weapons in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestThrownDamageModifier = + CVarDef.Create("playtest.thrown_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the healing given by all topicals in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestTopicalsHealModifier = + CVarDef.Create("playtest.topicals_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the damage dealt by all reagents in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestReagentDamageModifier = + CVarDef.Create("playtest.reagent_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the healing given by all reagents in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestReagentHealModifier = + CVarDef.Create("playtest.reagent_heal_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + + /// + /// Scales the explosion damage dealt in the game. + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef PlaytestExplosionDamageModifier = + CVarDef.Create("playtest.explosion_damage_modifier", 1f, CVar.SERVER | CVar.REPLICATED); + +} diff --git a/Content.Shared/Chemistry/SharedChemistryGuideDataSystem.cs b/Content.Shared/Chemistry/SharedChemistryGuideDataSystem.cs index 391134bcf0..7d36641ccf 100644 --- a/Content.Shared/Chemistry/SharedChemistryGuideDataSystem.cs +++ b/Content.Shared/Chemistry/SharedChemistryGuideDataSystem.cs @@ -14,6 +14,9 @@ public abstract class SharedChemistryGuideDataSystem : EntitySystem protected readonly Dictionary Registry = new(); public IReadOnlyDictionary ReagentGuideRegistry => Registry; + + // Only ran on the server + public abstract void ReloadAllReagentPrototypes(); } [Serializable, NetSerializable] diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 814609444a..d5938db9af 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -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 _appearanceQuery; private EntityQuery _damageableQuery; private EntityQuery _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(DamageableInit); @@ -36,6 +52,36 @@ namespace Content.Shared.Damage _appearanceQuery = GetEntityQuery(); _damageableQuery = GetEntityQuery(); _mindContainerQuery = GetEntityQuery(); + + // 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); } /// @@ -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; } + /// + /// Applies the two univeral "All" modifiers, if set. + /// Individual damage source modifiers are set in their respective code. + /// + /// The damage to be changed. + 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; + } + /// /// Sets all damage types supported by a to the specified value. /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 15b00e4610..43be9a5b14 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -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; diff --git a/Resources/Locale/en-US/cvar/cvar-help.ftl b/Resources/Locale/en-US/cvar/cvar-help.ftl index a0738fb5cb..39f7c7636b 100644 --- a/Resources/Locale/en-US/cvar/cvar-help.ftl +++ b/Resources/Locale/en-US/cvar/cvar-help.ftl @@ -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.