Cargo economy balance (#11123)

Co-authored-by: Visne <39844191+Visne@users.noreply.github.com>
This commit is contained in:
metalgearsloth
2022-09-15 11:53:17 +10:00
committed by GitHub
parent f4c38d74e1
commit ad7a851e27
113 changed files with 615 additions and 58 deletions

View File

@@ -63,7 +63,7 @@ namespace Content.Client.Cargo.UI
Products.RemoveAllChildren(); Products.RemoveAllChildren();
var products = ProductPrototypes.ToList(); var products = ProductPrototypes.ToList();
products.Sort((x, y) => products.Sort((x, y) =>
string.Compare(x.Name, y.Name, StringComparison.Ordinal)); string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase));
var search = SearchBar.Text.Trim().ToLowerInvariant(); var search = SearchBar.Text.Trim().ToLowerInvariant();
foreach (var prototype in products) foreach (var prototype in products)

View File

@@ -0,0 +1,29 @@
using Content.Client.Eui;
using Content.Shared.Eui;
using Content.Shared.UserInterface;
namespace Content.Client.UserInterface;
public sealed class StatValuesEui : BaseEui
{
private readonly StatsWindow _window;
public StatValuesEui()
{
_window = new StatsWindow();
_window.Title = "Melee stats";
_window.OpenCentered();
_window.OnClose += Closed;
}
public override void HandleMessage(EuiMessageBase msg)
{
base.HandleMessage(msg);
if (msg is not StatValuesEuiMessage eui)
return;
_window.Title = eui.Title;
_window.UpdateValues(eui.Headers, eui.Values);
}
}

View File

@@ -0,0 +1,11 @@
<DefaultWindow xmlns="https://spacestation14.io"
Title="Stats window"
MinSize="600 400">
<BoxContainer Orientation="Vertical">
<ScrollContainer HorizontalExpand="True"
VerticalExpand="True"
SizeFlagsStretchRatio="6">
<GridContainer Name="Values"/>
</ScrollContainer>
</BoxContainer>
</DefaultWindow>

View File

@@ -0,0 +1,48 @@
using Content.Client.Administration.UI.CustomControls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.UserInterface
{
[GenerateTypedNameReferences]
public sealed partial class StatsWindow : DefaultWindow
{
public StatsWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
}
public void UpdateValues(List<string> headers, List<string[]> values)
{
Values.DisposeAllChildren();
Values.Columns = headers.Count;
for (var i = 0; i < headers.Count; i++)
{
var item = headers[i];
Values.AddChild(new Label()
{
Text = item,
});
}
values.Sort((x, y) => string.Compare(x[0], y[0], StringComparison.CurrentCultureIgnoreCase));
for (var i = 0; i < values.Count; i++)
{
var value = values[i];
for (var j = 0; j < value.Length; j++)
{
Values.AddChild(new Label()
{
Text = value[j],
});
}
}
}
}
}

View File

@@ -13,7 +13,7 @@ namespace Content.IntegrationTests.Tests;
public sealed class CargoTest public sealed class CargoTest
{ {
[Test] [Test]
public async Task NoArbitrage() public async Task NoCargoOrderArbitrage()
{ {
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings() {NoClient = true}); await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings() {NoClient = true});
var server = pairTracker.Pair.Server; var server = pairTracker.Pair.Server;
@@ -32,8 +32,13 @@ public sealed class CargoTest
var ent = entManager.SpawnEntity(proto.Product, new MapCoordinates(Vector2.Zero, mapId)); var ent = entManager.SpawnEntity(proto.Product, new MapCoordinates(Vector2.Zero, mapId));
var price = pricing.GetPrice(ent); var price = pricing.GetPrice(ent);
Assert.That(price, Is.LessThan(proto.PointCost), $"Found arbitrage on {proto.ID} cargo product!"); Assert.That(price, Is.LessThan(proto.PointCost), $"Found arbitrage on {proto.ID} cargo product! Cost is {proto.PointCost} but sell is {price}!");
entManager.DeleteEntity(ent);
} }
mapManager.DeleteMap(mapId);
}); });
await pairTracker.CleanReturnAsync();
} }
} }

View File

@@ -15,5 +15,5 @@ public sealed class StationBankAccountComponent : Component
/// How much the bank balance goes up per second, every Delay period. Rounded down when multiplied. /// How much the bank balance goes up per second, every Delay period. Rounded down when multiplied.
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("increasePerSecond")] [ViewVariables(VVAccess.ReadWrite), DataField("increasePerSecond")]
public int IncreasePerSecond = 10; public int IncreasePerSecond = 2;
} }

View File

@@ -9,6 +9,7 @@ using Content.Shared.MobState.Components;
using Robust.Shared.Console; using Robust.Shared.Console;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility; using Robust.Shared.Utility;
namespace Content.Server.Cargo.Systems; namespace Content.Server.Cargo.Systems;
@@ -111,6 +112,33 @@ public sealed class PricingSystem : EntitySystem
args.Price += component.Price; args.Price += component.Price;
} }
/// <summary>
/// Get a rough price for an entityprototype. Does not consider contained entities.
/// </summary>
public double GetEstimatedPrice(EntityPrototype prototype, IComponentFactory? factory = null)
{
IoCManager.Resolve(ref factory);
var price = 0.0;
if (prototype.Components.TryGetValue(factory.GetComponentName(typeof(StaticPriceComponent)),
out var staticPriceProto))
{
var staticComp = (StaticPriceComponent) staticPriceProto.Component;
price += staticComp.Price;
}
if (prototype.Components.TryGetValue(factory.GetComponentName(typeof(StackPriceComponent)), out var stackpriceProto) &&
prototype.Components.TryGetValue(factory.GetComponentName(typeof(StackComponent)), out var stackProto))
{
var stackPrice = (StackPriceComponent) stackpriceProto.Component;
var stack = (StackComponent) stackProto.Component;
price += stack.Count * stackPrice.Price;
}
return price;
}
/// <summary> /// <summary>
/// Appraises an entity, returning it's price. /// Appraises an entity, returning it's price.
/// </summary> /// </summary>
@@ -123,7 +151,7 @@ public sealed class PricingSystem : EntitySystem
public double GetPrice(EntityUid uid) public double GetPrice(EntityUid uid)
{ {
var ev = new PriceCalculationEvent(); var ev = new PriceCalculationEvent();
RaiseLocalEvent(uid, ref ev, true); RaiseLocalEvent(uid, ref ev);
//TODO: Add an OpaqueToAppraisal component or similar for blocking the recursive descent into containers, or preventing material pricing. //TODO: Add an OpaqueToAppraisal component or similar for blocking the recursive descent into containers, or preventing material pricing.

View File

@@ -15,6 +15,7 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Player; using Robust.Shared.Player;
using JetBrains.Annotations; using JetBrains.Annotations;
using System.Linq; using System.Linq;
using Content.Server.Cargo.Systems;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Robust.Server.Player; using Robust.Server.Player;

View File

@@ -0,0 +1,144 @@
using Content.Server.Administration;
using Content.Server.Cargo.Systems;
using Content.Server.EUI;
using Content.Shared.Administration;
using Content.Shared.Materials;
using Content.Shared.Research.Prototypes;
using Content.Shared.UserInterface;
using Robust.Server.Player;
using Robust.Shared.Console;
using Robust.Shared.Prototypes;
namespace Content.Server.UserInterface;
[AdminCommand(AdminFlags.Debug)]
public sealed class StatValuesCommand : IConsoleCommand
{
public string Command => "showvalues";
public string Description => "Dumps all stats for a particular category into a table.";
public string Help => $"{Command} <cargosell / lathsell>";
public void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (shell.Player is not IPlayerSession pSession)
{
shell.WriteError($"{Command} can't be run on server!");
return;
}
if (args.Length != 1)
{
shell.WriteError($"Invalid number of args, need 1");
return;
}
StatValuesEuiMessage message;
switch (args[0])
{
case "cargosell":
message = GetCargo();
break;
case "lathesell":
message = GetLatheMessage();
break;
default:
shell.WriteError($"{args[0]} is not a valid stat!");
return;
}
var euiManager = IoCManager.Resolve<EuiManager>();
var eui = new StatValuesEui();
euiManager.OpenEui(eui, pSession);
eui.SendMessage(message);
}
private StatValuesEuiMessage GetCargo()
{
// Okay so there's no easy way to do this with how pricing works
// So we'll just get the first value for each prototype ID which is probably good enough for the majority.
var values = new List<string[]>();
var entManager = IoCManager.Resolve<IEntityManager>();
var priceSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<PricingSystem>();
var metaQuery = entManager.GetEntityQuery<MetaDataComponent>();
var prices = new HashSet<string>(256);
foreach (var entity in entManager.GetEntities())
{
if (!metaQuery.TryGetComponent(entity, out var meta))
continue;
var id = meta.EntityPrototype?.ID;
// We'll add it even if we don't have it so we don't have to raise the event again because this is probably faster.
if (id == null || !prices.Add(id))
continue;
var price = priceSystem.GetPrice(entity);
if (price == 0)
continue;
values.Add(new string[]
{
id,
$"{price:0}",
});
}
var state = new StatValuesEuiMessage()
{
Title = "Cargo sell prices",
Headers = new List<string>()
{
"ID",
"Price",
},
Values = values,
};
return state;
}
private StatValuesEuiMessage GetLatheMessage()
{
var values = new List<string[]>();
var protoManager = IoCManager.Resolve<IPrototypeManager>();
var factory = IoCManager.Resolve<IComponentFactory>();
var priceSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<PricingSystem>();
foreach (var proto in protoManager.EnumeratePrototypes<LatheRecipePrototype>())
{
var cost = 0.0;
foreach (var (material, count) in proto.RequiredMaterials)
{
var materialPrice = protoManager.Index<MaterialPrototype>(material).Price;
cost += materialPrice * count;
}
var sell = priceSystem.GetEstimatedPrice(protoManager.Index<EntityPrototype>(proto.Result), factory);
values.Add(new[]
{
proto.ID,
$"{cost:0}",
$"{sell:0}",
});
}
var state = new StatValuesEuiMessage()
{
Title = "Lathe sell prices",
Headers = new List<string>()
{
"ID",
"Cost",
"Sell price",
},
Values = values,
};
return state;
}
}

View File

@@ -0,0 +1,5 @@
using Content.Server.EUI;
namespace Content.Server.UserInterface;
public sealed class StatValuesEui : BaseEui {}

View File

@@ -1,3 +1,4 @@
using Content.Server.Cargo.Systems;
using Content.Server.Popups; using Content.Server.Popups;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
@@ -21,24 +22,30 @@ namespace Content.Server.VendingMachines
{ {
public sealed class VendingMachineSystem : SharedVendingMachineSystem public sealed class VendingMachineSystem : SharedVendingMachineSystem
{ {
[Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly ThrowingSystem _throwingSystem = default!;
[Dependency] private readonly SharedActionsSystem _action = default!;
[Dependency] private readonly AudioSystem _audioSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
[Dependency] private readonly AppearanceSystem _appearanceSystem = default!; [Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly AudioSystem _audioSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly SharedActionsSystem _action = default!;
[Dependency] private readonly PricingSystem _pricing = default!;
[Dependency] private readonly ThrowingSystem _throwingSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
private ISawmill _sawmill = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
_sawmill = Logger.GetSawmill("vending");
SubscribeLocalEvent<VendingMachineComponent, PowerChangedEvent>(OnPowerChanged); SubscribeLocalEvent<VendingMachineComponent, PowerChangedEvent>(OnPowerChanged);
SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak); SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak);
SubscribeLocalEvent<VendingMachineComponent, GotEmaggedEvent>(OnEmagged); SubscribeLocalEvent<VendingMachineComponent, GotEmaggedEvent>(OnEmagged);
SubscribeLocalEvent<VendingMachineComponent, DamageChangedEvent>(OnDamage); SubscribeLocalEvent<VendingMachineComponent, DamageChangedEvent>(OnDamage);
SubscribeLocalEvent<VendingMachineComponent, PriceCalculationEvent>(OnVendingPrice);
SubscribeLocalEvent<VendingMachineComponent, ActivatableUIOpenAttemptEvent>(OnActivatableUIOpenAttempt); SubscribeLocalEvent<VendingMachineComponent, ActivatableUIOpenAttemptEvent>(OnActivatableUIOpenAttempt);
SubscribeLocalEvent<VendingMachineComponent, BoundUIOpenedEvent>(OnBoundUIOpened); SubscribeLocalEvent<VendingMachineComponent, BoundUIOpenedEvent>(OnBoundUIOpened);
@@ -47,6 +54,24 @@ namespace Content.Server.VendingMachines
SubscribeLocalEvent<VendingMachineComponent, VendingMachineSelfDispenseEvent>(OnSelfDispense); SubscribeLocalEvent<VendingMachineComponent, VendingMachineSelfDispenseEvent>(OnSelfDispense);
} }
private void OnVendingPrice(EntityUid uid, VendingMachineComponent component, ref PriceCalculationEvent args)
{
var price = 0.0;
foreach (var (id, entry) in component.Inventory)
{
if (!_prototypeManager.TryIndex<EntityPrototype>(entry.ID, out var proto))
{
_sawmill.Error($"Unable to find entity prototype {entry.ID} on {ToPrettyString(uid)} vending.");
continue;
}
price += entry.Amount * _pricing.GetEstimatedPrice(proto, _factory);
}
args.Price += price;
}
protected override void OnComponentInit(EntityUid uid, SharedVendingMachineComponent sharedComponent, ComponentInit args) protected override void OnComponentInit(EntityUid uid, SharedVendingMachineComponent sharedComponent, ComponentInit args)
{ {
base.OnComponentInit(uid, sharedComponent, args); base.OnComponentInit(uid, sharedComponent, args);

View File

@@ -1,4 +1,5 @@
using System.Linq; using System.Linq;
using Content.Server.Cargo.Systems;
using Content.Server.Damage.Systems; using Content.Server.Damage.Systems;
using Content.Server.Examine; using Content.Server.Examine;
using Content.Server.Interaction; using Content.Server.Interaction;
@@ -23,6 +24,7 @@ using Robust.Shared.Map;
using Robust.Shared.Physics; using Robust.Shared.Physics;
using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Components;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility; using Robust.Shared.Utility;
using SharedGunSystem = Content.Shared.Weapons.Ranged.Systems.SharedGunSystem; using SharedGunSystem = Content.Shared.Weapons.Ranged.Systems.SharedGunSystem;
@@ -33,12 +35,35 @@ public sealed partial class GunSystem : SharedGunSystem
[Dependency] private readonly IComponentFactory _factory = default!; [Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly ExamineSystem _examine = default!; [Dependency] private readonly ExamineSystem _examine = default!;
[Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly InteractionSystem _interaction = default!;
[Dependency] private readonly PricingSystem _pricing = default!;
[Dependency] private readonly StaminaSystem _stamina = default!; [Dependency] private readonly StaminaSystem _stamina = default!;
[Dependency] private readonly StunSystem _stun = default!; [Dependency] private readonly StunSystem _stun = default!;
public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation; public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation;
public const float GunClumsyChance = 0.5f; public const float GunClumsyChance = 0.5f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BallisticAmmoProviderComponent, PriceCalculationEvent>(OnBallisticPrice);
}
private void OnBallisticPrice(EntityUid uid, BallisticAmmoProviderComponent component, ref PriceCalculationEvent args)
{
if (string.IsNullOrEmpty(component.FillProto) || component.UnspawnedCount == 0)
return;
if (!ProtoManager.TryIndex<EntityPrototype>(component.FillProto, out var proto))
{
Sawmill.Error($"Unable to find fill prototype for price on {component.FillProto} on {ToPrettyString(uid)}");
return;
}
// Probably good enough for most.
var price = _pricing.GetEstimatedPrice(proto);
args.Price += price * component.UnspawnedCount;
}
public override void Shoot(GunComponent gun, List<IShootable> ammo, EntityCoordinates fromCoordinates, EntityCoordinates toCoordinates, EntityUid? user = null) public override void Shoot(GunComponent gun, List<IShootable> ammo, EntityCoordinates fromCoordinates, EntityCoordinates toCoordinates, EntityUid? user = null)
{ {
// Try a clumsy roll // Try a clumsy roll

View File

@@ -12,7 +12,7 @@ public sealed class CargoShuttleComponent : Component
public TimeSpan? NextCall; public TimeSpan? NextCall;
[ViewVariables(VVAccess.ReadWrite), DataField("cooldown")] [ViewVariables(VVAccess.ReadWrite), DataField("cooldown")]
public float Cooldown = 150f; public float Cooldown = 30f;
[ViewVariables] [ViewVariables]
public bool CanRecall; public bool CanRecall;

View File

@@ -0,0 +1,18 @@
using Content.Shared.Eui;
using Robust.Shared.Serialization;
namespace Content.Shared.UserInterface;
/// <summary>
/// It's a message not a state because it's for debugging and it makes it easier to bootstrap more data dumping.
/// </summary>
[Serializable, NetSerializable]
public sealed class StatValuesEuiMessage : EuiMessageBase
{
/// <summary>
/// Titles for the window.
/// </summary>
public string Title = string.Empty;
public List<string> Headers = new();
public List<string[]> Values = new();
}

View File

@@ -15,6 +15,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 50
# For primates mainly # For primates mainly
- type: entity - type: entity
@@ -79,6 +81,8 @@
- type: Sprite - type: Sprite
netsync: false netsync: false
sprite: Mobs/Species/Human/organs.rsi sprite: Mobs/Species/Human/organs.rsi
- type: StaticPrice
price: 50
- type: entity - type: entity
id: OrganAnimalLungs id: OrganAnimalLungs

View File

@@ -13,6 +13,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 100
- type: entity - type: entity
id: TorsoHuman id: TorsoHuman

View File

@@ -11,6 +11,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 100
- type: entity - type: entity
id: LeftArmBorg id: LeftArmBorg

View File

@@ -12,6 +12,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 20
- type: entity - type: entity
id: TorsoSkeleton id: TorsoSkeleton

View File

@@ -12,6 +12,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 100
- type: entity - type: entity
id: TorsoSlime id: TorsoSlime

View File

@@ -13,6 +13,8 @@
containers: containers:
bodypart: !type:Container bodypart: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 100
- type: entity - type: entity
id: TorsoVox id: TorsoVox

View File

@@ -54,6 +54,6 @@
sprite: Objects/Vehicles/atv.rsi sprite: Objects/Vehicles/atv.rsi
state: vehicle state: vehicle
product: CrateFunATV product: CrateFunATV
cost: 6000 cost: 1500
category: Fun category: Fun
group: market group: market

View File

@@ -4,7 +4,7 @@
sprite: Mobs/Animals/bee.rsi sprite: Mobs/Animals/bee.rsi
state: 0 state: 0
product: CrateNPCBee product: CrateNPCBee
cost: 1000 cost: 4000
category: Livestock category: Livestock
group: market group: market
@@ -14,7 +14,7 @@
sprite: Mobs/Animals/butterfly.rsi sprite: Mobs/Animals/butterfly.rsi
state: butterfly state: butterfly
product: CrateNPCButterflies product: CrateNPCButterflies
cost: 1000 cost: 2500
category: Livestock category: Livestock
group: market group: market
@@ -34,7 +34,7 @@
sprite: Mobs/Animals/chicken.rsi sprite: Mobs/Animals/chicken.rsi
state: icon-1 state: icon-1
product: CrateNPCChicken product: CrateNPCChicken
cost: 1500 cost: 2500
category: Livestock category: Livestock
group: market group: market
@@ -44,7 +44,7 @@
sprite: Mobs/Animals/duck.rsi sprite: Mobs/Animals/duck.rsi
state: icon-0 state: icon-0
product: CrateNPCDuck product: CrateNPCDuck
cost: 2000 cost: 3500
category: Livestock category: Livestock
group: market group: market
@@ -114,7 +114,7 @@
sprite: Mobs/Animals/mouse.rsi sprite: Mobs/Animals/mouse.rsi
state: icon-0 state: icon-0
product: CrateNPCMouse product: CrateNPCMouse
cost: 1500 cost: 2500
category: Livestock category: Livestock
group: market group: market
@@ -124,7 +124,7 @@
sprite: Mobs/Animals/parrot.rsi sprite: Mobs/Animals/parrot.rsi
state: parrot state: parrot
product: CrateNPCParrot product: CrateNPCParrot
cost: 1000 cost: 2000
category: Livestock category: Livestock
group: market group: market
@@ -144,6 +144,6 @@
sprite: Mobs/Animals/snake.rsi sprite: Mobs/Animals/snake.rsi
state: snake state: snake
product: CrateNPCSnake product: CrateNPCSnake
cost: 1000 cost: 2000
category: Livestock category: Livestock
group: market group: market

View File

@@ -4,7 +4,7 @@
sprite: Objects/Specific/Medical/firstaidkits.rsi sprite: Objects/Specific/Medical/firstaidkits.rsi
state: firstaid state: firstaid
product: CrateMedicalSupplies product: CrateMedicalSupplies
cost: 1000 cost: 2400
category: Medical category: Medical
group: market group: market
@@ -14,6 +14,6 @@
sprite: Objects/Specific/Chemistry/beaker.rsi sprite: Objects/Specific/Chemistry/beaker.rsi
state: beaker state: beaker
product: CrateChemistrySupplies product: CrateChemistrySupplies
cost: 500 cost: 650
category: Medical category: Medical
group: market group: market

View File

@@ -24,7 +24,7 @@
sprite: Objects/Weapons/Guns/Battery/disabler.rsi sprite: Objects/Weapons/Guns/Battery/disabler.rsi
state: base state: base
product: CrateSecurityNonlethal product: CrateSecurityNonlethal
cost: 1500 cost: 2100
category: Security category: Security
group: market group: market

View File

@@ -40,6 +40,8 @@
interfaces: interfaces:
- key: enum.StorageUiKey.Key - key: enum.StorageUiKey.Key
type: StorageBoundUserInterface type: StorageBoundUserInterface
- type: StaticPrice
price: 80
- type: entity - type: entity
abstract: true abstract: true

View File

@@ -31,6 +31,8 @@
enum.ToggleVisuals.Layer: enum.ToggleVisuals.Layer:
True: {state: icon-on} True: {state: icon-on}
False: {state: icon} False: {state: icon}
- type: StaticPrice
price: 200
- type: entity - type: entity
parent: ClothingShoesBootsMag parent: ClothingShoesBootsMag

View File

@@ -8,3 +8,5 @@
- type: Tag - type: Tag
tags: tags:
- WhitelistChameleon - WhitelistChameleon
- type: StaticPrice
price: 15

View File

@@ -14,6 +14,8 @@
- type: SpaceGarbage - type: SpaceGarbage
- type: Sprite - type: Sprite
netsync: false netsync: false
- type: StaticPrice
price: 50
# This base type is used to cover all of the "obvious" things that should be doable to open-package food. # This base type is used to cover all of the "obvious" things that should be doable to open-package food.
# Practically this means injection. # Practically this means injection.

View File

@@ -1,6 +1,3 @@
- type: Tag
id: Cigarette
- type: entity - type: entity
id: Cigarette id: Cigarette
parent: BaseCigar parent: BaseCigar

View File

@@ -15,6 +15,8 @@
- Trash - Trash
- type: Recyclable - type: Recyclable
- type: SpaceGarbage - type: SpaceGarbage
- type: StaticPrice
price: 5
# Base for all cigars and cigarettes. # Base for all cigars and cigarettes.
- type: entity - type: entity

View File

@@ -13,4 +13,4 @@
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice - type: StaticPrice
price: 75 price: 100

View File

@@ -12,7 +12,7 @@
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice - type: StaticPrice
price: 75 price: 100
- type: entity - type: entity
parent: BaseComputerCircuitboard parent: BaseComputerCircuitboard

View File

@@ -12,3 +12,5 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: mainboard state: mainboard
netsync: false netsync: false
- type: StaticPrice
price: 100

View File

@@ -10,6 +10,8 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: charger_APC state: charger_APC
netsync: false netsync: false
- type: StaticPrice
price: 100
# Wallmount Substation # Wallmount Substation
- type: entity - type: entity
@@ -22,6 +24,8 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: charger_APC state: charger_APC
netsync: false netsync: false
- type: StaticPrice
price: 100
# Wallmount Generator # Wallmount Generator
- type: entity - type: entity
@@ -34,6 +38,8 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: charger_APC state: charger_APC
netsync: false netsync: false
- type: StaticPrice
price: 100
# APU # APU
- type: entity - type: entity
@@ -46,6 +52,8 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: charger_APC state: charger_APC
netsync: false netsync: false
- type: StaticPrice
price: 100
# Solar Tracker Electronics # Solar Tracker Electronics
- type: entity - type: entity
@@ -58,3 +66,5 @@
sprite: Objects/Misc/module.rsi sprite: Objects/Misc/module.rsi
state: generic state: generic
netsync: false netsync: false
- type: StaticPrice
price: 100

View File

@@ -11,3 +11,5 @@
state: signaller state: signaller
- type: Signaller - type: Signaller
- type: UseDelay - type: UseDelay
- type: StaticPrice
price: 40

View File

@@ -25,6 +25,8 @@
delayOptions: [3, 5, 10, 15, 30] delayOptions: [3, 5, 10, 15, 30]
initialBeepDelay: 0 initialBeepDelay: 0
beepSound: /Audio/Machines/Nuke/general_beep.ogg beepSound: /Audio/Machines/Nuke/general_beep.ogg
- type: StaticPrice
price: 40
- type: entity - type: entity
parent: TimerTrigger parent: TimerTrigger
@@ -39,3 +41,5 @@
components: components:
- type: TriggerOnSignal - type: TriggerOnSignal
- type: SignalReceiver - type: SignalReceiver
- type: StaticPrice
price: 40

View File

@@ -33,3 +33,5 @@
sprite: Objects/Devices/Holoprojectors/atmos.rsi sprite: Objects/Devices/Holoprojectors/atmos.rsi
state: icon state: icon
netsync: false netsync: false
- type: StaticPrice
price: 80

View File

@@ -81,6 +81,8 @@
containers: containers:
BeakerSlotA: !type:ContainerSlot BeakerSlotA: !type:ContainerSlot
BeakerSlotB: !type:ContainerSlot BeakerSlotB: !type:ContainerSlot
- type: StaticPrice
price: 60
- type: entity - type: entity
name: flash payload name: flash payload

View File

@@ -18,6 +18,8 @@
type: InstrumentBoundUserInterface type: InstrumentBoundUserInterface
- type: Item - type: Item
size: 24 size: 24
- type: StaticPrice
price: 200
#These are for instruments that are larger, can't be picked up, or have collision #These are for instruments that are larger, can't be picked up, or have collision
- type: entity - type: entity
@@ -67,6 +69,8 @@
- HighImpassable - HighImpassable
- MidImpassable - MidImpassable
- BulletImpassable - BulletImpassable
- type: StaticPrice
price: 300
- type: entity - type: entity
parent: BasePlaceableInstrument parent: BasePlaceableInstrument

View File

@@ -27,6 +27,8 @@
Quantity: 3 Quantity: 3
- ReagentId: MindbreakerToxin - ReagentId: MindbreakerToxin
Quantity: 2 Quantity: 2
- type: StaticPrice
price: 5
- type: entity - type: entity
parent: Crayon parent: Crayon

View File

@@ -175,7 +175,7 @@
components: components:
- type: Material - type: Material
materials: materials:
ReinforcedPlasmaGlass: 500 ReinforcedPlasmaGlass: 100
- type: Stack - type: Stack
stackType: ReinforcedPlasmaGlass stackType: ReinforcedPlasmaGlass
- type: Sprite - type: Sprite

View File

@@ -64,7 +64,7 @@
components: components:
- type: Material - type: Material
materials: materials:
Plasma: 500 Plasma: 100
- type: Stack - type: Stack
stackType: Plasma stackType: Plasma
- type: Sprite - type: Sprite

View File

@@ -28,7 +28,7 @@
- type: entity - type: entity
parent: PartBase parent: PartBase
id: PartRodMetal id: PartRodMetal
name: metals rods name: metal rods
suffix: Full suffix: Full
components: components:
- type: Stack - type: Stack
@@ -53,6 +53,10 @@
outputs: outputs:
- Lattice - Lattice
- FloorReinforced - FloorReinforced
- type: StaticPrice
price: 0
- type: StackPrice
price: 5
- type: entity - type: entity
parent: PartRodMetal parent: PartRodMetal

View File

@@ -19,6 +19,8 @@
quickEquip: true quickEquip: true
slots: slots:
- neck - neck
- type: StaticPrice
price: 100
- type: entity - type: entity
id: BedsheetBlack id: BedsheetBlack

View File

@@ -10,3 +10,5 @@
- type: Tag - type: Tag
tags: tags:
- ProximitySensor - ProximitySensor
- type: StaticPrice
price: 40

View File

@@ -12,3 +12,5 @@
state: jar state: jar
netsync: false netsync: false
- type: AMEFuelContainer - type: AMEFuelContainer
- type: StaticPrice
price: 500

View File

@@ -11,3 +11,5 @@
sprite: Objects/Power/AME/ame_part.rsi sprite: Objects/Power/AME/ame_part.rsi
state: box state: box
- type: AMEPart - type: AMEPart
- type: StaticPrice
price: 500

View File

@@ -28,6 +28,8 @@
- DroneUsable - DroneUsable
- type: Appearance - type: Appearance
- type: PowerCellVisuals - type: PowerCellVisuals
- type: StaticPrice
price: 100
- type: entity - type: entity
name: potato battery name: potato battery

View File

@@ -50,6 +50,9 @@
parent: BaseShield parent: BaseShield
id: RiotShield id: RiotShield
description: A large tower shield. Good for controlling crowds. description: A large tower shield. Good for controlling crowds.
components:
- type: StaticPrice
price: 100
- type: entity - type: entity
name: riot laser shield name: riot laser shield

View File

@@ -10,6 +10,8 @@
netsync: true netsync: true
- type: Item - type: Item
size: 2 size: 2
- type: StaticPrice
price: 20
- type: entity - type: entity
parent: SeedBase parent: SeedBase

View File

@@ -61,6 +61,8 @@
sprite: Objects/Tools/Hydroponics/scythe.rsi sprite: Objects/Tools/Hydroponics/scythe.rsi
slots: slots:
- back - back
- type: StaticPrice
price: 40
- type: entity - type: entity
name: hatchet name: hatchet

View File

@@ -19,3 +19,5 @@
receiveFrequencyId: SuitSensor receiveFrequencyId: SuitSensor
- type: WirelessNetworkConnection - type: WirelessNetworkConnection
range: 500 range: 500
- type: StaticPrice
price: 500

View File

@@ -8,6 +8,9 @@
- type: Item - type: Item
sprite: Objects/Specific/Medical/medical.rsi sprite: Objects/Specific/Medical/medical.rsi
heldPrefix: ointment heldPrefix: ointment
# Inherited
- type: StaticPrice
price: 0
- type: entity - type: entity
name: ointment name: ointment
@@ -35,6 +38,8 @@
stackType: Ointment stackType: Ointment
max: 10 max: 10
count: 10 count: 10
- type: StackPrice
price: 10
- type: entity - type: entity
name: bruise pack name: bruise pack
@@ -61,6 +66,8 @@
stackType: Brutepack stackType: Brutepack
max: 10 max: 10
count: 10 count: 10
- type: StackPrice
price: 10
- type: entity - type: entity
name: roll of gauze name: roll of gauze
@@ -91,6 +98,8 @@
stackType: Gauze stackType: Gauze
max: 10 max: 10
count: 10 count: 10
- type: StackPrice
price: 10
- type: entity - type: entity
id: Gauze1 id: Gauze1

View File

@@ -72,6 +72,8 @@
containers: containers:
entity_storage: !type:Container entity_storage: !type:Container
paper_label: !type:ContainerSlot paper_label: !type:ContainerSlot
- type: StaticPrice
price: 50
- type: entity - type: entity
id: BodyBag_Folded id: BodyBag_Folded

View File

@@ -7,6 +7,8 @@
components: components:
- type: Sprite - type: Sprite
netsync: false netsync: false
- type: StaticPrice
price: 60
# Cautery # Cautery

View File

@@ -54,3 +54,5 @@
- type: Appearance - type: Appearance
visuals: visuals:
- type: DeployableBarrierVisualizer - type: DeployableBarrierVisualizer
- type: StaticPrice
price: 200

View File

@@ -30,3 +30,5 @@
- type: Tag - type: Tag
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice
price: 80

View File

@@ -78,6 +78,8 @@
damage: damage:
types: types:
Blunt: 5 Blunt: 5
- type: StaticPrice
price: 30
- type: entity - type: entity
name: beaker name: beaker
@@ -113,6 +115,8 @@
- type: SolutionContainerVisuals - type: SolutionContainerVisuals
maxFillLevels: 6 maxFillLevels: 6
fillBaseName: beakerlarge fillBaseName: beakerlarge
- type: StaticPrice
price: 40
- type: entity - type: entity
name: cryostasis beaker name: cryostasis beaker
@@ -205,6 +209,8 @@
- type: SolutionContainerVisuals - type: SolutionContainerVisuals
maxFillLevels: 1 maxFillLevels: 1
fillBaseName: dropper fillBaseName: dropper
- type: StaticPrice
price: 40
- type: entity - type: entity
name: syringe name: syringe

View File

@@ -18,3 +18,5 @@
whitelist: whitelist:
tags: tags:
- PaintableAirlock - PaintableAirlock
- type: StaticPrice
price: 40

View File

@@ -52,6 +52,8 @@
- type: Appearance - type: Appearance
visuals: visuals:
- type: FlashLightVisualizer - type: FlashLightVisualizer
- type: StaticPrice
price: 40
- type: entity - type: entity
name: seclite name: seclite

View File

@@ -20,3 +20,5 @@
- type: Tag - type: Tag
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice
price: 100

View File

@@ -22,3 +22,5 @@
- type: Tag - type: Tag
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice
price: 60

View File

@@ -35,6 +35,8 @@
- type: Item - type: Item
sprite: Objects/Tools/wirecutters.rsi sprite: Objects/Tools/wirecutters.rsi
- type: LatticeCutting - type: LatticeCutting
- type: StaticPrice
price: 40
- type: entity - type: entity
name: screwdriver name: screwdriver
@@ -71,6 +73,8 @@
available: available:
- enum.DamageStateVisualLayers.Base: - enum.DamageStateVisualLayers.Base:
screwdriver: Rainbow screwdriver: Rainbow
- type: StaticPrice
price: 40
- type: entity - type: entity
name: wrench name: wrench
@@ -100,6 +104,8 @@
- Anchoring - Anchoring
useSound: useSound:
path: /Audio/Items/ratchet.ogg path: /Audio/Items/ratchet.ogg
- type: StaticPrice
price: 40
- type: entity - type: entity
name: crowbar name: crowbar
@@ -131,6 +137,8 @@
useSound: useSound:
path: /Audio/Items/crowbar.ogg path: /Audio/Items/crowbar.ogg
- type: TilePrying - type: TilePrying
- type: StaticPrice
price: 40
- type: entity - type: entity
name: emergency crowbar name: emergency crowbar
@@ -190,6 +198,8 @@
- type: Tag - type: Tag
tags: tags:
- DroneUsable - DroneUsable
- type: StaticPrice
price: 60
- type: entity - type: entity
name: power drill name: power drill
@@ -229,6 +239,8 @@
path: /Audio/Items/drill_use.ogg path: /Audio/Items/drill_use.ogg
changeSound: changeSound:
path: /Audio/Items/change_drill.ogg path: /Audio/Items/change_drill.ogg
- type: StaticPrice
price: 60
- type: entity - type: entity
name: RCD name: RCD
@@ -249,6 +261,8 @@
quickEquip: false quickEquip: false
slots: slots:
- Belt - Belt
- type: StaticPrice
price: 100
- type: entity - type: entity
name: RCD Ammo name: RCD Ammo
@@ -263,6 +277,8 @@
- type: Item - type: Item
sprite: Objects/Tools/rcd.rsi sprite: Objects/Tools/rcd.rsi
heldPrefix: ammo heldPrefix: ammo
- type: StaticPrice
price: 60
- type: entity - type: entity
name: shovel name: shovel

View File

@@ -51,6 +51,8 @@
color: orange color: orange
- type: Appearance - type: Appearance
- type: RequiresEyeProtection - type: RequiresEyeProtection
- type: StaticPrice
price: 40
- type: entity - type: entity
name: industrial welding tool name: industrial welding tool

View File

@@ -16,3 +16,5 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 20

View File

@@ -19,6 +19,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgeCaselessRifle id: CartridgeCaselessRifle

View File

@@ -18,6 +18,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgeMinigun id: CartridgeMinigun

View File

@@ -18,6 +18,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgeLightRifle id: CartridgeLightRifle

View File

@@ -18,6 +18,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgeMagnum id: CartridgeMagnum

View File

@@ -18,6 +18,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgePistol id: CartridgePistol

View File

@@ -18,6 +18,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance - type: Appearance
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: StaticPrice
price: 10
- type: entity - type: entity
id: CartridgeRifle id: CartridgeRifle

View File

@@ -17,6 +17,8 @@
map: ["enum.AmmoVisualLayers.Base"] map: ["enum.AmmoVisualLayers.Base"]
- type: SpentAmmoVisuals - type: SpentAmmoVisuals
- type: Appearance - type: Appearance
- type: StaticPrice
price: 5
- type: entity - type: entity
id: CartridgeCap id: CartridgeCap

View File

@@ -18,6 +18,8 @@
netsync: false netsync: false
sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi
state: rpg state: rpg
- type: StaticPrice
price: 20
- type: entity - type: entity
id: CartridgeRocketSlow id: CartridgeRocketSlow
@@ -36,6 +38,8 @@
- type: Sprite - type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi
state: frag state: frag
- type: StaticPrice
price: 20
# Grenades # Grenades

View File

@@ -29,6 +29,8 @@
steps: 5 steps: 5
zeroVisible: false zeroVisible: false
- type: Appearance - type: Appearance
- type: StaticPrice
price: 500
- type: entity - type: entity
id: BaseWeaponBatterySmall id: BaseWeaponBatterySmall

View File

@@ -17,6 +17,8 @@
path: /Audio/Weapons/Guns/Gunshots/lmg.ogg path: /Audio/Weapons/Guns/Gunshots/lmg.ogg
soundEmpty: soundEmpty:
path: /Audio/Weapons/Guns/Empty/lmg_empty.ogg path: /Audio/Weapons/Guns/Empty/lmg_empty.ogg
- type: StaticPrice
price: 500
# No chamber because HMG may want its own # No chamber because HMG may want its own
- type: entity - type: entity

View File

@@ -51,6 +51,8 @@
containers: containers:
gun_magazine: !type:ContainerSlot gun_magazine: !type:ContainerSlot
gun_chamber: !type:ContainerSlot gun_chamber: !type:ContainerSlot
- type: StaticPrice
price: 500
- type: entity - type: entity
name: L6 SAW name: L6 SAW

View File

@@ -14,6 +14,8 @@
- Back - Back
- type: Item - type: Item
size: 60 size: 60
- type: StaticPrice
price: 500
- type: entity - type: entity
name: china lake name: china lake

View File

@@ -55,6 +55,8 @@
steps: 1 steps: 1
zeroVisible: true zeroVisible: true
- type: Appearance - type: Appearance
- type: StaticPrice
price: 500
- type: entity - type: entity
name: viper name: viper

View File

@@ -38,6 +38,8 @@
path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg
soundInsert: soundInsert:
path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg
- type: StaticPrice
price: 500
- type: entity - type: entity
name: Deckard name: Deckard

View File

@@ -46,6 +46,8 @@
containers: containers:
gun_magazine: !type:ContainerSlot gun_magazine: !type:ContainerSlot
gun_chamber: !type:ContainerSlot gun_chamber: !type:ContainerSlot
- type: StaticPrice
price: 500
- type: entity - type: entity
name: AKMS name: AKMS

View File

@@ -49,6 +49,8 @@
containers: containers:
gun_magazine: !type:ContainerSlot gun_magazine: !type:ContainerSlot
gun_chamber: !type:ContainerSlot gun_chamber: !type:ContainerSlot
- type: StaticPrice
price: 500
- type: entity - type: entity
name: Atreides name: Atreides

View File

@@ -42,6 +42,8 @@
containers: containers:
ballistic-ammo: !type:Container ballistic-ammo: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 500
- type: entity - type: entity
name: Bulldog name: Bulldog
@@ -96,6 +98,8 @@
steps: 1 steps: 1
zeroVisible: true zeroVisible: true
- type: Appearance - type: Appearance
- type: StaticPrice
price: 500
- type: entity - type: entity
name: double-barreled shotgun name: double-barreled shotgun

View File

@@ -36,6 +36,8 @@
containers: containers:
ballistic-ammo: !type:Container ballistic-ammo: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 500
- type: entity - type: entity
name: Kardashev-Mosin name: Kardashev-Mosin

View File

@@ -45,6 +45,8 @@
enum.ToggleVisuals.Layer: enum.ToggleVisuals.Layer:
True: {state: stunbaton_on} True: {state: stunbaton_on}
False: {state: stunbaton_off} False: {state: stunbaton_off}
- type: StaticPrice
price: 100
- type: entity - type: entity
name: flash name: flash
@@ -67,6 +69,8 @@
size: 5 size: 5
sprite: Objects/Weapons/Melee/flash.rsi sprite: Objects/Weapons/Melee/flash.rsi
- type: ItemCooldown - type: ItemCooldown
- type: StaticPrice
price: 40
- type: entity - type: entity
name: portable flasher name: portable flasher

View File

@@ -6,7 +6,7 @@
- type: Item - type: Item
size: 5 size: 5
- type: StaticPrice - type: StaticPrice
price: 5 price: 20
- type: Clickable - type: Clickable
- type: InteractionOutline - type: InteractionOutline
- type: MovedByPressure - type: MovedByPressure

View File

@@ -59,3 +59,5 @@
machine_board: !type:Container machine_board: !type:Container
machine_parts: !type:Container machine_parts: !type:Container
ReagentDispenser-beaker: !type:ContainerSlot ReagentDispenser-beaker: !type:ContainerSlot
- type: StaticPrice
price: 1000

View File

@@ -99,5 +99,7 @@
mode: NoSprite mode: NoSprite
- type: PaintableAirlock - type: PaintableAirlock
group: Standard group: Standard
- type: StaticPrice
price: 150
placement: placement:
mode: SnapgridCenter mode: SnapgridCenter

View File

@@ -99,6 +99,8 @@
node: Firelock node: Firelock
- type: WallMount - type: WallMount
arc: 360 arc: 360
- type: StaticPrice
price: 150
- type: entity - type: entity
id: FirelockGlass id: FirelockGlass
@@ -152,3 +154,5 @@
occludes: false occludes: false
- type: Physics - type: Physics
canCollide: false canCollide: false
- type: StaticPrice
price: 100

View File

@@ -111,6 +111,8 @@
- type: Construction - type: Construction
graph: Windoor graph: Windoor
node: windoor node: windoor
- type: StaticPrice
price: 100
- type: entity - type: entity
id: BaseSecureWindoor id: BaseSecureWindoor

View File

@@ -40,6 +40,8 @@
- !type:PlaySoundBehavior - !type:PlaySoundBehavior
sound: sound:
path: /Audio/Effects/metalbreak.ogg path: /Audio/Effects/metalbreak.ogg
- type: StaticPrice
price: 50
- type: entity - type: entity
name: chair name: chair

View File

@@ -55,6 +55,8 @@
key: rollerbed key: rollerbed
- type: RollerbedVisualizer - type: RollerbedVisualizer
key: rollerbed key: rollerbed
- type: StaticPrice
price: 200
- type: entity - type: entity
id: CheapRollerBed id: CheapRollerBed

View File

@@ -33,6 +33,8 @@
bodyBroken: arcade bodyBroken: arcade
- type: Anchorable - type: Anchorable
- type: Pullable - type: Pullable
- type: StaticPrice
price: 300
- type: entity - type: entity
id: SpaceVillainArcade id: SpaceVillainArcade

View File

@@ -53,3 +53,5 @@
containers: containers:
board: !type:Container board: !type:Container
ents: [] ents: []
- type: StaticPrice
price: 400

View File

@@ -63,3 +63,5 @@
enum.CloningPodStatus.Gore: pod_g enum.CloningPodStatus.Gore: pod_g
enum.CloningPodStatus.Idle: pod_0 enum.CloningPodStatus.Idle: pod_0
- type: Climbable - type: Climbable
- type: StaticPrice
price: 1000

View File

@@ -85,6 +85,8 @@
anchored: true anchored: true
- type: Pullable - type: Pullable
- type: Lathe - type: Lathe
- type: StaticPrice
price: 800
- type: entity - type: entity
parent: [ BaseMachinePowered, ConstructibleMachine ] parent: [ BaseMachinePowered, ConstructibleMachine ]

View File

@@ -48,6 +48,8 @@
range: 2 range: 2
sound: sound:
path: /Audio/Ambience/Objects/gas_hiss.ogg path: /Audio/Ambience/Objects/gas_hiss.ogg
- type: StaticPrice
price: 100
#Note: The PipeDirection of the PipeNode should be the south-facing version, because the entity starts at an angle of 0 (south) #Note: The PipeDirection of the PipeNode should be the south-facing version, because the entity starts at an angle of 0 (south)

View File

@@ -246,6 +246,8 @@
!type:PipeNode !type:PipeNode
nodeGroupID: Pipe nodeGroupID: Pipe
pipeDirection: South pipeDirection: South
- type: StaticPrice
price: 500
- type: entity - type: entity
parent: BaseGasThermoMachine parent: BaseGasThermoMachine

View File

@@ -74,6 +74,8 @@
- type: ContainerContainer - type: ContainerContainer
containers: containers:
DisposalUnit: !type:Container DisposalUnit: !type:Container
- type: StaticPrice
price: 100
- type: entity - type: entity
id: DisposalUnit id: DisposalUnit

View File

@@ -67,6 +67,8 @@
maxIntensity: 100 maxIntensity: 100
intensitySlope: 2 intensitySlope: 2
totalIntensity: 200 totalIntensity: 200
- type: StaticPrice
price: 500
# Base Wallmount Generator # Base Wallmount Generator

View File

@@ -92,6 +92,8 @@
- !type:DoActsBehavior - !type:DoActsBehavior
acts: [ "Destruction" ] acts: [ "Destruction" ]
- type: StationInfiniteBatteryTarget - type: StationInfiniteBatteryTarget
- type: StaticPrice
price: 500
# APC under construction # APC under construction
- type: entity - type: entity

Some files were not shown because too many files have changed in this diff Show More