Fragile Deliveries (#36980)

* epic

* tweaks
This commit is contained in:
ScarKy0
2025-04-28 01:04:39 +02:00
committed by GitHub
parent fac4bcd9b2
commit 13a1853168
6 changed files with 115 additions and 3 deletions

View File

@@ -0,0 +1,31 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Delivery;
/// <summary>
/// Component given to deliveries.
/// Allows the delivery to be broken.
/// If intact, applies a small multiplier, otherwise substracts it.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[Access(typeof(DeliveryModifierSystem))]
public sealed partial class DeliveryFragileComponent : Component
{
/// <summary>
/// Multiplier to use when the delivery is intact.
/// </summary>
[DataField]
public float IntactMultiplierOffset = 0.15f;
/// <summary>
/// Multiplier to use when the delivery is broken.
/// </summary>
[DataField]
public float BrokenMultiplierOffset = -0.33f;
/// <summary>
/// Whether this priority has already been broken or not.
/// </summary>
[DataField, AutoNetworkedField]
public bool Broken;
}

View File

@@ -1,5 +1,5 @@
using Content.Shared.Destructible;
using Content.Shared.Examine;
using Content.Shared.GameTicking;
using Content.Shared.NameModifier.EntitySystems;
using Robust.Shared.Random;
using Robust.Shared.Serialization;
@@ -27,6 +27,11 @@ public sealed partial class DeliveryModifierSystem : EntitySystem
SubscribeLocalEvent<DeliveryPriorityComponent, MapInitEvent>(OnPriorityMapInit);
SubscribeLocalEvent<DeliveryPriorityComponent, ExaminedEvent>(OnPriorityExamine);
SubscribeLocalEvent<DeliveryPriorityComponent, GetDeliveryMultiplierEvent>(OnGetPriorityMultiplier);
SubscribeLocalEvent<DeliveryFragileComponent, MapInitEvent>(OnFragileMapInit);
SubscribeLocalEvent<DeliveryFragileComponent, BreakageEventArgs>(OnFragileBreakage);
SubscribeLocalEvent<DeliveryFragileComponent, ExaminedEvent>(OnFragileExamine);
SubscribeLocalEvent<DeliveryFragileComponent, GetDeliveryMultiplierEvent>(OnGetFragileMultiplier);
}
#region Random
@@ -70,6 +75,38 @@ public sealed partial class DeliveryModifierSystem : EntitySystem
}
#endregion
#region Fragile
private void OnFragileMapInit(Entity<DeliveryFragileComponent> ent, ref MapInitEvent args)
{
_delivery.UpdateBrokenVisuals(ent, true);
}
private void OnFragileBreakage(Entity<DeliveryFragileComponent> ent, ref BreakageEventArgs args)
{
ent.Comp.Broken = true;
_delivery.UpdateBrokenVisuals(ent, true);
Dirty(ent);
}
private void OnFragileExamine(Entity<DeliveryFragileComponent> ent, ref ExaminedEvent args)
{
var trueName = _nameModifier.GetBaseName(ent.Owner);
if (ent.Comp.Broken)
args.PushMarkup(Loc.GetString("delivery-fragile-broken-examine", ("type", trueName)));
else
args.PushMarkup(Loc.GetString("delivery-fragile-examine", ("type", trueName)));
}
private void OnGetFragileMultiplier(Entity<DeliveryFragileComponent> ent, ref GetDeliveryMultiplierEvent args)
{
if (ent.Comp.Broken)
args.AdditiveMultiplier += ent.Comp.BrokenMultiplierOffset;
else
args.AdditiveMultiplier += ent.Comp.IntactMultiplierOffset;
}
#endregion
#region Update Loops
public override void Update(float frameTime)
{

View File

@@ -12,13 +12,13 @@ namespace Content.Shared.Delivery;
public sealed partial class DeliveryPriorityComponent : Component
{
/// <summary>
/// The highest the random multiplier can go.
/// The multiplier to apply when delivered in time.
/// </summary>
[DataField]
public float InTimeMultiplierOffset = 0.2f;
/// <summary>
/// The lowest the random multiplier can go.
/// The multiplier to apply when delivered late.
/// </summary>
[DataField]
public float ExpiredMultiplierOffset = -0.1f;

View File

@@ -231,6 +231,7 @@ public abstract class SharedDeliverySystem : EntitySystem
}
}
#region Visual Updates
// TODO: generic updateVisuals from component data
private void UpdateAntiTamperVisuals(EntityUid uid, bool isLocked)
{
@@ -252,10 +253,17 @@ public abstract class SharedDeliverySystem : EntitySystem
}
}
public void UpdateBrokenVisuals(Entity<DeliveryFragileComponent> ent, bool isFragile)
{
_appearance.SetData(ent, DeliveryVisuals.IsBroken, ent.Comp.Broken);
_appearance.SetData(ent, DeliveryVisuals.IsFragile, isFragile);
}
protected void UpdateDeliverySpawnerVisuals(EntityUid uid, int contents)
{
_appearance.SetData(uid, DeliverySpawnerVisuals.Contents, contents > 0);
}
#endregion
/// <summary>
/// Gathers the total multiplier for a delivery.

View File

@@ -25,3 +25,6 @@ delivery-teleporter-empty-verb = Take mail
# modifiers
delivery-priority-examine = This is a [color=orange]priority {$type}[/color]. You have [color=orange]{$time}[/color] left to deliver it to get a bonus.
delivery-priority-expired-examine = This is a [color=orange]priority {$type}[/color]. It seems you ran out of time.
delivery-fragile-examine = This is a [color=red]fragile {$type}[/color]. Deliver it intact for a bonus.
delivery-fragile-broken-examine = This is a [color=red]fragile {$type}[/color]. It looks badly damaged.

View File

@@ -137,6 +137,8 @@
children:
- id: DeliveryModifierPriority
prob: 0.25
- id: DeliveryModifierFragile
prob: 0.25
- type: entity
id: DeliveryModifierPriority
@@ -144,3 +146,34 @@
categories: [ HideSpawnMenu ]
components:
- type: DeliveryPriority
- type: entity
id: DeliveryModifierFragile
description: Components to add when a delivery is rolled as fragile.
categories: [ HideSpawnMenu ]
components:
- type: DeliveryFragile
- type: Damageable
damageContainer: Inorganic
- type: DamageOnHighSpeedImpact
minimumSpeed: 0.1
damage:
types:
Blunt: 1
soundHit:
collection: WeakHit
- type: DamageOnLand
damage:
types:
Blunt: 1
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 1
behaviors:
- !type:PlaySoundBehavior
sound:
collection: DeliveryOpenSounds
- !type:DoActsBehavior
acts: [ "Breakage" ]