--- /dev/null
+using Content.Shared.Silicons.Laws.Components;
+using Content.Shared.Administration.Logs;
+using Content.Shared.Database;
+
+namespace Content.Server.Silicons.Laws;
+
+/// <summary>
+/// This handles running the ion storm event a on specific entity when that entity is spawned in.
+/// </summary>
+public sealed class StartIonStormedSystem : EntitySystem
+{
+ [Dependency] private readonly IonStormSystem _ionStorm = default!;
+ [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
+ [Dependency] private readonly SiliconLawSystem _siliconLaw = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent<StartIonStormedComponent, MapInitEvent>(OnMapInit);
+ }
+
+ private void OnMapInit(Entity<StartIonStormedComponent> ent, ref MapInitEvent args)
+ {
+ if (!TryComp<SiliconLawBoundComponent>(ent.Owner, out var lawBound))
+ return;
+ if (!TryComp<IonStormTargetComponent>(ent.Owner, out var target))
+ return;
+
+ for (int currentIonStorm = 0; currentIonStorm < ent.Comp.IonStormAmount; currentIonStorm++)
+ {
+ _ionStorm.IonStormTarget((ent.Owner, lawBound, target), false);
+ }
+
+ var laws = _siliconLaw.GetLaws(ent.Owner, lawBound);
+ _adminLogger.Add(LogType.Mind, LogImpact.High, $"{ToPrettyString(ent.Owner):silicon} spawned with ion stormed laws: {laws.LoggingString()}");
+ }
+}
--- /dev/null
+using Content.Shared.Roles;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Silicons.Laws.Components;
+
+/// <summary>
+/// Applies law altering ion storms on a specific entity IonStormAmount times when the entity is spawned.
+/// </summary>
+[RegisterComponent]
+public sealed partial class StartIonStormedComponent : Component
+{
+ /// <summary>
+ /// Amount of times that the ion storm will be run on the entity on spawn.
+ /// </summary>
+ [DataField]
+ public int IonStormAmount = 1;
+}
ghost-role-information-syndicate-cyborg-saboteur-name = Syndicate Saboteur Cyborg
ghost-role-information-syndicate-cyborg-description = The Syndicate needs reinforcements. You, a cold silicon killing machine, will help them.
+ghost-role-information-derelict-cyborg-name = Derelict Cyborg
+ghost-role-information-derelict-cyborg-description = You are a regular cyborg that got lost in space. After years of exposure to ion storms you find yourself near a space station.
+
ghost-role-information-security-name = Security
ghost-role-information-security-description = You are part of a security task force, but seem to have found yourself in a strange situation...
petting-success-medical-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} sterile metal head.
petting-success-service-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} dapper looking metal head.
petting-success-syndicate-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} menacing metal head.
+petting-success-derelict-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} rusty metal head.
petting-success-recycler = You pet {THE($target)} on {POSS-ADJ($target)} mildly threatening steel exterior.
petting-failure-honkbot = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BASIC($target, "honk", "honks")} in refusal!
petting-failure-medical-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy saving lives!
petting-failure-service-cyborg = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy serving others!
petting-failure-syndicate-cyborg = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} treacherous affiliation makes you reconsider.
+petting-failure-derelict-cyborg = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} rusty and jagged exterior makes you reconsider.
## Rattling fences
- state: green
- sprite: Objects/Weapons/Melee/energykatana.rsi
state: icon
+
+- type: entity
+ categories: [ HideSpawnMenu, Spawner ]
+ parent: BaseAntagSpawner
+ id: SpawnPointGhostDerelictCyborg
+ components:
+ - type: GhostRole
+ name: ghost-role-information-derelict-cyborg-name
+ description: ghost-role-information-derelict-cyborg-description
+ rules: ghost-role-information-silicon-rules
+ raffle:
+ settings: default
+ - type: Sprite
+ sprite: Markers/jobs.rsi
+ layers:
+ - state: green
+ - sprite: Mobs/Silicon/chassis.rsi
+ state: derelict_icon
\ No newline at end of file
Unsexed: UnisexSiliconSyndicate
- type: PointLight
color: "#dd200b"
+
+- type: entity
+ id: BaseBorgChassisDerelict
+ parent: BaseBorgChassis
+ abstract: true
+ components:
+ - type: NpcFactionMember
+ factions:
+ - NanoTrasen #The seemingly best fit. It was a regular NT cyborg once, after all.
+ - type: Access
+ enabled: false
+ groups:
+ - AllAccess #Randomized access would be fun. AllAccess is the best i can think of right now that does make it too hard for it to enter the station or navigate it..
+ - type: AccessReader
+ access: [["Command"], ["Research"]]
+ - type: StartIonStormed
+ ionStormAmount: 3
+ - type: IonStormTarget
+ chance: 1
+
\ No newline at end of file
interactFailureString: petting-failure-syndicate-cyborg
interactSuccessSound:
path: /Audio/Ambience/Objects/periodic_beep.ogg
+
+- type: entity
+ id: BorgChassisDerelict
+ parent: BaseBorgChassisDerelict
+ name: derelict cyborg
+ description: A man-machine hybrid that assists in station activity. This one is in a state of great disrepair.
+ components:
+ - type: Sprite
+ layers:
+ - state: derelict
+ - state: derelict_e_r
+ map: ["enum.BorgVisualLayers.Light"]
+ shader: unshaded
+ visible: false
+ - state: derelict_l
+ shader: unshaded
+ map: ["light"]
+ visible: false
+ - type: BorgChassis
+ maxModules: 5 # the sixth one broke lol
+ moduleWhitelist:
+ tags:
+ - BorgModuleGeneric
+ hasMindState: derelict_e
+ noMindState: derelict_e_r
+ - type: Construction
+ node: derelictcyborg
+ - type: InteractionPopup
+ interactSuccessString: petting-success-derelict-cyborg
+ interactFailureString: petting-failure-derelict-cyborg
+ interactSuccessSound:
+ path: /Audio/Ambience/Objects/periodic_beep.ogg
\ No newline at end of file
- PlayerBorgSyndicateAssaultGhostRole
- PlayerBorgSyndicateAssaultGhostRole # Saboteurs are kinda like cyborg medics, we want less.
- PlayerBorgSyndicateSaboteurGhostRole
+
+- type: entity
+ id: PlayerBorgDerelict
+ parent: BorgChassisDerelict
+ suffix: Battery, Module
+ components:
+ - type: ContainerFill
+ containers:
+ borg_brain:
+ - PositronicBrain
+ borg_module:
+ - BorgModuleTool
+ - BorgModuleFireExtinguisher
+ - BorgModuleGPS
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellHigh
+ - type: RandomMetadata
+ nameSegments: [names_borg]
+
+- type: entity
+ id: PlayerBorgDerelictGhostRole
+ parent: PlayerBorgDerelict
+ suffix: Ghost role
+ components:
+ - type: GhostRole
+ name: ghost-role-information-derelict-cyborg-name
+ description: ghost-role-information-derelict-cyborg-description
+ rules: ghost-role-information-silicon-rules
+ raffle:
+ settings: default
+ - type: GhostTakeoverAvailable
\ No newline at end of file
- id: SleeperAgents
- id: ZombieOutbreak
- id: LoneOpsSpawn
+ - id: DerelictCyborgSpawn
- type: entity
id: BaseStationEvent
- Service
blacklist:
- External # don't space everything
+
+- type: entity
+ parent: BaseGameRule
+ id: DerelictCyborgSpawn
+ components:
+ - type: StationEvent
+ weight: 5
+ earliestStart: 15
+ reoccurrenceDelay: 20
+ minimumPlayers: 4
+ duration: null
+ - type: SpaceSpawnRule
+ spawnDistance: 0
+ - type: AntagSpawner
+ prototype: PlayerBorgDerelict
+ - type: AntagSelection
+ definitions:
+ - spawnerPrototype: SpawnPointGhostDerelictCyborg
+ min: 1
+ max: 1
+ pickPlayer: false
- node: cyborg
entity: BorgChassisSelectable
+
+ - node: derelictcyborg
+ entity: BorgChassisDerelict
\ No newline at end of file
"y": 32
},
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/faf6db214927874c19b8fa8585d26b5d40de1acc",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/faf6db214927874c19b8fa8585d26b5d40de1acc, derelict sprites modified by GoldenCan(GitHub).",
"states": [
{
"name": "clown",
"name": "clown_l",
"directions": 4
},
+ {
+ "name": "derelict",
+ "directions": 4
+ },
+ {
+ "name": "derelict_e",
+ "directions": 4
+ },
+ {
+ "name": "derelict_e_r",
+ "directions": 4
+ },
+ {
+ "name": "derelict_icon",
+ "directions": 1
+ },
+ {
+ "name": "derelict_l",
+ "directions": 4
+ },
{
"name": "engineer",
"directions": 4