Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion Content.Shared/Backmen/EntityEffects/Effects/AdjustTraumas.cs
Original file line number Diff line number Diff line change
Expand Up @@ -305,5 +305,23 @@ public sealed partial class AdjustTraumas : EntityEffectBase<AdjustTraumas>
[DataField]
public bool MustHaveAllComponents;

public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => null;
public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
var traumaTypeName = TraumaType switch
{
TraumaType.BoneDamage => "trauma-type-bone-damage",
TraumaType.OrganDamage => "trauma-type-organ-damage",
TraumaType.VeinsDamage => "trauma-type-veins-damage",
TraumaType.NerveDamage => "trauma-type-nerve-damage",
TraumaType.Dismemberment => "trauma-type-dismemberment",
_ => "trauma-type-unknown"
};

return Loc.GetString(
"entity-effect-guidebook-adjust-traumas",
("chance", Probability),
("deltasign", MathF.Sign(Amount.Float())),
("amount", MathF.Abs(Amount.Float())),
("traumaType", Loc.GetString(traumaTypeName)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,10 @@ public sealed partial class SuppressPain : EntityEffectBase<SuppressPain>
public string ModifierIdentifier = "PainSuppressant";

public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-suppress-pain");
=> Loc.GetString(
"entity-effect-guidebook-suppress-pain",
("chance", Probability),
("amount", Amount.Float()),
("time", Time.TotalSeconds),
("maximumSuppression", MaximumSuppression.Float()));
}
10 changes: 7 additions & 3 deletions Content.Shared/Damage/Systems/DamageableSystem.API.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,15 @@ public DamageSpecifier ChangeDamage(
/// <param name="amount">how much to heal. value has to be negative to heal</param>
/// <param name="group">from which group to heal. if null, heal from all groups</param>
/// <param name="origin">who did the healing</param>
/// <param name="partMultiplier"></param>
/// <param name="targetPart"></param>
public DamageSpecifier HealEvenly(
Entity<DamageableComponent?> ent,
FixedPoint2 amount,
ProtoId<DamageGroupPrototype>? group = null,
EntityUid? origin = null)
EntityUid? origin = null,
float partMultiplier = 1.00f, // backmen
TargetBodyPart? targetPart = null) // backmen
{
var damageChange = new DamageSpecifier();

Expand All @@ -237,7 +241,7 @@ public DamageSpecifier HealEvenly(

// Get our total damage, or heal if we're below a certain amount.
if (!TryGetDamageGreaterThan((ent, ent.Comp), -amount, out var damage, group))
return ChangeDamage(ent, -damage, true, false, origin);
return ChangeDamage(ent, -damage, true, false, origin, partMultiplier: partMultiplier, targetPart: targetPart); // backmen

// make sure damageChange has the same damage types as damage
damageChange.DamageDict.EnsureCapacity(damage.DamageDict.Count);
Expand Down Expand Up @@ -283,7 +287,7 @@ public DamageSpecifier HealEvenly(
}
}

return ChangeDamage(ent, damageChange, true, false, origin);
return ChangeDamage(ent, damageChange, true, false, origin, partMultiplier: partMultiplier, targetPart: targetPart); // backmen
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using Content.Shared.Damage.Components;
using System.Linq;
using Content.Shared.Backmen.Targeting;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Damage.Systems;
using Content.Shared.FixedPoint;
Expand All @@ -20,7 +22,7 @@ protected override void Effect(Entity<DamageableComponent> entity, ref EntityEff
{
foreach (var (group, amount) in args.Effect.Damage)
{
_damageable.HealEvenly(entity.AsNullable(), amount * args.Scale, group);
_damageable.HealEvenly(entity.AsNullable(), amount * args.Scale, group, targetPart: args.Effect.TargetPart);
}
}
}
Expand All @@ -40,6 +42,9 @@ public sealed partial class EvenHealthChange : EntityEffectBase<EvenHealthChange
[DataField]
public bool IgnoreResistances = true;

[DataField]
public TargetBodyPart TargetPart = TargetBodyPart.All; // backmen

public override string EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
var damages = new List<string>();
Expand Down Expand Up @@ -80,9 +85,83 @@ public override string EntityEffectGuidebookText(IPrototypeManager prototype, IE
}

var healsordeals = heals ? deals ? "both" : "heals" : deals ? "deals" : "none";

// start-backmen
// Format target body part if not All
string? targetPartText = null;
if (TargetPart != TargetBodyPart.All)
{
targetPartText = FormatTargetBodyPart(TargetPart);
}
// end-backmen

return Loc.GetString("entity-effect-guidebook-even-health-change",
("chance", Probability),
("changes", ContentLocalizationManager.FormatList(damages)),
("healsordeals", healsordeals));
("healsordeals", healsordeals),
("targetPart", targetPartText ?? "")); // backmen
}

private static string FormatTargetBodyPart(TargetBodyPart targetPart)
{
// Check for composite values first (exact matches)
var compositeName = targetPart switch
{
TargetBodyPart.LeftFullArm => "target-body-part-left-full-arm",
TargetBodyPart.RightFullArm => "target-body-part-right-full-arm",
TargetBodyPart.LeftFullLeg => "target-body-part-left-full-leg",
TargetBodyPart.RightFullLeg => "target-body-part-right-full-leg",
TargetBodyPart.Hands => "target-body-part-hands",
TargetBodyPart.Arms => "target-body-part-arms",
TargetBodyPart.Legs => "target-body-part-legs",
TargetBodyPart.Feet => "target-body-part-feet",
TargetBodyPart.FullArms => "target-body-part-full-arms",
TargetBodyPart.FullLegs => "target-body-part-full-legs",
TargetBodyPart.BodyMiddle => "target-body-part-body-middle",
TargetBodyPart.FullLegsGroin => "target-body-part-full-legs-groin",
_ => null
};

if (compositeName != null)
return Loc.GetString(compositeName);

// Handle individual flags
var parts = new List<string>();
var validParts = SharedTargetingSystem.GetValidParts();

foreach (var part in validParts)
{
if (targetPart.HasFlag(part) && (int)targetPart != (int)(TargetBodyPart.All))
{
var partName = part switch
{
TargetBodyPart.Head => "target-body-part-head",
TargetBodyPart.Chest => "target-body-part-chest",
TargetBodyPart.Groin => "target-body-part-groin",
TargetBodyPart.LeftArm => "target-body-part-left-arm",
TargetBodyPart.LeftHand => "target-body-part-left-hand",
TargetBodyPart.RightArm => "target-body-part-right-arm",
TargetBodyPart.RightHand => "target-body-part-right-hand",
TargetBodyPart.LeftLeg => "target-body-part-left-leg",
TargetBodyPart.LeftFoot => "target-body-part-left-foot",
TargetBodyPart.RightLeg => "target-body-part-right-leg",
TargetBodyPart.RightFoot => "target-body-part-right-foot",
_ => null
};

if (partName != null)
parts.Add(partName);
}
}

// If we have specific parts, format them
if (parts.Count > 0)
{
var localizedParts = parts.Select(p => Loc.GetString(p)).ToList();
return ContentLocalizationManager.FormatList(localizedParts);
}

// Fallback
return Enum.GetName(typeof(TargetBodyPart), targetPart) ?? "Unknown";
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using Content.Shared.Damage;
using System.Linq;
using Content.Shared.Backmen.Targeting;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Damage.Systems;
Expand Down Expand Up @@ -26,8 +28,12 @@ protected override void Effect(Entity<DamageableComponent> entity, ref EntityEff
_damageable.TryChangeDamage(
entity.AsNullable(),
damageSpec,
out _,
args.Effect.IgnoreResistances,
interruptsDoAfters: false);
interruptsDoAfters: false,
ignoreGlobalModifiers: false,
partMultiplier: 1.00f,
targetPart: args.Effect.TargetPart); // backmen
}
}

Expand All @@ -43,6 +49,9 @@ public sealed partial class HealthChange : EntityEffectBase<HealthChange>
[DataField]
public bool IgnoreResistances = true;

[DataField]
public TargetBodyPart TargetPart = TargetBodyPart.All; // backmen

public override string EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
var damages = new List<string>();
Expand Down Expand Up @@ -85,9 +94,82 @@ public override string EntityEffectGuidebookText(IPrototypeManager prototype, IE

var healsordeals = heals ? (deals ? "both" : "heals") : (deals ? "deals" : "none");

// start-backmen
// Format target body part if not All
string? targetPartText = null;
if (TargetPart != TargetBodyPart.All)
{
targetPartText = FormatTargetBodyPart(TargetPart);
}
// end-backmen

return Loc.GetString("entity-effect-guidebook-health-change",
("chance", Probability),
("changes", ContentLocalizationManager.FormatList(damages)),
("healsordeals", healsordeals));
("healsordeals", healsordeals),
("targetPart", targetPartText ?? "")); // backmen
}

private static string FormatTargetBodyPart(TargetBodyPart targetPart)
{
// Check for composite values first (exact matches)
var compositeName = targetPart switch
{
TargetBodyPart.LeftFullArm => "target-body-part-left-full-arm",
TargetBodyPart.RightFullArm => "target-body-part-right-full-arm",
TargetBodyPart.LeftFullLeg => "target-body-part-left-full-leg",
TargetBodyPart.RightFullLeg => "target-body-part-right-full-leg",
TargetBodyPart.Hands => "target-body-part-hands",
TargetBodyPart.Arms => "target-body-part-arms",
TargetBodyPart.Legs => "target-body-part-legs",
TargetBodyPart.Feet => "target-body-part-feet",
TargetBodyPart.FullArms => "target-body-part-full-arms",
TargetBodyPart.FullLegs => "target-body-part-full-legs",
TargetBodyPart.BodyMiddle => "target-body-part-body-middle",
TargetBodyPart.FullLegsGroin => "target-body-part-full-legs-groin",
_ => null
};

if (compositeName != null)
return Loc.GetString(compositeName);

// Handle individual flags
var parts = new List<string>();
var validParts = SharedTargetingSystem.GetValidParts();

foreach (var part in validParts)
{
if (targetPart.HasFlag(part) && (int)targetPart != (int)(TargetBodyPart.All))
{
var partName = part switch
{
TargetBodyPart.Head => "target-body-part-head",
TargetBodyPart.Chest => "target-body-part-chest",
TargetBodyPart.Groin => "target-body-part-groin",
TargetBodyPart.LeftArm => "target-body-part-left-arm",
TargetBodyPart.LeftHand => "target-body-part-left-hand",
TargetBodyPart.RightArm => "target-body-part-right-arm",
TargetBodyPart.RightHand => "target-body-part-right-hand",
TargetBodyPart.LeftLeg => "target-body-part-left-leg",
TargetBodyPart.LeftFoot => "target-body-part-left-foot",
TargetBodyPart.RightLeg => "target-body-part-right-leg",
TargetBodyPart.RightFoot => "target-body-part-right-foot",
_ => null
};

if (partName != null)
parts.Add(partName);
}
}

// If we have specific parts, format them
if (parts.Count > 0)
{
var localizedParts = parts.Select(p => Loc.GetString(p)).ToList();
return ContentLocalizationManager.FormatList(localizedParts);
}

// Fallback
return Enum.GetName(typeof(TargetBodyPart), targetPart) ?? "Unknown";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
entity-effect-guidebook-adjust-traumas =
{ $chance ->
[1] { $deltasign ->
[1] Applies
*[-1] Removes
}
*[other] { $deltasign ->
[1] apply
*[-1] remove
}
} {NATURALFIXED($amount, 2)} of {$traumaType} trauma

entity-effect-guidebook-suppress-pain =
{ $chance ->
[1] Suppresses
*[other] suppress
} pain by {NATURALFIXED($amount, 2)} for {NATURALFIXED($time, 3)} {MANY("second", $time)} (up to {NATURALFIXED($maximumSuppression, 2)} maximum suppression)

trauma-type-bone-damage = bone damage
trauma-type-organ-damage = organ damage
trauma-type-veins-damage = veins damage
trauma-type-nerve-damage = nerve damage
trauma-type-dismemberment = dismemberment
trauma-type-unknown = unknown trauma

target-body-part-head = head
target-body-part-chest = chest
target-body-part-groin = groin
target-body-part-left-arm = left arm
target-body-part-left-hand = left hand
target-body-part-right-arm = right arm
target-body-part-right-hand = right hand
target-body-part-left-leg = left leg
target-body-part-left-foot = left foot
target-body-part-right-leg = right leg
target-body-part-right-foot = right foot
target-body-part-left-full-arm = left arm and hand
target-body-part-right-full-arm = right arm and hand
target-body-part-left-full-leg = left leg and foot
target-body-part-right-full-leg = right leg and foot
target-body-part-hands = hands
target-body-part-arms = arms
target-body-part-legs = legs
target-body-part-feet = feet
target-body-part-full-arms = full arms
target-body-part-full-legs = full legs
target-body-part-body-middle = body middle (chest, groin, arms)
target-body-part-full-legs-groin = legs and groin

Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ steal-target-groups-weapon-energy-shot-gun = energy shotgun




10 changes: 8 additions & 2 deletions Resources/Locale/en-US/guidebook/entity-effects/effects.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ entity-effect-guidebook-health-change =
[deals] deal
*[both] modify health by
}
} { $changes }
} { $changes } { $targetPart ->
[""]
*[other] on {$targetPart}
}

entity-effect-guidebook-even-health-change =
{ $chance ->
Expand All @@ -111,7 +114,10 @@ entity-effect-guidebook-even-health-change =
[deals] evenly deal
*[both] evenly modify health by
}
} { $changes }
} { $changes } { $targetPart ->
[""]
*[other] on {$targetPart}
}

entity-effect-guidebook-status-effect-old =
{ $type ->
Expand Down
Loading
Loading