Partial lathe ECS, fix cursed lathe visualizer, a bit more audiovisual feedback for lathes (#7238)
* Prototype that's mostly borked rather than completely borked * ECS inserting mats * Partial ECS mostly done, needs cleanup and visualizer * Replace timers * Power visualizes at least * First ""working"" version * Clean up all lathes * Colors * Fix animation timing * Fixes greyscale, adds a bunch of colors * Give every (used) material a color * Made most lathes take long enough you can at least see there's some sort of animation * Insertion feedback popup * Sound for circuit printer and uniform printer * Fix queueing, optimize update * Remove mono crash * cleanup * Fix test failure * Techfab inserting sprite * Cleanup and commenting * Fix bug in CanProduce check * Fix UI resolves * Mirror review stuff
15
Content.Client/Lathe/Components/LatheVisualsComponent.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
namespace Content.Client.Lathe;
|
||||
|
||||
/// <summary>
|
||||
/// Holds the idle and running state for machines to control
|
||||
/// playing animtions on the client.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class LatheVisualsComponent : Component
|
||||
{
|
||||
[DataField("idleState", required: true)]
|
||||
public string IdleState = default!;
|
||||
|
||||
[DataField("runningState", required: true)]
|
||||
public string RunningState = default!;
|
||||
}
|
||||
43
Content.Client/Lathe/LatheSystem.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Robust.Client.GameObjects;
|
||||
using Content.Shared.Lathe;
|
||||
using Content.Shared.Power;
|
||||
using Content.Client.Power;
|
||||
using Content.Client.Wires.Visualizers;
|
||||
using Content.Shared.Wires;
|
||||
|
||||
namespace Content.Client.Lathe
|
||||
{
|
||||
public sealed class LatheSystem : VisualizerSystem<LatheVisualsComponent>
|
||||
{
|
||||
protected override void OnAppearanceChange(EntityUid uid, LatheVisualsComponent component, ref AppearanceChangeEvent args)
|
||||
{
|
||||
if (TryComp(uid, out SpriteComponent? sprite))
|
||||
{
|
||||
if (args.Component.TryGetData(PowerDeviceVisuals.Powered, out bool powered))
|
||||
sprite.LayerSetVisible(PowerDeviceVisualLayers.Powered, powered);
|
||||
if (args.Component.TryGetData(SharedWiresComponent.WiresVisuals.MaintenancePanelState, out bool panel))
|
||||
sprite.LayerSetVisible(WiresVisualizer.WiresVisualLayers.MaintenancePanel, panel);
|
||||
// Lathe specific stuff
|
||||
if (args.Component.TryGetData(LatheVisuals.IsRunning, out bool isRunning))
|
||||
{
|
||||
var state = isRunning ? component.RunningState : component.IdleState;
|
||||
sprite.LayerSetAnimationTime(LatheVisualLayers.IsRunning, 0f);
|
||||
sprite.LayerSetState(LatheVisualLayers.IsRunning, state);
|
||||
}
|
||||
if (args.Component.TryGetData(LatheVisuals.IsInserting, out bool isInserting))
|
||||
{
|
||||
if (args.Component.TryGetData(LatheVisuals.InsertingColor, out Color color))
|
||||
sprite.LayerSetColor(LatheVisualLayers.IsInserting, color);
|
||||
|
||||
sprite.LayerSetAnimationTime(LatheVisualLayers.IsInserting, 0f);
|
||||
sprite.LayerSetVisible(LatheVisualLayers.IsInserting, isInserting);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public enum LatheVisualLayers : byte
|
||||
{
|
||||
IsRunning,
|
||||
IsInserting
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
using System;
|
||||
using Content.Shared.Lathe;
|
||||
using Content.Shared.Power;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.Animations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
|
||||
namespace Content.Client.Lathe.Visualizers
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public sealed class AutolatheVisualizer : AppearanceVisualizer
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
|
||||
private const string AnimationKey = "inserting_animation";
|
||||
|
||||
private Animation _buildingAnimation;
|
||||
private Animation _insertingMetalAnimation;
|
||||
private Animation _insertingGlassAnimation;
|
||||
private Animation _insertingGoldAnimation;
|
||||
private Animation _insertingPlasmaAnimation;
|
||||
private Animation _insertingPlasticAnimation;
|
||||
|
||||
public AutolatheVisualizer()
|
||||
{
|
||||
_buildingAnimation = PopulateAnimation("building", "building_unlit", 0.5f);
|
||||
_insertingMetalAnimation = PopulateAnimation("inserting_metal", "inserting_unlit", 0.5f);
|
||||
_insertingGlassAnimation = PopulateAnimation("inserting_glass", "inserting_unlit", 0.5f);
|
||||
_insertingGoldAnimation = PopulateAnimation("inserting_gold", "inserting_unlit", 0.5f);
|
||||
_insertingPlasmaAnimation = PopulateAnimation("inserting_plasma", "inserting_unlit", 0.5f);
|
||||
_insertingPlasticAnimation = PopulateAnimation("inserting_plastic", "inserting_unlit", 0.5f);
|
||||
}
|
||||
|
||||
private Animation PopulateAnimation(string sprite, string spriteUnlit, float length)
|
||||
{
|
||||
var animation = new Animation {Length = TimeSpan.FromSeconds(length)};
|
||||
|
||||
var flick = new AnimationTrackSpriteFlick();
|
||||
animation.AnimationTracks.Add(flick);
|
||||
flick.LayerKey = AutolatheVisualLayers.Base;
|
||||
flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(sprite, 0f));
|
||||
|
||||
var flickUnlit = new AnimationTrackSpriteFlick();
|
||||
animation.AnimationTracks.Add(flickUnlit);
|
||||
flickUnlit.LayerKey = AutolatheVisualLayers.BaseUnlit;
|
||||
flickUnlit.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(spriteUnlit, 0f));
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public override void InitializeEntity(EntityUid entity)
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_entMan.EnsureComponent<AnimationPlayerComponent>(entity);
|
||||
}
|
||||
|
||||
public override void OnChangeData(AppearanceComponent component)
|
||||
{
|
||||
base.OnChangeData(component);
|
||||
|
||||
var sprite = _entMan.GetComponent<ISpriteComponent>(component.Owner);
|
||||
var animPlayer = _entMan.GetComponent<AnimationPlayerComponent>(component.Owner);
|
||||
if (!component.TryGetData(PowerDeviceVisuals.VisualState, out LatheVisualState state))
|
||||
{
|
||||
state = LatheVisualState.Idle;
|
||||
}
|
||||
sprite.LayerSetVisible(AutolatheVisualLayers.AnimationLayer, true);
|
||||
switch (state)
|
||||
{
|
||||
case LatheVisualState.Idle:
|
||||
if (animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Stop(AnimationKey);
|
||||
}
|
||||
|
||||
sprite.LayerSetState(AutolatheVisualLayers.Base, "icon");
|
||||
sprite.LayerSetState(AutolatheVisualLayers.BaseUnlit, "unlit");
|
||||
sprite.LayerSetVisible(AutolatheVisualLayers.AnimationLayer, false);
|
||||
break;
|
||||
case LatheVisualState.Producing:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_buildingAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingMetal:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingMetalAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingGlass:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingGlassAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingGold:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingGoldAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingPlasma:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingPlasmaAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingPlastic:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingPlasticAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered);
|
||||
sprite.LayerSetVisible(AutolatheVisualLayers.BaseUnlit, glowingPartsVisible);
|
||||
}
|
||||
|
||||
public enum AutolatheVisualLayers : byte
|
||||
{
|
||||
Base,
|
||||
BaseUnlit,
|
||||
AnimationLayer
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
using System;
|
||||
using Content.Shared.Lathe;
|
||||
using Content.Shared.Power;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.Animations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
|
||||
namespace Content.Client.Lathe.Visualizers
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public sealed class ProtolatheVisualizer : AppearanceVisualizer
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
|
||||
private const string AnimationKey = "inserting_animation";
|
||||
|
||||
private Animation _buildingAnimation;
|
||||
private Animation _insertingMetalAnimation;
|
||||
private Animation _insertingGlassAnimation;
|
||||
private Animation _insertingGoldAnimation;
|
||||
private Animation _insertingPlasmaAnimation;
|
||||
private Animation _insertingPlasticAnimation;
|
||||
|
||||
public ProtolatheVisualizer()
|
||||
{
|
||||
_buildingAnimation = PopulateAnimation("building", "building_unlit", 0.8f);
|
||||
_insertingMetalAnimation = PopulateAnimation("inserting_metal", "inserting_unlit", 0.8f);
|
||||
_insertingGlassAnimation = PopulateAnimation("inserting_glass", "inserting_unlit", 0.8f);
|
||||
_insertingGoldAnimation = PopulateAnimation("inserting_gold", "inserting_unlit", 0.8f);
|
||||
_insertingPlasmaAnimation = PopulateAnimation("inserting_plasma", "inserting_unlit", 0.8f);
|
||||
_insertingPlasticAnimation = PopulateAnimation("inserting_plastic", "inserting_unlit", 0.8f);
|
||||
}
|
||||
|
||||
private Animation PopulateAnimation(string sprite, string spriteUnlit, float length)
|
||||
{
|
||||
var animation = new Animation { Length = TimeSpan.FromSeconds(length) };
|
||||
|
||||
var flick = new AnimationTrackSpriteFlick();
|
||||
animation.AnimationTracks.Add(flick);
|
||||
flick.LayerKey = ProtolatheVisualLayers.Base;
|
||||
flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(sprite, 0f));
|
||||
|
||||
var flickUnlit = new AnimationTrackSpriteFlick();
|
||||
animation.AnimationTracks.Add(flickUnlit);
|
||||
flickUnlit.LayerKey = ProtolatheVisualLayers.BaseUnlit;
|
||||
flickUnlit.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(spriteUnlit, 0f));
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public override void InitializeEntity(EntityUid entity)
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_entMan.EnsureComponent<AnimationPlayerComponent>(entity);
|
||||
}
|
||||
|
||||
public override void OnChangeData(AppearanceComponent component)
|
||||
{
|
||||
base.OnChangeData(component);
|
||||
|
||||
var sprite = _entMan.GetComponent<ISpriteComponent>(component.Owner);
|
||||
var animPlayer = _entMan.GetComponent<AnimationPlayerComponent>(component.Owner);
|
||||
if (!component.TryGetData(PowerDeviceVisuals.VisualState, out LatheVisualState state))
|
||||
{
|
||||
state = LatheVisualState.Idle;
|
||||
}
|
||||
sprite.LayerSetVisible(ProtolatheVisualLayers.AnimationLayer, true);
|
||||
switch (state)
|
||||
{
|
||||
case LatheVisualState.Idle:
|
||||
if (animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Stop(AnimationKey);
|
||||
}
|
||||
|
||||
sprite.LayerSetState(ProtolatheVisualLayers.Base, "icon");
|
||||
sprite.LayerSetState(ProtolatheVisualLayers.BaseUnlit, "unlit");
|
||||
sprite.LayerSetVisible(ProtolatheVisualLayers.AnimationLayer, false);
|
||||
break;
|
||||
case LatheVisualState.Producing:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_buildingAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingMetal:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingMetalAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingGlass:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingGlassAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingGold:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingGoldAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingPlasma:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingPlasmaAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
case LatheVisualState.InsertingPlastic:
|
||||
if (!animPlayer.HasRunningAnimation(AnimationKey))
|
||||
{
|
||||
animPlayer.Play(_insertingPlasticAnimation, AnimationKey);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered);
|
||||
sprite.LayerSetVisible(ProtolatheVisualLayers.BaseUnlit, glowingPartsVisible);
|
||||
}
|
||||
|
||||
public enum ProtolatheVisualLayers : byte
|
||||
{
|
||||
Base,
|
||||
BaseUnlit,
|
||||
AnimationLayer
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
using System.Threading;
|
||||
using Content.Server.Disease.Components;
|
||||
using Content.Shared.Disease;
|
||||
using Content.Shared.Disease.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Examine;
|
||||
@@ -151,7 +150,7 @@ namespace Content.Server.Disease
|
||||
_popupSystem.PopupEntity(Loc.GetString("diagnoser-cant-use-swab", ("machine", uid), ("swab", args.Used)), uid, Filter.Entities(args.User));
|
||||
return;
|
||||
}
|
||||
_popupSystem.PopupEntity(Loc.GetString("diagnoser-insert-swab", ("machine", uid), ("swab", args.Used)), uid, Filter.Entities(args.User));
|
||||
_popupSystem.PopupEntity(Loc.GetString("machine-insert-item", ("machine", uid), ("item", args.Used)), uid, Filter.Entities(args.User));
|
||||
|
||||
|
||||
machine.Disease = swab.Disease;
|
||||
@@ -183,7 +182,7 @@ namespace Content.Server.Disease
|
||||
_popupSystem.PopupEntity(Loc.GetString("diagnoser-cant-use-swab", ("machine", uid), ("swab", args.Used)), uid, Filter.Entities(args.User));
|
||||
return;
|
||||
}
|
||||
_popupSystem.PopupEntity(Loc.GetString("diagnoser-insert-swab", ("machine", uid), ("swab", args.Used)), uid, Filter.Entities(args.User));
|
||||
_popupSystem.PopupEntity(Loc.GetString("machine-insert-item", ("machine", uid), ("item", args.Used)), uid, Filter.Entities(args.User));
|
||||
var machine = Comp<DiseaseMachineComponent>(uid);
|
||||
machine.Disease = swab.Disease;
|
||||
EntityManager.DeleteEntity(args.Used);
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace Content.Server.Entry
|
||||
"ClientEntitySpawner",
|
||||
"CharacterInfo",
|
||||
"ItemCabinetVisuals",
|
||||
"LatheVisuals",
|
||||
"DiseaseMachineVisuals",
|
||||
"HandheldGPS",
|
||||
"ToggleableLightVisuals",
|
||||
|
||||
@@ -1,219 +1,53 @@
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Materials;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.Research.Components;
|
||||
using Content.Server.Stack;
|
||||
using Content.Server.UserInterface;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Lathe;
|
||||
using Content.Shared.Power;
|
||||
using Content.Shared.Research.Prototypes;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Server.Player;
|
||||
using Content.Shared.Sound;
|
||||
|
||||
namespace Content.Server.Lathe.Components
|
||||
{
|
||||
[RegisterComponent]
|
||||
public sealed class LatheComponent : SharedLatheComponent, IInteractUsing
|
||||
public sealed class LatheComponent : SharedLatheComponent
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
|
||||
public const int VolumePerSheet = 100;
|
||||
/// <summary>
|
||||
/// How much volume in cm^3 each sheet of material adds
|
||||
/// </summary>
|
||||
public int VolumePerSheet = 100;
|
||||
|
||||
/// <summary>
|
||||
/// The lathe's construction queue
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
public Queue<LatheRecipePrototype> Queue { get; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// The recipe the lathe is currently producing
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
public bool Producing { get; private set; }
|
||||
|
||||
private LatheState _state = LatheState.Base;
|
||||
|
||||
private LatheState State
|
||||
{
|
||||
get => _state;
|
||||
set => _state = value;
|
||||
}
|
||||
|
||||
public LatheRecipePrototype? ProducingRecipe;
|
||||
/// <summary>
|
||||
/// How long the inserting animation will play
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
private LatheRecipePrototype? _producingRecipe;
|
||||
public float InsertionTime = 0.79f; // 0.01 off for animation timing
|
||||
/// <summary>
|
||||
/// Update accumulator for the insertion time
|
||||
/// </suummary>
|
||||
public float InsertionAccumulator = 0f;
|
||||
/// <summary>
|
||||
/// Production accumulator for the production time.
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
private bool Powered => !_entMan.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver) || receiver.Powered;
|
||||
public float ProducingAccumulator = 0f;
|
||||
|
||||
private static readonly TimeSpan InsertionTime = TimeSpan.FromSeconds(0.9f);
|
||||
/// <summary>
|
||||
/// The sound that plays when the lathe is producing an item, if any
|
||||
/// </summary>
|
||||
[DataField("producingSound")]
|
||||
public SoundSpecifier? ProducingSound;
|
||||
|
||||
[ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(LatheUiKey.Key);
|
||||
|
||||
protected override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
if (UserInterface != null)
|
||||
{
|
||||
UserInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage;
|
||||
}
|
||||
}
|
||||
|
||||
private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage message)
|
||||
{
|
||||
if (!Powered)
|
||||
return;
|
||||
|
||||
switch (message.Message)
|
||||
{
|
||||
case LatheQueueRecipeMessage msg:
|
||||
PrototypeManager.TryIndex(msg.ID, out LatheRecipePrototype? recipe);
|
||||
if (recipe != null!)
|
||||
for (var i = 0; i < msg.Quantity; i++)
|
||||
{
|
||||
Queue.Enqueue(recipe);
|
||||
UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue()));
|
||||
}
|
||||
break;
|
||||
case LatheSyncRequestMessage _:
|
||||
if (!_entMan.HasComponent<MaterialStorageComponent>(Owner)) return;
|
||||
UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue()));
|
||||
if (_producingRecipe != null)
|
||||
UserInterface?.SendMessage(new LatheProducingRecipeMessage(_producingRecipe.ID));
|
||||
break;
|
||||
|
||||
case LatheServerSelectionMessage _:
|
||||
if (!_entMan.TryGetComponent(Owner, out ResearchClientComponent? researchClient)) return;
|
||||
researchClient.OpenUserInterface(message.Session);
|
||||
break;
|
||||
|
||||
case LatheServerSyncMessage _:
|
||||
if (!_entMan.TryGetComponent(Owner, out TechnologyDatabaseComponent? database)
|
||||
|| !_entMan.TryGetComponent(Owner, out ProtolatheDatabaseComponent? protoDatabase)) return;
|
||||
|
||||
if (database.SyncWithServer())
|
||||
protoDatabase.Sync();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
internal bool Produce(LatheRecipePrototype recipe)
|
||||
{
|
||||
if (Producing || !Powered || !CanProduce(recipe) || !_entMan.TryGetComponent(Owner, out MaterialStorageComponent? storage)) return false;
|
||||
|
||||
UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue()));
|
||||
|
||||
Producing = true;
|
||||
_producingRecipe = recipe;
|
||||
|
||||
foreach (var (material, amount) in recipe.RequiredMaterials)
|
||||
{
|
||||
// This should always return true, otherwise CanProduce fucked up.
|
||||
storage.RemoveMaterial(material, amount);
|
||||
}
|
||||
|
||||
UserInterface?.SendMessage(new LatheProducingRecipeMessage(recipe.ID));
|
||||
|
||||
State = LatheState.Producing;
|
||||
SetAppearance(LatheVisualState.Producing);
|
||||
|
||||
Owner.SpawnTimer(recipe.CompleteTime, () =>
|
||||
{
|
||||
Producing = false;
|
||||
_producingRecipe = null;
|
||||
_entMan.SpawnEntity(recipe.Result, _entMan.GetComponent<TransformComponent>(Owner).Coordinates);
|
||||
UserInterface?.SendMessage(new LatheStoppedProducingRecipeMessage());
|
||||
State = LatheState.Base;
|
||||
SetAppearance(LatheVisualState.Idle);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void OpenUserInterface(IPlayerSession session)
|
||||
{
|
||||
UserInterface?.Open(session);
|
||||
}
|
||||
async Task<bool> IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs)
|
||||
{
|
||||
if (!_entMan.TryGetComponent(Owner, out MaterialStorageComponent? storage)
|
||||
|| !_entMan.TryGetComponent(eventArgs.Using, out MaterialComponent? material)) return false;
|
||||
|
||||
var multiplier = 1;
|
||||
|
||||
if (_entMan.TryGetComponent(eventArgs.Using, out StackComponent? stack)) multiplier = stack.Count;
|
||||
|
||||
var totalAmount = 0;
|
||||
|
||||
// Check if it can insert all materials.
|
||||
foreach (var mat in material.MaterialIds)
|
||||
{
|
||||
// TODO: Change how MaterialComponent works so this is not hard-coded.
|
||||
if (!storage.CanInsertMaterial(mat, VolumePerSheet * multiplier)) return false;
|
||||
totalAmount += VolumePerSheet * multiplier;
|
||||
}
|
||||
|
||||
// Check if it can take ALL of the material's volume.
|
||||
if (storage.CanTakeAmount(totalAmount)) return false;
|
||||
|
||||
foreach (var mat in material.MaterialIds)
|
||||
{
|
||||
storage.InsertMaterial(mat, VolumePerSheet * multiplier);
|
||||
}
|
||||
|
||||
State = LatheState.Inserting;
|
||||
switch (material.Materials.FirstOrDefault()?.ID)
|
||||
{
|
||||
case "Steel":
|
||||
SetAppearance(LatheVisualState.InsertingMetal);
|
||||
break;
|
||||
case "Glass":
|
||||
SetAppearance(LatheVisualState.InsertingGlass);
|
||||
break;
|
||||
case "Gold":
|
||||
SetAppearance(LatheVisualState.InsertingGold);
|
||||
break;
|
||||
case "Plastic":
|
||||
SetAppearance(LatheVisualState.InsertingPlastic);
|
||||
break;
|
||||
case "Plasma":
|
||||
SetAppearance(LatheVisualState.InsertingPlasma);
|
||||
break;
|
||||
}
|
||||
|
||||
Owner.SpawnTimer(InsertionTime, () =>
|
||||
{
|
||||
State = LatheState.Base;
|
||||
SetAppearance(LatheVisualState.Idle);
|
||||
});
|
||||
|
||||
_entMan.DeleteEntity(eventArgs.Using);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void SetAppearance(LatheVisualState state)
|
||||
{
|
||||
if (_entMan.TryGetComponent(Owner, out AppearanceComponent? appearance))
|
||||
{
|
||||
appearance.SetData(PowerDeviceVisuals.VisualState, state);
|
||||
}
|
||||
}
|
||||
|
||||
private Queue<string> GetIdQueue()
|
||||
{
|
||||
var queue = new Queue<string>();
|
||||
foreach (var recipePrototype in Queue)
|
||||
{
|
||||
queue.Enqueue(recipePrototype.ID);
|
||||
}
|
||||
|
||||
return queue;
|
||||
}
|
||||
|
||||
private enum LatheState : byte
|
||||
{
|
||||
Base,
|
||||
Inserting,
|
||||
Producing
|
||||
}
|
||||
/// <summmary>
|
||||
/// The lathe's UI.
|
||||
/// </summary>
|
||||
[ViewVariables] public BoundUserInterface? UserInterface;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Content.Server.Lathe.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// For EntityQuery to keep track of which lathes are inserting
|
||||
/// <summary>
|
||||
[RegisterComponent]
|
||||
public sealed class LatheInsertingComponent : Component
|
||||
{}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Content.Server.Lathe.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// For EntityQuery to keep track of which lathes are producing
|
||||
/// <summary>
|
||||
[RegisterComponent]
|
||||
public sealed class LatheProducingComponent : Component
|
||||
{}
|
||||
}
|
||||
@@ -1,21 +1,286 @@
|
||||
using Content.Server.Lathe.Components;
|
||||
using Content.Shared.Lathe;
|
||||
using Content.Shared.Materials;
|
||||
using Content.Shared.Research.Prototypes;
|
||||
using Content.Server.Research.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Server.Materials;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.Stack;
|
||||
using Content.Server.UserInterface;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Audio;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.GameObjects;
|
||||
|
||||
namespace Content.Server.Lathe
|
||||
{
|
||||
[UsedImplicitly]
|
||||
internal sealed class LatheSystem : EntitySystem
|
||||
public sealed class LatheSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<LatheComponent, InteractUsingEvent>(OnInteractUsing);
|
||||
SubscribeLocalEvent<LatheComponent, ComponentInit>(OnComponentInit);
|
||||
}
|
||||
|
||||
// These queues are to add/remove COMPONENTS to the lathes
|
||||
private Queue<EntityUid> ProducingAddQueue = new();
|
||||
private Queue<EntityUid> ProducingRemoveQueue = new();
|
||||
private Queue<EntityUid> InsertingAddQueue = new();
|
||||
private Queue<EntityUid> InsertingRemoveQueue = new();
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
foreach (var comp in EntityManager.EntityQuery<LatheComponent>())
|
||||
foreach (var uid in ProducingAddQueue)
|
||||
EnsureComp<LatheProducingComponent>(uid);
|
||||
ProducingAddQueue.Clear();
|
||||
foreach (var uid in ProducingRemoveQueue)
|
||||
RemComp<LatheProducingComponent>(uid);
|
||||
ProducingRemoveQueue.Clear();
|
||||
foreach (var uid in InsertingAddQueue)
|
||||
EnsureComp<LatheInsertingComponent>(uid);
|
||||
InsertingAddQueue.Clear();
|
||||
foreach (var uid in InsertingRemoveQueue)
|
||||
RemComp<LatheInsertingComponent>(uid);
|
||||
InsertingRemoveQueue.Clear();
|
||||
|
||||
foreach (var (insertingComp, lathe) in EntityQuery<LatheInsertingComponent, LatheComponent>(false))
|
||||
{
|
||||
if (comp.Producing == false && comp.Queue.Count > 0)
|
||||
if (lathe.InsertionAccumulator < lathe.InsertionTime)
|
||||
{
|
||||
comp.Produce(comp.Queue.Dequeue());
|
||||
lathe.InsertionAccumulator += frameTime;
|
||||
continue;
|
||||
}
|
||||
lathe.InsertionAccumulator = 0;
|
||||
UpdateInsertingAppearance(lathe.Owner, false);
|
||||
InsertingRemoveQueue.Enqueue(lathe.Owner);
|
||||
}
|
||||
|
||||
foreach (var (producingComp, lathe) in EntityQuery<LatheProducingComponent, LatheComponent>(false))
|
||||
{
|
||||
if (lathe.ProducingRecipe == null)
|
||||
continue;
|
||||
if (lathe.ProducingAccumulator < lathe.ProducingRecipe.CompleteTime.TotalSeconds)
|
||||
{
|
||||
lathe.ProducingAccumulator += frameTime;
|
||||
continue;
|
||||
}
|
||||
lathe.ProducingAccumulator = 0;
|
||||
|
||||
FinishProducing(lathe.ProducingRecipe, lathe);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize the UI and appearance.
|
||||
/// Appearance requires initialization or the layers break
|
||||
/// </summary>
|
||||
private void OnComponentInit(EntityUid uid, LatheComponent component, ComponentInit args)
|
||||
{
|
||||
component.UserInterface = uid.GetUIOrNull(LatheUiKey.Key);
|
||||
if (component.UserInterface != null)
|
||||
{
|
||||
component.UserInterface.OnReceiveMessage += msg => UserInterfaceOnOnReceiveMessage(uid, component, msg);
|
||||
}
|
||||
|
||||
if (!TryComp<AppearanceComponent>(uid, out var appearance))
|
||||
return;
|
||||
appearance.SetData(LatheVisuals.IsInserting, false);
|
||||
appearance.SetData(LatheVisuals.IsRunning, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When someone tries to use an item on the lathe,
|
||||
/// insert it if it's a stack and fits inside
|
||||
/// </summary>
|
||||
private void OnInteractUsing(EntityUid uid, LatheComponent component, InteractUsingEvent args)
|
||||
{
|
||||
if (!TryComp<MaterialStorageComponent>(uid, out var storage) || !TryComp<MaterialComponent>(args.Used, out var material))
|
||||
return;
|
||||
|
||||
var multiplier = 1;
|
||||
|
||||
if (TryComp<StackComponent>(args.Used, out var stack))
|
||||
multiplier = stack.Count;
|
||||
|
||||
var totalAmount = 0;
|
||||
|
||||
// Check if it can insert all materials.
|
||||
foreach (var mat in material.MaterialIds)
|
||||
{
|
||||
// TODO: Change how MaterialComponent works so this is not hard-coded.
|
||||
if (!storage.CanInsertMaterial(mat, component.VolumePerSheet * multiplier))
|
||||
return;
|
||||
totalAmount += component.VolumePerSheet * multiplier;
|
||||
}
|
||||
|
||||
// Check if it can take ALL of the material's volume.
|
||||
if (storage.StorageLimit > 0 && !storage.CanTakeAmount(totalAmount))
|
||||
return;
|
||||
var lastMat = string.Empty;
|
||||
foreach (var mat in material.MaterialIds)
|
||||
{
|
||||
storage.InsertMaterial(mat, component.VolumePerSheet * multiplier);
|
||||
lastMat = mat;
|
||||
}
|
||||
/// We need the prototype to get the color
|
||||
_prototypeManager.TryIndex(lastMat, out MaterialPrototype? matProto);
|
||||
|
||||
EntityManager.QueueDeleteEntity(args.Used);
|
||||
InsertingAddQueue.Enqueue(uid);
|
||||
_popupSystem.PopupEntity(Loc.GetString("machine-insert-item", ("machine", uid),
|
||||
("item", args.Used)), uid, Filter.Entities(args.User));
|
||||
if (matProto != null)
|
||||
{
|
||||
UpdateInsertingAppearance(uid, true, matProto.Color);
|
||||
}
|
||||
UpdateInsertingAppearance(uid, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This handles the checks to start producing an item, and
|
||||
/// starts up the sound and visuals
|
||||
/// </summary>
|
||||
private bool Produce(LatheComponent component, LatheRecipePrototype recipe, bool SkipCheck = false)
|
||||
{
|
||||
if (!component.CanProduce(recipe)
|
||||
|| !TryComp(component.Owner, out MaterialStorageComponent? storage))
|
||||
return false;
|
||||
|
||||
if (!SkipCheck && HasComp<LatheProducingComponent>(component.Owner))
|
||||
return false;
|
||||
|
||||
if (TryComp<ApcPowerReceiverComponent>(component.Owner, out var receiver) && !receiver.Powered)
|
||||
return false;
|
||||
|
||||
component.UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue(component)));
|
||||
|
||||
component.ProducingRecipe = recipe;
|
||||
|
||||
foreach (var (material, amount) in recipe.RequiredMaterials)
|
||||
{
|
||||
// This should always return true, otherwise CanProduce fucked up.
|
||||
storage.RemoveMaterial(material, amount);
|
||||
}
|
||||
|
||||
component.UserInterface?.SendMessage(new LatheProducingRecipeMessage(recipe.ID));
|
||||
if (component.ProducingSound != null)
|
||||
{
|
||||
SoundSystem.Play(Filter.Pvs(component.Owner), component.ProducingSound.GetSound(), component.Owner);
|
||||
}
|
||||
UpdateRunningAppearance(component.Owner, true);
|
||||
ProducingAddQueue.Enqueue(component.Owner);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// After the production timer is up, this spawns the recipe and
|
||||
/// either cleans up or continues to the next item in the queue
|
||||
/// </summary>
|
||||
private void FinishProducing(LatheRecipePrototype recipe, LatheComponent component)
|
||||
{
|
||||
component.ProducingRecipe = null;
|
||||
EntityManager.SpawnEntity(recipe.Result, Comp<TransformComponent>(component.Owner).Coordinates);
|
||||
component.UserInterface?.SendMessage(new LatheStoppedProducingRecipeMessage());
|
||||
// Continue to next in queue if there are items left
|
||||
if (component.Queue.Count > 0)
|
||||
{
|
||||
Produce(component, component.Queue.Dequeue(), true);
|
||||
return;
|
||||
}
|
||||
ProducingRemoveQueue.Enqueue(component.Owner);
|
||||
UpdateRunningAppearance(component.Owner, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the machine sprite to either play the running animation
|
||||
/// or stop.
|
||||
/// </summary>
|
||||
private void UpdateRunningAppearance(EntityUid uid, bool isRunning)
|
||||
{
|
||||
if (!TryComp<AppearanceComponent>(uid, out var appearance))
|
||||
return;
|
||||
|
||||
appearance.SetData(LatheVisuals.IsRunning, isRunning);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the machine sprite to play the inserting animation
|
||||
/// and sets the color of the inserted mat if applicable
|
||||
/// </summary>
|
||||
private void UpdateInsertingAppearance(EntityUid uid, bool isInserting, Color? color = null)
|
||||
{
|
||||
if (!TryComp<AppearanceComponent>(uid, out var appearance))
|
||||
return;
|
||||
|
||||
appearance.SetData(LatheVisuals.IsInserting, isInserting);
|
||||
if (color != null)
|
||||
appearance.SetData(LatheVisuals.InsertingColor, color);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles all the button presses in the lathe UI
|
||||
/// </summary>
|
||||
private void UserInterfaceOnOnReceiveMessage(EntityUid uid, LatheComponent component, ServerBoundUserInterfaceMessage message)
|
||||
{
|
||||
if (TryComp<ApcPowerReceiverComponent>(uid, out var receiver) && !receiver.Powered)
|
||||
return;
|
||||
|
||||
switch (message.Message)
|
||||
{
|
||||
case LatheQueueRecipeMessage msg:
|
||||
_prototypeManager.TryIndex(msg.ID, out LatheRecipePrototype? recipe);
|
||||
if (recipe != null!)
|
||||
for (var i = 0; i < msg.Quantity; i++)
|
||||
{
|
||||
component.Queue.Enqueue(recipe);
|
||||
component.UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue(component)));
|
||||
}
|
||||
if (!HasComp<LatheProducingComponent>(component.Owner) && component.Queue.Count > 0)
|
||||
Produce(component, component.Queue.Dequeue());
|
||||
|
||||
break;
|
||||
case LatheSyncRequestMessage _:
|
||||
if (!HasComp<MaterialStorageComponent>(uid)) return;
|
||||
component.UserInterface?.SendMessage(new LatheFullQueueMessage(GetIdQueue(component)));
|
||||
if (component.ProducingRecipe != null)
|
||||
component.UserInterface?.SendMessage(new LatheProducingRecipeMessage(component.ProducingRecipe.ID));
|
||||
break;
|
||||
|
||||
case LatheServerSelectionMessage _:
|
||||
if (!TryComp(uid, out ResearchClientComponent? researchClient)) return;
|
||||
researchClient.OpenUserInterface(message.Session);
|
||||
break;
|
||||
|
||||
case LatheServerSyncMessage _:
|
||||
if (!TryComp(uid, out TechnologyDatabaseComponent? database)
|
||||
|| !TryComp(uid, out ProtolatheDatabaseComponent? protoDatabase)) return;
|
||||
|
||||
if (database.SyncWithServer())
|
||||
protoDatabase.Sync();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the prototypes in the lathe's construction queue
|
||||
/// </summary>
|
||||
private Queue<string> GetIdQueue(LatheComponent lathe)
|
||||
{
|
||||
var queue = new Queue<string>();
|
||||
foreach (var recipePrototype in lathe.Queue)
|
||||
{
|
||||
queue.Enqueue(recipePrototype.ID);
|
||||
}
|
||||
return queue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
94
Content.Shared/Lathe/LatheMessages.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Lathe;
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to sync material storage and the recipe queue.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheSyncRequestMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheSyncRequestMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to sync the lathe's technology database with the research server.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheServerSyncMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheServerSyncMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to open the ResearchClient UI.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheServerSelectionMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheServerSelectionMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client when the lathe is producing a recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheProducingRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly string ID;
|
||||
public LatheProducingRecipeMessage(string id)
|
||||
{
|
||||
ID = id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client when the lathe stopped/finished producing a recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheStoppedProducingRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheStoppedProducingRecipeMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client to let it know about the recipe queue.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheFullQueueMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly Queue<string> Recipes;
|
||||
public LatheFullQueueMessage(Queue<string> recipes)
|
||||
{
|
||||
Recipes = recipes;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server when a client queues a new recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheQueueRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly string ID;
|
||||
public readonly int Quantity;
|
||||
public LatheQueueRecipeMessage(string id, int quantity)
|
||||
{
|
||||
ID = id;
|
||||
Quantity = quantity;
|
||||
}
|
||||
}
|
||||
|
||||
[NetSerializable, Serializable]
|
||||
public enum LatheUiKey
|
||||
{
|
||||
Key,
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using System;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Lathe
|
||||
{
|
||||
[Serializable, NetSerializable]
|
||||
public enum LatheVisualState
|
||||
{
|
||||
Idle,
|
||||
Producing,
|
||||
InsertingMetal,
|
||||
InsertingGlass,
|
||||
InsertingGold,
|
||||
InsertingPlasma,
|
||||
InsertingPlastic
|
||||
}
|
||||
}
|
||||
17
Content.Shared/Lathe/LatheVisuals.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Lathe
|
||||
{
|
||||
[Serializable, NetSerializable]
|
||||
/// <summary>
|
||||
/// Stores bools for if the machine is on
|
||||
/// and if it's currently running and/or inserting.
|
||||
/// Used for the visualizer
|
||||
/// </summary>
|
||||
public enum LatheVisuals : byte
|
||||
{
|
||||
IsRunning,
|
||||
IsInserting,
|
||||
InsertingColor
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Content.Shared.Research.Prototypes;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Lathe
|
||||
{
|
||||
@@ -24,7 +19,7 @@ namespace Content.Shared.Lathe
|
||||
|
||||
foreach (var (material, amount) in recipe.RequiredMaterials)
|
||||
{
|
||||
if (storage[material] <= (amount * quantity)) return false;
|
||||
if (storage[material] < (amount * quantity)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -34,98 +29,5 @@ namespace Content.Shared.Lathe
|
||||
{
|
||||
return PrototypeManager.TryIndex(id, out LatheRecipePrototype? recipe) && CanProduce(recipe, quantity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to sync material storage and the recipe queue.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheSyncRequestMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheSyncRequestMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to sync the lathe's technology database with the research server.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheServerSyncMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheServerSyncMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server to open the ResearchClient UI.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheServerSelectionMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheServerSelectionMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client when the lathe is producing a recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheProducingRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly string ID;
|
||||
public LatheProducingRecipeMessage(string id)
|
||||
{
|
||||
ID = id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client when the lathe stopped/finished producing a recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheStoppedProducingRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public LatheStoppedProducingRecipeMessage()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the client to let it know about the recipe queue.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheFullQueueMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly Queue<string> Recipes;
|
||||
public LatheFullQueueMessage(Queue<string> recipes)
|
||||
{
|
||||
Recipes = recipes;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent to the server when a client queues a new recipe.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class LatheQueueRecipeMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly string ID;
|
||||
public readonly int Quantity;
|
||||
public LatheQueueRecipeMessage(string id, int quantity)
|
||||
{
|
||||
ID = id;
|
||||
Quantity = quantity;
|
||||
}
|
||||
}
|
||||
|
||||
[NetSerializable, Serializable]
|
||||
public enum LatheUiKey
|
||||
{
|
||||
Key,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Content.Shared.Materials;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Serialization.Manager.Attributes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
||||
using Robust.Shared.Utility;
|
||||
using Robust.Shared.ViewVariables;
|
||||
|
||||
namespace Content.Shared.Research.Prototypes
|
||||
{
|
||||
@@ -32,7 +27,7 @@ namespace Content.Shared.Research.Prototypes
|
||||
private string _result = string.Empty;
|
||||
|
||||
[DataField("completetime")]
|
||||
private int _completeTime = 2500;
|
||||
private TimeSpan _completeTime = TimeSpan.FromSeconds(5);
|
||||
|
||||
[DataField("materials", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, MaterialPrototype>))]
|
||||
private Dictionary<string, int> _requiredMaterials = new();
|
||||
@@ -102,6 +97,6 @@ namespace Content.Shared.Research.Prototypes
|
||||
/// Might lower depending on the lathe's upgrade level.
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
public int CompleteTime => _completeTime;
|
||||
public TimeSpan CompleteTime => _completeTime;
|
||||
}
|
||||
}
|
||||
|
||||
BIN
Resources/Audio/Machines/circuitprinter.ogg
Normal file
@@ -1,3 +1,7 @@
|
||||
diagnoser_printing.ogg taken from https://freesound.org/people/RobSp1derp1g/sounds/615419/ and edited
|
||||
|
||||
vaccinator_running.ogg taken from https://freesound.org/people/RutgerMuller/sounds/365413/ and edited
|
||||
|
||||
uniformprinter.ogg taken from https://freesound.org/people/sukaton/sounds/60640/ and edited
|
||||
|
||||
circuitprinter.ogg taken from https://freesound.org/people/OroborosNZ/sounds/273649/ and https://freesound.org/people/170048@virtualwindow.co.za/sounds/408041/ and edited
|
||||
|
||||
BIN
Resources/Audio/Machines/uniformprinter.ogg
Normal file
1
Resources/Locale/en-US/machine/machine.ftl
Normal file
@@ -0,0 +1 @@
|
||||
machine-insert-item = You insert {THE($item)} into {THE($machine)}.
|
||||
@@ -9,14 +9,18 @@
|
||||
netsync: false
|
||||
layers:
|
||||
- state: icon
|
||||
map: ["enum.AutolatheVisualLayers.Base"]
|
||||
map: ["enum.LatheVisualLayers.IsRunning"]
|
||||
- state: unlit
|
||||
shader: unshaded
|
||||
map: ["enum.AutolatheVisualLayers.BaseUnlit"]
|
||||
- state: building
|
||||
map: ["enum.AutolatheVisualLayers.AnimationLayer"]
|
||||
map: ["enum.PowerDeviceVisualLayers.Powered"]
|
||||
- state: inserting
|
||||
map: ["enum.LatheVisualLayers.IsInserting"]
|
||||
- state: panel
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
- type: Appearance
|
||||
- type: LatheVisuals
|
||||
idleState: icon
|
||||
runningState: building
|
||||
- type: Physics
|
||||
bodyType: Static
|
||||
- type: Fixtures
|
||||
@@ -66,10 +70,6 @@
|
||||
- CableStack
|
||||
- HandheldGPSBasic
|
||||
- HandheldHealthAnalyzer
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: AutolatheVisualizer
|
||||
- type: WiresVisualizer
|
||||
- type: ActivatableUI
|
||||
key: enum.LatheUiKey.Key
|
||||
- type: ActivatableUIRequiresPower
|
||||
@@ -93,14 +93,18 @@
|
||||
netsync: false
|
||||
layers:
|
||||
- state: icon
|
||||
map: ["enum.ProtolatheVisualLayers.Base"]
|
||||
map: ["enum.LatheVisualLayers.IsRunning"]
|
||||
- state: unlit
|
||||
shader: unshaded
|
||||
map: ["enum.ProtolatheVisualLayers.BaseUnlit"]
|
||||
- state: building
|
||||
map: ["enum.ProtolatheVisualLayers.AnimationLayer"]
|
||||
map: ["enum.PowerDeviceVisualLayers.Powered"]
|
||||
- state: inserting
|
||||
map: ["enum.LatheVisualLayers.IsInserting"]
|
||||
- state: panel
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
- type: Appearance
|
||||
- type: LatheVisuals
|
||||
idleState: icon
|
||||
runningState: building
|
||||
- type: Physics
|
||||
bodyType: Static
|
||||
- type: Fixtures
|
||||
@@ -196,10 +200,6 @@
|
||||
type: LatheBoundUserInterface
|
||||
- key: enum.ResearchClientUiKey.Key
|
||||
type: ResearchClientBoundUserInterface
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: ProtolatheVisualizer
|
||||
- type: WiresVisualizer
|
||||
- type: Transform
|
||||
anchored: true
|
||||
- type: Pullable
|
||||
@@ -216,12 +216,10 @@
|
||||
sprite: Structures/Machines/circuit_imprinter.rsi
|
||||
layers:
|
||||
- state: icon
|
||||
map: ["enum.ProtolatheVisualLayers.Base"]
|
||||
map: ["enum.LatheVisualLayers.IsRunning"]
|
||||
- state: unlit
|
||||
shader: unshaded
|
||||
map: ["enum.ProtolatheVisualLayers.BaseUnlit"]
|
||||
- state: building
|
||||
map: ["enum.ProtolatheVisualLayers.AnimationLayer"]
|
||||
map: ["enum.PowerDeviceVisualLayers.Powered"]
|
||||
- state: panel
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
- type: ProtolatheDatabase
|
||||
@@ -248,6 +246,8 @@
|
||||
- StasisBedMachineCircuitboard
|
||||
- type: Machine
|
||||
board: CircuitImprinterMachineCircuitboard
|
||||
- type: Lathe
|
||||
producingSound: /Audio/Machines/circuitprinter.ogg
|
||||
|
||||
- type: entity
|
||||
parent: Protolathe
|
||||
@@ -260,14 +260,16 @@
|
||||
sprite: Structures/Machines/security_techfab.rsi
|
||||
layers:
|
||||
- state: icon
|
||||
map: ["enum.ProtolatheVisualLayers.Base"]
|
||||
map: ["enum.LatheVisualLayers.IsRunning"]
|
||||
- state: unlit
|
||||
shader: unshaded
|
||||
map: ["enum.ProtolatheVisualLayers.BaseUnlit"]
|
||||
- state: icon
|
||||
map: ["enum.ProtolatheVisualLayers.AnimationLayer"]
|
||||
map: ["enum.PowerDeviceVisualLayers.Powered"]
|
||||
- state: inserting
|
||||
map: ["enum.LatheVisualLayers.IsInserting"]
|
||||
- state: panel
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
idleState: icon
|
||||
runningState: icon
|
||||
- type: ProtolatheDatabase
|
||||
protolatherecipes:
|
||||
- Flash
|
||||
@@ -375,13 +377,8 @@
|
||||
netsync: false
|
||||
layers:
|
||||
- state: icon
|
||||
map: ["enum.AutolatheVisualLayers.Base"]
|
||||
- state: unlit
|
||||
shader: unshaded
|
||||
map: ["enum.AutolatheVisualLayers.BaseUnlit"]
|
||||
- state: building
|
||||
map: ["enum.AutolatheVisualLayers.AnimationLayer"]
|
||||
- state: panel
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
map: ["enum.LatheVisualLayers.IsRunning"]
|
||||
- type: Machine
|
||||
board: UniformPrinterMachineCircuitboard
|
||||
- type: Lathe
|
||||
producingSound: /Audio/Machines/uniformprinter.ogg
|
||||
|
||||
@@ -3,33 +3,39 @@
|
||||
stack: Glass
|
||||
name: glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/glass.png
|
||||
color: "#a8ccd7"
|
||||
|
||||
- type: material
|
||||
id: ReinforcedGlass
|
||||
stack: ReinforcedGlass
|
||||
name: reinforced glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/rglass.png
|
||||
color: "#549bb0"
|
||||
|
||||
- type: material
|
||||
id: PlasmaGlass
|
||||
stack: PlasmaGlass
|
||||
name: plasma glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/pglass.png
|
||||
color: "#b35989"
|
||||
|
||||
- type: material
|
||||
id: ReinforcedPlasmaGlass
|
||||
stack: ReinforcedPlasmaGlass
|
||||
name: reinforced plasma glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/rpglass.png
|
||||
color: "#8c4069"
|
||||
|
||||
- type: material
|
||||
id: TitaniumGlass
|
||||
stack: TitaniumGlass
|
||||
name: titanium glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/titaniumglass.png
|
||||
color: "#333135"
|
||||
|
||||
- type: material
|
||||
id: PlastitaniumGlass
|
||||
stack: PlastitaniumGlass
|
||||
name: plastitanium glass
|
||||
icon: Objects/Materials/Sheets/glass.rsi/plastitaniumglass.png
|
||||
color: "#232127"
|
||||
|
||||
@@ -4,33 +4,39 @@
|
||||
stack: Cloth
|
||||
name: cloth
|
||||
icon: /Textures/Objects/Materials/materials.rsi/cloth.png
|
||||
color: "#e7e7de"
|
||||
|
||||
- type: material
|
||||
id: Durathread
|
||||
stack: Durathread
|
||||
name: durathread
|
||||
icon: /Textures/Objects/Materials/materials.rsi/durathread.png
|
||||
color: "#8291a1"
|
||||
|
||||
- type: material
|
||||
id: Plasma
|
||||
stack: Plasma
|
||||
name: plasma
|
||||
icon: Objects/Materials/Sheets/other.rsi/plasma.png
|
||||
color: "#7e009e"
|
||||
|
||||
- type: material
|
||||
id: Phoron
|
||||
stack: Phoron
|
||||
name: phoron
|
||||
icon: Objects/Materials/Sheets/other.rsi/phoron.png
|
||||
color: "#FF3300"
|
||||
|
||||
- type: material
|
||||
id: Plastic
|
||||
stack: Plastic
|
||||
name: plastic
|
||||
icon: Objects/Materials/Sheets/other.rsi/plastic.png
|
||||
color: "#d9d9d9"
|
||||
|
||||
- type: material
|
||||
id: Wood
|
||||
stack: WoodPlank
|
||||
name: wood
|
||||
icon: Objects/Materials/materials.rsi/wood.png
|
||||
color: "#966F33"
|
||||
|
||||
@@ -9,18 +9,21 @@
|
||||
stack: Adamantine
|
||||
name: adamantine
|
||||
icon: Objects/Materials/ingots.rsi/adamantine.png
|
||||
color: "#7dc37f"
|
||||
|
||||
- type: material
|
||||
id: Copper
|
||||
stack: Copper
|
||||
name: copper
|
||||
icon: Objects/Materials/ingots.rsi/copper.png
|
||||
color: "#B87333"
|
||||
|
||||
- type: material
|
||||
id: Gold
|
||||
stack: Gold
|
||||
name: gold
|
||||
icon: Objects/Materials/ingots.rsi/gold.png
|
||||
color: "#FFD700"
|
||||
|
||||
- type: material
|
||||
id: Hydrogen
|
||||
@@ -32,34 +35,39 @@
|
||||
id: Iron
|
||||
stack: Iron
|
||||
name: iron
|
||||
icon: Objects/Materials/ingots.rsi/iron.png
|
||||
icon: Objects/Materials/ingots.rsi/iron.png #Do we even distinguish between steel and iron?
|
||||
|
||||
- type: material
|
||||
id: Silver
|
||||
stack: Silver
|
||||
name: silver
|
||||
icon: Objects/Materials/ingots.rsi/silver.png
|
||||
color: "#C0C0C0"
|
||||
|
||||
- type: material
|
||||
id: Plasteel
|
||||
stack: Plasteel
|
||||
name: plasteel
|
||||
icon: Objects/Materials/Sheets/metal.rsi/plasteel.png
|
||||
color: "#696969" #Okay, this is epic
|
||||
|
||||
- type: material
|
||||
id: Brass
|
||||
stack: Brass
|
||||
name: brass
|
||||
icon: Objects/Materials/Sheets/metal.rsi/brass.png
|
||||
color: "#E1C16E"
|
||||
|
||||
- type: material
|
||||
id: Titanium
|
||||
stack: Titanium
|
||||
name: titanium
|
||||
icon: Objects/Materials/Sheets/metal.rsi/titanium.png
|
||||
color: "#878681"
|
||||
|
||||
- type: material
|
||||
id: Plastitanium
|
||||
stack: Plastitanium
|
||||
name: plastitanium
|
||||
icon: Objects/Materials/Sheets/metal.rsi/plastitanium.png
|
||||
color: "#4e4e4b"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: CapacitorStockPart
|
||||
icon: Objects/Misc/stock_parts.rsi/capacitor.png
|
||||
result: CapacitorStockPart
|
||||
completetime: 250
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -11,7 +11,7 @@
|
||||
id: MatterBinStockPart
|
||||
icon: Objects/Misc/stock_parts.rsi/matter_bin.png
|
||||
result: MatterBinStockPart
|
||||
completetime: 250
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -20,7 +20,7 @@
|
||||
id: MicroLaserStockPart
|
||||
icon: Objects/Misc/stock_parts.rsi/micro_laser.png
|
||||
result: MicroLaserStockPart
|
||||
completetime: 250
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 50
|
||||
@@ -30,7 +30,7 @@
|
||||
id: MicroManipulatorStockPart
|
||||
icon: Objects/Misc/stock_parts.rsi/micro_mani.png
|
||||
result: MicroManipulatorStockPart
|
||||
completetime: 250
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -39,7 +39,7 @@
|
||||
id: ScanningModuleStockPart
|
||||
icon: Objects/Misc/stock_parts.rsi/scan_module_static.png
|
||||
result: ScanningModuleStockPart
|
||||
completetime: 250
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 50
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Tools/Hydroponics/hoe.rsi
|
||||
state: icon
|
||||
result: HydroponicsToolMiniHoe
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 100
|
||||
@@ -15,7 +15,7 @@
|
||||
sprite: Objects/Tools/Hydroponics/scythe.rsi
|
||||
state: icon
|
||||
result: HydroponicsToolScythe
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 300
|
||||
Plastic: 200
|
||||
@@ -26,7 +26,7 @@
|
||||
sprite: Objects/Tools/Hydroponics/hatchet.rsi
|
||||
state: icon
|
||||
result: HydroponicsToolHatchet
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 100
|
||||
@@ -37,7 +37,7 @@
|
||||
sprite: Objects/Tools/Hydroponics/spade.rsi
|
||||
state: icon
|
||||
result: HydroponicsToolSpade
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 100
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Structures/conveyor.rsi
|
||||
state: conveyor_loose
|
||||
result: ConveyorBeltAssembly
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 500
|
||||
Plastic: 50
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Specific/Chemistry/beaker.rsi
|
||||
state: beaker
|
||||
result: Beaker
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 100
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
sprite: Objects/Specific/Chemistry/beaker_large.rsi
|
||||
state: beakerlarge
|
||||
result: LargeBeaker
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 200
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
sprite: Objects/Specific/Chemistry/beaker_cryostasis.rsi
|
||||
state: beakernoreact
|
||||
result: CryostasisBeaker
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 250
|
||||
Plastic: 50
|
||||
@@ -35,7 +35,7 @@
|
||||
sprite: Objects/Specific/Chemistry/dropper.rsi
|
||||
state: dropper
|
||||
result: Dropper
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 200
|
||||
Plastic: 100
|
||||
@@ -46,7 +46,7 @@
|
||||
sprite: Objects/Specific/Chemistry/syringe.rsi
|
||||
state: syringe_base0
|
||||
result: Syringe
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
Steel: 25
|
||||
@@ -55,6 +55,6 @@
|
||||
id: PillCanister
|
||||
icon: Objects/Specific/Chemistry/pills_canister.rsi/pill_canister.png
|
||||
result: PillCanister
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/Color/grey.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitColorGrey
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/Color/grey.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtColorGrey
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/bartender.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitBartender
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/bartender.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtBartender
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/captain.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitCaptain
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -57,7 +57,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/captain.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtCaptain
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -68,7 +68,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/cargotech.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitCargo
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/cargotech.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtCargo
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/salvage.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitSalvageSpecialist
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 500 #It's armored but I don't want to include durathread for a non-head
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/ce.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitChiefEngineer
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -109,7 +109,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/ce.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtChiefEngineer
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -120,7 +120,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/chaplain.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitChaplain
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/chaplain.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtChaplain
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/chef.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitChef
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/chef.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtChef
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/chemistry.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitChemistry
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/chemistry.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtChemistry
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/clown.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitClown
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/cmo.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitCMO
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -201,7 +201,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/cmo.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtCMO
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -212,7 +212,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/detective.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitDetective
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/detective.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtDetective
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/engineering.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitEngineering
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/engineering.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtEngineering
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/hop.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitHoP
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -263,7 +263,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/hop.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtHoP
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -274,7 +274,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/hos.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitHoS
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -285,7 +285,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/hos.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtHoS
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -296,7 +296,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/hydro.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitHydroponics
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -306,7 +306,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/hydro.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtHydroponics
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -316,7 +316,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/janitor.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitJanitor
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/janitor.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtJanitor
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/lawyerblack.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitLawyerBlack
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -346,7 +346,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/librarian.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitLibrarian
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/Color/lightbrown.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtColorLightBrown
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -366,7 +366,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/medical.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitMedicalDoctor
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -376,7 +376,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/medical.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtMedicalDoctor
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -386,7 +386,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/mime.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitMime
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -396,7 +396,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/mime.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtMime
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -406,7 +406,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/lawyerpurple.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitLawyerPurple
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -416,7 +416,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/paramedic.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitParamedic
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -426,7 +426,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/paramedic.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtParamedic
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -436,7 +436,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/prisoner.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitPrisoner
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -446,7 +446,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/prisoner.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtPrisoner
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -456,7 +456,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/qm.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitQM
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -466,7 +466,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/qm.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtQM
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/rnd.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitResearchDirector
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -487,7 +487,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/rnd.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtResearchDirector
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
Durathread: 100
|
||||
@@ -498,7 +498,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/scientist.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitScientist
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -508,7 +508,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/scientist.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtScientist
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -518,7 +518,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/security.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitSec
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -528,7 +528,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/security.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtSec
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -538,7 +538,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpsuit/warden.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpsuitWarden
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
@@ -548,7 +548,7 @@
|
||||
sprite: Clothing/Uniforms/Jumpskirt/warden.rsi
|
||||
state: icon
|
||||
result: ClothingUniformJumpskirtWarden
|
||||
completetime: 800
|
||||
completetime: 4
|
||||
materials:
|
||||
Cloth: 300
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Weapons/Melee/cleaver.rsi
|
||||
state: butch
|
||||
result: ButchCleaver
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 300
|
||||
Plastic: 50
|
||||
@@ -15,7 +15,7 @@
|
||||
sprite: Objects/Weapons/Melee/kitchen_knife.rsi
|
||||
state: icon
|
||||
result: KitchenKnife
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 50
|
||||
@@ -24,7 +24,7 @@
|
||||
id: DrinkMug
|
||||
icon: Objects/Consumable/Drinks/mug.rsi
|
||||
result: DrinkMug
|
||||
completetime: 200
|
||||
completetime: 0.8
|
||||
materials:
|
||||
Glass: 50
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
id: DrinkMugMetal
|
||||
icon: Objects/Consumable/Drinks/mug_metal.rsi
|
||||
result: DrinkMugMetal
|
||||
completetime: 200
|
||||
completetime: 0.8
|
||||
materials:
|
||||
Steel: 50
|
||||
|
||||
@@ -40,6 +40,6 @@
|
||||
id: DrinkGlass
|
||||
icon: Objects/Consumable/Drinks/glass_clear.rsi
|
||||
result: DrinkGlass
|
||||
completetime: 200
|
||||
completetime: 0.8
|
||||
materials:
|
||||
Glass: 50
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: FirelockElectronics
|
||||
icon: Objects/Misc/module.rsi/mainboard.png
|
||||
result: FirelockElectronics
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -11,7 +11,7 @@
|
||||
id: DoorElectronics
|
||||
icon: Objects/Misc/module.rsi/door_electronics.png
|
||||
result: DoorElectronics
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -20,7 +20,7 @@
|
||||
id: AirAlarmElectronics
|
||||
icon: Objects/Misc/module.rsi/airalarm_electronics.png
|
||||
result: AirAlarmElectronics
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -29,7 +29,7 @@
|
||||
id: FireAlarmElectronics
|
||||
icon: Objects/Misc/module.rsi/door_electronics.png
|
||||
result: FireAlarmElectronics
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Plastic: 50
|
||||
@@ -38,7 +38,7 @@
|
||||
id: CloningPodMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: CloningPodMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -48,7 +48,7 @@
|
||||
id: ThermomachineFreezerMachineCircuitBoard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ThermomachineFreezerMachineCircuitBoard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 150
|
||||
Glass: 900
|
||||
@@ -58,7 +58,7 @@
|
||||
id: MedicalScannerMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: MedicalScannerMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -67,7 +67,7 @@
|
||||
id: ChemMasterMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ChemMasterMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -76,7 +76,7 @@
|
||||
id: ChemDispenserMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ChemDispenserMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -86,7 +86,7 @@
|
||||
id: HydroponicsTrayMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: HydroponicsTrayMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -95,7 +95,7 @@
|
||||
id: AutolatheMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: AutolatheMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -104,7 +104,7 @@
|
||||
id: ProtolatheMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ProtolatheMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -113,7 +113,7 @@
|
||||
id: CircuitImprinterMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: CircuitImprinterMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -122,7 +122,7 @@
|
||||
id: UniformPrinterMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: UniformPrinterMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -131,7 +131,7 @@
|
||||
id: VaccinatorMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: VaccinatorMachineCircuitboard
|
||||
completetime: 100
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -141,7 +141,7 @@
|
||||
id: DiagnoserMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: DiagnoserMachineCircuitboard
|
||||
completetime: 100
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -152,7 +152,7 @@
|
||||
id: ReagentGrinderMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ReagentGrinderMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -161,7 +161,7 @@
|
||||
id: CrewMonitoringComputerCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: CrewMonitoringComputerCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -170,7 +170,7 @@
|
||||
id: ShuttleConsoleCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: ShuttleConsoleCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -180,7 +180,7 @@
|
||||
id: DawInstrumentMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: DawInstrumentMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -199,7 +199,7 @@
|
||||
id: APCElectronics
|
||||
icon: Objects/Misc/module.rsi/charger_APC.png
|
||||
result: APCElectronics
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 100
|
||||
@@ -208,7 +208,7 @@
|
||||
id: SubstationMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: SubstationMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 450
|
||||
@@ -217,7 +217,7 @@
|
||||
id: WallmountSubstationElectronics
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: WallmountSubstationElectronics
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 350
|
||||
@@ -226,7 +226,7 @@
|
||||
id: SMESMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/power_mod.png
|
||||
result: SMESMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
@@ -235,7 +235,7 @@
|
||||
id: GeneratorPlasmaMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: GeneratorPlasmaMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 350
|
||||
@@ -244,7 +244,7 @@
|
||||
id: GeneratorUraniumMachineCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: GeneratorUraniumMachineCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 350
|
||||
@@ -253,7 +253,7 @@
|
||||
id: WallmountGeneratorElectronics
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: WallmountGeneratorElectronics
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 350
|
||||
@@ -262,7 +262,7 @@
|
||||
id: WallmountGeneratorAPUElectronics
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: WallmountGeneratorAPUElectronics
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 350
|
||||
@@ -271,7 +271,7 @@
|
||||
id: SolarControlComputerCircuitboard
|
||||
icon: Objects/Misc/module.rsi/id_mod.png
|
||||
result: SolarControlComputerCircuitboard
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 900
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Specific/Janitorial/mop.rsi
|
||||
state: mop
|
||||
result: MopItem
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
id: MopBucket
|
||||
icon: Objects/Specific/Janitorial/janitorial.rsi
|
||||
result: MopBucket
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
Plastic: 100
|
||||
@@ -23,7 +23,7 @@
|
||||
sprite: Objects/Tools/bucket.rsi
|
||||
state: icon
|
||||
result: Bucket
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
id: WetFloorSign
|
||||
icon: Objects/Specific/Janitorial/wet_floor_sign.rsi
|
||||
result: WetFloorSign
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
sprite: Objects/Specific/Janitorial/janitorial.rsi
|
||||
state: cleaner
|
||||
result: SprayBottle
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
id: TrashBag
|
||||
icon: Objects/Specific/Janitorial/trashbag.rsi
|
||||
result: TrashBag
|
||||
completetime: 300
|
||||
completetime: 1.2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
id: LightReplacer
|
||||
icon: Objects/Specific/Janitorial/light_replacer.rsi
|
||||
result: LightReplacer
|
||||
completetime: 600
|
||||
completetime: 2.4
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 1000
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: Scalpel
|
||||
icon: Objects/Specific/Medical/Surgery/scalpel.rsi/scalpel.png
|
||||
result: Scalpel
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
id: Retractor
|
||||
icon: Objects/Specific/Medical/Surgery/scissors.rsi/retractor.png
|
||||
result: Scalpel
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
id: Cautery
|
||||
icon: Objects/Specific/Medical/Surgery/cautery.rsi/cautery.png
|
||||
result: Cautery
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
id: Drill
|
||||
icon: Objects/Specific/Medical/Surgery/drill.rsi/drill.png
|
||||
result: Drill
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 100
|
||||
@@ -35,7 +35,7 @@
|
||||
id: Saw
|
||||
icon: Objects/Specific/Medical/Surgery/saw.rsi/saw.png
|
||||
result: Saw
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
id: Hemostat
|
||||
icon: Objects/Specific/Medical/Surgery/scissors.rsi/hemostat.png
|
||||
result: Hemostat
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
id: BodyBag_Folded
|
||||
icon: Objects/Specific/Medical/Morgue/bodybags.rsi/bag_folded.png
|
||||
result: BodyBag_Folded
|
||||
completetime: 300
|
||||
completetime: 1.2
|
||||
materials:
|
||||
Plastic: 200
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
id: HandheldCrewMonitor
|
||||
icon: Objects/Specific/Medical/handheldcrewmonitor.rsi/icon.png
|
||||
result: HandheldCrewMonitor
|
||||
completetime: 5000
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 1200
|
||||
Steel: 1000
|
||||
@@ -69,7 +69,7 @@
|
||||
id: HandheldHealthAnalyzer
|
||||
icon: Objects/Specific/Medical/healthanalyzer.rsi/icon.png
|
||||
result: HandheldHealthAnalyzer
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Glass: 500
|
||||
Steel: 500
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: LightTube
|
||||
icon: Objects/Power/light_tube.rsi/normal.png
|
||||
result: LightTube
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 50
|
||||
@@ -11,7 +11,7 @@
|
||||
id: LightBulb
|
||||
icon: Objects/Power/light_bulb.rsi/normal.png
|
||||
result: LightBulb
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 50
|
||||
Glass: 50
|
||||
@@ -20,7 +20,7 @@
|
||||
id: PowerCellSmallHigh
|
||||
icon: Objects/Power/PowerCells/power_cell_small_hi.rsi
|
||||
result: PowerCellSmallHigh
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 100
|
||||
@@ -29,7 +29,7 @@
|
||||
id: GlowstickRed
|
||||
icon: Objects/Misc/glowstick.rsi
|
||||
result: GlowstickRed
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 50
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
id: Flare
|
||||
icon: Objects/Misc/flare.rsi
|
||||
result: Flare
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 50
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
sprite: Objects/Tools/flashlight.rsi
|
||||
state: flashlight
|
||||
result: FlashlightLantern
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
Glass: 100
|
||||
@@ -59,7 +59,7 @@
|
||||
sprite: Objects/Misc/fire_extinguisher.rsi
|
||||
state: fire_extinguisher_closed
|
||||
result: FireExtinguisher
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
id: Matchbox
|
||||
icon: Objects/Tools/matches.rsi
|
||||
result: Matchbox
|
||||
completetime: 10
|
||||
completetime: 1
|
||||
materials:
|
||||
Wood: 100
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
sprite: Mobs/Silicon/drone.rsi
|
||||
state: shell
|
||||
result: Drone
|
||||
completetime: 1500
|
||||
completetime: 6
|
||||
materials:
|
||||
Steel: 500
|
||||
Glass: 500
|
||||
@@ -89,7 +89,7 @@
|
||||
sprite: Objects/Fun/Instruments/h_synthesizer.rsi
|
||||
state: icon
|
||||
result: SynthesizerInstrument
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 300
|
||||
Plastic: 300
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Misc/handcuffs.rsi
|
||||
state: handcuff
|
||||
result: Handcuffs
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 300
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
sprite: Objects/Weapons/Melee/stunbaton.rsi
|
||||
state: stunbaton_off
|
||||
result: Stunbaton
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 300
|
||||
Plastic: 300
|
||||
@@ -25,7 +25,7 @@
|
||||
sprite: Objects/Weapons/Melee/flash.rsi
|
||||
state: flash
|
||||
result: Flash
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 100
|
||||
Plastic: 200
|
||||
@@ -37,7 +37,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell_beanbag.rsi
|
||||
state: base
|
||||
result: ShellShotgunBeanbag
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 15
|
||||
Steel: 10
|
||||
@@ -48,7 +48,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgePistolRubber
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 5
|
||||
Steel: 5
|
||||
@@ -59,7 +59,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeMagnumRubber
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 5
|
||||
Steel: 5
|
||||
@@ -70,7 +70,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeClRifleRubber
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 10
|
||||
Steel: 5
|
||||
@@ -81,7 +81,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeLRifleRubber
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 10
|
||||
Steel: 5
|
||||
@@ -92,7 +92,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeSRifleRubber
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 10
|
||||
Steel: 5
|
||||
@@ -103,7 +103,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgePistol
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 10
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi
|
||||
state: base
|
||||
result: ShellShotgun
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 20
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeMagnum
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 20
|
||||
|
||||
@@ -133,6 +133,6 @@
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/ammo_casing.rsi
|
||||
state: base
|
||||
result: CartridgeLRifle
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 30
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Objects/Materials/Sheets/metal.rsi
|
||||
state: steel
|
||||
result: SheetSteel1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
sprite: Objects/Materials/Sheets/glass.rsi
|
||||
state: glass
|
||||
result: SheetGlass1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 100
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
sprite: Objects/Materials/Sheets/glass.rsi
|
||||
state: rglass
|
||||
result: SheetRGlass1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 100
|
||||
Steel: 50
|
||||
@@ -35,6 +35,6 @@
|
||||
sprite: Objects/Materials/Sheets/other.rsi
|
||||
state: plastic
|
||||
result: SheetPlastic1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 100
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: Wirecutter
|
||||
icon: Objects/Tools/wirecutters.rsi/cutters-map.png
|
||||
result: Wirecutter
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 50
|
||||
@@ -13,7 +13,7 @@
|
||||
sprite: Objects/Tools/screwdriver.rsi
|
||||
state: screwdriver-map
|
||||
result: Screwdriver
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 50
|
||||
@@ -24,7 +24,7 @@
|
||||
sprite: /Textures/Objects/Tools/welder.rsi
|
||||
state: icon
|
||||
result: Welder
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 400
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
id: Wrench
|
||||
icon: Objects/Tools/wrench.rsi/icon.png
|
||||
result: Wrench
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
name: LV cable
|
||||
icon: /Textures/Objects/Tools/cable-coils.rsi/coillv-30.png
|
||||
result: CableApcStack1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 100
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
name: MV cable coil
|
||||
icon: /Textures/Objects/Tools/cable-coils.rsi/coilmv-30.png
|
||||
result: CableMVStack1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 150
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
name: HV cable coil
|
||||
icon: /Textures/Objects/Tools/cable-coils.rsi/coilhv-30.png
|
||||
result: CableHVStack1
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
id: Crowbar
|
||||
icon: Objects/Tools/crowbar.rsi/icon.png
|
||||
result: Crowbar
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
id: Pickaxe
|
||||
icon: Objects/Weapons/Melee/pickaxe.rsi
|
||||
result: Pickaxe
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Wood: 100
|
||||
@@ -86,7 +86,7 @@
|
||||
sprite: Objects/Tools/shovel.rsi
|
||||
state: icon
|
||||
result: Shovel
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Wood: 100
|
||||
@@ -97,7 +97,7 @@
|
||||
sprite: Objects/Tools/multitool.rsi
|
||||
state: icon
|
||||
result: Multitool
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 200
|
||||
Plastic: 200
|
||||
@@ -108,7 +108,7 @@
|
||||
sprite: Objects/Tools/drill.rsi
|
||||
state: drill_screw
|
||||
result: PowerDrill
|
||||
completetime: 500
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 600
|
||||
Plastic: 200
|
||||
@@ -119,7 +119,7 @@
|
||||
sprite: Objects/Tools/rcd.rsi
|
||||
state: icon
|
||||
result: RCD
|
||||
completetime: 1000
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 1000
|
||||
Plastic: 300
|
||||
@@ -130,7 +130,7 @@
|
||||
sprite: Objects/Tools/rcd.rsi
|
||||
state: ammo
|
||||
result: RCDAmmo
|
||||
completetime: 600
|
||||
completetime: 2.4
|
||||
materials:
|
||||
Steel: 500
|
||||
Plastic: 250
|
||||
@@ -139,7 +139,7 @@
|
||||
id: HandheldGPSBasic
|
||||
icon: Objects/Devices/gps.rsi/icon.png
|
||||
result: HandheldGPSBasic
|
||||
completetime: 2000
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 800
|
||||
Glass: 300
|
||||
|
||||
|
Before Width: | Height: | Size: 390 B |
@@ -90,9 +90,6 @@
|
||||
{
|
||||
"name": "leather_3"
|
||||
},
|
||||
{
|
||||
"name": "liggerhide"
|
||||
},
|
||||
{
|
||||
"name": "monkeyhide"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 685 B |
|
After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 656 B |
@@ -33,124 +33,17 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "building_unlit",
|
||||
"name": "inserting",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_unlit",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_glass",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_gold",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_metal",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_phoron",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_plasma",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_plastic",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5,
|
||||
0.5
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 697 B |
@@ -20,68 +20,33 @@
|
||||
"name": "building",
|
||||
"delays": [
|
||||
[
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.16,
|
||||
0.18
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "building_unlit",
|
||||
"delays": [
|
||||
[
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08,
|
||||
0.08
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_unlit"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 452 B |
|
Before Width: | Height: | Size: 473 B |
|
Before Width: | Height: | Size: 468 B |
|
Before Width: | Height: | Size: 445 B |
|
Before Width: | Height: | Size: 490 B |
|
Before Width: | Height: | Size: 447 B |
|
Before Width: | Height: | Size: 486 B |
|
Before Width: | Height: | Size: 461 B |
|
Before Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 458 B |
|
Before Width: | Height: | Size: 397 B |
|
Before Width: | Height: | Size: 435 B |
@@ -37,203 +37,17 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "building_unlit",
|
||||
"name": "inserting",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_unlit",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_glass",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_adamantine",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_bananium",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_diamond",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_silver",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_uranium",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_gold",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_metal",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_phoron",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_plasma",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "inserting_plastic",
|
||||
"delays": [
|
||||
[
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8,
|
||||
0.8
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 5.6 KiB |
@@ -15,6 +15,21 @@
|
||||
},
|
||||
{
|
||||
"name": "unlit"
|
||||
},
|
||||
{
|
||||
"name": "inserting",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -11,12 +11,6 @@
|
||||
"name": "icon",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "panel"
|
||||
},
|
||||
{
|
||||
"name": "unlit"
|
||||
},
|
||||
{
|
||||
"name": "building",
|
||||
"directions": 4,
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |