using Content.Shared.Clothing.Components; using Content.Shared.Damage; using Content.Shared.Damage.Systems; using Content.Shared.Examine; using Content.Shared.Inventory; using Content.Shared.Movement.Systems; using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Shared.Clothing; /// /// This handles /// public abstract class SharedCursedMaskSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnClothingEquip); SubscribeLocalEvent(OnClothingUnequip); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent>(OnMovementSpeedModifier); SubscribeLocalEvent>(OnModifyDamage); } private void OnClothingEquip(Entity ent, ref ClothingGotEquippedEvent args) { RandomizeCursedMask(ent, args.Wearer); TryTakeover(ent, args.Wearer); } protected virtual void OnClothingUnequip(Entity ent, ref ClothingGotUnequippedEvent args) { RandomizeCursedMask(ent, args.Wearer); } private void OnExamine(Entity ent, ref ExaminedEvent args) { args.PushMarkup(Loc.GetString($"cursed-mask-examine-{ent.Comp.CurrentState.ToString()}")); } private void OnMovementSpeedModifier(Entity ent, ref InventoryRelayedEvent args) { if (ent.Comp.CurrentState == CursedMaskExpression.Joy) args.Args.ModifySpeed(ent.Comp.JoySpeedModifier); } private void OnModifyDamage(Entity ent, ref InventoryRelayedEvent args) { if (ent.Comp.CurrentState == CursedMaskExpression.Despair) args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, ent.Comp.DespairDamageModifier); } protected void RandomizeCursedMask(Entity ent, EntityUid wearer) { var random = new System.Random((int) _timing.CurTick.Value); ent.Comp.CurrentState = random.Pick(Enum.GetValues()); _appearance.SetData(ent, CursedMaskVisuals.State, ent.Comp.CurrentState); _movementSpeedModifier.RefreshMovementSpeedModifiers(wearer); } protected virtual void TryTakeover(Entity ent, EntityUid wearer) { } }