From 718183277d9503b228b8dcd6d1c9ab7882441bf4 Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Tue, 4 Oct 2022 17:57:14 -0400 Subject: [PATCH] Replace StayAliveObjective with EscapeShuttleObjective. (#11642) --- .../Conditions/EscapeShuttleCondition.cs | 92 +++++++++++++++++++ .../Conditions/StayAliveCondition.cs | 46 ---------- .../conditions/escape-shuttle-condition.ftl | 2 + .../conditions/stay-alive-condition.ftl | 2 - .../Objectives/traitorObjectives.yml | 24 ++--- 5 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 Content.Server/Objectives/Conditions/EscapeShuttleCondition.cs delete mode 100644 Content.Server/Objectives/Conditions/StayAliveCondition.cs create mode 100644 Resources/Locale/en-US/objectives/conditions/escape-shuttle-condition.ftl delete mode 100644 Resources/Locale/en-US/objectives/conditions/stay-alive-condition.ftl diff --git a/Content.Server/Objectives/Conditions/EscapeShuttleCondition.cs b/Content.Server/Objectives/Conditions/EscapeShuttleCondition.cs new file mode 100644 index 0000000000..65e2556ec2 --- /dev/null +++ b/Content.Server/Objectives/Conditions/EscapeShuttleCondition.cs @@ -0,0 +1,92 @@ +using Content.Server.Cuffs.Components; +using Content.Server.Objectives.Interfaces; +using Content.Server.Station.Components; +using JetBrains.Annotations; +using Robust.Shared.Utility; + +namespace Content.Server.Objectives.Conditions +{ + [UsedImplicitly] + [DataDefinition] + public sealed class EscapeShuttleCondition : IObjectiveCondition + { + private Mind.Mind? _mind; + + public IObjectiveCondition GetAssigned(Mind.Mind mind) + { + return new EscapeShuttleCondition { + _mind = mind, + }; + } + + public string Title => Loc.GetString("objective-condition-escape-shuttle-title"); + + public string Description => Loc.GetString("objective-condition-escape-shuttle-description"); + + public SpriteSpecifier Icon => new SpriteSpecifier.Rsi(new ResourcePath("Structures/Furniture/chairs.rsi"), "shuttle"); + + private bool IsAgentOnShuttle(TransformComponent agentXform, EntityUid? shuttle) + { + if (shuttle == null) + return false; + + var entMan = IoCManager.Resolve(); + + if (!entMan.TryGetComponent(shuttle, out var shuttleGrid)) + return false; + + return shuttleGrid.Grid.WorldAABB.Contains(agentXform.WorldPosition); + } + + public float Progress + { + get { + var entMan = IoCManager.Resolve(); + + if (_mind?.OwnedEntity == null + || !entMan.TryGetComponent(_mind.OwnedEntity, out var xform)) + return 0f; + + var shuttleContainsAgent = false; + var agentIsAlive = !_mind.CharacterDeadIC; + var agentIsEscaping = true; + + if (entMan.TryGetComponent(_mind.OwnedEntity, out var cuffed) + && cuffed.CuffedHandCount > 0) + // You're not escaping if you're restrained! + agentIsEscaping = false; + + // Any emergency shuttle counts for this objective. + foreach (var stationData in entMan.EntityQuery()) + { + if (IsAgentOnShuttle(xform, stationData.EmergencyShuttle)) { + shuttleContainsAgent = true; + break; + } + } + + return (shuttleContainsAgent && agentIsAlive && agentIsEscaping) ? 1f : 0f; + } + } + + public float Difficulty => 1.3f; + + public bool Equals(IObjectiveCondition? other) + { + return other is EscapeShuttleCondition esc && Equals(_mind, esc._mind); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((EscapeShuttleCondition) obj); + } + + public override int GetHashCode() + { + return _mind != null ? _mind.GetHashCode() : 0; + } + } +} diff --git a/Content.Server/Objectives/Conditions/StayAliveCondition.cs b/Content.Server/Objectives/Conditions/StayAliveCondition.cs deleted file mode 100644 index 03af3a4c9f..0000000000 --- a/Content.Server/Objectives/Conditions/StayAliveCondition.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Content.Server.Objectives.Interfaces; -using JetBrains.Annotations; -using Robust.Shared.Utility; - -namespace Content.Server.Objectives.Conditions -{ - [UsedImplicitly] - [DataDefinition] - public sealed class StayAliveCondition : IObjectiveCondition - { - private Mind.Mind? _mind; - - public IObjectiveCondition GetAssigned(Mind.Mind mind) - { - return new StayAliveCondition {_mind = mind}; - } - - public string Title => Loc.GetString("objective-condition-stay-alive-title"); - - public string Description => Loc.GetString("objective-condition-stay-alive-description"); - - public SpriteSpecifier Icon => new SpriteSpecifier.Rsi(new ResourcePath("Objects/Misc/bureaucracy.rsi"), "folder-white"); - - public float Progress => (_mind?.CharacterDeadIC ?? false) ? 0f : 1f; - - public float Difficulty => 1.25f; - - public bool Equals(IObjectiveCondition? other) - { - return other is StayAliveCondition sac && Equals(_mind, sac._mind); - } - - public override bool Equals(object? obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != GetType()) return false; - return Equals((StayAliveCondition) obj); - } - - public override int GetHashCode() - { - return (_mind != null ? _mind.GetHashCode() : 0); - } - } -} diff --git a/Resources/Locale/en-US/objectives/conditions/escape-shuttle-condition.ftl b/Resources/Locale/en-US/objectives/conditions/escape-shuttle-condition.ftl new file mode 100644 index 0000000000..7749cf7754 --- /dev/null +++ b/Resources/Locale/en-US/objectives/conditions/escape-shuttle-condition.ftl @@ -0,0 +1,2 @@ +objective-condition-escape-shuttle-title = Escape on the emergency shuttle alive and unrestrained. +objective-condition-escape-shuttle-description = One of our undercover agents will debrief you when you arrive. Don't show up in cuffs. diff --git a/Resources/Locale/en-US/objectives/conditions/stay-alive-condition.ftl b/Resources/Locale/en-US/objectives/conditions/stay-alive-condition.ftl deleted file mode 100644 index 5868cda183..0000000000 --- a/Resources/Locale/en-US/objectives/conditions/stay-alive-condition.ftl +++ /dev/null @@ -1,2 +0,0 @@ -objective-condition-stay-alive-title = Stay alive. -objective-condition-stay-alive-description = Survive this shift, we need you for another assignment. \ No newline at end of file diff --git a/Resources/Prototypes/Objectives/traitorObjectives.yml b/Resources/Prototypes/Objectives/traitorObjectives.yml index 4e06a3fff8..d79ff1c8f8 100644 --- a/Resources/Prototypes/Objectives/traitorObjectives.yml +++ b/Resources/Prototypes/Objectives/traitorObjectives.yml @@ -39,17 +39,6 @@ - !type:RandomTraitorAliveCondition {} canBeDuplicate: true -- type: objective - id: StayAliveObjective - issuer: syndicate - requirements: - - !type:TraitorRequirement {} - - !type:IncompatibleConditionsRequirement - conditions: - - DieCondition - conditions: - - !type:StayAliveCondition {} - - type: objective id: DieObjective issuer: syndicate @@ -58,8 +47,8 @@ - !type:TraitorRequirement {} - !type:IncompatibleConditionsRequirement conditions: - - StayAliveCondition - StealCondition + - EscapeShuttleCondition conditions: - !type:DieCondition {} @@ -221,3 +210,14 @@ conditions: - !type:StealCondition prototype: JetpackCaptainFilled + +- type: objective + id: EscapeShuttleObjective + issuer: syndicate + requirements: + - !type:TraitorRequirement {} + - !type:IncompatibleConditionsRequirement + conditions: + - DieCondition + conditions: + - !type:EscapeShuttleCondition {}