Xenoborg extractor (#42796)

* verb category

* voltage toggle comp

* move stuff

* add simple prototype

* implement verb action

* switch expression

* fixed the node not updating

* charge the battery

* fixed battery not charging

* spawn on battery level system

* finally works

* swap commentary position

* can only anchor the extractor on the station

* popup message for trying to anchor outside of station

* default placement for unanchored version

* ops

* fix body type

* commentary

* update visuals of power consumer

* add custom sprite

* fix light layer not changing

* xenoborg circuit

* fix xenoborg circuit

* add tag

* add hand to hold xenoborg circuits

* move to material

* add xenoborg circuit material

* add recipe to mothership core

* add a hand to hold circuits to the mothership core

* to not confuse

* update

* ops

* another ops

* update mothership

* update guidebook

* update values

* more info

* fix stack

* can store xenoborg circuits

* description

* also update description

* circuit -> crytal

* not modified from anything

* update description

* Revert "update mothership"

This reverts commit 84974c56afadac2a99ed2a166244a668d83fff48.

* update empty label

* small update to sprite

* not necessary code

* remove empty line

* color

* make it explode when destroyed

* change values

* update sprite

* update sprite

* make it eletrified

* flavor text

* simplify to only use charge

* subscribe to event

* new line

* remove popup

* no need for the setter

* no longer networked

* feedback popups

* Minor tweaks

* better to understand

* better now?

---------

Co-authored-by: beck-thompson <beck314159@hotmail.com>
This commit is contained in:
Samuka 2026-02-27 21:55:09 -03:00 committed by GitHub
parent 210fae0ffe
commit 7f15e77954
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
39 changed files with 625 additions and 22 deletions

View File

@ -0,0 +1,7 @@
namespace Content.Server.Power.Components;
/// <summary>
/// Charges the battery from a entity with <see cref="PowerConsumerComponent"/>
/// </summary>
[RegisterComponent]
public sealed partial class PowerConsumerBatteryChargerComponent : Component;

View File

@ -0,0 +1,23 @@
using Robust.Shared.Prototypes;
namespace Content.Server.Power.Components;
/// <summary>
/// Spawns a entity when the battery reaches a certain percentage or amount of power.
/// It also consumes that much power when spawning the entity.
/// </summary>
[RegisterComponent]
public sealed partial class SpawnOnBatteryLevelComponent : Component
{
/// <summary>
/// Entity prototype to spawn.
/// </summary>
[DataField(required: true)]
public EntProtoId Prototype = string.Empty;
/// <summary>
/// Amount of power in the battery (in joules) to spawn entity
/// </summary>
[DataField]
public float Charge;
}

View File

@ -0,0 +1,46 @@
using Robust.Shared.GameStates;
using Content.Shared.Power;
namespace Content.Server.Power.Components;
/// <summary>
/// Changes the voltage of a device with <see cref="PowerConsumerComponent"/>
/// </summary>
[RegisterComponent]
public sealed partial class VoltageTogglerComponent : Component
{
/// <summary>
/// List of all voltage settings.
/// </summary>
[DataField(required: true), ViewVariables(VVAccess.ReadOnly)]
public VoltageSetting[] Settings = [];
/// <summary>
/// Index of the currently selected setting.
/// </summary>
[DataField]
[AutoNetworkedField]
public int SelectedVoltageLevel;
}
[DataDefinition]
public partial struct VoltageSetting
{
/// <summary>
/// Voltage.
/// </summary>
[DataField(required: true)]
public Voltage Voltage;
/// <summary>
/// Power usage in that voltage.
/// </summary>
[DataField(required: true)]
public float Wattage;
/// <summary>
/// Name of the setting.
/// </summary>
[DataField(required: true)]
public LocId Name;
}

View File

@ -0,0 +1,22 @@
using Content.Server.Power.Components;
using Content.Shared.Power.Components;
namespace Content.Server.Power.EntitySystems;
public sealed class PowerConsumerBatteryChargerSystem : EntitySystem
{
[Dependency] private readonly BatterySystem _battery = default!;
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<PowerConsumerBatteryChargerComponent, PowerConsumerComponent, BatteryComponent, TransformComponent>();
while (query.MoveNext(out var entity, out _, out var powerConsumerComp, out var battery, out var transform))
{
if (!transform.Anchored)
continue;
_battery.ChangeCharge((entity, battery), powerConsumerComp.NetworkLoad.ReceivingPower * frameTime);
}
}
}

View File

@ -57,6 +57,7 @@ namespace Content.Server.Power.EntitySystems
SubscribeLocalEvent<PowerNetworkBatteryComponent, EntityPausedEvent>(BatteryPaused);
SubscribeLocalEvent<PowerNetworkBatteryComponent, EntityUnpausedEvent>(BatteryUnpaused);
SubscribeLocalEvent<PowerConsumerComponent, MapInitEvent>(PowerConsumerMapInit);
SubscribeLocalEvent<PowerConsumerComponent, ComponentInit>(PowerConsumerInit);
SubscribeLocalEvent<PowerConsumerComponent, ComponentShutdown>(PowerConsumerShutdown);
SubscribeLocalEvent<PowerConsumerComponent, EntityPausedEvent>(PowerConsumerPaused);
@ -132,6 +133,11 @@ namespace Content.Server.Power.EntitySystems
component.NetworkBattery.Paused = false;
}
private void PowerConsumerMapInit(EntityUid uid, PowerConsumerComponent component, ref MapInitEvent args)
{
_appearance.SetData(uid, PowerDeviceVisuals.Powered, component.ReceivedPower > 0);
}
private void PowerConsumerInit(EntityUid uid, PowerConsumerComponent component, ComponentInit args)
{
_powerNetConnector.BaseNetConnectorInit(component);
@ -414,6 +420,8 @@ namespace Content.Server.Power.EntitySystems
lastRecv = newRecv;
var msg = new PowerConsumerReceivedChanged(newRecv, consumer.DrawRate);
RaiseLocalEvent(uid, ref msg);
_appearance.SetData(uid, PowerDeviceVisuals.Powered, newRecv > 0);
}
}

View File

@ -0,0 +1,34 @@
using Content.Server.Power.Components;
using Content.Shared.Power;
using Content.Shared.Power.Components;
namespace Content.Server.Power.EntitySystems;
public sealed class SpawnOnBatteryLevelSystem : EntitySystem
{
[Dependency] private readonly BatterySystem _battery = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SpawnOnBatteryLevelComponent, ChargeChangedEvent>(OnBatteryChargeChange);
}
private void OnBatteryChargeChange(Entity<SpawnOnBatteryLevelComponent> entity, ref ChargeChangedEvent args)
{
if (!TryComp<BatteryComponent>(entity, out var battery))
return;
if (!TryComp(entity, out TransformComponent? xform))
return;
if (battery.LastCharge >= entity.Comp.Charge)
{
Spawn(entity.Comp.Prototype, xform.Coordinates);
_battery.ChangeCharge((entity, battery), -entity.Comp.Charge);
}
}
}

View File

@ -0,0 +1,74 @@
using Content.Server.NodeContainer.EntitySystems;
using Content.Server.Power.Components;
using Content.Shared.NodeContainer;
using Content.Shared.NodeContainer.NodeGroups;
using Content.Shared.Power;
using Content.Shared.Verbs;
namespace Content.Server.Power.EntitySystems;
public sealed class VoltageTogglerSystem : EntitySystem
{
[Dependency] private readonly NodeGroupSystem _nodeGroupSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<VoltageTogglerComponent, GetVerbsEvent<Verb>>(OnGetVerb);
}
private void OnGetVerb(Entity<VoltageTogglerComponent> entity, ref GetVerbsEvent<Verb> args)
{
if (!args.CanAccess || !args.CanInteract)
return;
var index = 0;
foreach (var setting in entity.Comp.Settings)
{
// This is because Act wont work with index.
// Needs it to be saved in the loop.
var currIndex = index;
var verb = new Verb
{
Priority = currIndex,
Category = VerbCategory.VoltageLevel,
Disabled = entity.Comp.SelectedVoltageLevel == currIndex,
Text = Loc.GetString(setting.Name),
Act = () =>
{
entity.Comp.SelectedVoltageLevel = currIndex;
Dirty(entity);
ChangeVoltage(entity, setting);
}
};
args.Verbs.Add(verb);
index++;
}
}
private void ChangeVoltage(Entity<VoltageTogglerComponent> entity, VoltageSetting setting)
{
if (TryComp<NodeContainerComponent>(entity, out var nodeContainerComp))
{
var newNodeGroupId = setting.Voltage switch
{
Voltage.Apc => NodeGroupID.Apc,
Voltage.Medium => NodeGroupID.MVPower,
Voltage.High => NodeGroupID.HVPower,
_ => NodeGroupID.Default,
};
var inputNode = nodeContainerComp.Nodes["input"];
_nodeGroupSystem.QueueNodeRemove(inputNode);
inputNode.SetNodeGroupId(newNodeGroupId);
_nodeGroupSystem.QueueReflood(inputNode);
}
if (TryComp<PowerConsumerComponent>(entity, out var powerConsumerComp))
{
powerConsumerComp.Voltage = setting.Voltage;
powerConsumerComp.DrawRate = setting.Wattage;
}
}
}

View File

@ -0,0 +1,14 @@
namespace Content.Shared.Construction.Components;
/// <summary>
/// If a entity has this component it can only be anchored to the station
/// </summary>
[RegisterComponent]
public sealed partial class AnchorOnlyOnStationComponent : Component
{
/// <summary>
/// Pop up message when you try to anchor the entity on any grid that isn't the station grid
/// </summary>
[DataField]
public LocId PopupMessageAnchorFail = "anchorable-fail-not-on-station";
}

View File

@ -1,4 +1,5 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.Administration.Logs;
using Content.Shared.Examine;
using Content.Shared.Construction.Components;
@ -10,6 +11,8 @@ using Content.Shared.Interaction;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using Content.Shared.Popups;
using Content.Shared.Station;
using Content.Shared.Station.Components;
using Content.Shared.Tools.Components;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
@ -29,6 +32,7 @@ public sealed partial class AnchorableSystem : EntitySystem
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly PullingSystem _pulling = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly SharedStationSystem _stationSystem = default!;
[Dependency] private readonly SharedToolSystem _tool = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
@ -51,6 +55,8 @@ public sealed partial class AnchorableSystem : EntitySystem
SubscribeLocalEvent<AnchorableComponent, ExaminedEvent>(OnAnchoredExamine);
SubscribeLocalEvent<AnchorableComponent, ComponentStartup>(OnAnchorStartup);
SubscribeLocalEvent<AnchorableComponent, AnchorStateChangedEvent>(OnAnchorStateChange);
SubscribeLocalEvent<AnchorOnlyOnStationComponent, AnchorAttemptEvent>(OnAnchorOnStation);
}
private void OnAnchorStartup(EntityUid uid, AnchorableComponent comp, ComponentStartup args)
@ -58,6 +64,21 @@ public sealed partial class AnchorableSystem : EntitySystem
_appearance.SetData(uid, AnchorVisuals.Anchored, Transform(uid).Anchored);
}
private void OnAnchorOnStation(Entity<AnchorOnlyOnStationComponent> ent, ref AnchorAttemptEvent args)
{
var entityParent = Comp<TransformComponent>(ent).ParentUid;
var isOnStation = _stationSystem.GetStations()
.Select(stationEnt => _stationSystem.GetLargestGrid(stationEnt))
.Contains(entityParent);
if (isOnStation)
return;
// TODO: fix the popup
// _popup.PopupClient(Loc.GetString(ent.Comp.PopupMessageAnchorFail), ent, args.User);
args.Cancel();
}
private void OnAnchorStateChange(EntityUid uid, AnchorableComponent comp, AnchorStateChangedEvent args)
{
_appearance.SetData(uid, AnchorVisuals.Anchored, args.Anchored);

View File

@ -27,6 +27,11 @@ public abstract partial class Node
/// </summary>
[ViewVariables] public EntityUid Owner { get; private set; } = default!;
public void SetNodeGroupId(NodeGroupID newId)
{
NodeGroupID = newId;
}
/// <summary>
/// If this node should be considered for connection by other nodes.
/// </summary>

View File

@ -86,6 +86,9 @@ namespace Content.Shared.Verbs
public static readonly VerbCategory PowerLevel = new("verb-categories-power-level", null);
public static readonly VerbCategory VoltageLevel =
new("verb-categories-voltage-level", "/Textures/Interface/VerbIcons/zap.svg.192dpi.png");
public static readonly VerbCategory Adjust =
new("verb-categories-adjust", "/Textures/Interface/VerbIcons/screwdriver.png");
}

View File

@ -1,3 +1,5 @@
anchorable-anchored = Anchored
anchorable-unanchored = Unanchored
anchorable-occupied = Tile occupied
anchorable-fail-not-on-station = Can't anchor anywhere but the station

View File

@ -30,6 +30,7 @@ materials-coal = coal
materials-diamond = diamond
materials-gunpowder = gunpowder
materials-cotton = cotton
materials-xenoborg-crystal = xenoborg crystal
# Ores
materials-raw-iron = raw iron

View File

@ -0,0 +1,3 @@
power-voltage-low = Low voltage
power-voltage-medium = Medium voltage
power-voltage-high = High voltage

View File

@ -16,3 +16,4 @@ borg-slot-modules-empty = Modules
borg-slot-powercell-empty = Powercells
borg-slot-inflatable-door-empty = Inflatable Door
borg-slot-inflatable-wall-empty = Inflatable Wall
borg-slot-xenoborg-crystal-empty = Xenoborg crystals

View File

@ -80,6 +80,10 @@ stack-artifact-fragment = artifact {$amount ->
[1] fragment
*[other] fragments
}
stack-xenoborg-circuit = dvanced xenoborg {$amount ->
[1] circuitboard
*[other] circuitboards
}
# best materials
stack-ground-tobacco = ground tobacco

View File

@ -28,6 +28,7 @@ verb-categories-lever = Lever
verb-categories-select-type = Select Type
verb-categories-fax = Set Destination
verb-categories-power-level = Power Level
verb-categories-voltage-level = Voltage Level
verb-categories-adjust = Adjust
verb-common-toggle-light = Toggle light

View File

@ -145,6 +145,7 @@
- ConstructionMaterial
- RawMaterial
- Ingot
- XenoborgCrystal
components:
- Circuitboard
- Flatpack

View File

@ -41,14 +41,14 @@
idleState: core-idle
runningState: core-active
staticPacks:
- XenoborgMachines
- EmptyXenoborgs
- XenoborgUpgradeModules
- type: MaterialStorage
whitelist:
tags:
- XenoborgCrystal
- Sheet
- RawMaterial
- Ingot
- type: PointLight
color: "#0033ff"
enabled: true

View File

@ -146,7 +146,7 @@
laws: NutimovLawset
- type: entity
id: XenoborgCircuitBoard
id: XenoborgLawsetCircuitBoard
parent: BaseSiliconLawboard
name: law board (Xenoborg)
suffix: Admeme
@ -156,7 +156,7 @@
laws: XenoborgLawset
- type: entity
id: MothershipCircuitBoard
id: MothershipLawsetCircuitBoard
parent: BaseSiliconLawboard
name: law board (Mothership Core)
suffix: Admeme

View File

@ -280,3 +280,18 @@
- type: GuideHelp
guides:
- FoodRecipes
- type: entity
parent: [ BaseFlatpack, BaseXenoborgContraband ]
id: XenoborgExtractorFlatpack
name: xenoborg extractor flatpack
description: A flatpack used for constructing a xenoborg extractor.
components:
- type: Item
size: Normal
- type: Flatpack
entity: XenoborgExtractor
- type: GuideHelp
guides:
- Xenoborgs

View File

@ -0,0 +1,46 @@
- type: entity
parent: [ MaterialBase, BaseXenoborgContraband ]
id: MaterialXenoborgCrystal
name: xenoborg crystal
description: A special crystal created from nuclear fusion. It's used to make xenoborgs.
suffix: 10
components:
- type: Item
storedRotation: 0
- type: Appearance
- type: Stack
stackType: XenoborgCrystal
count: 10
baseLayer: base
layerStates:
- crystal-1
- crystal-2
- crystal-3
- type: Sprite
sprite: Objects/Materials/xenoborg_crystal.rsi
layers:
- state: crystal-3
map: [ "base" ]
- type: Material
- type: PhysicalComposition
materialComposition:
XenoborgCrystal: 100
- type: Tag
tags:
- XenoborgCrystal
- type: entity
parent: MaterialXenoborgCrystal
id: MaterialXenoborgCrystal5
suffix: 5
components:
- type: Stack
count: 5
- type: entity
parent: MaterialXenoborgCrystal
id: MaterialXenoborgCrystal1
suffix: 1
components:
- type: Stack
count: 1

View File

@ -1429,6 +1429,12 @@
whitelist:
components:
- BorgModule
- hand:
emptyRepresentative: MaterialXenoborgCrystal
emptyLabel: borg-slot-xenoborg-crystal-empty
whitelist:
tags:
- XenoborgCrystal
- hand:
emptyRepresentative: BorgModuleConstructionMaterialPlaceholder
emptyLabel: borg-slot-construction-empty
@ -1457,6 +1463,12 @@
- state: icon-xenoborg-basic
- type: ItemBorgModule
hands:
- hand:
emptyRepresentative: MaterialXenoborgCrystal
emptyLabel: borg-slot-xenoborg-crystal-empty
whitelist:
tags:
- XenoborgCrystal
- hand:
emptyRepresentative: BorgModuleConstructionMaterialPlaceholder
emptyLabel: borg-slot-construction-empty

View File

@ -0,0 +1,111 @@
- type: entity
parent: [BaseMachine, BaseXenoborgContraband]
id: XenoborgExtractor
name: xenoborg extractor
description: Drains electricity from the grid to produce xenoborg crystals via nuclear fusion.
suffix: Unanchored
placement:
mode: PlaceFree
components:
- type: Physics
bodyType: Dynamic
- type: Transform
anchored: false
- type: AnchorOnlyOnStation
- type: Sprite
sprite: Structures/Machines/xenoborg_extractor.rsi
snapCardinals: true
layers:
- state: icon
map: ["base"]
- state: running
map: ["running"]
- state: light
shader: unshaded
map: ["light"]
- type: Appearance
- type: GenericVisualizer
visuals:
enum.PowerDeviceVisuals.Powered:
base:
True: { visible: false }
False: { visible: true }
running:
True: { visible: true }
False: { visible: false }
light:
True: { visible: true }
False: { visible: false }
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalGlassBreak
- !type:ExplodeBehavior
- !type:SpawnEntitiesBehavior
spawn:
MachineFrameDestroyed:
min: 1
max: 1
- type: Explosive # small explosion when destroyed
explosionType: Default
maxIntensity: 20
totalIntensity: 10
intensitySlope: 5
canCreateVacuum: false
- type: NodeContainer
examinable: true
nodes:
input:
!type:CableDeviceNode
nodeGroupID: Apc
- type: LightningTarget
priority: 1
- type: Electrified
onHandInteract: false
onInteractUsing: false
onBump: false
requirePower: true
highVoltageNode: input
mediumVoltageNode: input
lowVoltageNode: input
- type: Battery
maxCharge: 2000000 # 2MJ
netsync: false
- type: ExaminableBattery
- type: PowerConsumerBatteryCharger
- type: PowerConsumer
voltage: Apc
drawRate: 10000
- type: VoltageToggler
settings:
- voltage: Apc
wattage: 16000 # 16kW - 125 seconds to spawn one
name: power-voltage-low
- voltage: Medium
wattage: 50000 # 50kW - 40 seconds to spawn one
name: power-voltage-medium
- voltage: High
wattage: 200000 # 200kW - 10 seconds to spawn one # sets off the rogue power consuming device alert!
name: power-voltage-high
- type: SpawnOnBatteryLevel
prototype: MaterialXenoborgCrystal1
charge: 2000000 # 2MJ
- type: entity
parent: XenoborgExtractor
id: XenoborgExtractorAnchored
suffix: Anchored
placement:
mode: SnapgridCenter
components:
- type: Physics
bodyType: Static
- type: Transform
anchored: true

View File

@ -17,3 +17,30 @@
responseType: "General Feedback"
responseLink: "https://forum.spacestation14.com/c/development/feedback/51"
showRoundEnd: false
- type: feedbackPopup
id: PlayingAsMothershipCoreFeedback
popupOrigin: wizden_master
title: "[bold]Playing as [color=deepskyblue]mothership[/color] core[/bold]"
description: >-
If you played mothership core this round or maybe in a previous round, feel free to respond this feedback thread about your experiences and issues with playing as the mothership core.
responseType: "Feedback Thread"
responseLink: "https://forum.spacestation14.com/t/playing-as-a-mothership-core/26688/2"
showRoundEnd: true
ruleWhitelist:
components:
- XenoborgsRule
- type: feedbackPopup
id: XenoborgExtractorFeedback
popupOrigin: wizden_master
title: "[bold]The [color=deepskyblue]xenoborg[/color] extractor [scramble chars=\"xenoborg-##][{}||,.<>\" rate=40 length=5][/bold]"
description: >-
Please share feedback on the new xenoborg extractor and crystal, and how these additions affect xenoborg gameplay.
responseType: "Feedback Thread"
responseLink: "https://forum.spacestation14.com/t/xenoborg-extractor/26689"
showRoundEnd: true
ruleWhitelist:
components:
- XenoborgsRule

View File

@ -141,3 +141,12 @@
icon: { sprite: Objects/Materials/materials.rsi, state: diamond }
color: "#80ffff"
price: 20 # big diamond gaslit us so hard diamonds actually became extremely rare
- type: material
id: XenoborgCrystal
stackEntity: MaterialXenoborgCrystal1
name: materials-xenoborg-crystal
unit: materials-unit-piece
icon: { sprite: Objects/Materials/xenoborg_crystal.rsi, state: crystal-1 }
color: "#3d94ff"
price: 2 # $200 for 1 unit # crystal pretty!

View File

@ -1,5 +1,10 @@
## Static
- type: latheRecipePack
id: XenoborgMachines
recipes:
- XenoborgExtractorRecipe
- type: latheRecipePack
id: EmptyXenoborgs
recipes:

View File

@ -1,5 +1,12 @@
# Base prototypes
- type: latheRecipe
abstract: true
id: BaseXenoborgMachineRecipe
categories:
- Machines
completetime: 2
- type: latheRecipe
abstract: true
id: BaseXenoborgRecipe
@ -14,6 +21,15 @@
- Modules
completetime: 2
# machines
- type: latheRecipe
parent: BaseXenoborgMachineRecipe
id: XenoborgExtractorRecipe
result: XenoborgExtractorFlatpack
materials:
Steel: 1000
# xenoborgs
- type: latheRecipe
@ -21,31 +37,28 @@
id: XenoborgEngiRecipe
result: XenoborgEngiPrinted
materials:
Steel: 3000
XenoborgCrystal: 100
- type: latheRecipe
parent: BaseXenoborgRecipe
id: XenoborgHeavyRecipe
result: XenoborgHeavyPrinted
materials:
Steel: 2000
Plasteel: 1000
XenoborgCrystal: 100
- type: latheRecipe
parent: BaseXenoborgRecipe
id: XenoborgScoutRecipe
result: XenoborgScoutPrinted
materials:
Steel: 2000
Plastic: 1000
XenoborgCrystal: 100
- type: latheRecipe
parent: BaseXenoborgRecipe
id: XenoborgStealthRecipe
result: XenoborgStealthPrinted
materials:
Steel: 2000
Glass: 1000
XenoborgCrystal: 100
# modules
@ -56,8 +69,7 @@
id: XenoborgModuleDoorControlRecipe
result: XenoborgModuleDoorControl
materials:
Steel: 1500
Glass: 1500
XenoborgCrystal: 100
## heavy xenoborg modules
@ -66,8 +78,7 @@
id: XenoborgModuleHeavyLaserRecipe
result: XenoborgModuleHeavyLaser
materials:
Steel: 1500
Glass: 1500
XenoborgCrystal: 100
## scout xenoborg modules
@ -76,8 +87,7 @@
id: XenoborgModuleEnergySwordRecipe
result: XenoborgModuleEnergySword
materials:
Steel: 1500
Glass: 1500
XenoborgCrystal: 100
## stealth xenoborg modules
@ -86,4 +96,4 @@
id: XenoborgModuleSuperCloakDeviceRecipe
result: XenoborgModuleSuperCloakDevice
materials:
Glass: 3000
XenoborgCrystal: 100

View File

@ -0,0 +1,6 @@
- type: stack
parent: BaseSmallStack
id: XenoborgCrystal
name: stack-xenoborg-circuit
icon: { sprite: "/Textures/Objects/Materials/xenoborg_crystal.rsi", state: crystal-3 }
spawn: MaterialXenoborgCrystal1

View File

@ -1563,6 +1563,9 @@
## X ##
- type: Tag
id: XenoborgCrystal # MaterialStorage whitelist: Mothership core
- type: Tag
id: XenoborgGhostrole # spawn whitelist : SpawnPointGhostRoleXenoborg

View File

@ -16,7 +16,9 @@
## Objectives
Your main objective is to kill and harvest all sentient brains in the station and bring them to the mothership core. These can be both real brains, and positronic brains.
Collect materials to create more xenoborg bodies.
Steal power from the station using xenoborg extractors to produce xenoborg crystals to create more xenoborg bodies.
Protect the Mothership at all costs.
## The Mothership Core
@ -74,6 +76,11 @@
<GuideEntityEmbed Entity="BorgModuleCable" Caption="cable cyborg module"/>
</Box>
[bold]Upgrade exclusive modules:[/bold]
<Box>
<GuideEntityEmbed Entity="XenoborgModuleDoorControl" Caption="door control xenoborg module"/>
</Box>
### The Heavy Xenoborg
<Box>
<GuideEntityEmbed Entity="XenoborgHeavy" Caption=""/>
@ -88,7 +95,7 @@
[bold]Upgrade exclusive modules:[/bold]
<Box>
<GuideEntityEmbed Entity="XenoborgModuleHeavyLaser" Caption="heavy laser xenoborg module"/>
<GuideEntityEmbed Entity="XenoborgModuleHeavyLaser" Caption="laser cannon xenoborg module"/>
</Box>
### The Scout Xenoborg
@ -125,19 +132,41 @@
[bold]Upgrade exclusive modules:[/bold]
<Box>
<GuideEntityEmbed Entity="XenoborgModuleSuperCloakDevice" Caption="cloaking device xenoborg module"/>
<GuideEntityEmbed Entity="XenoborgModuleSuperCloakDevice" Caption="invisibility device xenoborg module"/>
</Box>
## Xenoborg extractors
<Box>
<GuideEntityEmbed Entity="XenoborgExtractor" Caption="xenoborg extractor"/>
<GuideEntityEmbed Entity="MaterialXenoborgCrystal" Caption="xenoborg crystal"/>
</Box>
Its a machine necessary for the xenoborgs to grow their army. It can steal power from cables connected to it and then produce xenoborg crystals.
The mothership core can produce a xenoborg extractor flatpack for 10 steel.
Once its anchored on top of a cable it needs to be set to that cable voltage to start draining power.
Once it's battery is full it will produce one xenoborg crystal.
It drains different amounts of power depending on the voltage.
- low voltage - 16kW - 2 minutes and 5 seconds to produce one xenoborg circuit.
- medium voltage - 50kW - 40 seconds to produce one xenoborg circuit.
- high voltage - 200kW - 10 seconds to produce one xenoborg circuit.
Attention! at the highest voltage it will trigger the rogue power consuming device alert! and anyone using the power monitor device will know something is wrong.
## Preparation and Tactics
Before FTLing near the station, make sure the IFF is off.
Before launching an attack, xenoborgs should discuss strategy and decide which targets to strike first.
Xenoborgs should try to collect sentient brains without being detected. The longer the threat is unknown, the more dangerous the xenoborgs become.
## Mothership and Xenoborg lawsets
The Mothership and Xenoborgs have unique laws that define their purpose to self replicate and protect the Mothership.
<Box>
<GuideEntityEmbed Entity="XenoborgCircuitBoard" Caption=""/>
<GuideEntityEmbed Entity="XenoborgLawsetCircuitBoard" Caption=""/>
</Box>
The Mothership Core's laws are as follows::

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

View File

@ -0,0 +1,20 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "made by samuka-C (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "crystal-1"
},
{
"name": "crystal-2"
},
{
"name": "crystal-3"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 B

View File

@ -0,0 +1,40 @@
{
"version": 1,
"license":"CC-BY-SA-3.0",
"copyright":"Made by Samuka-C (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "light",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "running",
"delays": [
[
0.2,
0.2,
0.2,
0.2
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B