Derelict Borg Revival (#33433)
* Derelictn'tn't Borg! * Clean *sparkles* * Removed "S: Awaiting Changes"
This commit is contained in:
37
Content.Server/Silicons/Laws/StartIonStormedSystem.cs
Normal file
37
Content.Server/Silicons/Laws/StartIonStormedSystem.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
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()}");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
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;
|
||||
}
|
||||
@@ -238,6 +238,9 @@ ghost-role-information-syndicate-cyborg-assault-name = Syndicate Assault Cyborg
|
||||
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...
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ petting-success-janitor-cyborg = You pet {THE($target)} on {POSS-ADJ($target)} d
|
||||
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!
|
||||
@@ -82,6 +83,7 @@ petting-failure-janitor-cyborg = You reach out to pet {THE($target)}, but {SUBJE
|
||||
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
|
||||
|
||||
|
||||
@@ -170,3 +170,21 @@
|
||||
- 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
|
||||
@@ -328,3 +328,23 @@
|
||||
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
|
||||
|
||||
@@ -187,3 +187,35 @@
|
||||
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
|
||||
@@ -526,3 +526,37 @@
|
||||
- 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
|
||||
@@ -37,6 +37,7 @@
|
||||
- id: SleeperAgents
|
||||
- id: ZombieOutbreak
|
||||
- id: LoneOpsSpawn
|
||||
- id: DerelictCyborgSpawn
|
||||
|
||||
- type: entity
|
||||
id: BaseStationEvent
|
||||
@@ -562,3 +563,24 @@
|
||||
- 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
|
||||
|
||||
@@ -34,3 +34,6 @@
|
||||
|
||||
- node: cyborg
|
||||
entity: BorgChassisSelectable
|
||||
|
||||
- node: derelictcyborg
|
||||
entity: BorgChassisDerelict
|
||||
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict.png
Normal file
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_e.png
Normal file
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_e.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_e_r.png
Normal file
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_e_r.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_icon.png
Normal file
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_l.png
Normal file
BIN
Resources/Textures/Mobs/Silicon/chassis.rsi/derelict_l.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
@@ -5,7 +5,7 @@
|
||||
"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",
|
||||
@@ -23,6 +23,26 @@
|
||||
"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
|
||||
|
||||
Reference in New Issue
Block a user