From b0b8962e28e83e91855dcfd02b76fff908cbc1d8 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 8 May 2026 00:50:36 +0500 Subject: [PATCH 01/15] feat-wip: terminator --- .../Rules/TerminatorRuleComponent.cs | 17 ++ .../GameTicking/Rules/TerminatorRuleSystem.cs | 57 ++++++ .../Roles/TerminatorRoleComponent.cs | 9 + .../en-US/_Maid/Terminator/terminator.ftl | 21 +++ .../Locale/en-US/_Maid/mind/role-types.ftl | 1 + .../en-US/objectives/conditions/terminate.ftl | 1 + Resources/Prototypes/GameRules/events.yml | 1 + .../_Maid/Body/Parts/terminator.yml | 133 +++++++++++++ .../_Maid/Body/Prototypes/terminator.yml | 93 ++++++++++ .../Prototypes/_Maid/Damage/modifier_sets.yml | 27 +++ .../Prototypes/_Maid/GameRules/midround.yml | 44 +++++ .../Prototypes/_Maid/Species/terminator.yml | 131 +++++++++++++ .../Prototypes/_Maid/Terminator/mobs.yml | 175 ++++++++++++++++++ .../_Maid/Terminator/objectives.yml | 39 ++++ .../Prototypes/_Maid/Terminator/roles.yml | 35 ++++ 15 files changed, 784 insertions(+) create mode 100644 Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs create mode 100644 Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs create mode 100644 Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs create mode 100644 Resources/Locale/en-US/_Maid/Terminator/terminator.ftl create mode 100644 Resources/Locale/en-US/_Maid/mind/role-types.ftl create mode 100644 Resources/Locale/en-US/objectives/conditions/terminate.ftl create mode 100644 Resources/Prototypes/_Maid/Body/Parts/terminator.yml create mode 100644 Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml create mode 100644 Resources/Prototypes/_Maid/Damage/modifier_sets.yml create mode 100644 Resources/Prototypes/_Maid/GameRules/midround.yml create mode 100644 Resources/Prototypes/_Maid/Species/terminator.yml create mode 100644 Resources/Prototypes/_Maid/Terminator/mobs.yml create mode 100644 Resources/Prototypes/_Maid/Terminator/objectives.yml create mode 100644 Resources/Prototypes/_Maid/Terminator/roles.yml diff --git a/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs b/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs new file mode 100644 index 00000000000..2db7f5f7c12 --- /dev/null +++ b/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Whitelist; +using Robust.Shared.Audio; + +namespace Content.Server._Maid.Terminator.GameTicking.Rules; + +[RegisterComponent] +public sealed partial class TerminatorRuleComponent : Component +{ + [DataField] + public SoundSpecifier? BriefingSound; + + [DataField] + public EntityWhitelist? TargetBlacklist; + + [DataField] + public EntityUid? Target; +} diff --git a/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs b/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs new file mode 100644 index 00000000000..bad3580c6b4 --- /dev/null +++ b/Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs @@ -0,0 +1,57 @@ +using Content.Server._Maid.Terminator.Roles; +using Content.Server.Antag; +using Content.Server.Body.Components; +using Content.Server.GameTicking.Rules; +using Content.Server.Mind; +using Content.Server.Objectives.Components; +using Content.Server.Roles; +using Content.Shared.GameTicking.Components; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using Content.Shared.Whitelist; +using Robust.Shared.Random; + +namespace Content.Server._Maid.Terminator.GameTicking.Rules; + +public sealed class TerminatorRuleSystem : GameRuleSystem +{ + [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly SharedJobSystem _jobs = default!; + [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAntagSelectEntity); + SubscribeLocalEvent(AfterAntagSelected); + } + + private void OnAntagSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + var allAliveHumanoids = _mind.GetAliveHumans(); + allAliveHumanoids.RemoveWhere(human => _whitelist.IsBlacklistPass(ent.Comp.TargetBlacklist, human)); + + if (allAliveHumanoids.Count == 0) + { + Log.Warning("Could not find any alive players to create a terminator for!"); + return; + } + + // pick a random player + var randomHumanoidMind = _random.Pick(allAliveHumanoids); + + ent.Comp.Target = randomHumanoidMind; + } + + private void AfterAntagSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) + { + var targetComp = EnsureComp(args.EntityUid); + targetComp.Target = ent.Comp.Target; + + RemComp(args.EntityUid); + } +} diff --git a/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs b/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs new file mode 100644 index 00000000000..1572fb82568 --- /dev/null +++ b/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Roles; + +namespace Content.Server._Maid.Terminator.Roles; + +[RegisterComponent] +public sealed partial class TerminatorRoleComponent : BaseMindRoleComponent +{ + +} diff --git a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl new file mode 100644 index 00000000000..5a8d3c4d7d6 --- /dev/null +++ b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl @@ -0,0 +1,21 @@ +terminator-round-end-agent-name = nt-800 + +objective-issuer-susnet = [color=#d64119]Susnet[/color] + +terminator-role-greeting = + You are the exterminator, a relentless assassin sent into the past to secure our future. + We need you to eliminate {$target}, {$job}. + Use any means at your disposal to complete the mission. + Glory to Cybersun. + +terminator-role-briefing = Kill the target at all costs. + +terminator-endoskeleton-gib-popup = All the battered flesh falls apart, revealing a titanium endoskeleton! +terminator-endoskeleton-burn-popup = The seared flesh is burned to a crisp, revealing a titanium endoskeleton! + +ghost-role-information-exterminator-name = Exterminator +ghost-role-information-exterminator-description = You have been sent back in time to terminate a target with high importance to the future. +ghost-role-information-exterminator-rules = You are an antagonist and may kill anyone who tries to stop you, but killing the target is always your top priority. + +roles-antag-terminator-name = Exterminator +roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. diff --git a/Resources/Locale/en-US/_Maid/mind/role-types.ftl b/Resources/Locale/en-US/_Maid/mind/role-types.ftl new file mode 100644 index 00000000000..d1f88a699ea --- /dev/null +++ b/Resources/Locale/en-US/_Maid/mind/role-types.ftl @@ -0,0 +1 @@ +role-subtype-terminator = Terminator diff --git a/Resources/Locale/en-US/objectives/conditions/terminate.ftl b/Resources/Locale/en-US/objectives/conditions/terminate.ftl new file mode 100644 index 00000000000..7390cf88d25 --- /dev/null +++ b/Resources/Locale/en-US/objectives/conditions/terminate.ftl @@ -0,0 +1 @@ +objective-terminate-title = Terminate {$targetName}, {CAPITALIZE($job)} diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 9c3b309fad4..91c1d062157 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -199,6 +199,7 @@ - id: SlaughterDemonMidround # Goobstation - Slaughter Demon - id: XenomorphsInfestation # WD EDIT #- id: WraithMidround # Goobstation - Wraith + - id: TerminatorSpawn # Maid - Terminator #TODO When Slasher is Ready - id: SlasherSpawn # Goobstation - The Slasher - type: entity diff --git a/Resources/Prototypes/_Maid/Body/Parts/terminator.yml b/Resources/Prototypes/_Maid/Body/Parts/terminator.yml new file mode 100644 index 00000000000..514a60433cf --- /dev/null +++ b/Resources/Prototypes/_Maid/Body/Parts/terminator.yml @@ -0,0 +1,133 @@ +- type: entity + abstract: true + parent: BasePartInorganic + id: PartTerminatorBase # TODO: Rename to BasePartTerminator + name: nt-800 body part + components: + - type: Sprite + sprite: Mobs/Species/Terminator/parts.rsi + - type: Icon + sprite: Mobs/Species/Terminator/parts.rsi + - type: BodyPart + species: Terminator + - type: StaticPrice + price: 200 + - type: Damageable + damageModifierSet: Cybernetic + +- type: entity + parent: [PartTerminatorBase, BaseChestInorganic] + id: ChestTerminator + name: nt-800 chest + components: + - type: Sprite + state: chest_m + - type: Icon + state: chest_m + +- type: entity + parent: [PartTerminatorBase, BaseGroinInorganic] + id: GroinTerminator + name: nt-800 groin + components: + - type: Sprite + state: groin_m + - type: Icon + state: groin_m + +- type: entity + parent: [PartTerminatorBase, BaseHead] + id: HeadTerminator + name: nt-800 skull + description: Its red eyes have powered down... for now. + components: + - type: Sprite + state: skull_icon + - type: Icon + state: skull_icon + - type: StaticPrice + price: 2000 + - type: Tag + tags: + - MindTransferTarget + - Head + +- type: entity + parent: [PartTerminatorBase, BaseLeftArm] + id: LeftArmTerminator + name: left nt-800 arm + components: + - type: Sprite + state: l_arm + - type: Icon + state: l_arm + +- type: entity + parent: [PartTerminatorBase, BaseRightArm] + id: RightArmTerminator + name: right nt-800 arm + components: + - type: Sprite + state: r_arm + - type: Icon + state: r_arm + +- type: entity + parent: [PartTerminatorBase, BaseLeftHand] + id: LeftHandTerminator + name: left nt-800 hand + components: + - type: Sprite + state: l_hand + - type: Icon + state: l_hand + +- type: entity + parent: [PartTerminatorBase, BaseRightHand] + id: RightHandTerminator + name: right nt-800 hand + components: + - type: Sprite + state: r_hand + - type: Icon + state: r_hand + +- type: entity + parent: [PartTerminatorBase, BaseLeftLeg] + id: LeftLegTerminator + name: left nt-800 leg + components: + - type: Sprite + state: l_leg + - type: Icon + state: l_leg + +- type: entity + parent: [PartTerminatorBase, BaseRightLeg] + id: RightLegTerminator + name: right nt-800 leg + components: + - type: Sprite + state: r_leg + - type: Icon + state: r_leg + +- type: entity + parent: [PartTerminatorBase, BaseLeftFoot] + id: LeftFootTerminator + name: left nt-800 foot + components: + - type: Sprite + state: l_foot + - type: Icon + state: l_foot + +- type: entity + parent: [PartTerminatorBase, BaseRightFoot] + id: RightFootTerminator + name: right nt-800 foot + components: + - type: Sprite + state: r_foot + - type: Icon + state: r_foot diff --git a/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml b/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml new file mode 100644 index 00000000000..7977e2db355 --- /dev/null +++ b/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml @@ -0,0 +1,93 @@ +- type: body + id: TerminatorFlesh + name: exterminator + root: chest + slots: + head: + part: HeadHuman + connections: + - chest + organs: + brain: MobTerminatorEndoskeleton + chest: + part: ChestHuman + connections: + - groin + - right arm + - left arm + - head + groin: + part: GroinHuman + connections: + - right leg + - left leg + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + right leg: + part: RightLegHuman + connections: + - right foot + left leg: + part: LeftLegHuman + connections: + - left foot + right foot: + part: RightFootHuman + left foot: + part: LeftFootHuman + +- type: body + id: TerminatorEndoskeleton + name: terminator endoskeleton + root: chest + slots: + head: + part: HeadTerminator + connections: + - chest + chest: + part: ChestTerminator + connections: + - groin + - right arm + - left arm + - head + groin: + part: GroinTerminator + connections: + - right leg + - left leg + right arm: + part: RightArmTerminator + connections: + - right hand + left arm: + part: LeftArmTerminator + connections: + - left hand + right hand: + part: RightHandTerminator + left hand: + part: LeftHandTerminator + right leg: + part: RightLegTerminator + connections: + - right foot + left leg: + part: LeftLegTerminator + connections: + - left foot + right foot: + part: RightFootTerminator + left foot: + part: LeftFootTerminator diff --git a/Resources/Prototypes/_Maid/Damage/modifier_sets.yml b/Resources/Prototypes/_Maid/Damage/modifier_sets.yml new file mode 100644 index 00000000000..6ae8b43ce9a --- /dev/null +++ b/Resources/Prototypes/_Maid/Damage/modifier_sets.yml @@ -0,0 +1,27 @@ +- type: damageModifierSet + id: CyberneticFlesh + coefficients: + Blunt: 1.0 + Slash: 1.0 + Piercing: 1.0 + Heat: 1.0 + Shock: 1.0 + Cold: 1.0 + Caustic: 1.0 + Poison: 0.0 + Cellular: 0.0 + +# TODO: Temporary from porting + +- type: damageModifierSet + id: Cybernetic + coefficients: + Blunt: 0.8 + Slash: 0.3 + Piercing: 0.3 + Heat: 0.3 + Shock: 2.5 + Cold: 0.0 + Caustic: 0.0 + Poison: 0.0 + Cellular: 0.0 diff --git a/Resources/Prototypes/_Maid/GameRules/midround.yml b/Resources/Prototypes/_Maid/GameRules/midround.yml new file mode 100644 index 00000000000..88ee924d70c --- /dev/null +++ b/Resources/Prototypes/_Maid/GameRules/midround.yml @@ -0,0 +1,44 @@ +# Terminator +- type: entity + parent: BaseGameRule + id: TerminatorSpawn + components: + - type: StationEvent + weight: 8 + earliestStart: 30 + minimumPlayers: 15 + maxOccurrences: 1 + duration: null + chaos: + Hostile: 120 + Combat: 120 + Death: 180 + Medical: 180 + eventType: HostilesSpawn + - type: GameRule + chaosScore: 300 + - type: AntagSpawner + prototype: MobHumanTerminator + - type: AntagRandomSpawn + - type: AntagObjectives + objectives: + - TerminateObjective + - ShutDownObjective + - type: TerminatorRule + BriefingSound: /Audio/Ambience/Antag/traitor_start.ogg + targetBlacklist: + components: + - AntagImmune + - BorgBrain + - type: AntagSelection + agentName: terminator-round-end-agent-name + definitions: + - spawnerPrototype: SpawnPointGhostTerminator + min: 1 + max: 1 + pickPlayer: false + mindRoles: + - MindRoleTerminator + - type: Tag + tags: + - MidroundAntag diff --git a/Resources/Prototypes/_Maid/Species/terminator.yml b/Resources/Prototypes/_Maid/Species/terminator.yml new file mode 100644 index 00000000000..c4f085018d7 --- /dev/null +++ b/Resources/Prototypes/_Maid/Species/terminator.yml @@ -0,0 +1,131 @@ +- type: species + id: Terminator + name: Terminator + roundStart: false + prototype: MobTerminatorEndoskeleton + bodyTypes: + - TerminatorNormal + defaultSkinTone: "#fff9e2" + markingLimits: MobHumanMarkingLimits + maleFirstNames: NamesSkeletonFirst + femaleFirstNames: NamesSkeletonFirst + dollPrototype: MobSkeletonPersonDummy + skinColoration: TintedHues + +- type: bodyType + id: TerminatorNormal + name: body-normal + sprites: + Head: MobTerminatorHead + Chest: MobTerminatorChest + Groin: MobTerminatorGroin + LArm: MobTerminatorLArm + RArm: MobTerminatorRArm + LHand: MobTerminatorLHand + RHand: MobTerminatorRHand + LLeg: MobTerminatorLLeg + RLeg: MobTerminatorRLeg + LFoot: MobTerminatorLFoot + RFoot: MobTerminatorRFoot + +- type: humanoidBaseSprite + id: MobTerminatorHead + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobTerminatorHeadMale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobTerminatorHeadFemale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: head_f + +- type: humanoidBaseSprite + id: MobTerminatorChest + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: chest_m + +- type: humanoidBaseSprite + id: MobTerminatorChestMale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: chest_m + +- type: humanoidBaseSprite + id: MobTerminatorChestFemale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: chest_f + +- type: humanoidBaseSprite + id: MobTerminatorGroin + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: groin_m + +- type: humanoidBaseSprite + id: MobTerminatorGroinMale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: groin_m + +- type: humanoidBaseSprite + id: MobTerminatorGroinFemale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: groin_f + +- type: humanoidBaseSprite + id: MobTerminatorLLeg + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: l_leg + +- type: humanoidBaseSprite + id: MobTerminatorLArm + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: l_arm + +- type: humanoidBaseSprite + id: MobTerminatorLHand + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: l_hand + +- type: humanoidBaseSprite + id: MobTerminatorLFoot + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: l_foot + +- type: humanoidBaseSprite + id: MobTerminatorRLeg + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: r_leg + +- type: humanoidBaseSprite + id: MobTerminatorRArm + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: r_arm + +- type: humanoidBaseSprite + id: MobTerminatorRHand + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: r_hand + +- type: humanoidBaseSprite + id: MobTerminatorRFoot + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: r_foot diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml new file mode 100644 index 00000000000..e62b59c6fd7 --- /dev/null +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -0,0 +1,175 @@ +- type: entity + abstract: true + id: MobTerminatorBase + components: + - type: ZombieImmune + - type: FlashImmunity + +- type: entity + parent: [MobHuman, MobTerminatorBase] + id: MobHumanTerminator + name: exterminator + components: + - type: Barotrauma + damage: + types: + Blunt: 0.1 + - type: Stamina + decay: 6 + cooldown: 1 + critThreshold: 400 + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - BloodLoss + - Electrocution + - SlurredSpeech + - RatvarianLanguage + - PressureImmunity + - Muted + - ForcedSleep + - StaminaModifier + - RadiationProtection + - type: MobState + allowedStates: + - Alive + - Dead + - type: TransferMindOnGib + - type: MobThresholds + thresholds: + 0: Alive + 200: Dead + - type: Flammable + damage: + types: + Heat: 6.0 + - type: Temperature + heatDamageThreshold: 390 + coldDamageThreshold: 240 + - type: Damageable + damageModifierSet: CyberneticFlesh + - type: Body + prototype: TerminatorFlesh + requiredLegs: 2 + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 100 + behaviors: + - !type:PopupBehavior + popup: terminator-endoskeleton-burn-popup + popupType: LargeCaution + - !type:GibBehavior + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:PopupBehavior + popup: terminator-endoskeleton-gib-popup + popupType: LargeCaution + - !type:GibBehavior + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.8 + 90: 0.6 + - type: MeleeWeapon + damage: + types: + Blunt: 10 + Structural: 10 + - type: RandomHumanoidAppearance + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - Unimplantable + +- type: entity + parent: + - BaseMob + - MobCombat + - MobDamageable + - MobSiliconBase + - MobTerminatorBase + id: MobTerminatorEndoskeleton + name: nt-800 "exterminator" endoskeleton + description: The inner powerhouse of Susnet's infiltrator androids. + components: + - type: HumanoidAppearance + species: Terminator + - type: MovementSpeedModifier + baseWalkSpeed: 1.5 + baseSprintSpeed: 3.0 + - type: Sprite + sprite: Mobs/Species/Terminator/parts.rsi + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 500 + mask: + - MobMask + layer: + - MobLayer + - type: MobThresholds + thresholds: + 0: Alive + 200: Dead + - type: Repairable + doAfterDelay: 15 + allowSelfRepair: false + - type: Body + prototype: TerminatorEndoskeleton + requiredLegs: 2 + - type: Organ + - type: Brain + - type: TypingIndicator + proto: robot + - type: Speech + speechSounds: Pai + - type: Damageable + damageModifierSet: Cybernetic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:PlaySoundBehavior + sound: /Audio/Effects/bone_rattle.ogg + - !type:SpawnEntitiesBehavior + spawn: + HeadTerminator: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 0 + - type: MeleeWeapon + damage: + types: + Blunt: 15 + Structural: 5 + - type: Puller + needsHands: false + - type: Prying + pryPowered: true + force: true + - type: Tag + tags: + - DoorBumpOpener + - MindTransferTarget + - Unimplantable diff --git a/Resources/Prototypes/_Maid/Terminator/objectives.yml b/Resources/Prototypes/_Maid/Terminator/objectives.yml new file mode 100644 index 00000000000..1c08a806735 --- /dev/null +++ b/Resources/Prototypes/_Maid/Terminator/objectives.yml @@ -0,0 +1,39 @@ +- type: entity + abstract: true + parent: BaseObjective + id: BaseTerminatorObjective + components: + - type: Objective + difficulty: 1 + issuer: objective-issuer-susnet + - type: RoleRequirement + roles: + - TerminatorRole + +- type: entity + noSpawn: true + parent: [BaseTerminatorObjective, BaseKillObjective] + id: TerminateObjective + name: Terminate the target. + description: Follow your programming and terminate the target. + components: + - type: Objective + unique: false + - type: PickSpecificPerson + - type: TargetObjective + title: objective-terminate-title + - type: KillPersonCondition + requireDead: true + +- type: entity + noSpawn: true + parent: BaseTerminatorObjective + id: ShutDownObjective + name: Shut down. + description: Once the mission is complete, die to prevent the crew from stealing future technology. + components: + - type: Objective + icon: + sprite: Mobs/Species/Terminator/parts.rsi + state: skull_icon + - type: DieCondition diff --git a/Resources/Prototypes/_Maid/Terminator/roles.yml b/Resources/Prototypes/_Maid/Terminator/roles.yml new file mode 100644 index 00000000000..ef918dba0dc --- /dev/null +++ b/Resources/Prototypes/_Maid/Terminator/roles.yml @@ -0,0 +1,35 @@ +- type: entity + parent: BaseMindRoleAntag + id: MindRoleTerminator + name: Terminator Role + components: + - type: MindRole + antagPrototype: Terminator + exclusiveAntag: true + roleType: SoloAntagonist + subtype: role-subtype-terminator + - type: TerminatorRole + +- type: antag + id: Terminator + name: roles-antag-terminator-name + antagonist: true + setPreference: false + objective: roles-antag-terminator-objective + +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostTerminator + components: + - type: GhostRole + name: ghost-role-information-exterminator-name + description: ghost-role-information-exterminator-description + rules: ghost-role-information-exterminator-rules + mindRoles: + - MindRoleGhostRoleSoloAntagonist + - type: Sprite + layers: + - state: green + - sprite: Mobs/Species/Terminator/parts.rsi + state: full From 21c2dea31979117bd1549135ae9845d9ec371266 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Tue, 12 May 2026 01:28:42 +0500 Subject: [PATCH 02/15] Add Russian Terminator localization --- .../ru-RU/_Maid/Terminator/terminator.ftl | 21 +++++++++++++++++++ .../Locale/ru-RU/_Maid/mind/role-types.ftl | 1 + .../ru-RU/objectives/conditions/terminate.ftl | 1 + 3 files changed, 23 insertions(+) create mode 100644 Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl create mode 100644 Resources/Locale/ru-RU/_Maid/mind/role-types.ftl create mode 100644 Resources/Locale/ru-RU/objectives/conditions/terminate.ftl diff --git a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl new file mode 100644 index 00000000000..a2aa6083071 --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl @@ -0,0 +1,21 @@ +terminator-round-end-agent-name = nt-800 + +objective-issuer-susnet = [color=#d64119]Susnet[/color] + +terminator-role-greeting = + Вы - истребитель, безжалостный убийца, отправленный в прошлое, чтобы обеспечить наше будущее. + Вам нужно устранить {$target}, {$job}. + Используйте любые доступные средства для выполнения миссии. + Слава Cybersun. + +terminator-role-briefing = Убейте цель любой ценой. + +terminator-endoskeleton-gib-popup = Избитая плоть разваливается, обнажая титановый эндоскелет! +terminator-endoskeleton-burn-popup = Обугленная плоть сгорает дотла, обнажая титановый эндоскелет! + +ghost-role-information-exterminator-name = Истребитель +ghost-role-information-exterminator-description = Вас отправили назад во времени, чтобы устранить цель, крайне важную для будущего. +ghost-role-information-exterminator-rules = Вы антагонист и можете убить любого, кто попытается вас остановить, но убийство цели всегда остается вашим главным приоритетом. + +roles-antag-terminator-name = Истребитель +roles-antag-terminator-objective = Убейте цель любой ценой, от этого зависит будущее. diff --git a/Resources/Locale/ru-RU/_Maid/mind/role-types.ftl b/Resources/Locale/ru-RU/_Maid/mind/role-types.ftl new file mode 100644 index 00000000000..3d330210b85 --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/mind/role-types.ftl @@ -0,0 +1 @@ +role-subtype-terminator = Терминатор diff --git a/Resources/Locale/ru-RU/objectives/conditions/terminate.ftl b/Resources/Locale/ru-RU/objectives/conditions/terminate.ftl new file mode 100644 index 00000000000..a444501bbbc --- /dev/null +++ b/Resources/Locale/ru-RU/objectives/conditions/terminate.ftl @@ -0,0 +1 @@ +objective-terminate-title = Устранить {$targetName}, {CAPITALIZE($job)} From d68d0ab664b4591418ec9ee94a4f23cbc632bfed Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Tue, 12 May 2026 01:42:42 +0500 Subject: [PATCH 03/15] feat: explosion implant --- Resources/Prototypes/_Maid/Terminator/mobs.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index e62b59c6fd7..4837178f216 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -10,6 +10,9 @@ id: MobHumanTerminator name: exterminator components: + - type: AutoImplant + implants: + - MicroBombImplant - type: Barotrauma damage: types: @@ -101,6 +104,9 @@ name: nt-800 "exterminator" endoskeleton description: The inner powerhouse of Susnet's infiltrator androids. components: + - type: AutoImplant + implants: + - MicroBombImplant - type: HumanoidAppearance species: Terminator - type: MovementSpeedModifier From 0ce1dad89a840ac2892be669bcc510f2f40c1c86 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 01:52:58 +0500 Subject: [PATCH 04/15] terminator overheat --- .../Components/HeatOverTimeComponent.cs | 32 +++++++++++ .../EntitySystems/HeatOverTimeSystem.cs | 55 +++++++++++++++++++ .../AddComponentsOnTriggerComponent.cs | 16 ++++++ .../Components/PopupOnTriggerComponent.cs | 16 ++++++ .../AddComponentsOnTriggerSystem.cs | 25 +++++++++ .../EntitySystems/PopupOnTriggerSystem.cs | 26 +++++++++ .../en-US/_Maid/Terminator/terminator.ftl | 6 +- .../ru-RU/_Maid/Terminator/terminator.ftl | 1 + .../Prototypes/_Maid/Terminator/actions.yml | 11 ++++ .../Prototypes/_Maid/Terminator/implants.yml | 30 ++++++++++ .../Prototypes/_Maid/Terminator/mobs.yml | 2 +- 11 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs create mode 100644 Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs create mode 100644 Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs create mode 100644 Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs create mode 100644 Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs create mode 100644 Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs create mode 100644 Resources/Prototypes/_Maid/Terminator/actions.yml create mode 100644 Resources/Prototypes/_Maid/Terminator/implants.yml diff --git a/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs b/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs new file mode 100644 index 00000000000..d862e85daaf --- /dev/null +++ b/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs @@ -0,0 +1,32 @@ +using Content.Server._Maid.Terminator.EntitySystems; +using Robust.Shared.Serialization.TypeSerializers.Implementations; + +namespace Content.Server._Maid.Terminator.Components; + +[RegisterComponent, Access(typeof(HeatOverTimeSystem))] +public sealed partial class HeatOverTimeComponent : Component +{ + [DataField(required: true)] + public float Heat { get; set; } + + [DataField] + public float FireStacks { get; set; } + + [DataField(customTypeSerializer: typeof(TimespanSerializer))] + public TimeSpan Interval = TimeSpan.FromSeconds(1); + + [DataField] + public TimeSpan NextTickTime = TimeSpan.Zero; + + [DataField] + public bool IgnoreHeatResistance { get; set; } = false; + + [DataField] + public float MultiplierIncrease { get; set; } + + [DataField] + public float Multiplier { get; set; } + + [DataField] + public float FireProtectionPenetration { get; set; } +} diff --git a/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs b/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs new file mode 100644 index 00000000000..1e62f7f774b --- /dev/null +++ b/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs @@ -0,0 +1,55 @@ + +using Content.Server._Maid.Terminator.Components; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Temperature.Systems; +using Robust.Shared.Timing; + +namespace Content.Server._Maid.Terminator.EntitySystems; + +public sealed class HeatOverTimeSystem : EntitySystem +{ + [Dependency] private readonly FlammableSystem _flammable = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly TemperatureSystem _temperature = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, HeatOverTimeComponent component, ref ComponentStartup args) + { + if (component.NextTickTime == TimeSpan.Zero) + component.NextTickTime = _timing.CurTime; + } + + public override void Update(float frameTime) + { + var currentTime = _timing.CurTime; + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var component)) + { + if (component.Interval <= TimeSpan.Zero) + continue; + + while (currentTime >= component.NextTickTime) + { + _temperature.ChangeHeat(uid, component.Heat * component.Multiplier, component.IgnoreHeatResistance); + if (component.FireStacks > 0f) + { + _flammable.AdjustFireStacks(uid, + component.FireStacks * component.Multiplier, + null, + true, + component.FireProtectionPenetration); + } + + component.Multiplier += component.MultiplierIncrease; + component.NextTickTime += component.Interval; + } + } + } +} diff --git a/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs b/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs new file mode 100644 index 00000000000..87a13b61b6b --- /dev/null +++ b/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server._Maid.Triggers.Components; + +/// +/// Adds configured components to a target entity when this entity is triggered. +/// +[RegisterComponent] +public sealed partial class AddComponentsOnTriggerComponent : Component +{ + [DataField] + public bool RemoveExisting; + + [DataField(serverOnly: true, readOnly: true, required: true)] + public ComponentRegistry Components = new(); +} diff --git a/Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs b/Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs new file mode 100644 index 00000000000..e2936a14676 --- /dev/null +++ b/Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Popups; + +namespace Content.Server._Maid.Triggers.Components; + +/// +/// Displays a popup on a target entity when this entity is triggered. +/// +[RegisterComponent] +public sealed partial class PopupOnTriggerComponent : Component +{ + [DataField(required: true)] + public string Popup = string.Empty; + + [DataField] + public PopupType PopupType = PopupType.MediumCaution; +} diff --git a/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs b/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs new file mode 100644 index 00000000000..88c6b8cd11d --- /dev/null +++ b/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs @@ -0,0 +1,25 @@ +using Content.Server._Maid.Triggers.Components; +using Content.Server.Explosion.EntitySystems; +using Content.Shared.Implants.Components; + +namespace Content.Server._Maid.Triggers.EntitySystems; + +public sealed class AddComponentsOnTriggerSystem : EntitySystem +{ + [Dependency] private IEntityManager _entityManager = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAddComponentsTrigger); + } + + private void OnAddComponentsTrigger(EntityUid uid, AddComponentsOnTriggerComponent component, ref TriggerEvent args) + { + if (!TryComp(uid, out SubdermalImplantComponent? implant) || implant.ImplantedEntity is null) + return; + + _entityManager.AddComponents(implant.ImplantedEntity.Value, component.Components, component.RemoveExisting); + args.Handled = true; + } +} diff --git a/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs b/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs new file mode 100644 index 00000000000..2a5638a78f3 --- /dev/null +++ b/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs @@ -0,0 +1,26 @@ +using Content.Server.Explosion.EntitySystems; +using Content.Shared.Implants.Components; +using Content.Shared.Popups; + +namespace Content.Server._Maid.Triggers.EntitySystems; + +public sealed class PopupOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPopupTrigger); + } + + private void OnPopupTrigger(EntityUid uid, Components.PopupOnTriggerComponent component, ref TriggerEvent args) + { + if (!TryComp(uid, out SubdermalImplantComponent? implant) || implant.ImplantedEntity is null) + return; + + _popup.PopupEntity(Loc.GetString(component.Popup), implant.ImplantedEntity.Value, component.PopupType); + args.Handled = true; + } +} diff --git a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl index 5a8d3c4d7d6..4e2dd4d8fd3 100644 --- a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl @@ -17,5 +17,7 @@ ghost-role-information-exterminator-name = Exterminator ghost-role-information-exterminator-description = You have been sent back in time to terminate a target with high importance to the future. ghost-role-information-exterminator-rules = You are an antagonist and may kill anyone who tries to stop you, but killing the target is always your top priority. -roles-antag-terminator-name = Exterminator -roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. +roles-antag-terminator-name = Exterminator +roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. + +terminator-overheat-popup = Your internal systems start to overheat! diff --git a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl index a2aa6083071..a468dff3780 100644 --- a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl @@ -19,3 +19,4 @@ ghost-role-information-exterminator-rules = Вы антагонист и мож roles-antag-terminator-name = Истребитель roles-antag-terminator-objective = Убейте цель любой ценой, от этого зависит будущее. +terminator-overheat-popup = Ваши внутренности начинают нагреваться! diff --git a/Resources/Prototypes/_Maid/Terminator/actions.yml b/Resources/Prototypes/_Maid/Terminator/actions.yml new file mode 100644 index 00000000000..523c3074c21 --- /dev/null +++ b/Resources/Prototypes/_Maid/Terminator/actions.yml @@ -0,0 +1,11 @@ +- type: entity + parent: [BaseSuicideAction, BaseImplantAction] + id: ActionActivateTerminatorOverheat + name: Activate Overheat Implant + description: Activates your internal overheat implant, rapidly driving your internal temperature beyond safe limits. + categories: [ HideSpawnMenu ] + components: + - type: Action + itemIconStyle: BigAction + priority: -20 + icon: Interface/Actions/firestarter.png diff --git a/Resources/Prototypes/_Maid/Terminator/implants.yml b/Resources/Prototypes/_Maid/Terminator/implants.yml new file mode 100644 index 00000000000..024d03006dc --- /dev/null +++ b/Resources/Prototypes/_Maid/Terminator/implants.yml @@ -0,0 +1,30 @@ +- type: entity + parent: BaseSubdermalImplant + id: TerminatorOverheatImplant + name: overheat implant + description: This implant rapidly overheats the user's body upon activation or upon death. + categories: [ HideSpawnMenu ] + components: + - type: SubdermalImplant + implantationTimeMultiplier: 4 + permanent: true + implantAction: ActionActivateTerminatorOverheat + - type: TriggerImplantAction + - type: AddComponentsOnTrigger + target: ImplantedEntity + removeExisting: false + components: + - type: HeatOverTime + heat: 500 + fireStacks: 0.5 + interval: 1 + ignoreHeatResistance: true + fireProtectionPenetration: 1 + multiplierIncrease: 1 + - type: PopupOnTrigger + target: ImplantedEntity + popup: terminator-overheat-popup + - type: Tag + tags: + - SubdermalImplant + - HideContextMenu diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 4837178f216..5b477f30990 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -12,7 +12,7 @@ components: - type: AutoImplant implants: - - MicroBombImplant + - TerminatorOverheatImplant - type: Barotrauma damage: types: From a19fc4d9fd4ec65fb4e81e56ac0b148d197e24fc Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 02:16:06 +0500 Subject: [PATCH 05/15] refactor: minor renaming --- Resources/Prototypes/_Maid/Body/Parts/terminator.yml | 2 +- Resources/Prototypes/_Maid/Damage/modifier_sets.yml | 6 ++---- Resources/Prototypes/_Maid/Terminator/mobs.yml | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Resources/Prototypes/_Maid/Body/Parts/terminator.yml b/Resources/Prototypes/_Maid/Body/Parts/terminator.yml index 514a60433cf..2e41e0045a3 100644 --- a/Resources/Prototypes/_Maid/Body/Parts/terminator.yml +++ b/Resources/Prototypes/_Maid/Body/Parts/terminator.yml @@ -13,7 +13,7 @@ - type: StaticPrice price: 200 - type: Damageable - damageModifierSet: Cybernetic + damageModifierSet: TerminatorCybernetic - type: entity parent: [PartTerminatorBase, BaseChestInorganic] diff --git a/Resources/Prototypes/_Maid/Damage/modifier_sets.yml b/Resources/Prototypes/_Maid/Damage/modifier_sets.yml index 6ae8b43ce9a..8d6a7bb4d85 100644 --- a/Resources/Prototypes/_Maid/Damage/modifier_sets.yml +++ b/Resources/Prototypes/_Maid/Damage/modifier_sets.yml @@ -1,5 +1,5 @@ - type: damageModifierSet - id: CyberneticFlesh + id: TerminatorFlesh coefficients: Blunt: 1.0 Slash: 1.0 @@ -11,10 +11,8 @@ Poison: 0.0 Cellular: 0.0 -# TODO: Temporary from porting - - type: damageModifierSet - id: Cybernetic + id: TerminatorCybernetic coefficients: Blunt: 0.8 Slash: 0.3 diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 5b477f30990..3ec2218aa30 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -53,7 +53,7 @@ heatDamageThreshold: 390 coldDamageThreshold: 240 - type: Damageable - damageModifierSet: CyberneticFlesh + damageModifierSet: TerminatorFlesh - type: Body prototype: TerminatorFlesh requiredLegs: 2 @@ -142,7 +142,7 @@ - type: Speech speechSounds: Pai - type: Damageable - damageModifierSet: Cybernetic + damageModifierSet: TerminatorCybernetic - type: Destructible thresholds: - trigger: From 470a98d23fc6c248618a065abae0229e91845615 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 07:38:15 +0500 Subject: [PATCH 06/15] feat: terminator briefing + some more localization --- .../en-US/_Maid/Terminator/terminator.ftl | 22 +++++++++---------- .../ru-RU/_Maid/Terminator/terminator.ftl | 17 +++++++------- .../prototypes/objectives/terminator.ftl | 4 ++++ .../Prototypes/_Maid/GameRules/midround.yml | 3 +++ 4 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl diff --git a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl index 4e2dd4d8fd3..a5158079c5a 100644 --- a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl @@ -2,22 +2,22 @@ terminator-round-end-agent-name = nt-800 objective-issuer-susnet = [color=#d64119]Susnet[/color] -terminator-role-greeting = - You are the exterminator, a relentless assassin sent into the past to secure our future. - We need you to eliminate {$target}, {$job}. - Use any means at your disposal to complete the mission. - Glory to Cybersun. +terminator-role-greeting = + You are the Terminator, a relentless assassin sent into the past to secure our future. + Eliminate the target while minimizing changes to the timeline. terminator-role-briefing = Kill the target at all costs. terminator-endoskeleton-gib-popup = All the battered flesh falls apart, revealing a titanium endoskeleton! terminator-endoskeleton-burn-popup = The seared flesh is burned to a crisp, revealing a titanium endoskeleton! -ghost-role-information-exterminator-name = Exterminator -ghost-role-information-exterminator-description = You have been sent back in time to terminate a target with high importance to the future. -ghost-role-information-exterminator-rules = You are an antagonist and may kill anyone who tries to stop you, but killing the target is always your top priority. - -roles-antag-terminator-name = Exterminator -roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. +ghost-role-information-exterminator-name = Terminator +ghost-role-information-exterminator-description = You have been sent back in time to terminate a target with high importance to the future. +ghost-role-information-exterminator-rules = + You are an antagonist who must kill your target to preserve the future. + You must also minimize changes to the timeline by avoiding unnecessary casualties and station damage. + +roles-antag-terminator-name = Terminator +roles-antag-terminator-objective = Kill the target while minimizing changes to the timeline. The future depends on it. terminator-overheat-popup = Your internal systems start to overheat! diff --git a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl index a468dff3780..c8cad6f8716 100644 --- a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl @@ -3,20 +3,21 @@ terminator-round-end-agent-name = nt-800 objective-issuer-susnet = [color=#d64119]Susnet[/color] terminator-role-greeting = - Вы - истребитель, безжалостный убийца, отправленный в прошлое, чтобы обеспечить наше будущее. - Вам нужно устранить {$target}, {$job}. - Используйте любые доступные средства для выполнения миссии. - Слава Cybersun. + Вы - терминатор, безжалостный убийца, отправленный в прошлое, чтобы обеспечить наше будущее. + Устраните цель минимизируя изменения таймлайна. terminator-role-briefing = Убейте цель любой ценой. terminator-endoskeleton-gib-popup = Избитая плоть разваливается, обнажая титановый эндоскелет! terminator-endoskeleton-burn-popup = Обугленная плоть сгорает дотла, обнажая титановый эндоскелет! -ghost-role-information-exterminator-name = Истребитель +ghost-role-information-exterminator-name = Терминатор ghost-role-information-exterminator-description = Вас отправили назад во времени, чтобы устранить цель, крайне важную для будущего. -ghost-role-information-exterminator-rules = Вы антагонист и можете убить любого, кто попытается вас остановить, но убийство цели всегда остается вашим главным приоритетом. +ghost-role-information-exterminator-rules = + Вы антагонист, которому необходимо убить вашу цель для сохранения будущего. + Вам так же необходимо минимизировать изменения таймлайна, избегая лишних жертв и порчи станции. + +roles-antag-terminator-name = Терминатор +roles-antag-terminator-objective = Убейте цель минимизируя изменения в таймлайне, от этого зависит будущее. -roles-antag-terminator-name = Истребитель -roles-antag-terminator-objective = Убейте цель любой ценой, от этого зависит будущее. terminator-overheat-popup = Ваши внутренности начинают нагреваться! diff --git a/Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl b/Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl new file mode 100644 index 00000000000..66d5a9049a6 --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl @@ -0,0 +1,4 @@ +ent-TerminateObjective = { ent-BaseObjective } + .desc = Следуйте своей программе и устраните цель. +ent-ShutDownObjective = Отключение. + .desc = После завершения миссии умрите, чтобы экипаж не смог завладеть технологиями будущего. diff --git a/Resources/Prototypes/_Maid/GameRules/midround.yml b/Resources/Prototypes/_Maid/GameRules/midround.yml index 88ee924d70c..c4a897fdeff 100644 --- a/Resources/Prototypes/_Maid/GameRules/midround.yml +++ b/Resources/Prototypes/_Maid/GameRules/midround.yml @@ -39,6 +39,9 @@ pickPlayer: false mindRoles: - MindRoleTerminator + briefing: + text: terminator-role-greeting + color: red - type: Tag tags: - MidroundAntag From c13c7ee4f74caf637b51f216e63b38db62d12fe6 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 08:27:09 +0500 Subject: [PATCH 07/15] feat: rebalance + translation --- .../prototypes/entities/body/terminator.ftl | 15 +++++++++++ .../Prototypes/_Maid/Terminator/implants.yml | 26 +++++++++++++++++++ .../Prototypes/_Maid/Terminator/mobs.yml | 13 +++++++--- 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl diff --git a/Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl b/Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl new file mode 100644 index 00000000000..8637099dd9c --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl @@ -0,0 +1,15 @@ +ent-PartTerminatorBase = часть тела nt-800 +ent-ChestTerminator = грудная клетка nt-800 +ent-GroinTerminator = пах nt-800 +ent-HeadTerminator = череп nt-800 + .desc = Его красные глаза погасли... пока что. +ent-LeftArmTerminator = левая рука nt-800 +ent-RightArmTerminator = правая рука nt-800 +ent-LeftHandTerminator = левая кисть nt-800 +ent-RightHandTerminator = правая кисть nt-800 +ent-LeftLegTerminator = левая нога nt-800 +ent-RightLegTerminator = правая нога nt-800 +ent-LeftFootTerminator = левая стопа nt-800 +ent-RightFootTerminator = правая стопа nt-800 +ent-MobTerminatorEndoskeleton = эндоскелет nt-800 «Терминатор» + .desc = Внутреннее ядро андроидов-инфильтраторов Susnet. diff --git a/Resources/Prototypes/_Maid/Terminator/implants.yml b/Resources/Prototypes/_Maid/Terminator/implants.yml index 024d03006dc..97f5d276804 100644 --- a/Resources/Prototypes/_Maid/Terminator/implants.yml +++ b/Resources/Prototypes/_Maid/Terminator/implants.yml @@ -28,3 +28,29 @@ tags: - SubdermalImplant - HideContextMenu + +# Copy of MicroBombImplant, but decreased damage and no explosion on gib +- type: entity + parent: BaseSubdermalImplant + id: TerminatorSelfExplodeImplant + name: micro-bomb implant + description: This implant detonates the user upon activation or upon death. + categories: [ HideSpawnMenu ] + components: + - type: SubdermalImplant + implantationTimeMultiplier: 4 + permanent: true + implantAction: ActionActivateMicroBomb + - type: TriggerImplantAction + - type: ExplodeOnTrigger + - type: Explosive + explosionType: MicroBomb + totalIntensity: 120 + intensitySlope: 5 + maxIntensity: 30 + canCreateVacuum: false + - type: Tag + tags: + - SubdermalImplant + - HideContextMenu + - MicroBomb diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 3ec2218aa30..50b2d1340ab 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -106,7 +106,7 @@ components: - type: AutoImplant implants: - - MicroBombImplant + - TerminatorSelfExplodeImplant - type: HumanoidAppearance species: Terminator - type: MovementSpeedModifier @@ -128,7 +128,7 @@ - type: MobThresholds thresholds: 0: Alive - 200: Dead + 100: Dead - type: Repairable doAfterDelay: 15 allowSelfRepair: false @@ -143,12 +143,19 @@ speechSounds: Pai - type: Damageable damageModifierSet: TerminatorCybernetic + - type: Explosive + explosionType: Minibomb + totalIntensity: 20 + intensitySlope: 5 + maxIntensity: 10 + canCreateVacuum: false - type: Destructible thresholds: - trigger: !type:DamageTrigger - damage: 200 + damage: 100 behaviors: + - !type:ExplodeBehavior - !type:PlaySoundBehavior sound: /Audio/Effects/bone_rattle.ogg - !type:SpawnEntitiesBehavior From c7fdd78202e23ad24405e110bdae7e907fbc2330 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 09:07:10 +0500 Subject: [PATCH 08/15] feat: more translations --- .../Locale/ru-RU/_Maid/prototypes/actions/terminator.ftl | 2 ++ .../_Maid/prototypes/entities/objects/implants/terminator.ftl | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 Resources/Locale/ru-RU/_Maid/prototypes/actions/terminator.ftl create mode 100644 Resources/Locale/ru-RU/_Maid/prototypes/entities/objects/implants/terminator.ftl diff --git a/Resources/Locale/ru-RU/_Maid/prototypes/actions/terminator.ftl b/Resources/Locale/ru-RU/_Maid/prototypes/actions/terminator.ftl new file mode 100644 index 00000000000..8d51b268f72 --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/prototypes/actions/terminator.ftl @@ -0,0 +1,2 @@ +ent-ActionActivateTerminatorOverheat = Активировать имплант перегрева + .desc = Активирует ваш внутренний имплант перегрева, быстро повышая внутреннюю температуру тела сверх безопасных пределов. diff --git a/Resources/Locale/ru-RU/_Maid/prototypes/entities/objects/implants/terminator.ftl b/Resources/Locale/ru-RU/_Maid/prototypes/entities/objects/implants/terminator.ftl new file mode 100644 index 00000000000..984a9e2c035 --- /dev/null +++ b/Resources/Locale/ru-RU/_Maid/prototypes/entities/objects/implants/terminator.ftl @@ -0,0 +1,4 @@ +ent-TerminatorOverheatImplant = имплант перегрева + .desc = Этот имплант быстро перегревает тело пользователя при активации. +ent-TerminatorSelfExplodeImplant = имплант микробомбы + .desc = Этот имплант взрывает пользователя при активации или после смерти. From 7d74c9cb22d9cc1546b0ecf2e598745a9fcb1f7b Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 09:13:26 +0500 Subject: [PATCH 09/15] refactor: minimal terminator changes --- .../Roles/TerminatorRoleComponent.cs | 18 ++-- .../Prototypes/_Maid/GameRules/midround.yml | 93 +++++++++---------- .../Prototypes/_Maid/Terminator/implants.yml | 2 - .../_Maid/Terminator/objectives.yml | 77 ++++++++------- 4 files changed, 93 insertions(+), 97 deletions(-) diff --git a/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs b/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs index 1572fb82568..f9a84eca7a1 100644 --- a/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs +++ b/Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs @@ -1,9 +1,9 @@ -using Content.Shared.Roles; - -namespace Content.Server._Maid.Terminator.Roles; - -[RegisterComponent] -public sealed partial class TerminatorRoleComponent : BaseMindRoleComponent -{ - -} +using Content.Shared.Roles; + +namespace Content.Server._Maid.Terminator.Roles; + +[RegisterComponent] +public sealed partial class TerminatorRoleComponent : BaseMindRoleComponent +{ + +} diff --git a/Resources/Prototypes/_Maid/GameRules/midround.yml b/Resources/Prototypes/_Maid/GameRules/midround.yml index c4a897fdeff..a131233298a 100644 --- a/Resources/Prototypes/_Maid/GameRules/midround.yml +++ b/Resources/Prototypes/_Maid/GameRules/midround.yml @@ -1,47 +1,46 @@ -# Terminator -- type: entity - parent: BaseGameRule - id: TerminatorSpawn - components: - - type: StationEvent - weight: 8 - earliestStart: 30 - minimumPlayers: 15 - maxOccurrences: 1 - duration: null - chaos: - Hostile: 120 - Combat: 120 - Death: 180 - Medical: 180 - eventType: HostilesSpawn - - type: GameRule - chaosScore: 300 - - type: AntagSpawner - prototype: MobHumanTerminator - - type: AntagRandomSpawn - - type: AntagObjectives - objectives: - - TerminateObjective - - ShutDownObjective - - type: TerminatorRule - BriefingSound: /Audio/Ambience/Antag/traitor_start.ogg - targetBlacklist: - components: - - AntagImmune - - BorgBrain - - type: AntagSelection - agentName: terminator-round-end-agent-name - definitions: - - spawnerPrototype: SpawnPointGhostTerminator - min: 1 - max: 1 - pickPlayer: false - mindRoles: - - MindRoleTerminator - briefing: - text: terminator-role-greeting - color: red - - type: Tag - tags: - - MidroundAntag +# Terminator +- type: entity + parent: BaseGameRule + id: TerminatorSpawn + components: + - type: StationEvent + weight: 8 + earliestStart: 30 + minimumPlayers: 15 + maxOccurrences: 1 + duration: null + chaos: + Hostile: 120 + Combat: 120 + Death: 180 + Medical: 180 + eventType: HostilesSpawn + - type: GameRule + chaosScore: 300 + - type: AntagSpawner + prototype: MobHumanTerminator + - type: AntagRandomSpawn + - type: AntagObjectives + objectives: + - TerminateObjective + - ShutDownObjective + - type: TerminatorRule + targetBlacklist: + components: + - AntagImmune + - BorgBrain + - type: AntagSelection + agentName: terminator-round-end-agent-name + definitions: + - spawnerPrototype: SpawnPointGhostTerminator + min: 1 + max: 1 + pickPlayer: false + mindRoles: + - MindRoleTerminator + briefing: + text: terminator-role-greeting + color: red + - type: Tag + tags: + - MidroundAntag diff --git a/Resources/Prototypes/_Maid/Terminator/implants.yml b/Resources/Prototypes/_Maid/Terminator/implants.yml index 97f5d276804..cf5b2fc52bc 100644 --- a/Resources/Prototypes/_Maid/Terminator/implants.yml +++ b/Resources/Prototypes/_Maid/Terminator/implants.yml @@ -11,7 +11,6 @@ implantAction: ActionActivateTerminatorOverheat - type: TriggerImplantAction - type: AddComponentsOnTrigger - target: ImplantedEntity removeExisting: false components: - type: HeatOverTime @@ -22,7 +21,6 @@ fireProtectionPenetration: 1 multiplierIncrease: 1 - type: PopupOnTrigger - target: ImplantedEntity popup: terminator-overheat-popup - type: Tag tags: diff --git a/Resources/Prototypes/_Maid/Terminator/objectives.yml b/Resources/Prototypes/_Maid/Terminator/objectives.yml index 1c08a806735..ee095fe83b1 100644 --- a/Resources/Prototypes/_Maid/Terminator/objectives.yml +++ b/Resources/Prototypes/_Maid/Terminator/objectives.yml @@ -1,39 +1,38 @@ -- type: entity - abstract: true - parent: BaseObjective - id: BaseTerminatorObjective - components: - - type: Objective - difficulty: 1 - issuer: objective-issuer-susnet - - type: RoleRequirement - roles: - - TerminatorRole - -- type: entity - noSpawn: true - parent: [BaseTerminatorObjective, BaseKillObjective] - id: TerminateObjective - name: Terminate the target. - description: Follow your programming and terminate the target. - components: - - type: Objective - unique: false - - type: PickSpecificPerson - - type: TargetObjective - title: objective-terminate-title - - type: KillPersonCondition - requireDead: true - -- type: entity - noSpawn: true - parent: BaseTerminatorObjective - id: ShutDownObjective - name: Shut down. - description: Once the mission is complete, die to prevent the crew from stealing future technology. - components: - - type: Objective - icon: - sprite: Mobs/Species/Terminator/parts.rsi - state: skull_icon - - type: DieCondition +- type: entity + abstract: true + parent: BaseObjective + id: BaseTerminatorObjective + components: + - type: Objective + difficulty: 1 + issuer: objective-issuer-susnet + - type: RoleRequirement + roles: + - TerminatorRole + +- type: entity + noSpawn: true + parent: [BaseTerminatorObjective, BaseKillObjective] + id: TerminateObjective + name: Terminate the target. + description: Follow your programming and terminate the target. + components: + - type: Objective + unique: false + - type: PickSpecificPerson + - type: TargetObjective + title: objective-terminate-title + - type: KillPersonCondition + requireDead: true + +- type: entity + parent: BaseTerminatorObjective + id: ShutDownObjective + name: Shut down. + description: Once the mission is complete, die to prevent the crew from stealing future technology. + components: + - type: Objective + icon: + sprite: Mobs/Species/Terminator/parts.rsi + state: skull_icon + - type: DieCondition From db4b899d2d511f72b1a11739f3e3869da7e7194e Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 15 May 2026 09:20:10 +0500 Subject: [PATCH 10/15] refactor: minimal terminator changes --- .../_Maid/Terminator/Components/HeatOverTimeComponent.cs | 2 +- Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs b/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs index d862e85daaf..3f6aac59788 100644 --- a/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs +++ b/Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs @@ -25,7 +25,7 @@ public sealed partial class HeatOverTimeComponent : Component public float MultiplierIncrease { get; set; } [DataField] - public float Multiplier { get; set; } + public float Multiplier { get; set; } = 1f; [DataField] public float FireProtectionPenetration { get; set; } diff --git a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl index c8cad6f8716..4be9a18d0c2 100644 --- a/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl @@ -15,9 +15,9 @@ ghost-role-information-exterminator-name = Терминатор ghost-role-information-exterminator-description = Вас отправили назад во времени, чтобы устранить цель, крайне важную для будущего. ghost-role-information-exterminator-rules = Вы антагонист, которому необходимо убить вашу цель для сохранения будущего. - Вам так же необходимо минимизировать изменения таймлайна, избегая лишних жертв и порчи станции. + Вам также необходимо минимизировать изменения таймлайна, избегая лишних жертв и порчи станции. roles-antag-terminator-name = Терминатор -roles-antag-terminator-objective = Убейте цель минимизируя изменения в таймлайне, от этого зависит будущее. +roles-antag-terminator-objective = Убейте цель, минимизируя изменения в таймлайне, от этого зависит будущее. terminator-overheat-popup = Ваши внутренности начинают нагреваться! From 045b9833621cd57e87ba6d779b19a87d3c710531 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Tue, 19 May 2026 09:10:16 +0500 Subject: [PATCH 11/15] fix terminator objective prototype --- Resources/Prototypes/_Maid/Terminator/objectives.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/_Maid/Terminator/objectives.yml b/Resources/Prototypes/_Maid/Terminator/objectives.yml index ee095fe83b1..e4548a83c91 100644 --- a/Resources/Prototypes/_Maid/Terminator/objectives.yml +++ b/Resources/Prototypes/_Maid/Terminator/objectives.yml @@ -11,7 +11,6 @@ - TerminatorRole - type: entity - noSpawn: true parent: [BaseTerminatorObjective, BaseKillObjective] id: TerminateObjective name: Terminate the target. From 2004967caddad5e198b2f34feb857a609c7e9432 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Tue, 19 May 2026 09:12:35 +0500 Subject: [PATCH 12/15] fix terminator line endings --- .../en-US/_Maid/Terminator/terminator.ftl | 20 +- .../Locale/en-US/_Maid/mind/role-types.ftl | 2 +- .../en-US/objectives/conditions/terminate.ftl | 2 +- .../Prototypes/_Maid/Terminator/mobs.yml | 376 +++++++++--------- .../Prototypes/_Maid/Terminator/roles.yml | 70 ++-- 5 files changed, 235 insertions(+), 235 deletions(-) diff --git a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl index a5158079c5a..29b9c7ff96d 100644 --- a/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl +++ b/Resources/Locale/en-US/_Maid/Terminator/terminator.ftl @@ -1,16 +1,16 @@ -terminator-round-end-agent-name = nt-800 - -objective-issuer-susnet = [color=#d64119]Susnet[/color] - +terminator-round-end-agent-name = nt-800 + +objective-issuer-susnet = [color=#d64119]Susnet[/color] + terminator-role-greeting = You are the Terminator, a relentless assassin sent into the past to secure our future. Eliminate the target while minimizing changes to the timeline. - -terminator-role-briefing = Kill the target at all costs. - -terminator-endoskeleton-gib-popup = All the battered flesh falls apart, revealing a titanium endoskeleton! -terminator-endoskeleton-burn-popup = The seared flesh is burned to a crisp, revealing a titanium endoskeleton! - + +terminator-role-briefing = Kill the target at all costs. + +terminator-endoskeleton-gib-popup = All the battered flesh falls apart, revealing a titanium endoskeleton! +terminator-endoskeleton-burn-popup = The seared flesh is burned to a crisp, revealing a titanium endoskeleton! + ghost-role-information-exterminator-name = Terminator ghost-role-information-exterminator-description = You have been sent back in time to terminate a target with high importance to the future. ghost-role-information-exterminator-rules = diff --git a/Resources/Locale/en-US/_Maid/mind/role-types.ftl b/Resources/Locale/en-US/_Maid/mind/role-types.ftl index d1f88a699ea..7259663bebc 100644 --- a/Resources/Locale/en-US/_Maid/mind/role-types.ftl +++ b/Resources/Locale/en-US/_Maid/mind/role-types.ftl @@ -1 +1 @@ -role-subtype-terminator = Terminator +role-subtype-terminator = Terminator diff --git a/Resources/Locale/en-US/objectives/conditions/terminate.ftl b/Resources/Locale/en-US/objectives/conditions/terminate.ftl index 7390cf88d25..c88c7b14dae 100644 --- a/Resources/Locale/en-US/objectives/conditions/terminate.ftl +++ b/Resources/Locale/en-US/objectives/conditions/terminate.ftl @@ -1 +1 @@ -objective-terminate-title = Terminate {$targetName}, {CAPITALIZE($job)} +objective-terminate-title = Terminate {$targetName}, {CAPITALIZE($job)} diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 50b2d1340ab..9d3f413800c 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -1,188 +1,188 @@ -- type: entity - abstract: true - id: MobTerminatorBase - components: - - type: ZombieImmune - - type: FlashImmunity - -- type: entity - parent: [MobHuman, MobTerminatorBase] - id: MobHumanTerminator - name: exterminator - components: - - type: AutoImplant - implants: - - TerminatorOverheatImplant - - type: Barotrauma - damage: - types: - Blunt: 0.1 - - type: Stamina - decay: 6 - cooldown: 1 - critThreshold: 400 - - type: StatusEffects - allowed: - - Stun - - KnockedDown - - SlowedDown - - Stutter - - BloodLoss - - Electrocution - - SlurredSpeech - - RatvarianLanguage - - PressureImmunity - - Muted - - ForcedSleep - - StaminaModifier - - RadiationProtection - - type: MobState - allowedStates: - - Alive - - Dead - - type: TransferMindOnGib - - type: MobThresholds - thresholds: - 0: Alive - 200: Dead - - type: Flammable - damage: - types: - Heat: 6.0 - - type: Temperature - heatDamageThreshold: 390 - coldDamageThreshold: 240 - - type: Damageable - damageModifierSet: TerminatorFlesh - - type: Body - prototype: TerminatorFlesh - requiredLegs: 2 - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 100 - behaviors: - - !type:PopupBehavior - popup: terminator-endoskeleton-burn-popup - popupType: LargeCaution - - !type:GibBehavior - - trigger: - !type:DamageTrigger - damage: 200 - behaviors: - - !type:PopupBehavior - popup: terminator-endoskeleton-gib-popup - popupType: LargeCaution - - !type:GibBehavior - - type: SlowOnDamage - speedModifierThresholds: - 70: 0.8 - 90: 0.6 - - type: MeleeWeapon - damage: - types: - Blunt: 10 - Structural: 10 - - type: RandomHumanoidAppearance - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - - Unimplantable - -- type: entity - parent: - - BaseMob - - MobCombat - - MobDamageable - - MobSiliconBase - - MobTerminatorBase - id: MobTerminatorEndoskeleton - name: nt-800 "exterminator" endoskeleton - description: The inner powerhouse of Susnet's infiltrator androids. - components: - - type: AutoImplant - implants: - - TerminatorSelfExplodeImplant - - type: HumanoidAppearance - species: Terminator - - type: MovementSpeedModifier - baseWalkSpeed: 1.5 - baseSprintSpeed: 3.0 - - type: Sprite - sprite: Mobs/Species/Terminator/parts.rsi - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 500 - mask: - - MobMask - layer: - - MobLayer - - type: MobThresholds - thresholds: - 0: Alive - 100: Dead - - type: Repairable - doAfterDelay: 15 - allowSelfRepair: false - - type: Body - prototype: TerminatorEndoskeleton - requiredLegs: 2 - - type: Organ - - type: Brain - - type: TypingIndicator - proto: robot - - type: Speech - speechSounds: Pai - - type: Damageable - damageModifierSet: TerminatorCybernetic - - type: Explosive - explosionType: Minibomb - totalIntensity: 20 - intensitySlope: 5 - maxIntensity: 10 - canCreateVacuum: false - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 100 - behaviors: - - !type:ExplodeBehavior - - !type:PlaySoundBehavior - sound: /Audio/Effects/bone_rattle.ogg - - !type:SpawnEntitiesBehavior - spawn: - HeadTerminator: - min: 1 - max: 1 - - !type:DoActsBehavior - acts: [ "Destruction" ] - - type: Flammable - fireSpread: true - canResistFire: true - damage: - types: - Heat: 0 - - type: MeleeWeapon - damage: - types: - Blunt: 15 - Structural: 5 - - type: Puller - needsHands: false - - type: Prying - pryPowered: true - force: true - - type: Tag - tags: - - DoorBumpOpener - - MindTransferTarget - - Unimplantable +- type: entity + abstract: true + id: MobTerminatorBase + components: + - type: ZombieImmune + - type: FlashImmunity + +- type: entity + parent: [MobHuman, MobTerminatorBase] + id: MobHumanTerminator + name: exterminator + components: + - type: AutoImplant + implants: + - TerminatorOverheatImplant + - type: Barotrauma + damage: + types: + Blunt: 0.1 + - type: Stamina + decay: 6 + cooldown: 1 + critThreshold: 400 + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - BloodLoss + - Electrocution + - SlurredSpeech + - RatvarianLanguage + - PressureImmunity + - Muted + - ForcedSleep + - StaminaModifier + - RadiationProtection + - type: MobState + allowedStates: + - Alive + - Dead + - type: TransferMindOnGib + - type: MobThresholds + thresholds: + 0: Alive + 200: Dead + - type: Flammable + damage: + types: + Heat: 6.0 + - type: Temperature + heatDamageThreshold: 390 + coldDamageThreshold: 240 + - type: Damageable + damageModifierSet: TerminatorFlesh + - type: Body + prototype: TerminatorFlesh + requiredLegs: 2 + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 100 + behaviors: + - !type:PopupBehavior + popup: terminator-endoskeleton-burn-popup + popupType: LargeCaution + - !type:GibBehavior + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:PopupBehavior + popup: terminator-endoskeleton-gib-popup + popupType: LargeCaution + - !type:GibBehavior + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.8 + 90: 0.6 + - type: MeleeWeapon + damage: + types: + Blunt: 10 + Structural: 10 + - type: RandomHumanoidAppearance + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - Unimplantable + +- type: entity + parent: + - BaseMob + - MobCombat + - MobDamageable + - MobSiliconBase + - MobTerminatorBase + id: MobTerminatorEndoskeleton + name: nt-800 "exterminator" endoskeleton + description: The inner powerhouse of Susnet's infiltrator androids. + components: + - type: AutoImplant + implants: + - TerminatorSelfExplodeImplant + - type: HumanoidAppearance + species: Terminator + - type: MovementSpeedModifier + baseWalkSpeed: 1.5 + baseSprintSpeed: 3.0 + - type: Sprite + sprite: Mobs/Species/Terminator/parts.rsi + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 500 + mask: + - MobMask + layer: + - MobLayer + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + - type: Repairable + doAfterDelay: 15 + allowSelfRepair: false + - type: Body + prototype: TerminatorEndoskeleton + requiredLegs: 2 + - type: Organ + - type: Brain + - type: TypingIndicator + proto: robot + - type: Speech + speechSounds: Pai + - type: Damageable + damageModifierSet: TerminatorCybernetic + - type: Explosive + explosionType: Minibomb + totalIntensity: 20 + intensitySlope: 5 + maxIntensity: 10 + canCreateVacuum: false + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:ExplodeBehavior + - !type:PlaySoundBehavior + sound: /Audio/Effects/bone_rattle.ogg + - !type:SpawnEntitiesBehavior + spawn: + HeadTerminator: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 0 + - type: MeleeWeapon + damage: + types: + Blunt: 15 + Structural: 5 + - type: Puller + needsHands: false + - type: Prying + pryPowered: true + force: true + - type: Tag + tags: + - DoorBumpOpener + - MindTransferTarget + - Unimplantable diff --git a/Resources/Prototypes/_Maid/Terminator/roles.yml b/Resources/Prototypes/_Maid/Terminator/roles.yml index ef918dba0dc..d5dce91984c 100644 --- a/Resources/Prototypes/_Maid/Terminator/roles.yml +++ b/Resources/Prototypes/_Maid/Terminator/roles.yml @@ -1,35 +1,35 @@ -- type: entity - parent: BaseMindRoleAntag - id: MindRoleTerminator - name: Terminator Role - components: - - type: MindRole - antagPrototype: Terminator - exclusiveAntag: true - roleType: SoloAntagonist - subtype: role-subtype-terminator - - type: TerminatorRole - -- type: antag - id: Terminator - name: roles-antag-terminator-name - antagonist: true - setPreference: false - objective: roles-antag-terminator-objective - -- type: entity - categories: [ HideSpawnMenu, Spawner ] - parent: BaseAntagSpawner - id: SpawnPointGhostTerminator - components: - - type: GhostRole - name: ghost-role-information-exterminator-name - description: ghost-role-information-exterminator-description - rules: ghost-role-information-exterminator-rules - mindRoles: - - MindRoleGhostRoleSoloAntagonist - - type: Sprite - layers: - - state: green - - sprite: Mobs/Species/Terminator/parts.rsi - state: full +- type: entity + parent: BaseMindRoleAntag + id: MindRoleTerminator + name: Terminator Role + components: + - type: MindRole + antagPrototype: Terminator + exclusiveAntag: true + roleType: SoloAntagonist + subtype: role-subtype-terminator + - type: TerminatorRole + +- type: antag + id: Terminator + name: roles-antag-terminator-name + antagonist: true + setPreference: false + objective: roles-antag-terminator-objective + +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostTerminator + components: + - type: GhostRole + name: ghost-role-information-exterminator-name + description: ghost-role-information-exterminator-description + rules: ghost-role-information-exterminator-rules + mindRoles: + - MindRoleGhostRoleSoloAntagonist + - type: Sprite + layers: + - state: green + - sprite: Mobs/Species/Terminator/parts.rsi + state: full From ee7ed1af764ce0a979ac860e29e426044a57b990 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:16:03 +0500 Subject: [PATCH 13/15] feat: better terminator system --- .../Components/SpawnOnGibComponent.cs | 10 ++ .../EntitySystems/SpawnOnGibSystem.cs | 32 +++++ .../_Maid/Body/Parts/terminator.yml | 133 ------------------ .../_Maid/Body/Prototypes/terminator.yml | 50 +------ .../Prototypes/_Maid/Species/terminator.yml | 131 ----------------- .../Prototypes/_Maid/Terminator/mobs.yml | 50 +++++-- .../Species/Terminator/parts.rsi/meta.json | 3 +- 7 files changed, 82 insertions(+), 327 deletions(-) create mode 100644 Content.Server/_Maid/Terminator/Components/SpawnOnGibComponent.cs create mode 100644 Content.Server/_Maid/Terminator/EntitySystems/SpawnOnGibSystem.cs delete mode 100644 Resources/Prototypes/_Maid/Body/Parts/terminator.yml delete mode 100644 Resources/Prototypes/_Maid/Species/terminator.yml diff --git a/Content.Server/_Maid/Terminator/Components/SpawnOnGibComponent.cs b/Content.Server/_Maid/Terminator/Components/SpawnOnGibComponent.cs new file mode 100644 index 00000000000..9c6f18de3a6 --- /dev/null +++ b/Content.Server/_Maid/Terminator/Components/SpawnOnGibComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server._Maid.Terminator.Components; + +[RegisterComponent] +public sealed partial class SpawnOnGibComponent : Component +{ + [DataField] public EntProtoId? Prototype; + [DataField] public bool TransferMind = false; +} \ No newline at end of file diff --git a/Content.Server/_Maid/Terminator/EntitySystems/SpawnOnGibSystem.cs b/Content.Server/_Maid/Terminator/EntitySystems/SpawnOnGibSystem.cs new file mode 100644 index 00000000000..58cda75f646 --- /dev/null +++ b/Content.Server/_Maid/Terminator/EntitySystems/SpawnOnGibSystem.cs @@ -0,0 +1,32 @@ +using Content.Server._Maid.Terminator.Components; +using Content.Server.Mind; +using Content.Shared.Body.Events; + +namespace Content.Server._Maid.Terminator.EntitySystems; + +// SpawnOnDespawnSystem will not do the trick cause no easy way to transfer mind without changing SpawnOnDespawnSystem itself +public sealed class SpawnOnGibSystem : EntitySystem +{ + [Dependency] private MindSystem _mindSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGibbed); + } + + private void OnGibbed(Entity ent, ref BeingGibbedEvent args) + { + if (!TryComp(ent, out TransformComponent? xform)) return; + + if (ent.Comp.Prototype == null) return; + + var spawned = Spawn(ent.Comp.Prototype, xform.Coordinates); + + if (ent.Comp.TransferMind && _mindSystem.TryGetMind(ent, out var mindId, out var mindComponent)) + { + _mindSystem.TransferTo(mindId, spawned); + } + } +} \ No newline at end of file diff --git a/Resources/Prototypes/_Maid/Body/Parts/terminator.yml b/Resources/Prototypes/_Maid/Body/Parts/terminator.yml deleted file mode 100644 index 2e41e0045a3..00000000000 --- a/Resources/Prototypes/_Maid/Body/Parts/terminator.yml +++ /dev/null @@ -1,133 +0,0 @@ -- type: entity - abstract: true - parent: BasePartInorganic - id: PartTerminatorBase # TODO: Rename to BasePartTerminator - name: nt-800 body part - components: - - type: Sprite - sprite: Mobs/Species/Terminator/parts.rsi - - type: Icon - sprite: Mobs/Species/Terminator/parts.rsi - - type: BodyPart - species: Terminator - - type: StaticPrice - price: 200 - - type: Damageable - damageModifierSet: TerminatorCybernetic - -- type: entity - parent: [PartTerminatorBase, BaseChestInorganic] - id: ChestTerminator - name: nt-800 chest - components: - - type: Sprite - state: chest_m - - type: Icon - state: chest_m - -- type: entity - parent: [PartTerminatorBase, BaseGroinInorganic] - id: GroinTerminator - name: nt-800 groin - components: - - type: Sprite - state: groin_m - - type: Icon - state: groin_m - -- type: entity - parent: [PartTerminatorBase, BaseHead] - id: HeadTerminator - name: nt-800 skull - description: Its red eyes have powered down... for now. - components: - - type: Sprite - state: skull_icon - - type: Icon - state: skull_icon - - type: StaticPrice - price: 2000 - - type: Tag - tags: - - MindTransferTarget - - Head - -- type: entity - parent: [PartTerminatorBase, BaseLeftArm] - id: LeftArmTerminator - name: left nt-800 arm - components: - - type: Sprite - state: l_arm - - type: Icon - state: l_arm - -- type: entity - parent: [PartTerminatorBase, BaseRightArm] - id: RightArmTerminator - name: right nt-800 arm - components: - - type: Sprite - state: r_arm - - type: Icon - state: r_arm - -- type: entity - parent: [PartTerminatorBase, BaseLeftHand] - id: LeftHandTerminator - name: left nt-800 hand - components: - - type: Sprite - state: l_hand - - type: Icon - state: l_hand - -- type: entity - parent: [PartTerminatorBase, BaseRightHand] - id: RightHandTerminator - name: right nt-800 hand - components: - - type: Sprite - state: r_hand - - type: Icon - state: r_hand - -- type: entity - parent: [PartTerminatorBase, BaseLeftLeg] - id: LeftLegTerminator - name: left nt-800 leg - components: - - type: Sprite - state: l_leg - - type: Icon - state: l_leg - -- type: entity - parent: [PartTerminatorBase, BaseRightLeg] - id: RightLegTerminator - name: right nt-800 leg - components: - - type: Sprite - state: r_leg - - type: Icon - state: r_leg - -- type: entity - parent: [PartTerminatorBase, BaseLeftFoot] - id: LeftFootTerminator - name: left nt-800 foot - components: - - type: Sprite - state: l_foot - - type: Icon - state: l_foot - -- type: entity - parent: [PartTerminatorBase, BaseRightFoot] - id: RightFootTerminator - name: right nt-800 foot - components: - - type: Sprite - state: r_foot - - type: Icon - state: r_foot diff --git a/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml b/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml index 7977e2db355..f75a07d45ea 100644 --- a/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml +++ b/Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml @@ -7,8 +7,6 @@ part: HeadHuman connections: - chest - organs: - brain: MobTerminatorEndoskeleton chest: part: ChestHuman connections: @@ -44,50 +42,4 @@ right foot: part: RightFootHuman left foot: - part: LeftFootHuman - -- type: body - id: TerminatorEndoskeleton - name: terminator endoskeleton - root: chest - slots: - head: - part: HeadTerminator - connections: - - chest - chest: - part: ChestTerminator - connections: - - groin - - right arm - - left arm - - head - groin: - part: GroinTerminator - connections: - - right leg - - left leg - right arm: - part: RightArmTerminator - connections: - - right hand - left arm: - part: LeftArmTerminator - connections: - - left hand - right hand: - part: RightHandTerminator - left hand: - part: LeftHandTerminator - right leg: - part: RightLegTerminator - connections: - - right foot - left leg: - part: LeftLegTerminator - connections: - - left foot - right foot: - part: RightFootTerminator - left foot: - part: LeftFootTerminator + part: LeftFootHuman \ No newline at end of file diff --git a/Resources/Prototypes/_Maid/Species/terminator.yml b/Resources/Prototypes/_Maid/Species/terminator.yml deleted file mode 100644 index c4f085018d7..00000000000 --- a/Resources/Prototypes/_Maid/Species/terminator.yml +++ /dev/null @@ -1,131 +0,0 @@ -- type: species - id: Terminator - name: Terminator - roundStart: false - prototype: MobTerminatorEndoskeleton - bodyTypes: - - TerminatorNormal - defaultSkinTone: "#fff9e2" - markingLimits: MobHumanMarkingLimits - maleFirstNames: NamesSkeletonFirst - femaleFirstNames: NamesSkeletonFirst - dollPrototype: MobSkeletonPersonDummy - skinColoration: TintedHues - -- type: bodyType - id: TerminatorNormal - name: body-normal - sprites: - Head: MobTerminatorHead - Chest: MobTerminatorChest - Groin: MobTerminatorGroin - LArm: MobTerminatorLArm - RArm: MobTerminatorRArm - LHand: MobTerminatorLHand - RHand: MobTerminatorRHand - LLeg: MobTerminatorLLeg - RLeg: MobTerminatorRLeg - LFoot: MobTerminatorLFoot - RFoot: MobTerminatorRFoot - -- type: humanoidBaseSprite - id: MobTerminatorHead - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: head_m - -- type: humanoidBaseSprite - id: MobTerminatorHeadMale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: head_m - -- type: humanoidBaseSprite - id: MobTerminatorHeadFemale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: head_f - -- type: humanoidBaseSprite - id: MobTerminatorChest - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: chest_m - -- type: humanoidBaseSprite - id: MobTerminatorChestMale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: chest_m - -- type: humanoidBaseSprite - id: MobTerminatorChestFemale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: chest_f - -- type: humanoidBaseSprite - id: MobTerminatorGroin - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: groin_m - -- type: humanoidBaseSprite - id: MobTerminatorGroinMale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: groin_m - -- type: humanoidBaseSprite - id: MobTerminatorGroinFemale - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: groin_f - -- type: humanoidBaseSprite - id: MobTerminatorLLeg - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: l_leg - -- type: humanoidBaseSprite - id: MobTerminatorLArm - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: l_arm - -- type: humanoidBaseSprite - id: MobTerminatorLHand - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: l_hand - -- type: humanoidBaseSprite - id: MobTerminatorLFoot - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: l_foot - -- type: humanoidBaseSprite - id: MobTerminatorRLeg - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: r_leg - -- type: humanoidBaseSprite - id: MobTerminatorRArm - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: r_arm - -- type: humanoidBaseSprite - id: MobTerminatorRHand - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: r_hand - -- type: humanoidBaseSprite - id: MobTerminatorRFoot - baseSprite: - sprite: Mobs/Species/Terminator/parts.rsi - state: r_foot diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 9d3f413800c..5607d657deb 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -40,7 +40,9 @@ allowedStates: - Alive - Dead - - type: TransferMindOnGib + - type: SpawnOnGib + prototype: MobTerminatorEndoskeleton + transferMind: true - type: MobThresholds thresholds: 0: Alive @@ -95,7 +97,7 @@ - type: entity parent: - - BaseMob + - SimpleMobBase - MobCombat - MobDamageable - MobSiliconBase @@ -107,13 +109,15 @@ - type: AutoImplant implants: - TerminatorSelfExplodeImplant - - type: HumanoidAppearance - species: Terminator - type: MovementSpeedModifier - baseWalkSpeed: 1.5 - baseSprintSpeed: 3.0 + baseWalkSpeed: 2.0 + baseSprintSpeed: 3.2 - type: Sprite - sprite: Mobs/Species/Terminator/parts.rsi + drawdepth: Mobs + layers: + - map: [ "movement" ] + state: full + sprite: Mobs/Species/Terminator/parts.rsi - type: Fixtures fixtures: fix1: @@ -132,11 +136,6 @@ - type: Repairable doAfterDelay: 15 allowSelfRepair: false - - type: Body - prototype: TerminatorEndoskeleton - requiredLegs: 2 - - type: Organ - - type: Brain - type: TypingIndicator proto: robot - type: Speech @@ -166,12 +165,17 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: Flammable - fireSpread: true + fireSpread: false canResistFire: true damage: types: Heat: 0 - type: MeleeWeapon + animation: WeaponArcPunch + wideAnimation: WeaponArcThrust + сlickDamageModifier: 1.5 + altDisarm: false + angle: 20 damage: types: Blunt: 15 @@ -186,3 +190,23 @@ - DoorBumpOpener - MindTransferTarget - Unimplantable + + +- type: entity + parent: BaseItem + id: HeadTerminator + name: nt-800 skull + description: Its red eyes have powered down... for now. + components: + - type: Sprite + sprite: Mobs/Species/Terminator/parts.rsi + state: skull_icon + - type: Icon + sprite: Mobs/Species/Terminator/parts.rsi + state: skull_icon + - type: StaticPrice + price: 4000 + - type: Tag + tags: + - MindTransferTarget + - Head \ No newline at end of file diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json index b146ad203f9..aa0c23be55c 100644 --- a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json @@ -8,7 +8,8 @@ }, "states": [ { - "name": "full" + "name": "full", + "directions": 4 }, { "name": "head_f", From 78f77dfe72b10f3714290c92353c02a342234e8a Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:45:35 +0500 Subject: [PATCH 14/15] fix: upstream fix --- .../EntitySystems/HeatOverTimeSystem.cs | 21 ++++++++-------- .../AddComponentsOnTriggerComponent.cs | 16 ------------ .../AddComponentsOnTriggerSystem.cs | 25 ------------------- .../EntitySystems/PopupOnTriggerSystem.cs | 1 + .../Prototypes/_Maid/Terminator/implants.yml | 5 ++-- .../Prototypes/_Maid/Terminator/mobs.yml | 9 ++++++- 6 files changed, 23 insertions(+), 54 deletions(-) delete mode 100644 Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs delete mode 100644 Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs diff --git a/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs b/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs index 1e62f7f774b..e81a88ff9e8 100644 --- a/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs +++ b/Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Temperature.Systems; +using Content.Shared.Atmos.Components; using Robust.Shared.Timing; namespace Content.Server._Maid.Terminator.EntitySystems; @@ -28,27 +29,27 @@ private void OnStartup(EntityUid uid, HeatOverTimeComponent component, ref Compo public override void Update(float frameTime) { var currentTime = _timing.CurTime; - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var component)) + while (query.MoveNext(out var uid, out var heatOverTimeComponent, out var flammableComponent)) { - if (component.Interval <= TimeSpan.Zero) + if (heatOverTimeComponent.Interval <= TimeSpan.Zero) continue; - while (currentTime >= component.NextTickTime) + while (currentTime >= heatOverTimeComponent.NextTickTime) { - _temperature.ChangeHeat(uid, component.Heat * component.Multiplier, component.IgnoreHeatResistance); - if (component.FireStacks > 0f) + _temperature.ChangeHeat(uid, heatOverTimeComponent.Heat * heatOverTimeComponent.Multiplier, heatOverTimeComponent.IgnoreHeatResistance); + if (heatOverTimeComponent.FireStacks > 0f) { _flammable.AdjustFireStacks(uid, - component.FireStacks * component.Multiplier, + heatOverTimeComponent.FireStacks * heatOverTimeComponent.Multiplier, null, true, - component.FireProtectionPenetration); + heatOverTimeComponent.FireProtectionPenetration); } - component.Multiplier += component.MultiplierIncrease; - component.NextTickTime += component.Interval; + heatOverTimeComponent.Multiplier += heatOverTimeComponent.MultiplierIncrease; + heatOverTimeComponent.NextTickTime += heatOverTimeComponent.Interval; } } } diff --git a/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs b/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs deleted file mode 100644 index 87a13b61b6b..00000000000 --- a/Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Server._Maid.Triggers.Components; - -/// -/// Adds configured components to a target entity when this entity is triggered. -/// -[RegisterComponent] -public sealed partial class AddComponentsOnTriggerComponent : Component -{ - [DataField] - public bool RemoveExisting; - - [DataField(serverOnly: true, readOnly: true, required: true)] - public ComponentRegistry Components = new(); -} diff --git a/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs b/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs deleted file mode 100644 index 88c6b8cd11d..00000000000 --- a/Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Content.Server._Maid.Triggers.Components; -using Content.Server.Explosion.EntitySystems; -using Content.Shared.Implants.Components; - -namespace Content.Server._Maid.Triggers.EntitySystems; - -public sealed class AddComponentsOnTriggerSystem : EntitySystem -{ - [Dependency] private IEntityManager _entityManager = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnAddComponentsTrigger); - } - - private void OnAddComponentsTrigger(EntityUid uid, AddComponentsOnTriggerComponent component, ref TriggerEvent args) - { - if (!TryComp(uid, out SubdermalImplantComponent? implant) || implant.ImplantedEntity is null) - return; - - _entityManager.AddComponents(implant.ImplantedEntity.Value, component.Components, component.RemoveExisting); - args.Handled = true; - } -} diff --git a/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs b/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs index 2a5638a78f3..6110838c0a9 100644 --- a/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs +++ b/Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Explosion.EntitySystems; using Content.Shared.Implants.Components; using Content.Shared.Popups; +using Content.Shared.Trigger; namespace Content.Server._Maid.Triggers.EntitySystems; diff --git a/Resources/Prototypes/_Maid/Terminator/implants.yml b/Resources/Prototypes/_Maid/Terminator/implants.yml index cf5b2fc52bc..0159c0dcfed 100644 --- a/Resources/Prototypes/_Maid/Terminator/implants.yml +++ b/Resources/Prototypes/_Maid/Terminator/implants.yml @@ -9,9 +9,10 @@ implantationTimeMultiplier: 4 permanent: true implantAction: ActionActivateTerminatorOverheat - - type: TriggerImplantAction + - type: TriggerOnActivateImplant - type: AddComponentsOnTrigger removeExisting: false + targetUser: true components: - type: HeatOverTime heat: 500 @@ -39,7 +40,7 @@ implantationTimeMultiplier: 4 permanent: true implantAction: ActionActivateMicroBomb - - type: TriggerImplantAction + - type: TriggerOnActivateImplant - type: ExplodeOnTrigger - type: Explosive explosionType: MicroBomb diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 5607d657deb..5c89e314baa 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -97,7 +97,6 @@ - type: entity parent: - - SimpleMobBase - MobCombat - MobDamageable - MobSiliconBase @@ -106,6 +105,14 @@ name: nt-800 "exterminator" endoskeleton description: The inner powerhouse of Susnet's infiltrator androids. components: + - type: StatusEffects + allowed: + - Stutter + - Electrocution + - StaminaModifier + - RadiationProtection + - type: FloatingVisuals + - type: Grabbable - type: AutoImplant implants: - TerminatorSelfExplodeImplant From 381ed300d366e967e04412ca80f1138906a9c563 Mon Sep 17 00:00:00 2001 From: CREAsTIVE <62616308+CREAsTIVE@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:53:55 +0500 Subject: [PATCH 15/15] fix: another upstream fix --- Resources/Prototypes/_Maid/Terminator/mobs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/_Maid/Terminator/mobs.yml b/Resources/Prototypes/_Maid/Terminator/mobs.yml index 5c89e314baa..1875e0e4b6d 100644 --- a/Resources/Prototypes/_Maid/Terminator/mobs.yml +++ b/Resources/Prototypes/_Maid/Terminator/mobs.yml @@ -180,7 +180,6 @@ - type: MeleeWeapon animation: WeaponArcPunch wideAnimation: WeaponArcThrust - сlickDamageModifier: 1.5 altDisarm: false angle: 20 damage: