From 692c3232acf3829fa80f4b3e786e6154228aa221 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 25 Dec 2023 03:16:56 +0000 Subject: [PATCH] exterminator midround minor antag (#19946) * terminator locale * terminate objective * terminator components and shared system * terminator roles rules and system * terminator events * skeleton recolour * terminator and endoskeleton * ghost role spawn * damage modifier sets * :trollface: * :trollface: * add antag prototype * ghost role locale * skynet * :trollface: * :trollface: * :trollface: * add endoskeleton body prototype * :trollface: * :trollface: * smite locale * implement terminate smite * :trollface: * :trollface: * implement PopupBehavior * endoskeleton transform popup * move stuff from shared to server since nothing actually used it * recolour everything * update parts * :trollface: * :trollface: * ok fire was using the damage set, back to 1.0 * tweak * :trollface: * :trollface: * simplemob ops * 1 rule per pro * :trollface: * :trollface: * update some sprites * structural damage * :trollface: * :trollface: * Revert "update some sprites" This reverts commit 459196c6a8942c5412885d5fe2f1a83a48408ddc. * offbrand, add die objective to maybe remove fear of murderbone * add shut down objective to the list * fix ghost role * fix control mob * :trollface: * :trollface: * please * naming * code changes for GenericAntag terminator * yml changes for GenericAntag terminator * :trollface: * moved kill objective override to an objective component * use kill objective override * fix * oh * locale changes * change burn to heat for skin melting gib * change some endoskeleton stuff * pro * i already did this dementia ops * objective * fix * pro * swap out full sprite * update parts * forgor * fix mind transfer * type * endoskeleton has 500 mass * evil * fishops * warops --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Systems/AdminVerbSystem.Smites.cs | 26 +++ .../Thresholds/Behaviors/PopupBehavior.cs | 30 +++ .../TerminatorTargetOverrideComponent.cs | 12 ++ .../Systems/TerminatorTargetOverrideSystem.cs | 41 ++++ Content.Server/Roles/RoleSystem.cs | 1 + .../Roles/TerminatorRoleComponent.cs | 8 + .../Components/TerminatorComponent.cs | 19 ++ .../Components/TerminatorTargetComponent.cs | 16 ++ .../Terminator/Systems/TerminatorSystem.cs | 66 +++++++ .../Locale/en-US/administration/smites.ftl | 4 +- .../game-rules/rule-terminator.ftl | 14 ++ .../ghost/roles/ghost-role-component.ftl | 6 +- .../en-US/objectives/conditions/terminate.ftl | 1 + .../Locale/en-US/prototypes/roles/antags.ftl | 5 +- .../Prototypes/Body/Parts/terminator.yml | 157 +++++++++++++++ .../Prototypes/Body/Prototypes/terminator.yml | 85 ++++++++ Resources/Prototypes/Damage/modifier_sets.yml | 38 ++++ .../Entities/Markers/Spawners/ghost_roles.yml | 17 ++ .../Entities/Mobs/Player/terminator.yml | 183 ++++++++++++++++++ Resources/Prototypes/GameRules/events.yml | 13 ++ Resources/Prototypes/GameRules/midround.yml | 13 +- .../Prototypes/Objectives/terminator.yml | 40 ++++ .../Prototypes/Roles/Antags/terminator.yml | 6 + Resources/Prototypes/Species/terminator.yml | 110 +++++++++++ .../Species/Terminator/parts.rsi/full.png | Bin 0 -> 2187 bytes .../Species/Terminator/parts.rsi/head_f.png | Bin 0 -> 997 bytes .../Species/Terminator/parts.rsi/head_m.png | Bin 0 -> 997 bytes .../Species/Terminator/parts.rsi/l_arm.png | Bin 0 -> 807 bytes .../Species/Terminator/parts.rsi/l_foot.png | Bin 0 -> 746 bytes .../Species/Terminator/parts.rsi/l_hand.png | Bin 0 -> 748 bytes .../Species/Terminator/parts.rsi/l_leg.png | Bin 0 -> 737 bytes .../Species/Terminator/parts.rsi/meta.json | 66 +++++++ .../Species/Terminator/parts.rsi/r_arm.png | Bin 0 -> 839 bytes .../Species/Terminator/parts.rsi/r_foot.png | Bin 0 -> 782 bytes .../Species/Terminator/parts.rsi/r_hand.png | Bin 0 -> 759 bytes .../Species/Terminator/parts.rsi/r_leg.png | Bin 0 -> 848 bytes .../Terminator/parts.rsi/skull_icon.png | Bin 0 -> 1128 bytes .../Species/Terminator/parts.rsi/torso_f.png | Bin 0 -> 1803 bytes .../Species/Terminator/parts.rsi/torso_m.png | Bin 0 -> 1803 bytes 39 files changed, 973 insertions(+), 4 deletions(-) create mode 100644 Content.Server/Destructible/Thresholds/Behaviors/PopupBehavior.cs create mode 100644 Content.Server/Objectives/Components/TerminatorTargetOverrideComponent.cs create mode 100644 Content.Server/Objectives/Systems/TerminatorTargetOverrideSystem.cs create mode 100644 Content.Server/Roles/TerminatorRoleComponent.cs create mode 100644 Content.Server/Terminator/Components/TerminatorComponent.cs create mode 100644 Content.Server/Terminator/Components/TerminatorTargetComponent.cs create mode 100644 Content.Server/Terminator/Systems/TerminatorSystem.cs create mode 100644 Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl create mode 100644 Resources/Locale/en-US/objectives/conditions/terminate.ftl create mode 100644 Resources/Prototypes/Body/Parts/terminator.yml create mode 100644 Resources/Prototypes/Body/Prototypes/terminator.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Player/terminator.yml create mode 100644 Resources/Prototypes/Objectives/terminator.yml create mode 100644 Resources/Prototypes/Roles/Antags/terminator.yml create mode 100644 Resources/Prototypes/Species/terminator.yml create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/full.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_f.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/skull_icon.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/torso_f.png create mode 100644 Resources/Textures/Mobs/Species/Terminator/parts.rsi/torso_m.png diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index 10a001be8b627f..c0f660d216976a 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -18,6 +18,7 @@ using Content.Server.Storage.EntitySystems; using Content.Server.Tabletop; using Content.Server.Tabletop.Components; +using Content.Server.Terminator.Systems; using Content.Shared.Administration; using Content.Shared.Administration.Components; using Content.Shared.Body.Components; @@ -30,6 +31,7 @@ using Content.Shared.Electrocution; using Content.Shared.Interaction.Components; using Content.Shared.Inventory; +using Content.Shared.Mind.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; @@ -72,6 +74,7 @@ public sealed partial class AdminVerbSystem [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly TabletopSystem _tabletopSystem = default!; + [Dependency] private readonly TerminatorSystem _terminator = default!; [Dependency] private readonly VomitSystem _vomitSystem = default!; [Dependency] private readonly WeldableSystem _weldableSystem = default!; [Dependency] private readonly SharedContentEyeSystem _eyeSystem = default!; @@ -793,6 +796,7 @@ private void AddSmiteVerbs(GetVerbsEvent args) Message = Loc.GetString("admin-smite-super-speed-description"), }; args.Verbs.Add(superSpeed); + //Bonk Verb superBonkLite = new() { @@ -820,5 +824,27 @@ private void AddSmiteVerbs(GetVerbsEvent args) Impact = LogImpact.Extreme, }; args.Verbs.Add(superBonk); + + Verb terminate = new() + { + Text = "Terminate", + Category = VerbCategory.Smite, + Icon = new SpriteSpecifier.Rsi(new ("Mobs/Species/Terminator/parts.rsi"), "skull_icon"), + Act = () => + { + if (!TryComp(args.Target, out var mindContainer) || mindContainer.Mind == null) + return; + + var coords = Transform(args.Target).Coordinates; + var mindId = mindContainer.Mind.Value; + _terminator.CreateSpawner(coords, mindId); + + _popupSystem.PopupEntity(Loc.GetString("admin-smite-terminate-prompt"), args.Target, + args.Target, PopupType.LargeCaution); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-smite-terminate-description") + }; + args.Verbs.Add(terminate); } } diff --git a/Content.Server/Destructible/Thresholds/Behaviors/PopupBehavior.cs b/Content.Server/Destructible/Thresholds/Behaviors/PopupBehavior.cs new file mode 100644 index 00000000000000..59589c19aa74d1 --- /dev/null +++ b/Content.Server/Destructible/Thresholds/Behaviors/PopupBehavior.cs @@ -0,0 +1,30 @@ +using Content.Shared.Popups; + +namespace Content.Server.Destructible.Thresholds.Behaviors; + +/// +/// Shows a popup for everyone. +/// +[DataDefinition] +public sealed partial class PopupBehavior : IThresholdBehavior +{ + /// + /// Locale id of the popup message. + /// + [DataField("popup", required: true)] + public string Popup; + + /// + /// Type of popup to show. + /// + [DataField("popupType")] + public PopupType PopupType; + + public void Execute(EntityUid uid, DestructibleSystem system, EntityUid? cause = null) + { + var popup = system.EntityManager.System(); + // popup is placed at coords since the entity could be deleted after, no more popup then + var coords = system.EntityManager.GetComponent(uid).Coordinates; + popup.PopupCoordinates(Loc.GetString(Popup), coords, PopupType); + } +} diff --git a/Content.Server/Objectives/Components/TerminatorTargetOverrideComponent.cs b/Content.Server/Objectives/Components/TerminatorTargetOverrideComponent.cs new file mode 100644 index 00000000000000..c66ff55f054a12 --- /dev/null +++ b/Content.Server/Objectives/Components/TerminatorTargetOverrideComponent.cs @@ -0,0 +1,12 @@ +using Content.Server.Objectives.Systems; + +namespace Content.Server.Objectives.Components; + +/// +/// Sets this objective's target to the exterminator's target override, if it has one. +/// If not it will be random. +/// +[RegisterComponent, Access(typeof(TerminatorTargetOverrideSystem))] +public sealed partial class TerminatorTargetOverrideComponent : Component +{ +} diff --git a/Content.Server/Objectives/Systems/TerminatorTargetOverrideSystem.cs b/Content.Server/Objectives/Systems/TerminatorTargetOverrideSystem.cs new file mode 100644 index 00000000000000..0a81c2810ed631 --- /dev/null +++ b/Content.Server/Objectives/Systems/TerminatorTargetOverrideSystem.cs @@ -0,0 +1,41 @@ +using Content.Server.Objectives.Components; +using Content.Server.Terminator.Components; +using Content.Shared.Mind; +using Content.Shared.Objectives.Components; + +namespace Content.Server.Objectives.Systems; + +/// +/// Handles copying the exterminator's target override to this objective. +/// +public sealed class TerminatorTargetOverrideSystem : EntitySystem +{ + [Dependency] private readonly TargetObjectiveSystem _target = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAssigned); + } + + private void OnAssigned(EntityUid uid, TerminatorTargetOverrideComponent comp, ref ObjectiveAssignedEvent args) + { + if (args.Mind.OwnedEntity == null) + { + args.Cancelled = true; + return; + } + + var user = args.Mind.OwnedEntity.Value; + if (!TryComp(user, out var terminator)) + { + args.Cancelled = true; + return; + } + + // this exterminator has a target override so set its objective target accordingly + if (terminator.Target != null) + _target.SetTarget(uid, terminator.Target.Value); + } +} diff --git a/Content.Server/Roles/RoleSystem.cs b/Content.Server/Roles/RoleSystem.cs index c53fa1cf9ebcc7..f7a51773573a1d 100644 --- a/Content.Server/Roles/RoleSystem.cs +++ b/Content.Server/Roles/RoleSystem.cs @@ -15,6 +15,7 @@ public override void Initialize() SubscribeAntagEvents(); SubscribeAntagEvents(); SubscribeAntagEvents(); + SubscribeAntagEvents(); SubscribeAntagEvents(); SubscribeAntagEvents(); SubscribeAntagEvents(); diff --git a/Content.Server/Roles/TerminatorRoleComponent.cs b/Content.Server/Roles/TerminatorRoleComponent.cs new file mode 100644 index 00000000000000..4154e8ab690899 --- /dev/null +++ b/Content.Server/Roles/TerminatorRoleComponent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Roles; + +namespace Content.Server.Roles; + +[RegisterComponent] +public sealed partial class TerminatorRoleComponent : AntagonistRoleComponent +{ +} diff --git a/Content.Server/Terminator/Components/TerminatorComponent.cs b/Content.Server/Terminator/Components/TerminatorComponent.cs new file mode 100644 index 00000000000000..9427f95eeda0c9 --- /dev/null +++ b/Content.Server/Terminator/Components/TerminatorComponent.cs @@ -0,0 +1,19 @@ +using Content.Server.Terminator.Systems; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Server.Terminator.Components; + +/// +/// Main terminator component, handles the target, if any, and objectives. +/// +[RegisterComponent, Access(typeof(TerminatorSystem))] +public sealed partial class TerminatorComponent : Component +{ + /// + /// Used to force the terminate objective's target. + /// If null it will be a random person. + /// + [DataField("target")] + public EntityUid? Target; +} diff --git a/Content.Server/Terminator/Components/TerminatorTargetComponent.cs b/Content.Server/Terminator/Components/TerminatorTargetComponent.cs new file mode 100644 index 00000000000000..786cbd1167b4ce --- /dev/null +++ b/Content.Server/Terminator/Components/TerminatorTargetComponent.cs @@ -0,0 +1,16 @@ +using Content.Server.Terminator.Systems; + +namespace Content.Server.Terminator.Components; + +/// +/// Sets after the ghost role spawns. +/// +[RegisterComponent, Access(typeof(TerminatorSystem))] +public sealed partial class TerminatorTargetComponent : Component +{ + /// + /// The target to set after the ghost role spawns. + /// + [DataField("target")] + public EntityUid? Target; +} diff --git a/Content.Server/Terminator/Systems/TerminatorSystem.cs b/Content.Server/Terminator/Systems/TerminatorSystem.cs new file mode 100644 index 00000000000000..b6699352779c03 --- /dev/null +++ b/Content.Server/Terminator/Systems/TerminatorSystem.cs @@ -0,0 +1,66 @@ +using Content.Server.Body.Components; +using Content.Server.GenericAntag; +using Content.Server.Ghost.Roles.Events; +using Content.Server.Roles; +using Content.Server.Terminator.Components; +using Content.Shared.Roles; +using Robust.Shared.Map; + +namespace Content.Server.Terminator.Systems; + +public sealed class TerminatorSystem : EntitySystem +{ + [Dependency] private readonly SharedRoleSystem _role = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnSpawned); + SubscribeLocalEvent(OnCreated); + } + + private void OnMapInit(EntityUid uid, TerminatorComponent comp, MapInitEvent args) + { + // cyborg doesn't need to breathe + RemComp(uid); + } + + private void OnSpawned(EntityUid uid, TerminatorComponent comp, GhostRoleSpawnerUsedEvent args) + { + if (!TryComp(args.Spawner, out var target)) + return; + + comp.Target = target.Target; + } + + private void OnCreated(EntityUid uid, TerminatorComponent comp, ref GenericAntagCreatedEvent args) + { + var mindId = args.MindId; + var mind = args.Mind; + + _role.MindAddRole(mindId, new RoleBriefingComponent + { + Briefing = Loc.GetString("terminator-role-briefing") + }, mind); + _role.MindAddRole(mindId, new TerminatorRoleComponent(), mind); + } + + /// + /// Create a spawner at a position and return it. + /// + /// Coordinates to create the spawner at + /// Optional target mind to force the terminator to target + public EntityUid CreateSpawner(EntityCoordinates coords, EntityUid? target) + { + var uid = Spawn("SpawnPointGhostTerminator", coords); + if (target != null) + { + var comp = EnsureComp(uid); + comp.Target = target; + } + + return uid; + } +} diff --git a/Resources/Locale/en-US/administration/smites.ftl b/Resources/Locale/en-US/administration/smites.ftl index e6b0f92b7a2148..fe8077a550c725 100644 --- a/Resources/Locale/en-US/administration/smites.ftl +++ b/Resources/Locale/en-US/administration/smites.ftl @@ -12,7 +12,8 @@ admin-smite-turned-ash-other = {CAPITALIZE($name)} turns into a pile of ash! admin-smite-stomach-removal-self = Your stomach feels hollow... admin-smite-run-walk-swap-prompt = You have to press shift to run! admin-smite-super-speed-prompt = You move at mach 0.8! -admin-smite-lung-removal-self = You can't breath! +admin-smite-lung-removal-self = You can't breathe! +admin-smite-terminate-prompt = I'll be back ## Smite descriptions @@ -57,6 +58,7 @@ admin-smite-disarm-prone-description = Makes them get disarmed 100% of the time admin-smite-garbage-can-description = Turn them into a garbage bin to emphasize what they remind you of. admin-smite-super-bonk-description = Slams them on every single table on the Station and beyond. admin-smite-super-bonk-lite-description= Slams them on every single table on the Station and beyond. Stops when the target is dead. +admin-smite-terminate-description = Creates a Terminator ghost role with the sole objective of killing them. ## Tricks descriptions diff --git a/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl b/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl new file mode 100644 index 00000000000000..41237a5c10d8e2 --- /dev/null +++ b/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl @@ -0,0 +1,14 @@ +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! diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 5d6d0b337b2b17..a74b90d65acf12 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -188,4 +188,8 @@ ghost-role-information-Cak-rules = You are a living edible sweet cat. Your task ghost-role-information-BreadDog-name = BreadDog ghost-role-information-BreadDog-description = You are the chef's favorite child. You're a living bread dog. -ghost-role-information-BreadDog-rules = You're an edible dog made of bread. Your task is to find your place in this world where everything wants to eat you. \ No newline at end of file +ghost-role-information-BreadDog-rules = You're an edible dog made of bread. Your task is to find your place in this world where everything wants to eat you. + +ghost-role-information-exterminator-name = Exterminator +ghost-role-information-exterminator-description = You been 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 that tries to stop you, but killing the target is always your top priority. 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 00000000000000..c88c7b14dae6f7 --- /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/Locale/en-US/prototypes/roles/antags.ftl b/Resources/Locale/en-US/prototypes/roles/antags.ftl index 2848300c190357..1502a30208ae03 100644 --- a/Resources/Locale/en-US/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/prototypes/roles/antags.ftl @@ -29,4 +29,7 @@ roles-antag-space-ninja-name = Space Ninja roles-antag-space-ninja-objective = Use your stealth to sabotage the station, nom on electrical wires. roles-antag-thief-name = Thief -roles-antag-thief-objective = Add some NT property to your personal collection without using violence. \ No newline at end of file +roles-antag-thief-objective = Add some NT property to your personal collection without using violence. + +roles-antag-terminator-name = Terminator +roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. diff --git a/Resources/Prototypes/Body/Parts/terminator.yml b/Resources/Prototypes/Body/Parts/terminator.yml new file mode 100644 index 00000000000000..dec0c99f7c20a9 --- /dev/null +++ b/Resources/Prototypes/Body/Parts/terminator.yml @@ -0,0 +1,157 @@ +- type: entity + abstract: true + parent: BaseItem + id: PartTerminator + name: nt-800 body part + components: + - type: Sprite + sprite: Mobs/Species/Terminator/parts.rsi + - type: Icon + sprite: Mobs/Species/Terminator/parts.rsi + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Cybernetic + - type: BodyPart + - type: ContainerContainer + containers: + bodypart: !type:Container + ents: [] + - type: StaticPrice + price: 200 + +- type: entity + parent: PartTerminator + id: TorsoTerminator + name: nt-800 torso + components: + - type: Sprite + state: torso_m + - type: Icon + state: torso_m + - type: BodyPart + partType: Torso + +- type: entity + parent: PartTerminator + 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: BodyPart + partType: Head + # killing a terminators worth big bucks + - type: StaticPrice + price: 2000 + - type: Tag + tags: + - Head + +- type: entity + parent: PartTerminator + id: LeftArmTerminator + name: left nt-800 arm + components: + - type: Sprite + state: l_arm + - type: Icon + state: l_arm + - type: BodyPart + partType: Arm + symmetry: Left + +- type: entity + parent: PartTerminator + id: RightArmTerminator + name: right nt-800 arm + components: + - type: Sprite + state: r_arm + - type: Icon + state: r_arm + - type: BodyPart + partType: Arm + symmetry: Right + +- type: entity + parent: PartTerminator + id: LeftHandTerminator + name: left nt-800 hand + components: + - type: Sprite + state: l_hand + - type: Icon + state: l_hand + - type: BodyPart + partType: Hand + symmetry: Left + +- type: entity + parent: PartTerminator + id: RightHandTerminator + name: right nt-800 hand + components: + - type: Sprite + state: r_hand + - type: Icon + state: r_hand + - type: BodyPart + partType: Hand + symmetry: Right + +- type: entity + parent: PartTerminator + id: LeftLegTerminator + name: left nt-800 leg + components: + - type: Sprite + state: l_leg + - type: Icon + state: l_leg + - type: BodyPart + partType: Leg + symmetry: Left + - type: MovementBodyPart + +- type: entity + parent: PartTerminator + id: RightLegTerminator + name: right nt-800 leg + components: + - type: Sprite + state: r_leg + - type: Icon + state: r_leg + - type: BodyPart + partType: Leg + symmetry: Right + - type: MovementBodyPart + +- type: entity + parent: PartTerminator + id: LeftFootTerminator + name: left nt-800 foot + components: + - type: Sprite + state: l_foot + - type: Icon + state: l_foot + - type: BodyPart + partType: Foot + symmetry: Left + +- type: entity + parent: PartTerminator + id: RightFootTerminator + name: right nt-800 foot + components: + - type: Sprite + state: r_foot + - type: Icon + state: r_foot + - type: BodyPart + partType: Foot + symmetry: Right diff --git a/Resources/Prototypes/Body/Prototypes/terminator.yml b/Resources/Prototypes/Body/Prototypes/terminator.yml new file mode 100644 index 00000000000000..c271a89d869572 --- /dev/null +++ b/Resources/Prototypes/Body/Prototypes/terminator.yml @@ -0,0 +1,85 @@ +# not quite human... +- type: body + id: TerminatorFlesh + name: exterminator + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: MobTerminatorEndoskeleton + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - left leg + - right 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 + +# TODO: terminator body parts +- type: body + id: TerminatorEndoskeleton + name: terminatorEndoskeleton + root: torso + slots: + head: + part: HeadTerminator + connections: + - torso + torso: + part: TorsoTerminator + connections: + - left arm + - right arm + - left leg + - right 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/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 26904bc2761027..c56d7326b19967 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -249,3 +249,41 @@ Cellular: 0.0 Heat: 2.5 Caustic: 0.0 + +# terminator's flesh damage set +- type: damageModifierSet + id: CyberneticFlesh + coefficients: + Blunt: 0.2 + Slash: 0.2 + Piercing: 0.1 + # fire and lasers burn it good + Heat: 1.0 + # zap + Shock: 1.5 + Cold: 0.25 + Caustic: 0.25 + # doesnt have organs to poison + Poison: 0.0 + Cellular: 0.0 + +# terminator's endoskeleton damage set +- type: damageModifierSet + id: Cybernetic + coefficients: + # bonk + Blunt: 1.0 + # alloy too hard to cut or shoot + Slash: 0.0 + Piercing: 0.0 + # no burning anymore + Heat: 0.0 + # zap zap + Shock: 2.5 + Cold: 0.0 + Caustic: 0.0 + Poison: 0.0 + Cellular: 0.0 + flatReductions: + # can't punch the endoskeleton to death + Blunt: 5 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 75f7b59f14faff..5e5186eb7241b2 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -130,3 +130,20 @@ - state: green - sprite: Objects/Weapons/Melee/energykatana.rsi state: icon + +- type: entity + parent: MarkerBase + id: SpawnPointGhostTerminator + name: terminator spawn point + components: + - type: GhostRole + name: ghost-role-information-exterminator-name + description: ghost-role-information-exterminator-description + rules: ghost-role-information-exterminator-rules + - type: GhostRoleMobSpawner + prototype: MobHumanTerminator + - type: Sprite + layers: + - state: green + - sprite: Mobs/Species/Terminator/parts.rsi + state: full diff --git a/Resources/Prototypes/Entities/Mobs/Player/terminator.yml b/Resources/Prototypes/Entities/Mobs/Player/terminator.yml new file mode 100644 index 00000000000000..0867419f8b2c9d --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/terminator.yml @@ -0,0 +1,183 @@ +- type: entity + parent: MobHuman + id: MobHumanTerminator + # uses random name generator dont worry + name: exterminator + components: + - type: Terminator + - type: GenericAntag + rule: Exterminator + # reduced barotrauma damage + - type: Barotrauma + damage: + types: + Blunt: 0.1 + # 4x stamina, faster recovery + - type: Stamina + decay: 6 + cooldown: 1 + critThreshold: 400 + # immune to space drugs, pax, temporary blindness + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - Electrocution + - Drunk + - SlurredSpeech + - RatvarianLanguage + - PressureImmunity + - Muted + - ForcedSleep + - StaminaModifier + - type: MobState + allowedStates: + - Alive + - Dead + # endoskeleton need it + - type: TransferMindOnGib + - type: MobThresholds + thresholds: + 0: Alive + # used for health display its not possible to actually fall into crit + 200: Dead + # fire!!!! + - type: Flammable + damage: + types: + Heat: 2.0 + # slightly wider thresholds + - type: Temperature + heatDamageThreshold: 390 + coldDamageThreshold: 240 + # take terminator flesh damage + - type: Damageable + damageModifierSet: CyberneticFlesh + # only organ is an endoskeleton, which is transferred when flesh dies + - type: Body + prototype: TerminatorFlesh + # endoskeleton transformation when either you would get burned to crit or killed by any damage + # you will become an endoskeleton as your last chance to kill the target + - type: Destructible + thresholds: + # the burn trigger is first incase of a bombing or nuking, it might well do over 200 damage but 100 heat is more important + - 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 + # faster than humans when damaged + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.8 + 90: 0.6 + # arnold is very strong + - type: MeleeWeapon + damage: + types: + Blunt: 10 + Structural: 10 + - type: RandomHumanoidAppearance + +- type: entity + parent: + - BaseMob + - MobCombat + - MobDamageable + - MobSiliconBase + id: MobTerminatorEndoskeleton + # you are now valid + name: nt-800 "exterminator" endoskeleton + description: The inner powerhouse of Susnet's infiltrator androids. Ridiculously hard alloy on the inside, unassuming flesh on the outside. + 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 + # he heavy + density: 500 + mask: + - MobMask + layer: + - MobLayer + - type: MobThresholds + thresholds: + 0: Alive + # gibbed at 200 so cant go crit + 200: Dead + # incase some weird stuff happens and the crew adopts a terminator + - type: Repairable + doAfterDelay: 15 + allowSelfRepair: false + - type: Body + prototype: TerminatorEndoskeleton + # lets it sit in the terminator flesh's brain slot + - type: Organ + - type: Brain + - type: TypingIndicator + proto: robot # beep boop borp + - type: Speech + speechSounds: Pai + - type: Damageable + damageModifierSet: Cybernetic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:PlaySoundBehavior + # endoSKELETON + sound: /Audio/Effects/bone_rattle.ogg + # a keepsake or a gift for cargo + - !type:SpawnEntitiesBehavior + spawn: + HeadTerminator: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + # for fire spreading around, the endoskeleton cannot burn + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 0 + # now his only weapon, but it is stronger + - type: MeleeWeapon + damage: + types: + Blunt: 15 + Structural: 5 + - type: Puller + needsHands: false + - type: Tag + tags: + - DoorBumpOpener + - ShoesRequiredStepTriggerImmune + # let mind transfer on gib work + - MindTransferTarget diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 53042c648dd37c..8b68ea7fb798fc 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -260,6 +260,19 @@ lightBreakChancePerSecond: 0.0003 doorToggleChancePerSecond: 0.001 +- type: entity + parent: BaseGameRule + id: TerminatorSpawn + noSpawn: true + components: + - type: StationEvent + weight: 8 + duration: 1 + earliestStart: 30 + minimumPlayers: 20 + - type: RandomSpawnRule + prototype: SpawnPointGhostTerminator + - type: entity id: VentClog parent: BaseGameRule diff --git a/Resources/Prototypes/GameRules/midround.yml b/Resources/Prototypes/GameRules/midround.yml index 241ee931bb58f0..28767e2c1808d1 100644 --- a/Resources/Prototypes/GameRules/midround.yml +++ b/Resources/Prototypes/GameRules/midround.yml @@ -34,4 +34,15 @@ parent: BaseGameRule noSpawn: true components: - - type: ThiefRule \ No newline at end of file + - type: ThiefRule + +- type: entity + noSpawn: true + parent: BaseGameRule + id: Exterminator + components: + - type: GenericAntagRule + agentName: terminator-round-end-agent-name + objectives: + - TerminateObjective + - ShutDownObjective diff --git a/Resources/Prototypes/Objectives/terminator.yml b/Resources/Prototypes/Objectives/terminator.yml new file mode 100644 index 00000000000000..1b569599a7fa6b --- /dev/null +++ b/Resources/Prototypes/Objectives/terminator.yml @@ -0,0 +1,40 @@ +- type: entity + abstract: true + parent: BaseObjective + id: BaseTerminatorObjective + components: + - type: Objective + difficulty: 1 + issuer: susnet + - type: RoleRequirement + roles: + components: + - TerminatorRole + +- type: entity + noSpawn: true + parent: [BaseTerminatorObjective, BaseKillObjective] + id: TerminateObjective + description: Follow your programming and terminate the target. + components: + - type: Objective + unique: false + - type: TargetObjective + title: objective-terminate-title + - type: PickRandomPerson + - type: TerminatorTargetOverride + - type: KillPersonCondition + requireDead: true + +- type: entity + noSpawn: true + parent: BaseTerminatorObjective + id: ShutDownObjective + name: Shut down + description: Once the mission is complete die to prevent our technology from being stolen. + components: + - type: Objective + icon: + sprite: Mobs/Species/Terminator/parts.rsi + state: skull_icon + - type: DieCondition diff --git a/Resources/Prototypes/Roles/Antags/terminator.yml b/Resources/Prototypes/Roles/Antags/terminator.yml new file mode 100644 index 00000000000000..ef1f176b8de4ec --- /dev/null +++ b/Resources/Prototypes/Roles/Antags/terminator.yml @@ -0,0 +1,6 @@ +- type: antag + id: Terminator + name: roles-antag-terminator-name + antagonist: true + setPreference: false + objective: roles-antag-terminator-objective diff --git a/Resources/Prototypes/Species/terminator.yml b/Resources/Prototypes/Species/terminator.yml new file mode 100644 index 00000000000000..cfc5a7107cead7 --- /dev/null +++ b/Resources/Prototypes/Species/terminator.yml @@ -0,0 +1,110 @@ +- type: species + id: Terminator + name: Terminator + roundStart: false + prototype: MobTerminatorEndoskeleton + sprites: MobTerminatorSprites + defaultSkinTone: "#fff9e2" + markingLimits: MobHumanMarkingLimits + maleFirstNames: skeletonNamesFirst + femaleFirstNames: skeletonNamesFirst + dollPrototype: MobSkeletonPersonDummy + skinColoration: TintedHues + +- type: speciesBaseSprites + id: MobTerminatorSprites + sprites: + Head: MobTerminatorHead + Chest: MobTerminatorTorso + 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: MobTerminatorTorso + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobTerminatorTorsoMale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobTerminatorTorsoFemale + baseSprite: + sprite: Mobs/Species/Terminator/parts.rsi + state: torso_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/Textures/Mobs/Species/Terminator/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..44e3df3e91b378de6c18fc0617a87996c248a5d2 GIT binary patch literal 2187 zcmV;62z2*}P)Px#1ZP1_K>z@;j|==^1pojDHAzH4RCr$PntyDS)fvaXloq)C0d1|U-Mt{CO2uj| z?LeTS5dR=z<}~{QaW2HnB_>PE{?P=cn_F}yTe2)>f4IekI2{EOlMNFP6D**$2&3(; zcI@^C1$sMbTcIue0kqiN@6-3Wd0T$H=iGZ=;>IVrIp;j@dEf7Ip7)&Ry!X8qH@V6G zH#3~lm^BYQG~rb7@xFc5*Rds8`c@}WeEpL@1p+}}vFJ5||)Pr|^2N%c25h|@jG}3@s8R_Wy_dn#=@nfH*BnUe7zaIY@ zV;4tpVeA63v*%)HXb`hAW+P)(0BPxI#!JCdM~au-zX`kFdd;x_OYbhnoSY(@KX)3( zz6d*3V8iAuX#S)osY`Ro(bE;hw?elekd=?(sz+o7uwD1gz^gVq|Co1 z2cx~sQfJ9F(c`Hk(om0+$Btm|%LqQ)_Og_0({96c1HkF8@a_gOXQB7YP8^SfWva7e zn|2;|x=uMS5!}<6cegN9hzp}<(AnC6JMJo#l5N`EiO=gYxNZQlzrFIZ>8u0QX94%X zb=mN|WU*}RQ*nLf7#*nUv#mLb{n+0to|B*kVP;x-+!;Oq5x1TFl6CjVK<_E}EU8>C z*PoZ4e?@(@v!9;h1y4(WcXRKbpO+`SHIM%U%hvr+j_Dm>n|2;&KlV>%5Wec|L`%b7 zsWZ9pLsZ{wV?Xxy$~6PPsl^?DgJPYJ!OD`dN-VyoN=k*t*^m8so=#O;c>eL`gBa-P zxa?Y2(kJZ4{yfi%zLA46#bScPgX7XZTDKcj)f=RqH8&kC&8huTG+n=|GmPMZa;e+u zd&&WBidSwz^8*pk&1pGH`x4Sgq4;gK+=|r@DUOVd-8PexY|d(HUnI z046&()7#%9j04bds3!J>=zjTn%r;B5Y4?Nn!#iZ%>sH8;ZQ5-x4nWrYGPH#2oYo|4 z)9wdc>sQkEB?stK9~mB!Qqi_wOW|tzHh2zzPWhg;f8y4nBC#oK(@wNsve79|uB5NH z`+31r2IWPoAO1c@&SxTX&WMzawQoxX<}p4As-0yr9)jG6M(p{%u(&+_B}cy^>oKCo z^_Up1gXaJ^)hVb0PIC&$4uDggf?xVKxyk=9*6U>Y+VgwOB}?DxB#LWR783l8-W2M) zeZ~Ax_PDf8z>smWowQBW5X;}pZ z2hPSEI4QQH^`EA6@QNlo-hiBW`3b#?G+qK6_)C8}AcN1EzZ6AxtVZQJf8GZwBO{}@ z^S;M0FIa)J?1flRTnhR`-<&RGc;m$<;vYKV7u0fV(--IMB^o-xO{7KwpT>GBnycm|)g!{CPYFa3_c~H#tWqN%dAZ zJ<+NUni%)*{FTv`Xfy+O;oaM|NS*7B!ei%0r9E+BT%0h?!Y1(A)SwojHhs|KN8e1J z2dt8yLT8Bku8;KfJGJEFzP4(r54KnbK$k(roIre99{u2LWESMg@l?QTQ-e^G+PVeW zV!U46Ymie<1EKht19aW%vLvSZ#xsBdnVA7pZ}>3+nb|15Yc<%WJ=KFJszXg`(+B#Z zJ~-VxlTZ#Id$zsc)cl9qUjGetHLL=_OdEeEaD(A{N!xb;B;gtGO~)z#+>iOMES-L~ z(N6~Sfxg&2e^}1|3ddiI-$2|ynA%_+fOGv_PVL5%h%X7}0DT{y%17YoP>Z^p`mK$7 z(AHGz95Kf_06DoqnR<-A{&UoiAn4$!OMUv02v*7KS_4gWLQJkU@L$|xn!Ybfs}BGG N002ovPDHLkV1n=*R1*LI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..dada5727bf6261b51b3df9e29910a92972386fe9 GIT binary patch literal 997 zcmVAge`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^UE1-g^h(fA_t2_l9=>(SI$V{bNsm|BX9eUs(zG?s%#4E41OyhhGCV z%|Px%nr?g+LGlNN#(?TDaFw}Nen1m$!tD8EJcT#IQP=L}Nhlh;V~X%;VOo_RRNZ+g zIR@?Bw?{+T3m?m}4gS@;;=v1ZE$y0o)fA9B|JEEA-;V(CSxjQWO$Bc*vR`q1l|xl^ z4eCSf{uV(u1wKsA;Ze95-!dl{9ee3@3Osxq#gB_K>};-~v%41$>KpMrol@low4HeJ zG>X=aUL5YO;mdvsz8AscgQMH)mbS=Wc@q&45fKp)5fKp)5fS}UO0qvd`2I3es(khS zfM3!!QebVUfIBbb`~XbX`{CcG6Od9a@!xS9Vu%QMJkj{Lp_ z#N}lU6_r)kSW1`<9NV_7&l_cb3%KITri@THg4((UTL2;=A|fIpA|fIp`U5`!d=2XX T9$_Z%00000NkvXXu0mjf<5$Vb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..dada5727bf6261b51b3df9e29910a92972386fe9 GIT binary patch literal 997 zcmVAge`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^UE1-g^h(fA_t2_l9=>(SI$V{bNsm|BX9eUs(zG?s%#4E41OyhhGCV z%|Px%nr?g+LGlNN#(?TDaFw}Nen1m$!tD8EJcT#IQP=L}Nhlh;V~X%;VOo_RRNZ+g zIR@?Bw?{+T3m?m}4gS@;;=v1ZE$y0o)fA9B|JEEA-;V(CSxjQWO$Bc*vR`q1l|xl^ z4eCSf{uV(u1wKsA;Ze95-!dl{9ee3@3Osxq#gB_K>};-~v%41$>KpMrol@low4HeJ zG>X=aUL5YO;mdvsz8AscgQMH)mbS=Wc@q&45fKp)5fKp)5fS}UO0qvd`2I3es(khS zfM3!!QebVUfIBbb`~XbX`{CcG6Od9a@!xS9Vu%QMJkj{Lp_ z#N}lU6_r)kSW1`<9NV_7&l_cb3%KITri@THg4((UTL2;=A|fIpA|fIp`U5`!d=2XX T9$_Z%00000NkvXXu0mjf<5$Vb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7425405cf99b761b0b095748bf740cb7fbd973 GIT binary patch literal 807 zcmV+?1K9kDP)Age`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^ncNU$6an6#hp7^hQ?_yWi&SZmw%b<2G~r_Y;sk)lYEVpWy@t l!+P^dUyJ|%0002|%p2p7YPS_z1BL(q002ovPDHLkV1l*XY*_#R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b3f150767e0cb3c9920fab3982345dc405fac GIT binary patch literal 746 zcmVAge`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^_z3^#5%xa|X^m zXYSpdkpKVy000000002s9|$&0U>eP&P%No(RM+Fft&hdiyCCaA&%!WqYx}aRVed-X zlWs<%z{aId8}D>=9W~a@o7=RoLb)W zo(z5t!9Kfq8o4YAjK}>yzpB3B$uI8!0000000000007IS8ezL}b@jBRnrZv7w42Um zISyZC|HZicDIV&1Huk;P8rII0dOTh%SA6sDZ!iA;04v$XM_4rP_SO8mj-A|qW%<&a c!Y=pz0?f}?PP0Wa$^ZZW07*qoM6N<$g2F>t{{R30 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..cf93432a5e797cb3f22ffeb6ada16a28f8ddc6af GIT binary patch literal 748 zcmVAge`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^00HOdTu~d;>{}pdhHtMX4cB{FancZqn1ONa40002V;+PJ&>3Lyo??|t^?S@?SdQOyBrL7&kzPmh)6zeA` z(*afTZ^K(-@m_<09&2t*6+~iR0M+%SLfL2$#=(<3^tAC!?1? z>D(+)J-gNINO97pH@3K(x10E^`^x%8MbE11ZZ$>)uzCFToy~r4S#^J9wdkB5AB489 eGynhq{;Mf0j8IAge`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^vOA zLE#7niwFU$yn%rfpgCwR*8c^9Ljr62`7i>99E7<5o7KXbHufnO;K+Odht^d( Tds-Bv00000NkvXXu0mjf=juxp literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json new file mode 100644 index 00000000000000..688877a32d0ab0 --- /dev/null +++ b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/meta.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by ps3moira#9488 (discord) for SS14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "skull_icon", + "directions": 1 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..51f05a477380a3bebd9e5d2834e82a5f49117441 GIT binary patch literal 839 zcmV-N1GxN&P)Age`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^0zaK7mu0V(cakc9JSoTa-2usgNNkA`%=5f+FG& zlR`5}QXF#I{~HoQa>KoU&Pj$40RR910Ki`+#c6YGW5@UNT!_a_FW2*KZ#uiWMYpAb z?*kAi_jq=BQ@2 z(hP?qOax%hSISjQH&wuUxp8PH)NwC&-c9+psEX2kZ2$lO00000000000013=^EyDB zn>Q1wJu;qD5+dWyc>B0kl&M<2W-5Symy7Mct&7QBXR*(^PyilSnoI|8u!zPXRiBq@D( z-YorK-ynUyJun$STP-lPv`%N)v>6+l;I#T3^$+l*Yxnr1000000000ZegW3*bYW$< Ri825H002ovPDHLkV1m>CbISk# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..19ac240da3ad9bb75bd86dc85b5cad0ed453a20b GIT binary patch literal 782 zcmV+p1M&QcP)Age`>x4_Hc93`YRXlW1{qLyw$ z|3R%mYe5hcK}1`7w)i)DR`LgyY-%9izWVp)|_XnTgMT-~3SoMyg6FV{8C5xBPD;<~QI z_Th2|hMx4O5v@vXvhB$vyq`mF1p4m4u~y6K@0_zo2ye+Rx`l&77?b<1^2%jSz8axxU{^f{zFeMgJ=2OODl{ko6D;>U)Ig_ zxrt4*;KOED-cenemd;u&ZB?s*-X!;+A@8^ztqJ3?&t=D1WRh&SI~u-bl$jZ7wzML@ zeG<)O3wb$}-BG-|H_;1tyzj}W*5r4Zqn8sto4C8*h{jM5_Y&;5i7&jzwlLi0)000000001hv8*JUOuM|aTG688M(ya2?yP0{^=UBqo$Z?D7RtKyJ>6Zk z6X%~wT12i;j1E6|>PP{Qz9M`8$%U|Yx2Q}Sn@oadB2mk;8 M07*qoM6N<$f_3_BDgXcg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Terminator/parts.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd2eb37ccbe12bef6a484660d4be6459db0a47d GIT binary patch literal 759 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