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:
parent
210fae0ffe
commit
7f15e77954
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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";
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
power-voltage-low = Low voltage
|
||||
power-voltage-medium = Medium voltage
|
||||
power-voltage-high = High voltage
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@
|
|||
- ConstructionMaterial
|
||||
- RawMaterial
|
||||
- Ingot
|
||||
- XenoborgCrystal
|
||||
components:
|
||||
- Circuitboard
|
||||
- Flatpack
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
## Static
|
||||
|
||||
- type: latheRecipePack
|
||||
id: XenoborgMachines
|
||||
recipes:
|
||||
- XenoborgExtractorRecipe
|
||||
|
||||
- type: latheRecipePack
|
||||
id: EmptyXenoborgs
|
||||
recipes:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -1563,6 +1563,9 @@
|
|||
|
||||
## X ##
|
||||
|
||||
- type: Tag
|
||||
id: XenoborgCrystal # MaterialStorage whitelist: Mothership core
|
||||
|
||||
- type: Tag
|
||||
id: XenoborgGhostrole # spawn whitelist : SpawnPointGhostRoleXenoborg
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
Loading…
Reference in New Issue