For DamagedSiliconAccent use Destructible threshold for default "DamageAtMaxThreshold" (#37252)

* set DamageAtMaxCorruption as nullable with null default and use destructible trigger threshold for this if null.

* fix documentation

* these really don't need to be passed by reference
This commit is contained in:
Quantum-cross
2025-05-07 20:44:36 -04:00
committed by GitHub
parent d80934b156
commit 6bb3b83bf1
2 changed files with 22 additions and 8 deletions

View File

@@ -1,4 +1,5 @@
using System.Text; using System.Text;
using Content.Server.Destructible;
using Content.Server.PowerCell; using Content.Server.PowerCell;
using Content.Shared.Speech.Components; using Content.Shared.Speech.Components;
using Content.Shared.Damage; using Content.Shared.Damage;
@@ -11,6 +12,7 @@ public sealed class DamagedSiliconAccentSystem : EntitySystem
{ {
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly DestructibleSystem _destructibleSystem = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -35,7 +37,7 @@ public sealed class DamagedSiliconAccentSystem : EntitySystem
} }
currentChargeLevel = Math.Clamp(currentChargeLevel, 0.0f, 1.0f); currentChargeLevel = Math.Clamp(currentChargeLevel, 0.0f, 1.0f);
// Corrupt due to low power (drops characters on longer messages) // Corrupt due to low power (drops characters on longer messages)
args.Message = CorruptPower(args.Message, currentChargeLevel, ref ent.Comp); args.Message = CorruptPower(args.Message, currentChargeLevel, ent.Comp);
} }
if (ent.Comp.EnableDamageCorruption) if (ent.Comp.EnableDamageCorruption)
@@ -50,11 +52,11 @@ public sealed class DamagedSiliconAccentSystem : EntitySystem
damage = damageable.TotalDamage; damage = damageable.TotalDamage;
} }
// Corrupt due to damage (drop, repeat, replace with symbols) // Corrupt due to damage (drop, repeat, replace with symbols)
args.Message = CorruptDamage(args.Message, damage, ref ent.Comp); args.Message = CorruptDamage(args.Message, damage, ent);
} }
} }
public string CorruptPower(string message, float chargeLevel, ref DamagedSiliconAccentComponent comp) public string CorruptPower(string message, float chargeLevel, DamagedSiliconAccentComponent comp)
{ {
// The first idxMin characters are SAFE // The first idxMin characters are SAFE
var idxMin = comp.StartPowerCorruptionAtCharIdx; var idxMin = comp.StartPowerCorruptionAtCharIdx;
@@ -104,12 +106,23 @@ public sealed class DamagedSiliconAccentSystem : EntitySystem
return outMsg.ToString(); return outMsg.ToString();
} }
private string CorruptDamage(string message, FixedPoint2 totalDamage, ref DamagedSiliconAccentComponent comp) private string CorruptDamage(string message, FixedPoint2 totalDamage, Entity<DamagedSiliconAccentComponent> ent)
{ {
var outMsg = new StringBuilder(); var outMsg = new StringBuilder();
// If this is not specified, use the Destructible threshold for destruction or breakage
var damageAtMaxCorruption = ent.Comp.DamageAtMaxCorruption;
if (damageAtMaxCorruption is null)
{
if (!TryComp<DestructibleComponent>(ent, out var destructible))
return message;
damageAtMaxCorruption = _destructibleSystem.DestroyedAt(ent, destructible);
}
// Linear interpolation of character damage probability // Linear interpolation of character damage probability
var damagePercent = Math.Clamp((float)totalDamage / (float)comp.DamageAtMaxCorruption, 0, 1); var damagePercent = Math.Clamp((float)totalDamage / (float)damageAtMaxCorruption, 0, 1);
var chanceToCorruptLetter = damagePercent * comp.MaxDamageCorruption; var chanceToCorruptLetter = damagePercent * ent.Comp.MaxDamageCorruption;
foreach (var letter in message) foreach (var letter in message)
{ {
if (_random.Prob(chanceToCorruptLetter)) // Corrupt! if (_random.Prob(chanceToCorruptLetter)) // Corrupt!

View File

@@ -27,10 +27,11 @@ public sealed partial class DamagedSiliconAccentComponent : Component
/// <summary> /// <summary>
/// Probability of character corruption will increase linearly to <see cref="MaxDamageCorruption" /> once until /// Probability of character corruption will increase linearly to <see cref="MaxDamageCorruption" /> once until
/// total damage is at or above this value. /// total damage is at or above this value. If null, it will use the value returned by
/// DestructibleSystem.DestroyedAt, which is the damage threshold for destruction or breakage.
/// </summary> /// </summary>
[DataField] [DataField]
public FixedPoint2 DamageAtMaxCorruption = 300; public FixedPoint2? DamageAtMaxCorruption;
/// <summary> /// <summary>
/// Enable charge level corruption effects /// Enable charge level corruption effects