Workbench UI improve (#1508)

* grid workbench

* categorization

* Update CP14WorkbenchWindow.xaml.cs

* conditions

* categories
This commit is contained in:
Red
2025-07-08 00:42:34 +03:00
committed by GitHub
parent e7b73354ab
commit 2fc34bface
15 changed files with 333 additions and 104 deletions

View File

@@ -1,14 +1,11 @@
<Control xmlns="https://spacestation14.io">
<Button Name="Button">
<GridContainer Columns="2">
<Button Name="Button"
MaxSize="64 64">
<BoxContainer>
<EntityPrototypeView Name="View"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
Scale="2,2"
HorizontalAlignment="Center"
VerticalExpand="True"/>
<Label Name="Name"/>
</GridContainer>
SetSize="64 64"
Scale="3,3"
HorizontalAlignment="Center"/>
</BoxContainer>
</Button>
</Control>

View File

@@ -39,7 +39,6 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
Button.OnPressed += _ => OnSelect?.Invoke(entry, _recipePrototype);
UpdateColor();
UpdateName();
UpdateView();
}
@@ -51,13 +50,6 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
Button.ModulateSelfOverride = Color.FromHex("#302622");
}
private void UpdateName()
{
var result = _prototype.Index(_recipePrototype.Result);
var counter = _recipePrototype.ResultCount > 1 ? $" x{_recipePrototype.ResultCount}" : "";
Name.Text = $"{Loc.GetString(result.Name)} {counter}" ;
}
private void UpdateView()
{
View.SetPrototype(_recipePrototype.Result);

View File

@@ -12,60 +12,62 @@
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<!-- Search Bar -->
<LineEdit Name="SearchBar" Margin="4" PlaceHolder="Search" HorizontalExpand="True" />
<OptionButton Name="OptionCategories" Access="Public" MinSize="130 0"/>
<OptionButton Name="OptionCategories" Access="Public" MinSize="130 0" />
</BoxContainer>
<!-- Crafts container -->
<ScrollContainer HorizontalExpand="True" VerticalExpand="True" MinSize="0 200">
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True" />
<ScrollContainer HorizontalExpand="True" VerticalExpand="True" MinSize="0 200" HScrollEnabled="False">
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True" VerticalAlignment="Top"/>
</ScrollContainer>
</BoxContainer>
<!-- Craft view (right side UI) -->
<BoxContainer MinWidth="350" Orientation="Vertical" HorizontalExpand="True"
VerticalExpand="True">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f" />
</PanelContainer.PanelOverride>
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f" />
</PanelContainer.PanelOverride>
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<!-- icon -->
<EntityPrototypeView Name="ItemView"
Scale="2,2"
Margin="8"
MinSize="96 96"
MaxSize="96 96"
HorizontalAlignment="Left" />
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<!-- icon -->
<EntityPrototypeView Name="ItemView"
Scale="2,2"
Margin="8"
MinSize="96 96"
MaxSize="96 96"
HorizontalAlignment="Left" />
<!-- name & description -->
<BoxContainer Margin="5 0 0 0" HorizontalExpand="True" VerticalExpand="True"
Orientation="Vertical">
<RichTextLabel Name="ItemName" Margin="5" />
<RichTextLabel Name="ItemDescription" Margin="5" />
<!-- name & description -->
<BoxContainer Margin="5 0 0 0" HorizontalExpand="True" VerticalExpand="True"
Orientation="Vertical">
<RichTextLabel Name="ItemName" Margin="5" />
<RichTextLabel Name="ItemDescription" Margin="5" />
</BoxContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5" />
<!-- Required title -->
<Label Margin="5 0 0 0" Text="{Loc 'cp14-workbench-recipe-list'}" />
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer
Margin="5 0 0 0"
Name="ItemRequirements"
Orientation="Vertical" VerticalExpand="True"
HorizontalExpand="True" />
<controls:HLine Color="#404040" Thickness="5" Margin="0 5" />
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}" />
</BoxContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5" />
<!-- Required title -->
<Label Margin="5 0 0 0" Text="{Loc 'cp14-workbench-recipe-list'}" />
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer
Margin="5 0 0 0"
Name="ItemRequirements"
Orientation="Vertical" VerticalExpand="True"
HorizontalExpand="True" />
<controls:HLine Color="#404040" Thickness="5" Margin="0 5" />
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}" />
</BoxContainer>
</PanelContainer>
</PanelContainer>
</ScrollContainer>
</BoxContainer>
</BoxContainer>
</BoxContainer>

View File

@@ -3,6 +3,7 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using System.Linq;
using Content.Client._CP14.Skill;
using Content.Shared._CP14.Workbench;
using Content.Shared._CP14.Workbench.Prototypes;
@@ -28,7 +29,13 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
public event Action<CP14WorkbenchUiRecipesEntry>? OnCraft;
private readonly Dictionary<int, LocId> _categories = new();
/// <summary>
/// Used for category dropdown filtering.
/// </summary>
private readonly Dictionary<int, LocId> _categoryIndexes = new();
private Dictionary<LocId, List<CP14WorkbenchUiRecipesEntry>> _categories = new();
private List<CP14WorkbenchUiRecipesEntry> _uncategorized = new();
private CP14WorkbenchUiRecipesState? _cachedState;
private CP14WorkbenchUiRecipesEntry? _selectedEntry;
@@ -50,15 +57,49 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
OptionCategories.OnItemSelected += OnCategoryItemSelected;
}
public void UpdateRecipesVisibility()
private void UpdateRecipesVisibility()
{
if (_cachedState is null)
return;
CraftsContainer.RemoveAllChildren();
var recipes = new List<CP14WorkbenchUiRecipesEntry>();
foreach (var entry in _cachedState.Recipes)
if (_uncategorized.Count > 0 && OptionCategories.SelectedId == AllCategoryId)
{
var uncategorizedGridContainer = new GridContainer();
uncategorizedGridContainer.Columns = 5;
uncategorizedGridContainer.VerticalExpand = true;
CraftsContainer.AddChild(uncategorizedGridContainer);
AddRecipeListToGrid(_uncategorized, uncategorizedGridContainer);
}
foreach (var category in _categories)
{
if (_categoryIndexes.TryGetValue(OptionCategories.SelectedId, out var selectedCategory) &&
category.Key != selectedCategory)
continue;
var categoryLabel = new RichTextLabel();
categoryLabel.Margin = new Thickness(5);
categoryLabel.Text = Loc.GetString(category.Key);
CraftsContainer.AddChild(categoryLabel);
var gridContainer = new GridContainer();
gridContainer.Columns = 5;
gridContainer.VerticalExpand = true;
CraftsContainer.AddChild(gridContainer);
AddRecipeListToGrid(category.Value, gridContainer);
}
if (_selectedEntry is not null && _cachedState.Recipes.Contains(_selectedEntry.Value))
RecipeSelectNull();
}
private void AddRecipeListToGrid(List<CP14WorkbenchUiRecipesEntry> category, GridContainer gridContainer)
{
foreach (var entry in category)
{
if (!_prototype.TryIndex(entry.ProtoId, out var indexedEntry))
{
@@ -88,21 +129,11 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
continue;
}
recipes.Add(entry);
}
recipes.Sort(CP14WorkbenchUiRecipesEntry.CompareTo);
foreach (var recipe in recipes)
{
var control = new CP14WorkbenchRecipeControl(recipe);
var control = new CP14WorkbenchRecipeControl(entry);
control.OnSelect += RecipeSelect;
CraftsContainer.AddChild(control);
gridContainer.AddChild(control);
}
if (_selectedEntry is not null && !recipes.Contains(_selectedEntry.Value))
RecipeSelectNull();
}
public void UpdateState(CP14WorkbenchUiRecipesState recipesState)
@@ -112,37 +143,37 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
_cachedState = recipesState;
_categoryIndexes.Clear();
_categories.Clear();
_uncategorized.Clear();
OptionCategories.Clear();
OptionCategories.AddItem(Loc.GetString("cp14-recipe-category-all"), AllCategoryId);
var categories = new List<LocId>();
var count = 0;
foreach (var entry in recipesState.Recipes)
foreach (var entry in recipesState.Recipes.OrderByDescending(e => e.Craftable))
{
if (!_prototype.TryIndex(entry.ProtoId, out var indexedEntry))
continue;
// Populate categories
if (indexedEntry.Category is null)
continue;
if (!_prototype.TryIndex(indexedEntry.Category, out var indexedCategory))
{
_uncategorized.Add(entry);
continue;
}
if (categories.Contains(indexedCategory.Name))
continue;
if (!_categories.TryGetValue(indexedCategory.Name, out var entries))
{
entries = new List<CP14WorkbenchUiRecipesEntry>();
_categories[indexedCategory.Name] = entries;
}
categories.Add(indexedCategory.Name);
entries.Add(entry);
}
categories.Sort((a, b) => string.Compare(Loc.GetString(a), Loc.GetString(b), StringComparison.Ordinal));
foreach (var category in categories)
var count = 0;
foreach (var category in _categories)
{
OptionCategories.AddItem(Loc.GetString(category), count);
_categories.Add(count, category);
OptionCategories.AddItem(Loc.GetString(category.Key), count);
_categoryIndexes.Add(count, category.Key);
count++;
}
@@ -188,7 +219,7 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
if (OptionCategories.SelectedId == AllCategoryId)
return true;
if (!_categories.TryGetValue(OptionCategories.SelectedId, out var selectedCategory))
if (!_categoryIndexes.TryGetValue(OptionCategories.SelectedId, out var selectedCategory))
{
Sawmill.Error($"Non-existent {OptionCategories.SelectedId} category id selected. Filter skipped");
return true;

View File

@@ -92,11 +92,16 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
return;
}
var resultEntities = new HashSet<EntityUid>();
for (int i = 0; i < recipe.ResultCount; i++)
//Check conditions
var passConditions = true;
foreach (var condition in recipe.Conditions)
{
var resultEntity = Spawn(recipe.Result);
resultEntities.Add(resultEntity);
if (!condition.CheckCondition(EntityManager, _proto, ent, args.User))
{
condition.FailedEffect(EntityManager, _proto, ent, args.User);
passConditions = false;
}
condition.PostCraft(EntityManager, _proto, ent, args.User);
}
foreach (var req in recipe.Requirements)
@@ -104,10 +109,20 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
req.PostCraft(EntityManager, _proto, placedEntities);
}
//We teleport result to workbench AFTER craft.
foreach (var resultEntity in resultEntities)
if (passConditions)
{
_transform.SetCoordinates(resultEntity, Transform(ent).Coordinates.Offset(new Vector2(_random.NextFloat(-0.25f, 0.25f), _random.NextFloat(-0.25f, 0.25f))));
var resultEntities = new HashSet<EntityUid>();
for (var i = 0; i < recipe.ResultCount; i++)
{
var resultEntity = Spawn(recipe.Result);
resultEntities.Add(resultEntity);
}
//We teleport result to workbench AFTER craft.
foreach (var resultEntity in resultEntities)
{
_transform.SetCoordinates(resultEntity, Transform(ent).Coordinates.Offset(new Vector2(_random.NextFloat(-0.25f, 0.25f), _random.NextFloat(-0.25f, 0.25f))));
}
}
UpdateUIRecipes(ent);

View File

@@ -0,0 +1,61 @@
using Content.Shared._CP14.MagicEnergy;
using Content.Shared._CP14.MagicEnergy.Components;
using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Workbench.Conditions;
public sealed partial class MagicInWorkbench : CP14WorkbenchCraftCondition
{
[DataField]
public FixedPoint2 Energy = 10;
public override bool CheckCondition(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
if (!entManager.TryGetComponent<CP14MagicEnergyContainerComponent>(workbench, out var energyContainer))
return false;
return energyContainer.Energy >= Energy;
}
public override void PostCraft(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
var magicSys = entManager.System<SharedCP14MagicEnergySystem>();
magicSys.ChangeEnergy(workbench, -Energy, out _, out _);
}
public override void FailedEffect(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
var magicSys = entManager.System<SharedCP14MagicEnergySystem>();
magicSys.ChangeEnergy(workbench, -Energy, out _, out _);
if (entManager.TryGetComponent<TransformComponent>(workbench, out var xform))
entManager.SpawnAtPosition("CP14SkyLightning", xform.Coordinates);
}
public override string GetConditionTitle(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
if (!entManager.TryGetComponent<CP14MagicEnergyContainerComponent>(workbench, out var energyContainer))
return string.Empty;
var manaProcent = Energy / energyContainer.MaxEnergy * 100;
return Loc.GetString("cp14-workbench-condition-mana-in-w", ("count", manaProcent));
}
}

View File

@@ -17,7 +17,7 @@ public sealed class CP14WorkbenchRecipePrototype : IPrototype
public string ID { get; private set; } = default!;
[DataField(required: true)]
public ProtoId<TagPrototype> Tag = default!;
public ProtoId<TagPrototype> Tag;
[DataField]
public TimeSpan CraftTime = TimeSpan.FromSeconds(1f);
@@ -25,9 +25,23 @@ public sealed class CP14WorkbenchRecipePrototype : IPrototype
[DataField]
public SoundSpecifier? OverrideCraftSound;
/// <summary>
/// Mandatory conditions, without which the craft button will not even be active
/// </summary>
[DataField(required: true)]
public List<CP14WorkbenchCraftRequirement> Requirements = new();
/// <summary>
/// Mandatory conditions for completion, but not blocking the craft button.
/// Players must monitor compliance themselves.
/// If the conditions are not met, negative effects occur.
/// </summary>
[DataField]
public List<CP14WorkbenchCraftCondition> Conditions = new();
/// <summary>
/// What skills do you need to know to see this recipe in the interface?
/// </summary>
[DataField]
public HashSet<ProtoId<CP14SkillPrototype>> RequiredSkills = new();

View File

@@ -0,0 +1,51 @@
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CP14.Workbench;
[ImplicitDataDefinitionForInheritors]
[MeansImplicitUse]
public abstract partial class CP14WorkbenchCraftCondition
{
public abstract bool CheckCondition(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user);
public virtual void PostCraft(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
}
public abstract void FailedEffect(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user);
/// <summary>
/// This text will be displayed in the description of the craft conditions. Write something like The workbench must be filled to 100% mana. here
/// </summary>
public virtual string GetConditionTitle(
EntityManager entManager,
IPrototypeManager protoManager,
EntityUid workbench,
EntityUid user)
{
return string.Empty;
}
/// <summary>
/// You can specify the texture directly. Return null to disable.
/// </summary>
public virtual SpriteSpecifier? GetConditionTexture(IPrototypeManager protoManager)
{
return null;
}
}

View File

@@ -1,6 +1,10 @@
cp14-recipe-category-all = All
cp14-recipe-category-materials = Materials
cp14-recipe-category-tile = Floor
cp14-recipe-category-tool = Tools
cp14-recipe-category-weapon = Weapon
cp14-recipe-category-armor = Armor
cp14-recipe-category-armor = Armor
cp14-recipe-category-carpet = Carpets
cp14-recipe-category-wallpaper = Wallpapers
cp14-recipe-category-clothing = Clothing

View File

@@ -0,0 +1 @@
cp14-workbench-condition-mana-in-w = The station must be full of mana at {$count}%.

View File

@@ -1,6 +1,10 @@
cp14-recipe-category-all = Все
cp14-recipe-category-materials = Материалы
cp14-recipe-category-tile = Пол
cp14-recipe-category-tool = Инструменты
cp14-recipe-category-weapon = Оружие
cp14-recipe-category-armor = Броня
cp14-recipe-category-armor = Броня
cp14-recipe-category-carpet = Ковры
cp14-recipe-category-wallpaper = Обои
cp14-recipe-category-clothing = Одежда

View File

@@ -0,0 +1 @@
cp14-workbench-condition-mana-in-w = Станция должна быть полна маной на {$count}%

View File

@@ -6,6 +6,10 @@
id: Tools
name: cp14-recipe-category-tool
- type: CP14RecipeCategory
id: Materials
name: cp14-recipe-category-materials
- type: CP14RecipeCategory
id: Weapon
name: cp14-recipe-category-weapon
@@ -14,3 +18,14 @@
id: Armor
name: cp14-recipe-category-armor
- type: CP14RecipeCategory
id: Carpet
name: cp14-recipe-category-carpet
- type: CP14RecipeCategory
id: Wallpaper
name: cp14-recipe-category-wallpaper
- type: CP14RecipeCategory
id: Clothing
name: cp14-recipe-category-clothing

View File

@@ -2,6 +2,7 @@
id: CP14CopperBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
category: Materials
requiredSkills:
- CopperMelting
requirements:
@@ -14,6 +15,7 @@
id: CP14IronBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
category: Materials
requiredSkills:
- IronMelting
requirements:
@@ -26,6 +28,7 @@
id: CP14GoldBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
category: Materials
requiredSkills:
- GoldMelting
requirements:
@@ -38,6 +41,7 @@
id: CP14MithrilBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
category: Materials
requiredSkills:
- MithrilMelting
requirements:
@@ -50,6 +54,7 @@
id: CP14GlassSheet1
tag: CP14RecipeMeltingFurnace
craftTime: 2
category: Materials
requiredSkills:
- GlassMelting
requirements:
@@ -62,6 +67,7 @@
id: CP14GlassSheetShard1
tag: CP14RecipeMeltingFurnace
craftTime: 2
category: Materials
requiredSkills:
- GlassMelting
requirements:

View File

@@ -2,6 +2,7 @@
id: CP14ClothMaterialCotton
tag: CP14RecipeSewing
craftTime: 2
category: Materials
requirements:
- !type:ProtoIdResource
protoId: CP14Cotton
@@ -22,6 +23,7 @@
id: CP14ClothMaterialString
tag: CP14RecipeSewing
craftTime: 1
category: Materials
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -32,6 +34,7 @@
id: CP14StringFromWeb
tag: CP14RecipeSewing
craftTime: 1
category: Materials
requirements:
- !type:ProtoIdResource
protoId: CP14Web
@@ -42,6 +45,7 @@
id: CP14StringCottonCloth
tag: CP14RecipeSewing
craftTime: 1
category: Materials
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -53,6 +57,7 @@
id: CP14ClothingShirtCottonBlue
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -67,6 +72,7 @@
id: CP14ClothingShirtCottonBlack
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -81,6 +87,7 @@
id: CP14ClothingShirtCottonPurple
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -95,6 +102,7 @@
id: CP14ClothingShirtCottonRed
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -109,6 +117,7 @@
id: CP14ClothingShirtCottonWhite
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -121,6 +130,7 @@
id: CP14ClothingShirtCottonYellow
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -135,6 +145,7 @@
id: CP14ClothingShirtBlackDress
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -149,6 +160,7 @@
id: CP14ClothingPantsTrouserWhite
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -161,6 +173,7 @@
id: CP14ClothingPantsTrouserDarkBlue
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -175,6 +188,7 @@
id: CP14ClothingHeadHuntersHat
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -189,6 +203,7 @@
id: CP14ClothingShirtMercenary
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -205,6 +220,7 @@
id: CP14ClothingYellowWizardDress
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -223,6 +239,7 @@
id: CP14ClothingHeadBeretMercenary
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -239,6 +256,7 @@
id: CP14ClothingPantsMercenaryTrousers
tag: CP14RecipeSewing
craftTime: 2
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14String
@@ -255,6 +273,7 @@
id: CP14ClothingOuterClothingFish
tag: CP14RecipeSewing
craftTime: 4
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14FoodMeatFlemTorso
@@ -269,6 +288,7 @@
id: CP14ClothingHeadFishMask
tag: CP14RecipeSewing
craftTime: 5
category: Clothing
requirements:
- !type:ProtoIdResource
protoId: CP14FoodMeatFlemHead
@@ -311,6 +331,7 @@
id: CP14WallpaperBlack
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -323,6 +344,7 @@
id: CP14WallpaperGreen
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -335,6 +357,7 @@
id: CP14WallpaperPurple
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -347,6 +370,7 @@
id: CP14WallpaperRed
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -359,6 +383,7 @@
id: CP14WallpaperWhite
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -369,6 +394,7 @@
id: CP14WallpaperWhite2
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -379,6 +405,7 @@
id: CP14WallpaperYellow
tag: CP14RecipeSewing
craftTime: 2
category: Wallpaper
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -550,6 +577,7 @@
id: CP14FloorCarpetItemBlue10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -564,6 +592,7 @@
id: CP14FloorCarpetItemRed10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -578,6 +607,7 @@
id: CP14FloorCarpetItemCyan10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -594,6 +624,7 @@
id: CP14FloorCarpetItemGreen10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -608,6 +639,7 @@
id: CP14FloorCarpetItemOrange10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -624,6 +656,7 @@
id: CP14FloorCarpetItemPurple10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -638,6 +671,7 @@
id: CP14FloorCarpetItemBlack10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth
@@ -652,6 +686,7 @@
id: CP14FloorCarpetItemYellow10
tag: CP14RecipeSewing
craftTime: 2
category: Carpet
requirements:
- !type:StackResource
stack: CP14Cloth