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;
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;
[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!;
Message = Loc.GetString("admin-smite-super-speed-description"),
};
args.Verbs.Add(superSpeed);
+
//Bonk
Verb superBonkLite = new()
{
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<MindContainerComponent>(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);
}
}
--- /dev/null
+using Content.Shared.Popups;
+
+namespace Content.Server.Destructible.Thresholds.Behaviors;
+
+/// <summary>
+/// Shows a popup for everyone.
+/// </summary>
+[DataDefinition]
+public sealed partial class PopupBehavior : IThresholdBehavior
+{
+ /// <summary>
+ /// Locale id of the popup message.
+ /// </summary>
+ [DataField("popup", required: true)]
+ public string Popup;
+
+ /// <summary>
+ /// Type of popup to show.
+ /// </summary>
+ [DataField("popupType")]
+ public PopupType PopupType;
+
+ public void Execute(EntityUid uid, DestructibleSystem system, EntityUid? cause = null)
+ {
+ var popup = system.EntityManager.System<SharedPopupSystem>();
+ // popup is placed at coords since the entity could be deleted after, no more popup then
+ var coords = system.EntityManager.GetComponent<TransformComponent>(uid).Coordinates;
+ popup.PopupCoordinates(Loc.GetString(Popup), coords, PopupType);
+ }
+}
--- /dev/null
+using Content.Server.Objectives.Systems;
+
+namespace Content.Server.Objectives.Components;
+
+/// <summary>
+/// Sets this objective's target to the exterminator's target override, if it has one.
+/// If not it will be random.
+/// </summary>
+[RegisterComponent, Access(typeof(TerminatorTargetOverrideSystem))]
+public sealed partial class TerminatorTargetOverrideComponent : Component
+{
+}
--- /dev/null
+using Content.Server.Objectives.Components;
+using Content.Server.Terminator.Components;
+using Content.Shared.Mind;
+using Content.Shared.Objectives.Components;
+
+namespace Content.Server.Objectives.Systems;
+
+/// <summary>
+/// Handles copying the exterminator's target override to this objective.
+/// </summary>
+public sealed class TerminatorTargetOverrideSystem : EntitySystem
+{
+ [Dependency] private readonly TargetObjectiveSystem _target = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<TerminatorTargetOverrideComponent, ObjectiveAssignedEvent>(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<TerminatorComponent>(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);
+ }
+}
SubscribeAntagEvents<NukeopsRoleComponent>();
SubscribeAntagEvents<RevolutionaryRoleComponent>();
SubscribeAntagEvents<SubvertedSiliconRoleComponent>();
+ SubscribeAntagEvents<TerminatorRoleComponent>();
SubscribeAntagEvents<TraitorRoleComponent>();
SubscribeAntagEvents<ZombieRoleComponent>();
SubscribeAntagEvents<ThiefRoleComponent>();
--- /dev/null
+using Content.Shared.Roles;
+
+namespace Content.Server.Roles;
+
+[RegisterComponent]
+public sealed partial class TerminatorRoleComponent : AntagonistRoleComponent
+{
+}
--- /dev/null
+using Content.Server.Terminator.Systems;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
+
+namespace Content.Server.Terminator.Components;
+
+/// <summary>
+/// Main terminator component, handles the target, if any, and objectives.
+/// </summary>
+[RegisterComponent, Access(typeof(TerminatorSystem))]
+public sealed partial class TerminatorComponent : Component
+{
+ /// <summary>
+ /// Used to force the terminate objective's target.
+ /// If null it will be a random person.
+ /// </summary>
+ [DataField("target")]
+ public EntityUid? Target;
+}
--- /dev/null
+using Content.Server.Terminator.Systems;
+
+namespace Content.Server.Terminator.Components;
+
+/// <summary>
+/// Sets <see cref="TerminatorComponent.Target"/> after the ghost role spawns.
+/// </summary>
+[RegisterComponent, Access(typeof(TerminatorSystem))]
+public sealed partial class TerminatorTargetComponent : Component
+{
+ /// <summary>
+ /// The target to set after the ghost role spawns.
+ /// </summary>
+ [DataField("target")]
+ public EntityUid? Target;
+}
--- /dev/null
+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<TerminatorComponent, MapInitEvent>(OnMapInit);
+ SubscribeLocalEvent<TerminatorComponent, GhostRoleSpawnerUsedEvent>(OnSpawned);
+ SubscribeLocalEvent<TerminatorComponent, GenericAntagCreatedEvent>(OnCreated);
+ }
+
+ private void OnMapInit(EntityUid uid, TerminatorComponent comp, MapInitEvent args)
+ {
+ // cyborg doesn't need to breathe
+ RemComp<RespiratorComponent>(uid);
+ }
+
+ private void OnSpawned(EntityUid uid, TerminatorComponent comp, GhostRoleSpawnerUsedEvent args)
+ {
+ if (!TryComp<TerminatorTargetComponent>(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);
+ }
+
+ /// <summary>
+ /// Create a spawner at a position and return it.
+ /// </summary>
+ /// <param name="coords">Coordinates to create the spawner at</param>
+ /// <param name="target">Optional target mind to force the terminator to target</param>
+ public EntityUid CreateSpawner(EntityCoordinates coords, EntityUid? target)
+ {
+ var uid = Spawn("SpawnPointGhostTerminator", coords);
+ if (target != null)
+ {
+ var comp = EnsureComp<TerminatorTargetComponent>(uid);
+ comp.Target = target;
+ }
+
+ return uid;
+ }
+}
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
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
--- /dev/null
+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-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.
--- /dev/null
+objective-terminate-title = Terminate {$targetName}, {CAPITALIZE($job)}
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.
--- /dev/null
+- 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
--- /dev/null
+# 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
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
- 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
--- /dev/null
+- 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
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
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
--- /dev/null
+- 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
--- /dev/null
+- type: antag
+ id: Terminator
+ name: roles-antag-terminator-name
+ antagonist: true
+ setPreference: false
+ objective: roles-antag-terminator-objective
--- /dev/null
+- 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
--- /dev/null
+{
+ "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
+ }
+ ]
+}