stimulants increase stamina (#18754)

Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
deltanedas
2023-08-06 12:06:23 +01:00
committed by GitHub
parent 62826002d5
commit af8302445d
7 changed files with 86 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
using Content.Shared.Damage.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared.Damage.Components;
/// <summary>
/// Multiplies the entity's <see cref="StaminaComponent.StaminaDamage"/> by the <see cref="Modifier"/>.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(StaminaSystem))]
public sealed partial class StaminaModifierComponent : Component
{
/// <summary>
/// What to multiply max stamina by.
/// When added this scales max stamina, but not stamina damags to give you an extra boost of survability.
/// If you have too much damage when the modifier is removed, you suffer "withdrawl" and instantly stamcrit.
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("modifier"), AutoNetworkedField]
public float Modifier = 2f;
}

View File

@@ -0,0 +1,52 @@
using Content.Shared.Damage.Components;
namespace Content.Shared.Damage.Systems;
public sealed partial class StaminaSystem
{
private void InitializeModifier()
{
SubscribeLocalEvent<StaminaModifierComponent, ComponentStartup>(OnModifierStartup);
SubscribeLocalEvent<StaminaModifierComponent, ComponentShutdown>(OnModifierShutdown);
}
private void OnModifierStartup(EntityUid uid, StaminaModifierComponent comp, ComponentStartup args)
{
if (!TryComp<StaminaComponent>(uid, out var stamina))
return;
stamina.CritThreshold *= comp.Modifier;
}
private void OnModifierShutdown(EntityUid uid, StaminaModifierComponent comp, ComponentShutdown args)
{
if (!TryComp<StaminaComponent>(uid, out var stamina))
return;
stamina.CritThreshold /= comp.Modifier;
}
/// <summary>
/// Change the stamina modifier for an entity.
/// If it has <see cref="StaminaComponent"/> it will also be updated.
/// </summary>
public void SetModifier(EntityUid uid, float modifier, StaminaComponent? stamina = null, StaminaModifierComponent? comp = null)
{
if (!Resolve(uid, ref comp))
return;
var old = comp.Modifier;
if (old.Equals(modifier))
return;
comp.Modifier = modifier;
Dirty(uid, comp);
if (Resolve(uid, ref stamina, false))
{
// scale to the new threshold, act as if it was removed then added
stamina.CritThreshold *= modifier / old;
}
}
}

View File

@@ -21,7 +21,7 @@ using Robust.Shared.Timing;
namespace Content.Shared.Damage.Systems; namespace Content.Shared.Damage.Systems;
public sealed class StaminaSystem : EntitySystem public sealed partial class StaminaSystem : EntitySystem
{ {
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
@@ -41,6 +41,9 @@ public sealed class StaminaSystem : EntitySystem
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
InitializeModifier();
SubscribeLocalEvent<StaminaComponent, EntityUnpausedEvent>(OnStamUnpaused); SubscribeLocalEvent<StaminaComponent, EntityUnpausedEvent>(OnStamUnpaused);
SubscribeLocalEvent<StaminaComponent, ComponentStartup>(OnStartup); SubscribeLocalEvent<StaminaComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<StaminaComponent, ComponentShutdown>(OnShutdown); SubscribeLocalEvent<StaminaComponent, ComponentShutdown>(OnShutdown);
@@ -48,6 +51,7 @@ public sealed class StaminaSystem : EntitySystem
SubscribeLocalEvent<StaminaComponent, ComponentHandleState>(OnStamHandleState); SubscribeLocalEvent<StaminaComponent, ComponentHandleState>(OnStamHandleState);
SubscribeLocalEvent<StaminaComponent, DisarmedEvent>(OnDisarmed); SubscribeLocalEvent<StaminaComponent, DisarmedEvent>(OnDisarmed);
SubscribeLocalEvent<StaminaComponent, RejuvenateEvent>(OnRejuvenate); SubscribeLocalEvent<StaminaComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<StaminaDamageOnCollideComponent, StartCollideEvent>(OnCollide); SubscribeLocalEvent<StaminaDamageOnCollideComponent, StartCollideEvent>(OnCollide);
SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnHit); SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnHit);
} }

View File

@@ -194,6 +194,7 @@
- ForcedSleep - ForcedSleep
- TemporaryBlindness - TemporaryBlindness
- Pacified - Pacified
- StaminaModifier
- type: ThermalRegulator - type: ThermalRegulator
metabolismHeat: 800 metabolismHeat: 800
radiatedHeat: 100 radiatedHeat: 100

View File

@@ -84,6 +84,7 @@
- ForcedSleep - ForcedSleep
- TemporaryBlindness - TemporaryBlindness
- Pacified - Pacified
- StaminaModifier
- type: Blindable - type: Blindable
# Other # Other
- type: Inventory - type: Inventory

View File

@@ -124,6 +124,11 @@
key: KnockedDown key: KnockedDown
time: 3 time: 3
type: Remove type: Remove
- !type:GenericStatusEffect
key: StaminaModifier
component: StaminaModifier
time: 3
type: Add
Medicine: Medicine:
metabolismRate: 1.0 metabolismRate: 1.0
effects: effects:

View File

@@ -56,3 +56,6 @@
- type: statusEffect - type: statusEffect
id: RatvarianLanguage #Praise him id: RatvarianLanguage #Praise him
- type: statusEffect
id: StaminaModifier