SharedCursedMaskSystem.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Content.Shared.Clothing.Components;
  2. using Content.Shared.Damage;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Inventory;
  5. using Content.Shared.Movement.Systems;
  6. using Robust.Shared.Random;
  7. using Robust.Shared.Timing;
  8. namespace Content.Shared.Clothing;
  9. /// <summary>
  10. /// This handles <see cref="CursedMaskComponent"/>
  11. /// </summary>
  12. public abstract class SharedCursedMaskSystem : EntitySystem
  13. {
  14. [Dependency] private readonly IGameTiming _timing = default!;
  15. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  16. [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
  17. /// <inheritdoc/>
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<CursedMaskComponent, ClothingGotEquippedEvent>(OnClothingEquip);
  22. SubscribeLocalEvent<CursedMaskComponent, ClothingGotUnequippedEvent>(OnClothingUnequip);
  23. SubscribeLocalEvent<CursedMaskComponent, ExaminedEvent>(OnExamine);
  24. SubscribeLocalEvent<CursedMaskComponent, InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent>>(OnMovementSpeedModifier);
  25. SubscribeLocalEvent<CursedMaskComponent, InventoryRelayedEvent<DamageModifyEvent>>(OnModifyDamage);
  26. }
  27. private void OnClothingEquip(Entity<CursedMaskComponent> ent, ref ClothingGotEquippedEvent args)
  28. {
  29. RandomizeCursedMask(ent, args.Wearer);
  30. TryTakeover(ent, args.Wearer);
  31. }
  32. protected virtual void OnClothingUnequip(Entity<CursedMaskComponent> ent, ref ClothingGotUnequippedEvent args)
  33. {
  34. RandomizeCursedMask(ent, args.Wearer);
  35. }
  36. private void OnExamine(Entity<CursedMaskComponent> ent, ref ExaminedEvent args)
  37. {
  38. args.PushMarkup(Loc.GetString($"cursed-mask-examine-{ent.Comp.CurrentState.ToString()}"));
  39. }
  40. private void OnMovementSpeedModifier(Entity<CursedMaskComponent> ent, ref InventoryRelayedEvent<RefreshMovementSpeedModifiersEvent> args)
  41. {
  42. if (ent.Comp.CurrentState == CursedMaskExpression.Joy)
  43. args.Args.ModifySpeed(ent.Comp.JoySpeedModifier);
  44. }
  45. private void OnModifyDamage(Entity<CursedMaskComponent> ent, ref InventoryRelayedEvent<DamageModifyEvent> args)
  46. {
  47. if (ent.Comp.CurrentState == CursedMaskExpression.Despair)
  48. args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, ent.Comp.DespairDamageModifier);
  49. }
  50. protected void RandomizeCursedMask(Entity<CursedMaskComponent> ent, EntityUid wearer)
  51. {
  52. var random = new System.Random((int) _timing.CurTick.Value);
  53. ent.Comp.CurrentState = random.Pick(Enum.GetValues<CursedMaskExpression>());
  54. _appearance.SetData(ent, CursedMaskVisuals.State, ent.Comp.CurrentState);
  55. _movementSpeedModifier.RefreshMovementSpeedModifiers(wearer);
  56. }
  57. protected virtual void TryTakeover(Entity<CursedMaskComponent> ent, EntityUid wearer)
  58. {
  59. }
  60. }