Margin="5 0 0 0"
Text="{Loc 'lathe-menu-fabricating-message'}">
</Label>
- <EntityPrototypeView
- Name="FabricatingEntityProto"
- HorizontalAlignment="Left"
- Margin="100 0 0 0"
- />
+ <BoxContainer Name="FabricatingDisplayContainer"
+ HorizontalAlignment="Left"
+ Margin="100 0 0 0"/>
<Label
Name="NameLabel"
RectClipContent="True"
-using System.Buffers;
using System.Linq;
using System.Text;
using Content.Client.Materials;
using Content.Shared.Lathe;
using Content.Shared.Lathe.Prototypes;
-using Content.Shared.Materials;
using Content.Shared.Research.Prototypes;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
+using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
-using Robust.Client.ResourceManagement;
-using Robust.Client.Graphics;
using Robust.Shared.Prototypes;
namespace Content.Client.Lathe.UI;
if (SearchBar.Text.Trim().Length != 0)
{
- if (proto.Name.ToLowerInvariant().Contains(SearchBar.Text.Trim().ToLowerInvariant()))
+ if (_lathe.GetRecipeName(recipe).ToLowerInvariant().Contains(SearchBar.Text.Trim().ToLowerInvariant()))
recipesToShow.Add(proto);
}
else
if (!int.TryParse(AmountLineEdit.Text, out var quantity) || quantity <= 0)
quantity = 1;
- var sortedRecipesToShow = recipesToShow.OrderBy(p => p.Name);
+ var sortedRecipesToShow = recipesToShow.OrderBy(_lathe.GetRecipeName);
RecipeList.Children.Clear();
_entityManager.TryGetComponent(Entity, out LatheComponent? lathe);
foreach (var prototype in sortedRecipesToShow)
{
- EntityPrototype? recipeProto = null;
- if (_prototypeManager.TryIndex(prototype.Result, out EntityPrototype? entityProto))
- recipeProto = entityProto;
-
var canProduce = _lathe.CanProduce(Entity, prototype, quantity, component: lathe);
- var control = new RecipeControl(prototype, () => GenerateTooltipText(prototype), canProduce, recipeProto);
+ var control = new RecipeControl(_lathe, prototype, () => GenerateTooltipText(prototype), canProduce, GetRecipeDisplayControl(prototype));
control.OnButtonPressed += s =>
{
if (!int.TryParse(AmountLineEdit.Text, out var amount) || amount <= 0)
StringBuilder sb = new();
var multiplier = _entityManager.GetComponent<LatheComponent>(Entity).MaterialUseMultiplier;
- foreach (var (id, amount) in prototype.RequiredMaterials)
+ foreach (var (id, amount) in prototype.Materials)
{
- if (!_prototypeManager.TryIndex<MaterialPrototype>(id, out var proto))
+ if (!_prototypeManager.TryIndex(id, out var proto))
continue;
var adjustedAmount = SharedLatheSystem.AdjustMaterial(amount, prototype.ApplyMaterialDiscount, multiplier);
sb.AppendLine(tooltipText);
}
- if (!string.IsNullOrWhiteSpace(prototype.Description))
- sb.AppendLine(Loc.GetString("lathe-menu-description-display", ("description", prototype.Description)));
+ var desc = _lathe.GetRecipeDescription(prototype);
+ if (!string.IsNullOrWhiteSpace(desc))
+ sb.AppendLine(Loc.GetString("lathe-menu-description-display", ("description", desc)));
// Remove last newline
if (sb.Length > 0)
var queuedRecipeBox = new BoxContainer();
queuedRecipeBox.Orientation = BoxContainer.LayoutOrientation.Horizontal;
- var queuedRecipeProto = new EntityPrototypeView();
- queuedRecipeBox.AddChild(queuedRecipeProto);
- if (_prototypeManager.TryIndex(recipe.Result, out EntityPrototype? entityProto) && entityProto != null)
- queuedRecipeProto.SetPrototype(entityProto);
+ queuedRecipeBox.AddChild(GetRecipeDisplayControl(recipe));
var queuedRecipeLabel = new Label();
- queuedRecipeLabel.Text = $"{idx}. {recipe.Name}";
+ queuedRecipeLabel.Text = $"{idx}. {_lathe.GetRecipeName(recipe)}";
queuedRecipeBox.AddChild(queuedRecipeLabel);
QueueList.AddChild(queuedRecipeBox);
idx++;
if (recipe == null)
return;
- if (_prototypeManager.TryIndex(recipe.Result, out EntityPrototype? entityProto) && entityProto != null)
- FabricatingEntityProto.SetPrototype(entityProto);
+ FabricatingDisplayContainer.Children.Clear();
+ FabricatingDisplayContainer.AddChild(GetRecipeDisplayControl(recipe));
+
+ NameLabel.Text = _lathe.GetRecipeName(recipe);
+ }
+
+ public Control GetRecipeDisplayControl(LatheRecipePrototype recipe)
+ {
+ if (recipe.Icon != null)
+ {
+ var textRect = new TextureRect();
+ textRect.Texture = _spriteSystem.Frame0(recipe.Icon);
+ return textRect;
+ }
+
+ if (recipe.Result is { } result)
+ {
+ var entProtoView = new EntityPrototypeView();
+ entProtoView.SetPrototype(result);
+ return entProtoView;
+ }
- NameLabel.Text = $"{recipe.Name}";
+ return new Control();
}
private void OnItemSelected(OptionButton.ItemSelectedEventArgs obj)
Margin="0"
StyleClasses="ButtonSquare">
<BoxContainer Orientation="Horizontal">
- <EntityPrototypeView
- Name="RecipePrototype"
+ <BoxContainer
+ Name="RecipeDisplayContainer"
Margin="0 0 4 0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
using Content.Shared.Research.Prototypes;
using Robust.Client.AutoGenerated;
-using Robust.Client.Graphics;
using Robust.Client.UserInterface;
-using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
-using Robust.Shared.Prototypes;
namespace Content.Client.Lathe.UI;
public Action<string>? OnButtonPressed;
public Func<string> TooltipTextSupplier;
- public RecipeControl(LatheRecipePrototype recipe, Func<string> tooltipTextSupplier, bool canProduce, EntityPrototype? entityPrototype = null)
+ public RecipeControl(LatheSystem latheSystem, LatheRecipePrototype recipe, Func<string> tooltipTextSupplier, bool canProduce, Control displayControl)
{
RobustXamlLoader.Load(this);
- RecipeName.Text = recipe.Name;
- if (entityPrototype != null)
- RecipePrototype.SetPrototype(entityPrototype);
+ RecipeName.Text = latheSystem.GetRecipeName(recipe);
+ RecipeDisplayContainer.AddChild(displayControl);
Button.Disabled = !canProduce;
TooltipTextSupplier = tooltipTextSupplier;
Button.TooltipSupplier = SupplyTooltip;
{
foreach (var recipe in recipes)
{
- foreach (var (matId, amount) in recipe.RequiredMaterials)
+ foreach (var (matId, amount) in recipe.Materials)
{
var actualAmount = SharedLatheSystem.AdjustMaterial(amount, recipe.ApplyMaterialDiscount, multiplier);
if (spawnedMats.TryGetValue(matId, out var numSpawned))
{
foreach (var recipe in recipes)
{
- foreach (var (matId, amount) in recipe.RequiredMaterials)
+ foreach (var (matId, amount) in recipe.Materials)
{
var actualAmount = SharedLatheSystem.AdjustMaterial(amount, recipe.ApplyMaterialDiscount, multiplier);
if (deconstructedMats.TryGetValue(matId, out var numSpawned))
{
foreach (var recipe in recipes)
{
- foreach (var (matId, amount) in recipe.RequiredMaterials)
+ foreach (var (matId, amount) in recipe.Materials)
{
var actualAmount = SharedLatheSystem.AdjustMaterial(amount, recipe.ApplyMaterialDiscount, multiplier);
if (compositionComponent.MaterialComposition.TryGetValue(matId, out var numSpawned))
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
using System.Linq;
+using Content.Shared.Research.Prototypes;
namespace Content.Server.Cargo.Systems;
return price;
}
+ public double GetLatheRecipePrice(LatheRecipePrototype recipe)
+ {
+ var price = 0.0;
+
+ if (recipe.Result is { } result)
+ {
+ price += GetEstimatedPrice(_prototypeManager.Index(result));
+ }
+
+ if (recipe.ResultReagents is { } resultReagents)
+ {
+ foreach (var (reagent, amount) in resultReagents)
+ {
+ price += (_prototypeManager.Index(reagent).PricePerUnit * amount).Double();
+ }
+ }
+
+ return price;
+ }
+
/// <summary>
/// Get a rough price for an entityprototype. Does not consider contained entities.
/// </summary>
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Administration.Logs;
-using Content.Server.Atmos;
using Content.Server.Atmos.EntitySystems;
+using Content.Server.Fluids.EntitySystems;
using Content.Server.Lathe.Components;
using Content.Server.Materials;
+using Content.Server.Popups;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Stack;
using Content.Shared.Atmos;
+using Content.Shared.Chemistry.Components;
+using Content.Shared.Chemistry.EntitySystems;
+using Content.Shared.Chemistry.Reagent;
using Content.Shared.UserInterface;
using Content.Shared.Database;
using Content.Shared.Emag.Components;
+using Content.Shared.Examine;
using Content.Shared.Lathe;
using Content.Shared.Materials;
using Content.Shared.ReagentSpeed;
using Content.Shared.Research.Components;
using Content.Shared.Research.Prototypes;
using JetBrains.Annotations;
+using Robust.Server.Containers;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Prototypes;
[Dependency] private readonly AtmosphereSystem _atmosphere = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly UserInterfaceSystem _uiSys = default!;
[Dependency] private readonly MaterialStorageSystem _materialStorage = default!;
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly PuddleSystem _puddle = default!;
[Dependency] private readonly ReagentSpeedSystem _reagentSpeed = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
[Dependency] private readonly StackSystem _stack = default!;
[Dependency] private readonly TransformSystem _transform = default!;
SubscribeLocalEvent<EmagLatheRecipesComponent, LatheGetRecipesEvent>(GetEmagLatheRecipes);
SubscribeLocalEvent<LatheHeatProducingComponent, LatheStartPrintingEvent>(OnHeatStartPrinting);
}
-
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<LatheProducingComponent, LatheComponent>();
{
if (!_proto.TryIndex(id, out var proto))
continue;
- foreach (var (mat, _) in proto.RequiredMaterials)
+ foreach (var (mat, _) in proto.Materials)
{
if (!materialWhitelist.Contains(mat))
{
if (!CanProduce(uid, recipe, 1, component))
return false;
- foreach (var (mat, amount) in recipe.RequiredMaterials)
+ foreach (var (mat, amount) in recipe.Materials)
{
var adjustedAmount = recipe.ApplyMaterialDiscount
? (int) (-amount * component.MaterialUseMultiplier)
if (comp.CurrentRecipe != null)
{
- var result = Spawn(comp.CurrentRecipe.Result, Transform(uid).Coordinates);
- _stack.TryMergeToContacts(result);
+ if (comp.CurrentRecipe.Result is { } resultProto)
+ {
+ var result = Spawn(resultProto, Transform(uid).Coordinates);
+ _stack.TryMergeToContacts(result);
+ }
+
+ if (comp.CurrentRecipe.ResultReagents is { } resultReagents &&
+ comp.ReagentOutputSlotId is { } slotId)
+ {
+ var toAdd = new Solution(
+ resultReagents.Select(p => new ReagentQuantity(p.Key.Id, p.Value, null)));
+
+ // dispense it in the container if we have it and dump it if we don't
+ if (_container.TryGetContainer(uid, slotId, out var container) &&
+ container.ContainedEntities.Count == 1 &&
+ _solution.TryGetFitsInDispenser(container.ContainedEntities.First(), out var solution, out _))
+ {
+ _solution.AddSolution(solution.Value, toAdd);
+ }
+ else
+ {
+ _popup.PopupEntity(Loc.GetString("lathe-reagent-dispense-no-container", ("name", uid)), uid);
+ _puddle.TrySpillAt(uid, toAdd, out _);
+ }
+ }
}
comp.CurrentRecipe = null;
{
return GetAvailableRecipes(uid, component).Contains(recipe.ID);
}
+
#region UI Messages
private void OnLatheQueueRecipeMessage(EntityUid uid, LatheComponent component, LatheQueueRecipeMessage args)
}
if (count > 0)
{
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(args.Actor):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}");
+ _adminLogger.Add(LogType.Action,
+ LogImpact.Low,
+ $"{ToPrettyString(args.Actor):player} queued {count} {GetRecipeName(recipe)} at {ToPrettyString(uid):lathe}");
}
}
TryStartProducing(uid, component);
using Content.Server.Power.Components;
using Content.Shared.Administration;
using Content.Shared.Item;
-using Content.Shared.Materials;
using Content.Shared.Research.Prototypes;
using Content.Shared.UserInterface;
using Content.Shared.Weapons.Melee;
{
var cost = 0.0;
- foreach (var (material, count) in proto.RequiredMaterials)
+ foreach (var (material, count) in proto.Materials)
{
- var materialPrice = _proto.Index<MaterialPrototype>(material).Price;
+ var materialPrice = _proto.Index(material).Price;
cost += materialPrice * count;
}
- var sell = priceSystem.GetEstimatedPrice(_proto.Index<EntityPrototype>(proto.Result));
+ var sell = priceSystem.GetLatheRecipePrice(proto);
values.Add(new[]
{
{
var partRecipe = recipes[0];
if (recipes.Count > 1)
- partRecipe = recipes.MinBy(p => p.RequiredMaterials.Values.Sum());
+ partRecipe = recipes.MinBy(p => p.Materials.Values.Sum());
- foreach (var (mat, matAmount) in partRecipe!.RequiredMaterials)
+ foreach (var (mat, matAmount) in partRecipe!.Materials)
{
materials.TryAdd(mat, 0);
materials[mat] += matAmount * amount * coefficient;
{
var partRecipe = recipes[0];
if (recipes.Count > 1)
- partRecipe = recipes.MinBy(p => p.RequiredMaterials.Values.Sum());
+ partRecipe = recipes.MinBy(p => p.Materials.Values.Sum());
- foreach (var (mat, matAmount) in partRecipe!.RequiredMaterials)
+ foreach (var (mat, matAmount) in partRecipe!.Materials)
{
materials.TryAdd(mat, 0);
materials[mat] += matAmount * amount * coefficient;
[DataField]
public SoundSpecifier? ProducingSound;
+ [DataField]
+ public string? ReagentOutputSlotId;
+
#region Visualizer info
[DataField]
public string? IdleState;
using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Content.Shared.Emag.Systems;
+using Content.Shared.Examine;
+using Content.Shared.Localizations;
using Content.Shared.Materials;
using Content.Shared.Research.Prototypes;
using JetBrains.Annotations;
base.Initialize();
SubscribeLocalEvent<EmagLatheRecipesComponent, GotEmaggedEvent>(OnEmagged);
+ SubscribeLocalEvent<LatheComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypesReloaded);
+
BuildInverseRecipeDictionary();
}
+ private void OnExamined(Entity<LatheComponent> ent, ref ExaminedEvent args)
+ {
+ if (!args.IsInDetailsRange)
+ return;
+
+ if (ent.Comp.ReagentOutputSlotId != null)
+ args.PushMarkup(Loc.GetString("lathe-menu-reagent-slot-examine"));
+ }
+
[PublicAPI]
public bool CanProduce(EntityUid uid, string recipe, int amount = 1, LatheComponent? component = null)
{
if (!HasRecipe(uid, recipe, component))
return false;
- foreach (var (material, needed) in recipe.RequiredMaterials)
+ foreach (var (material, needed) in recipe.Materials)
{
var adjustedAmount = AdjustMaterial(needed, recipe.ApplyMaterialDiscount, component.MaterialUseMultiplier);
_inverseRecipeDictionary.Clear();
foreach (var latheRecipe in _proto.EnumeratePrototypes<LatheRecipePrototype>())
{
+ if (latheRecipe.Result == null)
+ continue;
+
_inverseRecipeDictionary.GetOrNew(latheRecipe.Result).Add(latheRecipe);
}
}
recipes.AddRange(r);
return recipes.Count != 0;
}
+
+ public string GetRecipeName(ProtoId<LatheRecipePrototype> proto)
+ {
+ return GetRecipeName(_proto.Index(proto));
+ }
+
+ public string GetRecipeName(LatheRecipePrototype proto)
+ {
+ if (!string.IsNullOrWhiteSpace(proto.Name))
+ return Loc.GetString(proto.Name);
+
+ if (proto.Result is { } result)
+ {
+ return _proto.Index(result).Name;
+ }
+
+ if (proto.ResultReagents is { } resultReagents)
+ {
+ return ContentLocalizationManager.FormatList(resultReagents
+ .Select(p => Loc.GetString("lathe-menu-result-reagent-display", ("reagent", _proto.Index(p.Key).LocalizedName), ("amount", p.Value)))
+ .ToList());
+ }
+
+ return string.Empty;
+ }
+
+ [PublicAPI]
+ public string GetRecipeDescription(ProtoId<LatheRecipePrototype> proto)
+ {
+ return GetRecipeDescription(_proto.Index(proto));
+ }
+
+ public string GetRecipeDescription(LatheRecipePrototype proto)
+ {
+ if (!string.IsNullOrWhiteSpace(proto.Description))
+ return Loc.GetString(proto.Description);
+
+ if (proto.Result is { } result)
+ {
+ return _proto.Index(result).Description;
+ }
+
+ if (proto.ResultReagents is { } resultReagents)
+ {
+ // We only use the first one for the description since these descriptions don't combine very well.
+ var reagent = resultReagents.First().Key;
+ return _proto.Index(reagent).LocalizedDescription;
+ }
+
+ return string.Empty;
+ }
}
+using Content.Shared.Chemistry.Reagent;
+using Content.Shared.FixedPoint;
using Content.Shared.Lathe.Prototypes;
using Content.Shared.Materials;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
using Robust.Shared.Utility;
namespace Content.Shared.Research.Prototypes
{
- [NetSerializable, Serializable, Prototype("latheRecipe")]
+ [NetSerializable, Serializable, Prototype]
public sealed partial class LatheRecipePrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
- [DataField("name")]
- private string _name = string.Empty;
+ /// <summary>
+ /// Name displayed in the lathe GUI.
+ /// </summary>
+ [DataField]
+ public LocId? Name;
- [DataField("description")]
- private string _description = string.Empty;
+ /// <summary>
+ /// Short description displayed in the lathe GUI.
+ /// </summary>
+ [DataField]
+ public LocId? Description;
/// <summary>
/// The prototype name of the resulting entity when the recipe is printed.
/// </summary>
- [DataField("result", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
- public string Result = string.Empty;
+ [DataField]
+ public EntProtoId? Result;
+
+ [DataField]
+ public Dictionary<ProtoId<ReagentPrototype>, FixedPoint2>? ResultReagents;
/// <summary>
/// An entity whose sprite is displayed in the ui in place of the actual recipe result.
/// </summary>
- [DataField("icon")]
+ [DataField]
public SpriteSpecifier? Icon;
[DataField("completetime")]
- private TimeSpan _completeTime = TimeSpan.FromSeconds(5);
-
- [DataField("materials", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, MaterialPrototype>))]
- private Dictionary<string, int> _requiredMaterials = new();
-
- //todo make these function calls because we're eating tons of resolves here.
- /// <summary>
- /// Name displayed in the lathe GUI.
- /// </summary>
- [ViewVariables]
- public string Name
- {
- get
- {
- if (_name.Trim().Length != 0)
- return _name;
- var protoMan = IoCManager.Resolve<IPrototypeManager>();
- protoMan.TryIndex(Result, out EntityPrototype? prototype);
- if (prototype?.Name != null)
- _name = prototype.Name;
- return _name;
- }
- }
-
- /// <summary>
- /// Short description displayed in the lathe GUI.
- /// </summary>
- [ViewVariables]
- public string Description
- {
- get
- {
- if (_description.Trim().Length != 0)
- return _description;
- var protoMan = IoCManager.Resolve<IPrototypeManager>();
- protoMan.TryIndex(Result, out EntityPrototype? prototype);
- if (prototype?.Description != null)
- _description = prototype.Description;
- return _description;
- }
- }
+ public TimeSpan CompleteTime = TimeSpan.FromSeconds(5);
/// <summary>
/// The materials required to produce this recipe.
/// Takes a material ID as string.
/// </summary>
- [ViewVariables]
- public Dictionary<string, int> RequiredMaterials
- {
- get => _requiredMaterials;
- private set => _requiredMaterials = value;
- }
-
-
- /// <summary>
- /// How many milliseconds it'll take for the lathe to finish this recipe.
- /// Might lower depending on the lathe's upgrade level.
- /// </summary>
- [ViewVariables]
- public TimeSpan CompleteTime => _completeTime;
+ [DataField]
+ public Dictionary<ProtoId<MaterialPrototype>, int> Materials = new();
- [DataField("applyMaterialDiscount")]
+ [DataField]
public bool ApplyMaterialDiscount = true;
/// <summary>
using System.Linq;
+using Content.Shared.Lathe;
using Content.Shared.Research.Components;
using Content.Shared.Research.Prototypes;
using JetBrains.Annotations;
{
[Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly SharedLatheSystem _lathe = default!;
public override void Initialize()
{
var recipeProto = PrototypeManager.Index(recipe);
description.PushNewline();
description.AddMarkup(Loc.GetString("research-console-unlocks-list-entry",
- ("name",recipeProto.Name)));
+ ("name", _lathe.GetRecipeName(recipeProto))));
}
foreach (var generic in technology.GenericUnlocks)
{
using Content.Shared.Examine;
using Content.Shared.Interaction;
+using Content.Shared.Lathe;
using Content.Shared.Popups;
using Content.Shared.Random.Helpers;
using Content.Shared.Research.Components;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedResearchSystem _research = default!;
+ [Dependency] private readonly SharedLatheSystem _lathe = default!;
public override void Initialize()
{
if (ent.Comp.Recipes != null && ent.Comp.Recipes.Count > 0)
{
var prototype = _protoMan.Index(ent.Comp.Recipes[0]);
- var resultPrototype = _protoMan.Index<EntityPrototype>(prototype.Result);
- message = Loc.GetString("tech-disk-examine", ("result", resultPrototype.Name));
+ message = Loc.GetString("tech-disk-examine", ("result", _lathe.GetRecipeName(prototype)));
if (ent.Comp.Recipes.Count > 1) //idk how to do this well. sue me.
message += " " + Loc.GetString("tech-disk-examine-more");
--- /dev/null
+lathe-recipe-Medkit-name = first aid kit (empty)
+lathe-recipe-MedkitBurn-name = burn treatment kit (empty)
+lathe-recipe-MedkitToxin-name = toxin treatment kit (empty)
+lathe-recipe-MedkitO2-name = oxygen deprivation treatment kit (empty)
+lathe-recipe-MedkitBrute-name = brute trauma treatment kit (empty)
+lathe-recipe-MedkitAdvanced-name = advanced first aid kit (empty)
+lathe-recipe-MedkitRadiation-name = radiation treatment kit (empty)
+lathe-recipe-MedkitCombat-name = combat medical kit (empty)
lathe-menu-category-all = All
lathe-menu-search-filter = Filter:
lathe-menu-amount = Amount:
+lathe-menu-reagent-slot-examine = It has a slot for a beaker on the side.
+lathe-reagent-dispense-no-container = Liquid pours out of {THE($name)} onto the floor!
+lathe-menu-result-reagent-display = {$reagent} ({$amount}u)
lathe-menu-material-display = {$material} ({$amount})
lathe-menu-tooltip-display = {$amount} of {$material}
lathe-menu-description-display = [italic]{$description}[/italic]
- type: latheRecipe
id: Medkit
result: Medkit
- name: first aid kit (empty)
+ name: lathe-recipe-Medkit-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitBurn
result: MedkitBurn
- name: burn treatment kit (empty)
+ name: lathe-recipe-MedkitBurn-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitToxin
result: MedkitToxin
- name: toxin treatment kit (empty)
+ name: lathe-recipe-MedkitToxin-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitO2
result: MedkitO2
- name: oxygen deprivation treatment kit (empty)
+ name: lathe-recipe-MedkitO2-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitBrute
result: MedkitBrute
- name: brute trauma treatment kit (empty)
+ name: lathe-recipe-MedkitBrute-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitAdvanced
result: MedkitAdvanced
- name: advanced first aid kit (empty)
+ name: lathe-recipe-MedkitAdvanced-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitRadiation
result: MedkitRadiation
- name: radiation treatment kit (empty)
+ name: lathe-recipe-MedkitRadiation-name
completetime: 2
materials:
Plastic: 300
- type: latheRecipe
id: MedkitCombat
result: MedkitCombat
- name: combat medical kit (empty)
+ name: lathe-recipe-MedkitCombat-name
completetime: 2
materials:
Plastic: 300