--- /dev/null
+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;
+}
+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;
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
}
#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)
{
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;
}
}
+ #region Visual Updates
// TODO: generic updateVisuals from component data
private void UpdateAntiTamperVisuals(EntityUid uid, bool isLocked)
{
}
}
+ 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.
# 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.
children:
- id: DeliveryModifierPriority
prob: 0.25
+ - id: DeliveryModifierFragile
+ prob: 0.25
- type: entity
id: DeliveryModifierPriority
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" ]