From 8721f736e186dcab0a5d45dbd9226e8df72f952d Mon Sep 17 00:00:00 2001 From: Red <96445749+TheShuEd@users.noreply.github.com> Date: Sun, 20 Jul 2025 15:45:59 +0300 Subject: [PATCH] Cooking simulator 3: Pies (#1540) * enum -> prototype * move sprites * more dirt sprites * some food data stucking fixing * pumpkin fix * pie move sprites * refactor components * pie refactor * remove outdated proto * new pie types * Update SliceableFoodSystem.cs * Refactor food cooking system and add fat flavor Added 'Fat' to the flavor profile. Refactored food cooking logic to use CreateFoodData and UpdateFoodDataVisuals instead of CookFood and ApplyFoodVisuals. Introduced RenameCooker property to CP14FoodCookerComponent to control entity renaming during cooking. Improved separation of food data creation and visual updates. * Update migration.yml * Refactor food visual and sliceable logic in cooking system Moved sliceable food logic from OnCookFinished to UpdateFoodDataVisuals for better encapsulation. Made UpdateFoodDataVisuals overridable and updated its usage in random food initialization. Added Rename field to CP14RandomFoodDataComponent and cleaned up unused BecomeSliceable field in CP14FoodCookerComponent. Updated pie_pan.yml to add SliceableFood and a new random food entity. * Update pie_pan.yml * fill levels --- .../_CP14/Cooking/CP14ClientCookingSystem.cs | 12 +- .../Tests/_CP14/CP14Cooking.cs | 2 +- .../Fluids/EntitySystems/PuddleSystem.cs | 5 - .../Components/SliceableFoodComponent.cs | 3 +- .../EntitySystems/SliceableFoodSystem.cs | 15 + .../_CP14/Cooking/CP14CookingSystem.cs | 79 ++-- .../Cooking/CP14RandomFoodDataComponent.cs | 3 + .../Fluids/SharedPuddleSystem.Spillable.cs | 1 + .../Components/FlavorProfileComponent.cs | 1 + .../CP14SharedCookingSystem.DoAfter.cs | 15 +- .../CP14SharedCookingSystem.Transfer.cs | 19 +- .../_CP14/Cooking/CP14SharedCookingSystem.cs | 160 ++++---- .../Components/CP14FoodCookerComponent.cs | 24 +- .../Components/CP14FoodHolderComponent.cs | 35 +- .../Components/CP14FoodVisualsComponent.cs | 36 -- .../CP14CookingRecipePrototype.cs | 6 +- .../Prototypes/CP14FoodTypePrototype.cs | 15 + .../_CP14/Cooking/Requirements/TagBlocked.cs | 2 +- .../Workbench/Requirements/FoodResource.cs | 18 +- Resources/Locale/en-US/_CP14/cooking/pies.ftl | 2 + Resources/Locale/ru-RU/_CP14/cooking/pies.ftl | 2 + .../Objects/Consumable/Food/Meals/bowl.yml | 7 +- .../Consumable/Food/Meals/pies_pieces.yml | 64 ++++ .../Objects/Consumable/Food/Meals/plate.yml | 7 +- .../Objects/Consumable/Food/cutlery.yml | 20 - .../Entities/Objects/Consumable/Food/pie.yml | 358 ------------------ .../Objects/Specific/Cooking/base.yml | 4 - .../Objects/Specific/Cooking/cooking_pot.yml | 9 +- .../Objects/Specific/Cooking/frying_pen.yml | 9 +- .../Objects/Specific/Cooking/pie_pan.yml | 84 ++++ .../_CP14/Recipes/Cooking/food_types.yml | 8 + .../Prototypes/_CP14/Recipes/Cooking/pies.yml | 61 +++ .../Recipes/Workbench/CookingTable/pies.yml | 59 --- Resources/Prototypes/_CP14/Tags/misc.yml | 3 - .../Trading/BuyPositions/dairy_products.yml | 4 +- .../Food/Meals}/frying_pan.rsi/base.png | Bin .../Food/Meals}/frying_pan.rsi/closed.png | Bin .../Food/Meals}/frying_pan.rsi/cooking.png | Bin .../Food/Meals/frying_pan.rsi/dirt.png | Bin 0 -> 289 bytes .../Meals}/frying_pan.rsi/inhand-left.png | Bin .../Meals}/frying_pan.rsi/inhand-right.png | Bin .../Food/Meals}/frying_pan.rsi/meta.json | 3 + .../Food/Meals}/frying_pan.rsi/opened.png | Bin .../Consumable/Food/Meals/plates.rsi/dirt.png | Bin 0 -> 240 bytes .../Food/Meals/plates.rsi/meta.json | 3 + .../apple.png => Pies/misc.rsi/fruit.png} | Bin .../Food/{pie.rsi => Pies/misc.rsi}/meat.png | Bin .../Consumable/Food/Pies/misc.rsi/meta.json | 20 + .../fish.png => Pies/misc.rsi/veg.png} | Bin .../Consumable/Food/Pies/pieces.rsi/blank.png | Bin 0 -> 342 bytes .../Consumable/Food/Pies/pieces.rsi/meat.png | Bin 0 -> 238 bytes .../Consumable/Food/Pies/pieces.rsi/meta.json | 26 ++ .../Food/Pies/pieces.rsi/pumpkin.png | Bin 0 -> 249 bytes .../Consumable/Food/Pies/pieces.rsi/trash.png | Bin 0 -> 309 bytes .../Consumable/Food/Pies/pieces.rsi/veg.png | Bin 0 -> 258 bytes .../Consumable/Food/Pies/plate.rsi/iron.png | Bin 0 -> 428 bytes .../Consumable/Food/Pies/plate.rsi/meta.json | 23 ++ .../Consumable/Food/Pies/plate.rsi/raw-0.png | Bin 0 -> 96 bytes .../Consumable/Food/Pies/plate.rsi/raw-1.png | Bin 0 -> 276 bytes .../Consumable/Food/Pies/plate.rsi/raw-2.png | Bin 0 -> 306 bytes .../Consumable/Food/Soups/bowls.rsi/dirt.png | Bin 0 -> 233 bytes .../Consumable/Food/Soups/bowls.rsi/meta.json | 3 + .../Food/Soups}/cooking_pot.rsi/base.png | Bin .../Food/Soups}/cooking_pot.rsi/closed.png | Bin .../Food/Soups}/cooking_pot.rsi/cooking.png | Bin .../Food/Soups/cooking_pot.rsi/dirt.png | Bin 0 -> 297 bytes .../Soups}/cooking_pot.rsi/inhand-left.png | Bin .../Soups}/cooking_pot.rsi/inhand-right.png | Bin .../Food/Soups}/cooking_pot.rsi/meta.json | 3 + .../Food/Soups}/cooking_pot.rsi/opened.png | Bin .../Consumable/Food/pie.rsi/apple_raw.png | Bin 532 -> 0 bytes .../Consumable/Food/pie.rsi/burnt_pie.png | Bin 536 -> 0 bytes .../Consumable/Food/pie.rsi/fisht_raw.png | Bin 537 -> 0 bytes .../Consumable/Food/pie.rsi/meat_raw.png | Bin 472 -> 0 bytes .../Objects/Consumable/Food/pie.rsi/meta.json | 41 -- .../Consumable/Food/pie.rsi/pumpkin.png | Bin 451 -> 0 bytes .../Consumable/Food/pie.rsi/pumpkin_raw.png | Bin 430 -> 0 bytes .../Objects/Consumable/Food/pie.rsi/tin.png | Bin 435 -> 0 bytes Resources/migration.yml | 7 +- 79 files changed, 581 insertions(+), 700 deletions(-) delete mode 100644 Content.Shared/_CP14/Cooking/Components/CP14FoodVisualsComponent.cs rename Content.Shared/_CP14/Cooking/{ => Prototypes}/CP14CookingRecipePrototype.cs (88%) create mode 100644 Content.Shared/_CP14/Cooking/Prototypes/CP14FoodTypePrototype.cs create mode 100644 Resources/Locale/en-US/_CP14/cooking/pies.ftl create mode 100644 Resources/Locale/ru-RU/_CP14/cooking/pies.ftl create mode 100644 Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/pies_pieces.yml delete mode 100644 Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/pie.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/pie_pan.yml create mode 100644 Resources/Prototypes/_CP14/Recipes/Cooking/food_types.yml create mode 100644 Resources/Prototypes/_CP14/Recipes/Cooking/pies.yml delete mode 100644 Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/base.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/closed.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/cooking.png (100%) create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/dirt.png rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/inhand-left.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/inhand-right.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/meta.json (93%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Meals}/frying_pan.rsi/opened.png (100%) create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Meals/plates.rsi/dirt.png rename Resources/Textures/_CP14/Objects/Consumable/Food/{pie.rsi/apple.png => Pies/misc.rsi/fruit.png} (100%) rename Resources/Textures/_CP14/Objects/Consumable/Food/{pie.rsi => Pies/misc.rsi}/meat.png (100%) create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/misc.rsi/meta.json rename Resources/Textures/_CP14/Objects/Consumable/Food/{pie.rsi/fish.png => Pies/misc.rsi/veg.png} (100%) create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/blank.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/meat.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/pumpkin.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/trash.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/veg.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/iron.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/raw-0.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/raw-1.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/raw-2.png create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Soups/bowls.rsi/dirt.png rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/base.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/closed.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/cooking.png (100%) create mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/dirt.png rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/inhand-left.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/inhand-right.png (100%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/meta.json (93%) rename Resources/Textures/_CP14/Objects/{Specific/Cooking => Consumable/Food/Soups}/cooking_pot.rsi/opened.png (100%) delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/apple_raw.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/burnt_pie.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/fisht_raw.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/meat_raw.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/meta.json delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/pumpkin.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/pumpkin_raw.png delete mode 100644 Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/tin.png diff --git a/Content.Client/_CP14/Cooking/CP14ClientCookingSystem.cs b/Content.Client/_CP14/Cooking/CP14ClientCookingSystem.cs index afa89b35d4..c005386837 100644 --- a/Content.Client/_CP14/Cooking/CP14ClientCookingSystem.cs +++ b/Content.Client/_CP14/Cooking/CP14ClientCookingSystem.cs @@ -23,18 +23,16 @@ public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem { base.Initialize(); - SubscribeLocalEvent(OnAfterHandleState); - SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnAfterHandleState); + SubscribeLocalEvent(OnAppearanceChange); } - private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args) + private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args) { var solutionId = string.Empty; if (TryComp(ent, out var holder)) solutionId = holder.SolutionId; - else if (TryComp(ent, out var cooker)) - solutionId = cooker.SolutionId; UpdateVisuals( ent, @@ -46,14 +44,12 @@ public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem ent.Comp.FoodData); } - private void OnAfterHandleState(Entity ent, ref AfterAutoHandleStateEvent args) + private void OnAfterHandleState(Entity ent, ref AfterAutoHandleStateEvent args) { var solutionId = string.Empty; if (TryComp(ent, out var holder)) solutionId = holder.SolutionId; - else if (TryComp(ent, out var cooker)) - solutionId = cooker.SolutionId; UpdateVisuals( ent, diff --git a/Content.IntegrationTests/Tests/_CP14/CP14Cooking.cs b/Content.IntegrationTests/Tests/_CP14/CP14Cooking.cs index b93c6c9150..47cef6ede2 100644 --- a/Content.IntegrationTests/Tests/_CP14/CP14Cooking.cs +++ b/Content.IntegrationTests/Tests/_CP14/CP14Cooking.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Content.Shared._CP14.Cooking; +using Content.Shared._CP14.Cooking.Prototypes; using Content.Shared._CP14.Cooking.Requirements; using Content.Shared.Chemistry.Components; using Content.Shared.Tag; @@ -20,7 +21,6 @@ namespace Content.IntegrationTests.Tests._CP14; [TestFixture] public sealed class CP14Cooking { - [Test] public async Task TestAllCookingRecipeIsCookable() { diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index f9217e5de2..66469916d8 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -673,11 +673,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem return false; } - //CP14 spill event for cooking subscription - var ev = new CP14BeforeSpillEvent(); - RaiseLocalEvent(uid, ev); - //CP14 end - return TrySpillAt(transformComponent.Coordinates, solution, out puddleUid, sound: sound); } diff --git a/Content.Server/Nutrition/Components/SliceableFoodComponent.cs b/Content.Server/Nutrition/Components/SliceableFoodComponent.cs index 7877e91d03..e262b50353 100644 --- a/Content.Server/Nutrition/Components/SliceableFoodComponent.cs +++ b/Content.Server/Nutrition/Components/SliceableFoodComponent.cs @@ -1,10 +1,11 @@ +using Content.Server._CP14.Cooking; using Content.Server.Nutrition.EntitySystems; using Robust.Shared.Audio; using Robust.Shared.Prototypes; namespace Content.Server.Nutrition.Components; -[RegisterComponent, Access(typeof(SliceableFoodSystem))] +[RegisterComponent, Access(typeof(SliceableFoodSystem), typeof(CP14CookingSystem))] public sealed partial class SliceableFoodComponent : Component { /// diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index 3ce285b06c..cd6882f501 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -85,6 +85,10 @@ public sealed class SliceableFoodSystem : EntitySystem if (!TryComp(usedItem, out var utensil) || (utensil.Types & UtensilType.Knife) == 0) return false; + //CP14 transfer flavors + TryComp(uid, out var flavorProfile); + //CP14 end + var sliceVolume = solution.Volume / FixedPoint2.New(component.TotalCount); for (int i = 0; i < component.TotalCount; i++) { @@ -93,6 +97,17 @@ public sealed class SliceableFoodSystem : EntitySystem var lostSolution = _solutionContainer.SplitSolution(soln.Value, sliceVolume); + //CP14 - transfer flavors + if (flavorProfile is not null) + { + var sliceFlavors = EnsureComp(sliceUid); + foreach (var newFlavor in flavorProfile.Flavors) + { + sliceFlavors.Flavors.Add(newFlavor); + } + } + //CP14 end + // Fill new slice FillSlice(sliceUid, lostSolution); } diff --git a/Content.Server/_CP14/Cooking/CP14CookingSystem.cs b/Content.Server/_CP14/Cooking/CP14CookingSystem.cs index c160215e4f..0eeaacb51b 100644 --- a/Content.Server/_CP14/Cooking/CP14CookingSystem.cs +++ b/Content.Server/_CP14/Cooking/CP14CookingSystem.cs @@ -5,11 +5,12 @@ using System.Linq; using System.Numerics; +using Content.Server.Nutrition.Components; using Content.Server.Temperature.Systems; using Content.Shared._CP14.Cooking; using Content.Shared._CP14.Cooking.Components; using Content.Shared._CP14.Temperature; -using Content.Shared.Nutrition.Components; +using Content.Shared.Chemistry.EntitySystems; using Robust.Shared.Random; namespace Content.Server._CP14.Cooking; @@ -17,6 +18,7 @@ namespace Content.Server._CP14.Cooking; public sealed class CP14CookingSystem : CP14SharedCookingSystem { [Dependency] private readonly TemperatureSystem _temperature = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -24,25 +26,30 @@ public sealed class CP14CookingSystem : CP14SharedCookingSystem SubscribeLocalEvent(OnRandomFoodMapInit); - SubscribeLocalEvent(OnSpilled); - SubscribeLocalEvent(OnHolderSpilled); - SubscribeLocalEvent(OnCookerSpilled); + SubscribeLocalEvent(OnHolderChanged); } - private void OnCookerSpilled(Entity ent, ref CP14BeforeSpillEvent args) + protected override bool TryTransferFood(Entity target, Entity source) { - ent.Comp.HoldFood = false; - Dirty(ent); + if (base.TryTransferFood(target, source)) + { + //Sliceable + if (source.Comp.FoodData?.SliceProto is not null) + { + var sliceable = EnsureComp(target); + sliceable.Slice = source.Comp.FoodData.SliceProto; + sliceable.TotalCount = source.Comp.FoodData.SliceCount; + } + } + + return true; } - private void OnHolderSpilled(Entity ent, ref CP14BeforeSpillEvent args) + private void OnHolderChanged(Entity ent, ref SolutionContainerChangedEvent args) { - ent.Comp.HoldFood = false; - Dirty(ent); - } + if (args.Solution.Volume != 0) + return; - private void OnSpilled(Entity ent, ref CP14BeforeSpillEvent args) - { ent.Comp.FoodData = null; Dirty(ent); } @@ -55,26 +62,17 @@ public sealed class CP14CookingSystem : CP14SharedCookingSystem if (!_random.Prob(ent.Comp.Prob)) return; - //TODO: Fuck this dublication logic, and randomization visual - var randomFood = _random.Pick(OrderedRecipes.Where(r => r.FoodType == holder.FoodType).ToList()); - - //Name and Description - if (randomFood.FoodData.Name is not null) - _metaData.SetEntityName(ent, Loc.GetString(randomFood.FoodData.Name)); - if (randomFood.FoodData.Desc is not null) - _metaData.SetEntityDescription(ent, Loc.GetString(randomFood.FoodData.Desc)); - - var foodVisuals = EnsureComp(ent); - //Visuals - foodVisuals.FoodData = randomFood.FoodData; - - //Some randomize - foreach (var layer in foodVisuals.FoodData.Visuals) + var filteredRecipes = OrderedRecipes.Where(r => r.FoodType == holder.FoodType).ToList(); + if (filteredRecipes.Count == 0) { - if (_random.Prob(0.5f)) - layer.Scale = new Vector2(-1, 1); + Log.Error($"No recipes found for food type {holder.FoodType}"); + return; } + var randomFood = _random.Pick(filteredRecipes); + + UpdateFoodDataVisuals((ent, holder), randomFood.FoodData, ent.Comp.Rename); + Dirty(ent.Owner, holder); } @@ -89,6 +87,20 @@ public sealed class CP14CookingSystem : CP14SharedCookingSystem Spawn(ent.Comp.BurntAdditionalSpawn, Transform(ent).Coordinates); } + protected override void UpdateFoodDataVisuals(Entity ent, CP14FoodData data, bool rename = true) + { + base.UpdateFoodDataVisuals(ent, data, rename); + + if (ent.Comp.FoodData?.SliceProto is null) + return; + + if (!TryComp(ent, out var sliceable)) + return; + + sliceable.Slice = ent.Comp.FoodData.SliceProto; + sliceable.TotalCount = ent.Comp.FoodData.SliceCount; + } + protected override void OnCookFinished(Entity ent, ref CP14CookingDoAfter args) { if (args.Cancelled || args.Handled) @@ -125,10 +137,3 @@ public sealed class CP14CookingSystem : CP14SharedCookingSystem } } } - -/// -/// It is invoked on the entity from which all reagents are spilled. -/// -public sealed class CP14BeforeSpillEvent : EntityEventArgs -{ -} diff --git a/Content.Server/_CP14/Cooking/CP14RandomFoodDataComponent.cs b/Content.Server/_CP14/Cooking/CP14RandomFoodDataComponent.cs index 0ef9be84f1..71090b4e24 100644 --- a/Content.Server/_CP14/Cooking/CP14RandomFoodDataComponent.cs +++ b/Content.Server/_CP14/Cooking/CP14RandomFoodDataComponent.cs @@ -11,4 +11,7 @@ public sealed partial class CP14RandomFoodDataComponent : Component /// [DataField] public float Prob = 0.75f; + + [DataField] + public bool Rename = true; } diff --git a/Content.Shared/Fluids/SharedPuddleSystem.Spillable.cs b/Content.Shared/Fluids/SharedPuddleSystem.Spillable.cs index 2ce008da26..3094d34bed 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.Spillable.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.Spillable.cs @@ -1,3 +1,4 @@ +using Content.Shared._CP14.Cooking; using Content.Shared.Chemistry.Components; using Content.Shared.Database; using Content.Shared.DoAfter; diff --git a/Content.Shared/Nutrition/Components/FlavorProfileComponent.cs b/Content.Shared/Nutrition/Components/FlavorProfileComponent.cs index a3ca92ecf2..4de13b512a 100644 --- a/Content.Shared/Nutrition/Components/FlavorProfileComponent.cs +++ b/Content.Shared/Nutrition/Components/FlavorProfileComponent.cs @@ -20,5 +20,6 @@ public sealed partial class FlavorProfileComponent : Component "Nutriment", "Vitamin", "Protein", + "Fat", //CP14 }; } diff --git a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.DoAfter.cs b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.DoAfter.cs index 3c4886ca17..d44829f2f0 100644 --- a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.DoAfter.cs +++ b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.DoAfter.cs @@ -4,10 +4,10 @@ */ using Content.Shared._CP14.Cooking.Components; +using Content.Shared._CP14.Cooking.Prototypes; using Content.Shared.DoAfter; using Content.Shared.Temperature; using Robust.Shared.Prototypes; -using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Timing; @@ -55,10 +55,14 @@ public abstract partial class CP14SharedCookingSystem if (args.Cancelled || args.Handled) return; + if (!TryComp(ent, out var holder)) + return; + if (!_proto.TryIndex(args.Recipe, out var indexedRecipe)) return; - CookFood(ent, indexedRecipe); + CreateFoodData(ent, indexedRecipe); + UpdateFoodDataVisuals((ent, holder), ent.Comp.RenameCooker); args.Handled = true; } @@ -117,7 +121,10 @@ public abstract partial class CP14SharedCookingSystem if (!_container.TryGetContainer(ent, ent.Comp.ContainerId, out var container)) return; - if (container.ContainedEntities.Count <= 0 && !ent.Comp.HoldFood) + if (!TryComp(ent, out var holder)) + return; + + if (container.ContainedEntities.Count <= 0 && holder.FoodData is null) { StopCooking(ent); return; @@ -128,7 +135,7 @@ public abstract partial class CP14SharedCookingSystem ent.Comp.LastHeatingTime = _timing.CurTime; DirtyField(ent.Owner,ent.Comp, nameof(CP14FoodCookerComponent.LastHeatingTime)); - if (!_doAfter.IsRunning(ent.Comp.DoAfterId) && !ent.Comp.HoldFood) + if (!_doAfter.IsRunning(ent.Comp.DoAfterId) && holder.FoodData is null) { var recipe = GetRecipe(ent); if (recipe is not null) diff --git a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.Transfer.cs b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.Transfer.cs index 5a044d382e..0504af6ae2 100644 --- a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.Transfer.cs +++ b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.Transfer.cs @@ -14,25 +14,25 @@ public abstract partial class CP14SharedCookingSystem private void InitTransfer() { SubscribeLocalEvent(OnAfterInteract); - SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnInsertAttempt); } - private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) + private void OnInteractUsing(Entity target, ref InteractUsingEvent args) { - if (!TryComp(args.Target, out var cooker)) + if (!TryComp(args.Used, out var used)) return; - MoveFoodToHolder(ent, (args.Target.Value, cooker)); + TryTransferFood(target, (args.Used, used)); } - private void OnInteractUsing(Entity ent, ref AfterInteractEvent args) + private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) { - if (!TryComp(args.Target, out var holder)) + if (!TryComp(args.Target, out var target)) return; - MoveFoodToHolder((args.Target.Value, holder), ent); + TryTransferFood(ent, (args.Target.Value, target)); } private void OnInsertAttempt(Entity ent, ref ContainerIsInsertingAttemptEvent args) @@ -40,7 +40,10 @@ public abstract partial class CP14SharedCookingSystem if (args.Cancelled) return; - if (ent.Comp.HoldFood) + if (!TryComp(ent, out var holder)) + return; + + if (holder.FoodData is not null) { _popup.PopupEntity(Loc.GetString("cp14-cooking-popup-not-empty", ("name", MetaData(ent).EntityName)), ent); args.Cancel(); diff --git a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.cs b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.cs index d4d298f7e9..365b291f63 100644 --- a/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.cs +++ b/Content.Shared/_CP14/Cooking/CP14SharedCookingSystem.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Numerics; using Content.Shared._CP14.Cooking.Components; +using Content.Shared._CP14.Cooking.Prototypes; using Content.Shared.Audio; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; @@ -16,7 +17,6 @@ using Content.Shared.Fluids; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; using Content.Shared.Tag; -using Content.Shared.Throwing; using Robust.Shared.Containers; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -26,17 +26,17 @@ namespace Content.Shared._CP14.Cooking; public abstract partial class CP14SharedCookingSystem : EntitySystem { - [Dependency] protected readonly IPrototypeManager _proto = default!; [Dependency] protected readonly SharedContainerSystem _container = default!; - [Dependency] protected readonly IRobustRandom _random = default!; - [Dependency] protected readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly IRobustRandom _random = default!; [Dependency] protected readonly SharedSolutionContainerSystem _solution = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPuddleSystem _puddle = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; - [Dependency] protected readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; /// /// When overcooking food, we will replace the reagents inside with this reagent. @@ -61,7 +61,7 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem CacheAndOrderRecipes(); SubscribeLocalEvent(OnPrototypesReloaded); - SubscribeLocalEvent(OnExaminedEvent); + SubscribeLocalEvent(OnExaminedEvent); } public override void Update(float frameTime) @@ -85,7 +85,7 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem CacheAndOrderRecipes(); } - private void OnExaminedEvent(Entity ent, ref ExaminedEvent args) + private void OnExaminedEvent(Entity ent, ref ExaminedEvent args) { if (ent.Comp.FoodData?.Name is null) return; @@ -107,31 +107,32 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem /// /// Transfer food data from cooker to holder /// - private void MoveFoodToHolder(Entity holder, Entity cooker) + protected virtual bool TryTransferFood(Entity target, + Entity source) { - if (holder.Comp.HoldFood || !cooker.Comp.HoldFood) - return; + if (!source.Comp.CanGiveFood || !target.Comp.CanAcceptFood) + return false; - if (holder.Comp.FoodType != cooker.Comp.FoodType) - return; + if (target.Comp.FoodType != source.Comp.FoodType) + return false; - if (!TryComp(holder, out var holderFoodComp)) - return; + if (source.Comp.FoodData is null) + return false; - if (!TryComp(cooker, out var cookerFoodVisuals) || cookerFoodVisuals.FoodData is null) - return; + if (!TryComp(target, out var holderFoodComp)) + return false; - if (!_solution.TryGetSolution(cooker.Owner, cooker.Comp.SolutionId, out var cookerSoln, out var cookerSolution)) - return; + if (!_solution.TryGetSolution(source.Owner, source.Comp.SolutionId, out var cookerSoln, out var cookerSolution)) + return false; //Solutions - if (_solution.TryGetSolution(holder.Owner, holderFoodComp.Solution, out var holderSoln, out var solution)) + if (_solution.TryGetSolution(target.Owner, holderFoodComp.Solution, out var holderSoln, out var solution)) { if (solution.Volume > 0) { - _popup.PopupEntity(Loc.GetString("cp14-cooking-popup-not-empty", ("name", MetaData(holder).EntityName)), - holder); - return; + _popup.PopupEntity(Loc.GetString("cp14-cooking-popup-not-empty", ("name", MetaData(target).EntityName)), + target); + return false; } _solution.TryTransferSolution(holderSoln.Value, cookerSolution, solution.MaxVolume); @@ -139,63 +140,77 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem //Trash //If we have a lot of trash, we put 1 random trash in each plate. If it's a last plate (out of solution in cooker), we put all the remaining trash in it. - if (cookerFoodVisuals.FoodData.Trash.Count > 0) + if (source.Comp.FoodData?.Trash.Count > 0) { if (cookerSolution.Volume <= 0) { - holderFoodComp.Trash.AddRange(cookerFoodVisuals.FoodData.Trash); + holderFoodComp.Trash.AddRange(source.Comp.FoodData.Trash); } else { if (_net.IsServer) { - var newTrash = _random.Pick(cookerFoodVisuals.FoodData.Trash); - cookerFoodVisuals.FoodData.Trash.Remove(newTrash); + var newTrash = _random.Pick(source.Comp.FoodData.Trash); + source.Comp.FoodData.Trash.Remove(newTrash); holderFoodComp.Trash.Add(newTrash); } } } + if (source.Comp.FoodData is not null) + UpdateFoodDataVisuals(target, source.Comp.FoodData); + + Dirty(target); + Dirty(source); + + _solution.UpdateChemicals(cookerSoln.Value); + + return true; + } + + private void UpdateFoodDataVisuals( + Entity ent, + bool rename = true) + { + var data = ent.Comp.FoodData; + + if (data is null) + return; + + UpdateFoodDataVisuals(ent, data, rename); + } + + protected virtual void UpdateFoodDataVisuals( + Entity ent, + CP14FoodData data, + bool rename = true) + { //Name and Description - if (cookerFoodVisuals.FoodData.Name is not null) - _metaData.SetEntityName(holder, Loc.GetString(cookerFoodVisuals.FoodData.Name)); - if (cookerFoodVisuals.FoodData.Desc is not null) - _metaData.SetEntityDescription(holder, Loc.GetString(cookerFoodVisuals.FoodData.Desc)); + if (rename) + { + if (data.Name is not null) + _metaData.SetEntityName(ent, Loc.GetString(data.Name)); + if (data.Desc is not null) + _metaData.SetEntityDescription(ent, Loc.GetString(data.Desc)); + } //Flavors - EnsureComp(holder, out var flavorComp); - foreach (var flavor in cookerFoodVisuals.FoodData.Flavors) + EnsureComp(ent, out var flavorComp); + foreach (var flavor in data.Flavors) { flavorComp.Flavors.Add(flavor); } //Visuals - var holderFoodVisuals = EnsureComp(holder); - holderFoodVisuals.FoodData = new CP14FoodData(cookerFoodVisuals.FoodData); - - //Visual random - foreach (var layer in holderFoodVisuals.FoodData.Visuals) + ent.Comp.FoodData = new CP14FoodData(data); + foreach (var layer in data.Visuals) { if (_random.Prob(0.5f)) layer.Scale = new Vector2(-1, 1); } - //Clear cooker data - if (cookerSolution.Volume <= 0) - { - cookerFoodVisuals.FoodData = null; - cooker.Comp.HoldFood = false; - } - - holder.Comp.HoldFood = true; - - Dirty(holder, holderFoodVisuals); - Dirty(cooker, cookerFoodVisuals); - - Dirty(holder); - Dirty(cooker); - - _solution.UpdateChemicals(cookerSoln.Value); + //Sliceable + // > on server overrided side } public CP14CookingRecipePrototype? GetRecipe(Entity ent) @@ -218,7 +233,9 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem return GetRecipe(ent.Comp.FoodType, solution, allTags); } - public CP14CookingRecipePrototype? GetRecipe(CP14FoodType foodType, Solution? solution, List> allTags) + public CP14CookingRecipePrototype? GetRecipe(ProtoId foodType, + Solution? solution, + List> allTags) { if (OrderedRecipes.Count == 0) { @@ -252,7 +269,7 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem return selectedRecipe; } - protected void CookFood(Entity ent, CP14CookingRecipePrototype recipe) + protected void CreateFoodData(Entity ent, CP14CookingRecipePrototype recipe) { if (!_solution.TryGetSolution(ent.Owner, ent.Comp.SolutionId, out var soln, out var solution)) return; @@ -260,18 +277,7 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem if (!_container.TryGetContainer(ent, ent.Comp.ContainerId, out var container)) return; - var newData = new CP14FoodData - { - Visuals = new List(recipe.FoodData.Visuals), - Trash = new List(recipe.FoodData.Trash), - Flavors = new HashSet(recipe.FoodData.Flavors), - Name = recipe.FoodData.Name, - Desc = recipe.FoodData.Desc, - CurrentRecipe = recipe - }; - - newData.Name = recipe.FoodData.Name; - newData.Desc = recipe.FoodData.Desc; + var newData = new CP14FoodData(recipe.FoodData); //Process entities foreach (var contained in container.ContainedEntities) @@ -307,36 +313,36 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem if (solution.Volume <= 0) return; - var foodVisuals = EnsureComp(ent.Owner); - foodVisuals.FoodData = newData; - - ent.Comp.HoldFood = true; + if (TryComp(ent.Owner, out var holder)) + { + holder.FoodData = newData; + Dirty(ent.Owner, holder); + } Dirty(ent); - Dirty(ent, foodVisuals); } protected void BurntFood(Entity ent) { - if (!TryComp(ent, out var foodVisuals) || foodVisuals.FoodData is null) + if (!TryComp(ent, out var holder) || holder.FoodData is null) return; if (!_solution.TryGetSolution(ent.Owner, ent.Comp.SolutionId, out var soln, out var solution)) return; //Brown visual - foreach (var visuals in foodVisuals.FoodData.Visuals) + foreach (var visuals in holder.FoodData.Visuals) { visuals.Color = Color.FromHex("#212121"); } - foodVisuals.FoodData.Name = Loc.GetString("cp14-meal-recipe-burned-trash-name"); - foodVisuals.FoodData.Desc = Loc.GetString("cp14-meal-recipe-burned-trash-desc"); + holder.FoodData.Name = Loc.GetString("cp14-meal-recipe-burned-trash-name"); + holder.FoodData.Desc = Loc.GetString("cp14-meal-recipe-burned-trash-desc"); var replacedVolume = solution.Volume / 2; solution.SplitSolution(replacedVolume); solution.AddReagent(_burntFoodReagent, replacedVolume / 2); - DirtyField(ent.Owner, foodVisuals, nameof(CP14FoodVisualsComponent.FoodData)); + DirtyField(ent.Owner, holder, nameof(CP14FoodHolderComponent.FoodData)); } } diff --git a/Content.Shared/_CP14/Cooking/Components/CP14FoodCookerComponent.cs b/Content.Shared/_CP14/Cooking/Components/CP14FoodCookerComponent.cs index 10a598a67c..56e5efcd17 100644 --- a/Content.Shared/_CP14/Cooking/Components/CP14FoodCookerComponent.cs +++ b/Content.Shared/_CP14/Cooking/Components/CP14FoodCookerComponent.cs @@ -3,6 +3,7 @@ * https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT */ +using Content.Shared._CP14.Cooking.Prototypes; using Content.Shared.DoAfter; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -10,14 +11,14 @@ using Robust.Shared.Serialization; namespace Content.Shared._CP14.Cooking.Components; +/// +/// Prepares food from ingredients and places it in the FoodHolderComponent +/// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), Access(typeof(CP14SharedCookingSystem))] public sealed partial class CP14FoodCookerComponent : Component { - [DataField] - public bool HoldFood = false; - [DataField(required: true)] - public CP14FoodType FoodType; + public ProtoId FoodType; [DataField] public string ContainerId; @@ -50,6 +51,9 @@ public sealed partial class CP14FoodCookerComponent : Component [DataField] public float BurntAdditionalSpawnProb = 0.2f; + + [DataField] + public bool RenameCooker = false; } [Serializable] @@ -64,6 +68,8 @@ public sealed partial class CP14FoodData Visuals = new List(data.Visuals); Trash = new List(data.Trash); Flavors = new HashSet(data.Flavors); + SliceProto = data.SliceProto; + SliceCount = data.SliceCount; } [DataField] @@ -83,12 +89,12 @@ public sealed partial class CP14FoodData [DataField] public HashSet Flavors = new(); -} -public enum CP14FoodType -{ - Meal, - Soup, + [DataField] + public EntProtoId? SliceProto; + + [DataField] + public ushort SliceCount = 5; } [Serializable, NetSerializable] diff --git a/Content.Shared/_CP14/Cooking/Components/CP14FoodHolderComponent.cs b/Content.Shared/_CP14/Cooking/Components/CP14FoodHolderComponent.cs index 01429f28ce..59bd759976 100644 --- a/Content.Shared/_CP14/Cooking/Components/CP14FoodHolderComponent.cs +++ b/Content.Shared/_CP14/Cooking/Components/CP14FoodHolderComponent.cs @@ -3,20 +3,47 @@ * https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT */ +using Content.Shared._CP14.Cooking.Prototypes; using Robust.Shared.GameStates; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; namespace Content.Shared._CP14.Cooking.Components; -[RegisterComponent, NetworkedComponent, Access(typeof(CP14SharedCookingSystem))] +/// +/// Food of the specified type can be transferred to this entity. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), Access(typeof(CP14SharedCookingSystem))] public sealed partial class CP14FoodHolderComponent : Component { + /// + /// What food is currently stored here? + /// + [DataField, AutoNetworkedField] + public CP14FoodData? FoodData; + [DataField] - public bool HoldFood = false; + public bool CanAcceptFood = false; + + [DataField] + public bool CanGiveFood = false; [DataField(required: true)] - public CP14FoodType FoodType; + public ProtoId FoodType; [DataField] public string? SolutionId; + + [DataField] + public int MaxDisplacementFillLevels = 8; + + [DataField] + public string? DisplacementRsiPath; + + /// + /// target layer, where new layers will be added. This allows you to control the order of generative layers and static layers. + /// + [DataField] + public string TargetLayerMap = "cp14_foodLayers"; + + public HashSet RevealedLayers = new(); } diff --git a/Content.Shared/_CP14/Cooking/Components/CP14FoodVisualsComponent.cs b/Content.Shared/_CP14/Cooking/Components/CP14FoodVisualsComponent.cs deleted file mode 100644 index 4a47f7e60d..0000000000 --- a/Content.Shared/_CP14/Cooking/Components/CP14FoodVisualsComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is sublicensed under MIT License - * https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT - */ - -using Robust.Shared.GameStates; -using Robust.Shared.Utility; - -namespace Content.Shared._CP14.Cooking.Components; - -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true, true), Access(typeof(CP14SharedCookingSystem))] -public sealed partial class CP14FoodVisualsComponent : Component -{ - /// - /// What food is currently stored here? - /// - [DataField, AutoNetworkedField] - public CP14FoodData? FoodData; - - [DataField] - public int MaxDisplacementFillLevels = 8; - - [DataField] - public string? DisplacementRsiPath = null; - - [DataField] - public string? SolutionId; - - /// - /// target layer, where new layers will be added. This allows you to control the order of generative layers and static layers. - /// - [DataField] - public string TargetLayerMap = "cp14_foodLayers"; - - public HashSet RevealedLayers = new(); -} diff --git a/Content.Shared/_CP14/Cooking/CP14CookingRecipePrototype.cs b/Content.Shared/_CP14/Cooking/Prototypes/CP14CookingRecipePrototype.cs similarity index 88% rename from Content.Shared/_CP14/Cooking/CP14CookingRecipePrototype.cs rename to Content.Shared/_CP14/Cooking/Prototypes/CP14CookingRecipePrototype.cs index 43881597a0..8ac0403e21 100644 --- a/Content.Shared/_CP14/Cooking/CP14CookingRecipePrototype.cs +++ b/Content.Shared/_CP14/Cooking/Prototypes/CP14CookingRecipePrototype.cs @@ -7,7 +7,7 @@ using Content.Shared._CP14.Cooking.Components; using Robust.Shared.Audio; using Robust.Shared.Prototypes; -namespace Content.Shared._CP14.Cooking; +namespace Content.Shared._CP14.Cooking.Prototypes; [Prototype("CP14CookingRecipe")] public sealed class CP14CookingRecipePrototype : IPrototype @@ -28,8 +28,8 @@ public sealed class CP14CookingRecipePrototype : IPrototype [DataField] public CP14FoodData FoodData = new(); - [DataField] - public CP14FoodType FoodType = CP14FoodType.Meal; + [DataField(required: true)] + public ProtoId FoodType; [DataField] public TimeSpan CookingTime = TimeSpan.FromSeconds(20f); diff --git a/Content.Shared/_CP14/Cooking/Prototypes/CP14FoodTypePrototype.cs b/Content.Shared/_CP14/Cooking/Prototypes/CP14FoodTypePrototype.cs new file mode 100644 index 0000000000..3e97dba785 --- /dev/null +++ b/Content.Shared/_CP14/Cooking/Prototypes/CP14FoodTypePrototype.cs @@ -0,0 +1,15 @@ +/* + * This file is sublicensed under MIT License + * https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT + */ + +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Cooking.Prototypes; + +[Prototype("CP14FoodType")] +public sealed class CP14FoodTypePrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; +} diff --git a/Content.Shared/_CP14/Cooking/Requirements/TagBlocked.cs b/Content.Shared/_CP14/Cooking/Requirements/TagBlocked.cs index eb69c0c307..43641f8ee1 100644 --- a/Content.Shared/_CP14/Cooking/Requirements/TagBlocked.cs +++ b/Content.Shared/_CP14/Cooking/Requirements/TagBlocked.cs @@ -30,6 +30,6 @@ public sealed partial class TagBlocked : CP14CookingCraftRequirement public override float GetComplexity() { - return 1; + return Tags.Count * -1; } } diff --git a/Content.Shared/_CP14/Workbench/Requirements/FoodResource.cs b/Content.Shared/_CP14/Workbench/Requirements/FoodResource.cs index 0796ddb3a6..b3ba4132c9 100644 --- a/Content.Shared/_CP14/Workbench/Requirements/FoodResource.cs +++ b/Content.Shared/_CP14/Workbench/Requirements/FoodResource.cs @@ -6,8 +6,10 @@ using System.Linq; using Content.Shared._CP14.Cooking; using Content.Shared._CP14.Cooking.Components; +using Content.Shared._CP14.Cooking.Prototypes; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.FixedPoint; +using Content.Shared.Nutrition.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -28,16 +30,16 @@ public sealed partial class FoodResource : CP14WorkbenchCraftRequirement var solutionSys = entManager.System(); foreach (var ent in placedEntities) { - if (!entManager.TryGetComponent(ent, out var foodVisuals)) + if (!entManager.TryGetComponent(ent, out var foodHolder)) continue; - if (entManager.HasComponent(ent)) + if (!entManager.HasComponent(ent)) continue; - if (foodVisuals.FoodData?.CurrentRecipe != Recipe) + if (foodHolder.FoodData?.CurrentRecipe != Recipe) continue; - if (!solutionSys.TryGetSolution(ent, foodVisuals.SolutionId, out _, out var solution)) + if (!solutionSys.TryGetSolution(ent, foodHolder.SolutionId, out _, out var solution)) continue; if (solution.Volume < Count) @@ -57,16 +59,16 @@ public sealed partial class FoodResource : CP14WorkbenchCraftRequirement foreach (var ent in placedEntities) { - if (!entManager.TryGetComponent(ent, out var foodVisuals)) + if (!entManager.TryGetComponent(ent, out var foodHolder)) continue; - if (entManager.HasComponent(ent)) + if (!entManager.HasComponent(ent)) continue; - if (foodVisuals.FoodData?.CurrentRecipe != Recipe) + if (foodHolder.FoodData?.CurrentRecipe != Recipe) continue; - if (!solutionSys.TryGetSolution(ent, foodVisuals.SolutionId, out _, out var solution)) + if (!solutionSys.TryGetSolution(ent, foodHolder.SolutionId, out _, out var solution)) continue; if (solution.Volume < Count) diff --git a/Resources/Locale/en-US/_CP14/cooking/pies.ftl b/Resources/Locale/en-US/_CP14/cooking/pies.ftl new file mode 100644 index 0000000000..5dec6c87e1 --- /dev/null +++ b/Resources/Locale/en-US/_CP14/cooking/pies.ftl @@ -0,0 +1,2 @@ +cp14-soup-recipe-pie-name = pie +cp14-soup-recipe-pie-desc = It's time to get a knife and cut the pie to see what's inside! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/cooking/pies.ftl b/Resources/Locale/ru-RU/_CP14/cooking/pies.ftl new file mode 100644 index 0000000000..f0960527d6 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/cooking/pies.ftl @@ -0,0 +1,2 @@ +cp14-soup-recipe-pie-name = пирог +cp14-soup-recipe-pie-desc = Самое время достать нож, и порезать пирог, чтобы узнать что у него внутри! \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/bowl.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/bowl.yml index 3a4ef4b2eb..186d7c1afd 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/bowl.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/bowl.yml @@ -14,12 +14,11 @@ solutions: food: maxVol: 30 - - type: CP14FoodVisuals - displacementRsiPath: _CP14/Objects/Consumable/Food/Soups/displacement.rsi - solutionId: food - type: CP14FoodHolder foodType: Soup solutionId: food + displacementRsiPath: _CP14/Objects/Consumable/Food/Soups/displacement.rsi + canAcceptFood: true - type: Appearance - type: SolutionContainerVisuals - type: Food @@ -27,6 +26,8 @@ path: /Audio/Items/drink.ogg utensil: Spoon transferAmount: 2.5 + - type: Spillable + solution: food - type: entity id: CP14BowlWooden diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/pies_pieces.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/pies_pieces.yml new file mode 100644 index 0000000000..aa67bf5631 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/pies_pieces.yml @@ -0,0 +1,64 @@ +- type: entity + parent: FoodInjectableBase + id: CP14FoodPiePieceBase + abstract: true + categories: [ ForkFiltered ] + components: + - type: Item + size: Tiny + - type: Temperature + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/Pies/pieces.rsi + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 7 + - ReagentId: Protein + Quantity: 2 + +- type: entity + id: CP14FoodPiePieceTrash + parent: CP14FoodPiePieceBase + name: a piece of disgusting pie + description: On the outside, it looked appealing and delicious, but on the inside, it was simply awful. + components: + - type: Sprite + layers: + - state: blank + - state: trash + +- type: entity + id: CP14FoodPiePieceMeat + parent: CP14FoodPiePieceBase + name: a piece of meat pie + description: Pie with juicy meat. + components: + - type: Sprite + layers: + - state: blank + - state: meat + +- type: entity + id: CP14FoodPiePiecePumpkin + parent: CP14FoodPiePieceBase + name: a piece of pumpkin pie + description: Pumpkin pie. Sweet and delicate. + components: + - type: Sprite + layers: + - state: blank + - state: pumpkin + +- type: entity + id: CP14FoodPiePieceVeg + parent: CP14FoodPiePieceBase + name: a piece of vegetable pie + description: Vegetables and herbs inside + components: + - type: Sprite + layers: + - state: blank + - state: veg \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/plate.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/plate.yml index 3df3a927f7..31e5a7c19c 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/plate.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/Meals/plate.yml @@ -15,16 +15,17 @@ solutions: food: maxVol: 20 - - type: CP14FoodVisuals - displacementRsiPath: _CP14/Objects/Consumable/Food/Meals/displacement.rsi - solutionId: food - type: CP14FoodHolder + displacementRsiPath: _CP14/Objects/Consumable/Food/Meals/displacement.rsi foodType: Meal solutionId: food + canAcceptFood: true - type: Appearance - type: SolutionContainerVisuals - type: Food transferAmount: 2.5 + - type: Spillable + solution: food - type: entity id: CP14PlateWooden diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/cutlery.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/cutlery.yml index 62974842ca..974c573f99 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/cutlery.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/cutlery.yml @@ -1,23 +1,3 @@ -- type: entity - id: CP14PlatePie - parent: BaseItem - name: pie plate - description: A mould for making a delicious pie. - categories: [ ForkFiltered ] - components: - - type: Sprite - sprite: _CP14/Objects/Consumable/Food/pie.rsi - state: tin - - type: Item - shape: - - 0,0,1,0 - - type: Tag - tags: - - CP14PlatePie - - type: PhysicalComposition - materialComposition: - CP14Iron: 10 # 1 iron bar = 1 plate pie in craft - - type: entity parent: BaseItem id: CP14Fork diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/pie.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/pie.yml deleted file mode 100644 index 3257449200..0000000000 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/pie.yml +++ /dev/null @@ -1,358 +0,0 @@ -# base - -- type: entity - parent: FoodInjectableBase - id: CP14FoodPieBase - abstract: true - categories: [ ForkFiltered ] - components: - - type: Item - size: Normal - storedRotation: -90 - - type: Temperature - - type: FlavorProfile - flavors: - - sweet - - type: Sprite - sprite: _CP14/Objects/Consumable/Food/pie.rsi - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 12 - - ReagentId: Protein - Quantity: 5 - - type: Food - trash: - - CP14PlatePie - - type: Tag - tags: - - Pie - - type: StaticPrice - price: 6 # price for crafting and plate - - type: PhysicalComposition - materialComposition: - CP14Iron: 10 # 1 iron bar = 1 plate pie in craft - -- type: entity - parent: FoodInjectableBase - id: CP14FoodPieBaseRaw - abstract: true - categories: [ ForkFiltered ] - components: - - type: Item - size: Normal - storedRotation: -90 - - type: Temperature - - type: FlavorProfile - flavors: - - raw dough - - type: Sprite - sprite: _CP14/Objects/Consumable/Food/pie.rsi - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 12 - - ReagentId: UncookedAnimalProteins - Quantity: 5 - - type: Food - trash: - - CP14PlatePie - - type: PhysicalComposition - materialComposition: - CP14Iron: 10 # 1 iron bar = 1 plate pie in craft - -# pie - -- type: entity - name: raw apple pie - parent: CP14FoodPieBaseRaw - id: CP14FoodPieAppleRaw - description: Raw dough with apples seems like a cnr you shouldn't be eating right now. - components: - - type: FlavorProfile - flavors: - - raw dough - - apple - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 6 - - ReagentId: UncookedAnimalProteins - Quantity: 2 - - ReagentId: Vitamin - Quantity: 5 - - type: Sprite - layers: - - state: tin - - state: apple_raw - - type: Tag - tags: - - Fruit - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieApple - -- type: entity - name: apple pie - parent: CP14FoodPieBase - id: CP14FoodPieApple - description: Apple pie beckons with its smells. - components: - - type: FlavorProfile - flavors: - - sweet - - apple - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 15 - - ReagentId: Protein - Quantity: 4 - - ReagentId: Vitamin - Quantity: 14 - - type: Sprite - layers: - - state: tin - - state: apple - - type: Tag - tags: - - Fruit - - Pie - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieBurnt - -- type: entity - name: raw meat pie - parent: CP14FoodPieBaseRaw - id: CP14FoodPieMeatRaw - description: Raw dough with raw meat, not the best dish at the moment. - components: - - type: FlavorProfile - flavors: - - raw dough - - meaty - - type: SolutionContainerManager - solutions: - food: - maxVol: 34 - reagents: - - ReagentId: Nutriment - Quantity: 16 - - ReagentId: UncookedAnimalProteins - Quantity: 13 - - ReagentId: Vitamin - Quantity: 2 - - type: Sprite - layers: - - state: tin - - state: meat_raw - - type: Tag - tags: - - Meat - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieMeat - -- type: entity - name: meat pie - parent: CP14FoodPieBase - id: CP14FoodPieMeat - description: Oh that wonderful aroma of bread and meat, I could eat that right now. - components: - - type: FlavorProfile - flavors: - - meaty - - type: SolutionContainerManager - solutions: - food: - maxVol: 34 - reagents: - - ReagentId: Nutriment - Quantity: 16 - - ReagentId: Protein - Quantity: 13 - - ReagentId: Vitamin - Quantity: 2 - - type: Sprite - layers: - - state: tin - - state: meat - - type: Tag - tags: - - Meat - - Pie - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieBurnt - -- type: entity - name: raw fish pie - parent: CP14FoodPieBaseRaw - id: CP14FoodPieFishRaw - description: Raw dough with raw fish..... Where did they get the fish?! - components: - - type: FlavorProfile - flavors: - - raw dough - - fishy - - type: Sprite - layers: - - state: tin - - state: fisht_raw - - type: Tag - tags: - - Meat - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieFish - - type: StaticPrice - price: 20 - -- type: entity - name: fish pie - parent: CP14FoodPieBase - id: CP14FoodPieFish - description: Fish pie, a good alternative among meat dishes. - components: - - type: FlavorProfile - flavors: - - fishy - - type: SolutionContainerManager - solutions: - food: - maxVol: 30 - reagents: - - ReagentId: Nutriment - Quantity: 15 - - ReagentId: Protein - Quantity: 8 - - ReagentId: Vitamin - Quantity: 6 - - type: Sprite - layers: - - state: tin - - state: fish - - type: Tag - tags: - - Meat - - Pie - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieBurnt - -- type: entity - name: raw pumpkin pie - parent: CP14FoodPieBaseRaw - id: CP14FoodPiePumpkinRaw - description: Raw dough with pumpkin, can be a satisfyingly flavorful dish. - components: - - type: FlavorProfile - flavors: - - raw dough - - pumpkin - - type: Sprite - layers: - - state: tin - - state: pumpkin_raw - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 2 - - ReagentId: UncookedAnimalProteins - Quantity: 2 - - ReagentId: PumpkinFlesh - Quantity: 10 - - ReagentId: Vitamin - Quantity: 4 - - type: Tag - tags: - - Fruit - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPiePumpkin - -- type: entity - name: pumpkin pie - parent: CP14FoodPieBase - id: CP14FoodPiePumpkin - description: Delicious pumpkin pie, with a toasted crust on the outside. - components: - - type: FlavorProfile - flavors: - - pumpkin - - type: Sprite - layers: - - state: tin - - state: pumpkin - - type: SolutionContainerManager - solutions: - food: - maxVol: 20 - reagents: - - ReagentId: Nutriment - Quantity: 4 - - ReagentId: Protein - Quantity: 2 - - ReagentId: PumpkinFlesh - Quantity: 10 - - ReagentId: Vitamin - Quantity: 4 - - type: Tag - tags: - - Fruit - - Pie - - type: CP14TemperatureTransformation - entries: - - temperatureRange: 400, 500 - transformTo: CP14FoodPieBurnt - -- type: entity - name: burnt pie - parent: CP14FoodPieBaseRaw - id: CP14FoodPieBurnt - description: The pie is burnt and is a burnt and inedible mass. It's best to clean that up with a knife. - components: - - type: FlavorProfile - flavors: - - terrible - - type: Sprite - layers: - - state: tin - - state: burnt_pie - - type: SolutionContainerManager - solutions: - food: - maxVol: 15 - reagents: - - ReagentId: Nutriment - Quantity: 2 - - ReagentId: CP14BurntFood - Quantity: 8 - - type: Butcherable - butcheringType: Knife - spawned: - - id: CP14PlatePie - amount: 1 diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/base.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/base.yml index 25cc4ba275..7b54afced7 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/base.yml @@ -21,9 +21,6 @@ burn: True: { visible: true } False: { visible: false } - - type: Item - size: Ginormous - - type: MultiHandedItem - type: ContainerContainer containers: storagebase: !type:Container @@ -32,7 +29,6 @@ maxItemSize: Normal grid: - 0,0,3,3 - - 0,0,2,2 whitelist: components: - Food diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/cooking_pot.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/cooking_pot.yml index 0667af73e1..e3f5864fa1 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/cooking_pot.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/cooking_pot.yml @@ -5,7 +5,7 @@ description: Container for cooking Grand Soup. components: - type: Sprite - sprite: _CP14/Objects/Specific/Cooking/cooking_pot.rsi + sprite: _CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi layers: - state: base map: ["enum.StorageVisualLayers.Base"] @@ -23,13 +23,18 @@ solutions: cooker: maxVol: 150 - - type: CP14FoodVisuals + - type: CP14FoodHolder + foodType: Soup solutionId: cooker displacementRsiPath: _CP14/Objects/Consumable/Food/Soups/displacement_pot.rsi maxDisplacementFillLevels: 2 + canGiveFood: true - type: CP14FoodCooker foodType: Soup solutionId: cooker + - type: Item + size: Ginormous + - type: MultiHandedItem - type: RefillableSolution solution: cooker - type: Spillable diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/frying_pen.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/frying_pen.yml index 1313a2e80c..b885bb8446 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/frying_pen.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/frying_pen.yml @@ -5,7 +5,7 @@ description: "You can always watch three things: how fire burns, how water flows, and how delicious meat is cooked." components: - type: Sprite - sprite: _CP14/Objects/Specific/Cooking/frying_pan.rsi + sprite: _CP14/Objects/Consumable/Food/Meals/frying_pan.rsi layers: - state: base map: ["enum.StorageVisualLayers.Base"] @@ -35,10 +35,15 @@ solutions: cooker: maxVol: 100 - - type: CP14FoodVisuals + - type: CP14FoodHolder + foodType: Meal solutionId: cooker displacementRsiPath: _CP14/Objects/Consumable/Food/Meals/displacement_pan.rsi maxDisplacementFillLevels: 2 + canGiveFood: true + - type: Item + size: Ginormous + - type: MultiHandedItem - type: CP14FoodCooker foodType: Meal solutionId: cooker diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/pie_pan.yml b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/pie_pan.yml new file mode 100644 index 0000000000..d90a78d7b2 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/Specific/Cooking/pie_pan.yml @@ -0,0 +1,84 @@ +- type: entity + id: CP14PlatePie + parent: CP14CookerBase + name: pie plate + description: A mould for making a delicious pie. + categories: [ ForkFiltered ] + components: + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/Pies/plate.rsi + layers: + - state: iron + - map: ["cp14_foodLayers"] + - map: ["enum.StorageFillLayers.Fill"] + - type: Item + size: Normal + shape: + - 0,0,1,1 + - type: PhysicalComposition + materialComposition: + CP14Iron: 10 # 1 iron bar = 1 plate pie in craft + - type: CP14FoodCooker + foodType: Pie + solutionId: cooker + - type: CP14FoodHolder + foodType: Pie + solutionId: cooker + - type: Storage + maxItemSize: Small + grid: + - 0,0,2,2 + cP14Ignorelist: + components: + - CP14FoodHolder + - FoodSequenceStartPoint + - Sharp + - CP14Sharpened + - type: Appearance + - type: StorageFillVisualizer + maxFillLevels: 3 + fillBaseName: raw + - type: SolutionContainerManager + solutions: + cooker: + maxVol: 50 + - type: AmbientSound + sound: + path: /Audio/_CP14/Ambience/pan_frying.ogg + - type: GenericVisualizer + visuals: + enum.CP14CookingVisuals.Cooking: + cook: + True: { visible: true } + False: { visible: false } + enum.CP14CookingVisuals.Burning: + burn: + True: { visible: true } + False: { visible: false } + - type: Food + solution: cooker + transferAmount: 2.5 + trash: + - CP14PlatePie + - type: Spillable + solution: cooker + - type: SolutionContainerVisuals + - type: SliceableFood + +- type: entity + id: CP14PlatePieRandom + suffix: Random food + parent: CP14PlatePie + components: + - type: CP14RandomFoodData + - type: SolutionContainerManager + solutions: + cooker: + maxVol: 50 + reagents: + - ReagentId: Nutriment + Quantity: 20 + - ReagentId: Protein + Quantity: 20 + - ReagentId: Fat + Quantity: 10 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Cooking/food_types.yml b/Resources/Prototypes/_CP14/Recipes/Cooking/food_types.yml new file mode 100644 index 0000000000..6f1eafb84e --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Cooking/food_types.yml @@ -0,0 +1,8 @@ +- type: CP14FoodType + id: Meal + +- type: CP14FoodType + id: Soup + +- type: CP14FoodType + id: Pie \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Cooking/pies.yml b/Resources/Prototypes/_CP14/Recipes/Cooking/pies.yml new file mode 100644 index 0000000000..7203ae85a0 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Cooking/pies.yml @@ -0,0 +1,61 @@ +- type: CP14CookingRecipe + id: InediblePie + foodType: Pie + foodData: + name: cp14-soup-recipe-pie-name + desc: cp14-soup-recipe-pie-desc + visuals: + - sprite: _CP14/Objects/Consumable/Food/Pies/misc.rsi + state: veg + sliceProto: CP14FoodPiePieceTrash + requirements: + - !type:AlwaysMet + +# 1 Req + +- type: CP14CookingRecipe + id: PieVeg + foodType: Pie + foodData: + name: cp14-soup-recipe-pie-name + desc: cp14-soup-recipe-pie-desc + visuals: + - sprite: _CP14/Objects/Consumable/Food/Pies/misc.rsi + state: veg + sliceProto: CP14FoodPiePieceVeg + requirements: + - !type:TagRequired + tags: + - CP14Salad + - CP14Vegetable + +- type: CP14CookingRecipe + id: PieMeat + foodType: Pie + foodData: + name: cp14-soup-recipe-pie-name + desc: cp14-soup-recipe-pie-desc + visuals: + - sprite: _CP14/Objects/Consumable/Food/Pies/misc.rsi + state: meat + sliceProto: CP14FoodPiePieceMeat + requirements: + - !type:TagRequired + tags: + - CP14Meat + - CP14MeatSlice + +- type: CP14CookingRecipe + id: PiePumpkin + foodType: Pie + foodData: + name: cp14-soup-recipe-pie-name + desc: cp14-soup-recipe-pie-desc + visuals: + - sprite: _CP14/Objects/Consumable/Food/Pies/misc.rsi + state: meat + sliceProto: CP14FoodPiePiecePumpkin + requirements: + - !type:TagRequired + tags: + - CP14Pumpkin \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml deleted file mode 100644 index f7efc76aaa..0000000000 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml +++ /dev/null @@ -1,59 +0,0 @@ -- type: CP14Recipe - id: CP14FoodPieAppleRaw - tag: CP14RecipeCooking - craftTime: 5 - requirements: - - !type:ProtoIdResource - protoId: CP14PlatePie - - !type:ProtoIdResource - protoId: CP14FoodDoughMediumFlat - - !type:ProtoIdResource - protoId: CP14FoodAppleSlice - count: 4 - result: CP14FoodPieAppleRaw - -- type: CP14Recipe - id: CP14FoodPieMeatRaw - tag: CP14RecipeCooking - craftTime: 5 - requirements: - - !type:ProtoIdResource - protoId: CP14PlatePie - - !type:ProtoIdResource - protoId: CP14FoodDoughMediumFlat - - !type:ProtoIdResource - protoId: CP14FoodMeatPigSlice - count: 3 - result: CP14FoodPieMeatRaw - -- type: CP14Recipe - id: CP14FoodPiePumpkinRaw - tag: CP14RecipeCooking - craftTime: 5 - requirements: - - !type:ProtoIdResource - protoId: CP14PlatePie - - !type:ProtoIdResource - protoId: CP14FoodDoughMediumFlat - - !type:ProtoIdResource - protoId: CP14FoodPumpkinSlice - count: 5 - result: CP14FoodPiePumpkinRaw - -# preobaly just a placeholder until we get actaul fish - -- type: CP14Recipe - id: CP14FoodPieFishRaw - tag: CP14RecipeCooking - craftTime: 5 - requirements: - - !type:ProtoIdResource - protoId: CP14PlatePie - - !type:ProtoIdResource - protoId: CP14FoodDoughMediumFlat - - !type:ProtoIdResource - protoId: CP14FoodMeatFlemTorso - - !type:ProtoIdResource - protoId: CP14FoodMeatFlemLeg - count: 2 - result: CP14FoodPieFishRaw diff --git a/Resources/Prototypes/_CP14/Tags/misc.yml b/Resources/Prototypes/_CP14/Tags/misc.yml index 9064e44b7c..55a4fcb8c6 100644 --- a/Resources/Prototypes/_CP14/Tags/misc.yml +++ b/Resources/Prototypes/_CP14/Tags/misc.yml @@ -73,9 +73,6 @@ - type: Tag id: CP14Arrow -- type: Tag - id: CP14PlatePie - - type: Tag id: CP14FarmFood diff --git a/Resources/Prototypes/_CP14/Trading/BuyPositions/dairy_products.yml b/Resources/Prototypes/_CP14/Trading/BuyPositions/dairy_products.yml index 20c68d092c..c42a792288 100644 --- a/Resources/Prototypes/_CP14/Trading/BuyPositions/dairy_products.yml +++ b/Resources/Prototypes/_CP14/Trading/BuyPositions/dairy_products.yml @@ -52,7 +52,7 @@ reputationLevel: 1 uiPosition: 2 icon: - sprite: _CP14/Objects/Specific/Cooking/frying_pan.rsi + sprite: _CP14/Objects/Consumable/Food/Meals/frying_pan.rsi state: base service: !type:CP14BuyItemsService product: CP14FryingPan @@ -64,7 +64,7 @@ reputationLevel: 1 uiPosition: 3 icon: - sprite: _CP14/Objects/Specific/Cooking/cooking_pot.rsi + sprite: _CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi state: base service: !type:CP14BuyItemsService product: CP14CookingPot diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/base.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/base.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/base.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/base.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/closed.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/closed.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/closed.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/closed.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/cooking.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/cooking.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/frying_pan.rsi/cooking.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/cooking.png diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/dirt.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Meals/frying_pan.rsi/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..70280698455662af44b87d05ae959104329dd3a1 GIT binary patch literal 289 zcmV++0p9+JP)Px#+et)0R9J=Wld%eeFc60Smcnf%;N;rvo+5i+D9_*vx#uZvbL}KZw`?7nw3=Fl zC>_duAY8)f|0nkgD2k#e%0IxwuJql*UM7gm%S4c&`I&(zY~#`=@zK6tGIZQ1j7wLi zXCf4955N+ewp3>kCU*J!iH#eNBlXSI0B|Z5CpNCb?YWTmUe%v%U)@1$aOr9QuoC1N z#oJUTiZhU(a&FG4C&>WWeKU&v8<^>&nV(^Z82F;-@5c2vqw|)YT4FJ#wwLk>!?-1*_p-b=R)BPkw8g zIdCYp-#>Kp zQdggFw#rAohRC{?Qp(NquGO~z#TQw)oD7lBbJJ3=S`jtJ_CNa(Zo{02AAOBLz$hkV zaAD&gu{pJG&f30mKlt^yyo7|9lg>3>vxJCSH4{N<5^o=!eMG8J)Ie}`KyX;Y!(Wg2 zd8V&3G}6i4cS0a`b^p~OSH;3x77T3b?Ef7A0Rh=fT&w?FiazdnD$>PzLE8H=H{VD` z5qAYj$@}3|Ln2y} z6C_v{Cy4Yk1sZU*Nmm3YeVs4z)n`i)$Hs=%C^lb{XTRRR*Emq{`d$1ls|RnL?*5;z zzdv399ZYj@X6uCxE;GpR1kOQ#;FvHt6+=R7|DBP1n&04Q^2Lj5;sWzDn+bJ_0c zUHN@My_s;A{dw2djtnUK~A>_Q$d1_qzc#tXivx4r^8pTX1B&t;ucLK6V&>1PfA literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/trash.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Pies/pieces.rsi/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..33fb560710e1f0bce9dd5bb97c01672dfc006dfc GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}?>$`{Ln2y} z6C_v{Cy4Yk1sZU7?C0<{d}3dt7$k$edso_wSh%^ZZRBhdmd* zR(YAOw8UYR?T7s#)e6@Vc(>~OKY!rBfe&A2i-46Z-+f-9Zk^p>jjM7$=G$IrS+U~4 zONN!-4*cJv+V|gn|KEn-e=F|mwynRvL;?iTR#_d;{r~41GxKa4eP+FOWoEaen3K_u ze*C|F_&kq&`25Dz)3f;hE`Zml= yI#6$Xlwk+|^|Nn(|NruOJ_6WRAnnQ xb!>B;%x^qN=!*#RbA#YX!gn;FE_LK&nDE*3<3v$~<3N8fc)I$ztaD0e0su^OWoZBa literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/iron.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Pies/plate.rsi/iron.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ec311a12d93625788de38d1001283bbdbcfcee GIT binary patch literal 428 zcmV;d0aN~oP)Px$W=TXrR9J=Wl`(6=Kp2Lfl%nV&NLTG39duC;DU>1z#XlibDk3;Z`)4|L=$|Mp zg<>@o}mgJ~#xKsCTec-t( z5|VxQq6DR4IjEzCZ)(Pq(eDk6CnG$Goo|}(wB$GQKQY!AMg$@O#c`X49)yw% z(n)xFa^{PWf$$_0VKvn6rFu)BfV*@6ux&e73#)}zhS-l$wNl%9jMkC)?+S%NvCbD9 WmWB?Wc})uc*XMaSfSB*u1QZw;-5D2j067evu6{1-oD!M{GtLW{xg`Rz63S?28fu3N10o%w9?Ue~Zp z_KR6r?W-TTGdW0HWq4D*`ryhJZ4s|nB>2O#`+oBYyP3L_il@}L# z+F{mr`}!%9_hm_4-}r3aUtjh+$gV$zm!-fWu5LT?ssrDpOj*9vwPx#>`6pHR9J=Wld%eeFc60SLcyU!C{l0|b@ws)9^HiQeTwdaTi?USa942>M8v@% zlO1f*m==sw=yKoY<&yinO8|l(2;$G|)^14SXas=c=`f3T%>V#6Uz1g58Yic5Gx!ww-b6qzuExA@lF17W6kLkvBl=08%qm$> z9|3c0c%cg~e8>8_m3Lwj0aZkA`8Ofv*xL$BMMW1TiM-$lUhAUW%&|X2moR<>$?Y-* zz9qla88gS0mr@8v_s4dxKo8-A`{RTYB`->8`vcE`FjZesk-*p0ym7IC<@}(r@WbhRnore|CwsM2TZe zE$5gSTI;^O{kvj<(|Wi6XEb_FGY3c%pJe>8g>^&eBwmJ9YP$ReHMe?>uVgsz`Qssh z5?!b3Za#@`dRx}rt-h=Ec)goQmF<2L_Z@RN13$^V+N3I5d9r$j>3qHg8LzX}Sx-FI gX25gUVBJ~i72ovs9{mdKI;Vst0B%}Z_W%F@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/bowls.rsi/meta.json b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/bowls.rsi/meta.json index 1f1fd9f150..20f559a34a 100644 --- a/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/bowls.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/bowls.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "dirt" + }, { "name": "wooden" }, diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/base.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/base.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/base.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/base.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/closed.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/closed.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/closed.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/closed.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/cooking.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/cooking.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/cooking.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/cooking.png diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/dirt.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..68e560ed1ce5a4493d242031fcd92faf159f482e GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}k3C%+Ln2y} z6C_v{Cy4MEBrLhYQ0CiMB=P(CSN^$EX1QN5O5yIDx_IT&S#M@NHK?2w+4oK$hfhJ= zAn=*YDMnYmhM)5$Wh5xN8lGVS>dWQf;bE72=Xj)k<6pliPXjm9AN}x9VI`k}I?EeL z2?@S`d;Tr_{OkPdxj=P1Ir}4?+t>X*(B0U0aNd;wg;g>M*F`kk&p-C)JTK=Z-(uO3 z#xP5CyP`FdrMQBt;KhXwVH^pMjU5)VskvPZ61?gDV&Adl)6y8`D|?hO+Nj os^YHx%s6GCq5~QbA6YUmc-43>2<^Yk4)iXAr>mdKI;Vst08s;P(EtDd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/inhand-left.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/inhand-left.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/inhand-right.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/inhand-right.png diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/meta.json b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/meta.json similarity index 93% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/meta.json rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/meta.json index d2eadda949..db91042014 100644 --- a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/meta.json @@ -27,6 +27,9 @@ ] ] }, + { + "name": "dirt" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/opened.png b/Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/opened.png similarity index 100% rename from Resources/Textures/_CP14/Objects/Specific/Cooking/cooking_pot.rsi/opened.png rename to Resources/Textures/_CP14/Objects/Consumable/Food/Soups/cooking_pot.rsi/opened.png diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/apple_raw.png b/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/apple_raw.png deleted file mode 100644 index 20c11be77a51e8a8781f7fd46b4532948ef1bc13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmV+v0_**WP)Px$&PhZ;R9J=WlRrpXQ51(ijY}}lx)|*#wE?3gP^Ux}DK2lwR1_qGLoyTuq0pgI z9oi0d>Q)F8GQ^=n5tL3DvPj9I&8h?qWXbj4U^3(p5ZZJI@8XM?zL%xT{gwy!+xygTe5h8S;Cem|gGmt6Ljief9Lb*$Li1xB}qv+ClKAI_-tfAr01z1qF+JG^pn4vp)@T9nSf2Tk817fxOfS3MyRIs{ z`?v}~G7eD*l1Q!a;-vtP&dh4T`+E2iaNhI!=thS(O9iZ0fK%1x;bM|zsi4Ep4y#zP z0CiR2`sl{hV;}*5r_Z10fKTst^m-z-LbFsLTWm3^6cU*uDnX(W#EJ!6X9pH=CO$kh z!p|Ry4J(8#!lU_VetqA?79pLP1<*3koe6pH$JJvXfvxSmp?t2)+M9W5jTW{D5}D)d zuuAdxx4!wQYGaG&`KUEoq&_T?&z0HQ-s?Mro_@p4^l~TjD$eV*&qT&TB;(z6TZB=i z^tVv%hJX3?)>F7=f!h+m9g*9?fah>u0*(ZLBhpJgR|fDL?pvT&q!&NI27|$1aQF)q WNWmjrXgdx70000Px$(n&-?R9J=Wl(A~tP#8v!u4=nhomx?%gb*Q$z~IG0plikqeTyzdQ1BC!EG>P4 zf}pREE`f^!?|4NP?W4oSgq1 zW!VQ_T6F<%?4L!88JKqhAIG#f_Rp5e6zR9z)AC%=@?0TD;arZwd40`}7qc9N0LW2D zea((ro|`#0lWog$MRWgX4p1p;0CWN$LpSL4do-#xcf}}?0QmIbmAd!#bCi~yYTEK# z(R}|cSuST|`qPj`)ds-OjYLS!#))8a|7f12iELF(BPwN$PT;c{Y3K!wyJAGI-vi)> z2!9jl%3dPzXn_|EJDCmL;PmzafM7Df&<*s0M)&5L?YKha$x|HD!Z9rX4!^qUqXhsc z2;^+cc3fd&bsd1=V31sPOp8lJ^6aOe6Zim>i=|A_nO?%3ty(;ar*vH4(* diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/fisht_raw.png b/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/fisht_raw.png deleted file mode 100644 index 4ab392ace80adf13e0187d6fb30ba81b733e81ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)Px$(@8`@R9J=Wl1*q6K^TUg7Nz1+BoH!@og@~?_D~H=X)CRi6vTqXgT-P_LJx(2 zg5b}s=iZ9+6zI8ls0h7C1%qN0EB>&AVi6LwNH%RY3VRSm{96wtIpomYr5C|@uJg|K zK72EvP$(4tI~`#!6bpH8uk*847DLSp9BvjbFKz6Z%U#Zd5(yM47V=)RxKwok5Tcu@ z+&BQ%W`!4zcF)a3q$LtW!Z%PX^^8#v`UrK-#DnGDWW16@kqmn{w*j-g9Q#!PW< z`5}(;1v3#r7;(l<#e5|?{RDtk`PFL|>F-MeP_u1DvJ;#;e;R<5yDMm#Ms}>1Qq{#N z*Mp4afM4L)$t1A5-Us)eqe}^Z=!vnuw%XdjNOl4ty0A7YZFl!603eJw!$tx03Y6NAw*ZJ93W$+ z(4$Fewv8?&=3o}l69Zs+W`OkQ?EXJtlghI>@8<)H+c5&*a7U*Wpj9F@HQ>}6P)Px$l1W5CR9J=WlfO#>VH}5_qCg0dZtztUZAd||CP_$w;Ajb&n}PztXlQ6{h=$gN z2C2EJf1pJUf-p#&BCubJk=WZ{SO`wpV7{b7cSlRm`%HJdpZEKDc<(*XXf&Gt&XC&; zg?z5_)B3{3k*k@G!@c5@z?*`CO-0+_-K5AR>|((*&SoS;$8LfRP+i zB2FZ11BHC9b9VWHynCi`-9khpUXKqE4f1e%qn?d$NQoH9F+@DTeA;g-F=8hGsPd(? zB#@+1EF-IRbpnm28YRoZ>+vzUFix@X3OqyFZ#&yoU}7o)bdSGMEF+>p0N&e8RVt!E zB~vMu0nfL+zZ3uv@c^T57bG$!CCg&QG-*85`ZC?(uY5#e#Alt1X4ozeo7)~*&8F15 z*W**=MmU5K4k4>`L^MbulOmDnW>>Q*VsqQSzl1&R&-Xg}>j!<`T~_P7x0?Wcf5g_| zrlWFK0zCu@SWnr=a O0000Px$eMv+?R9J=WlRZm9Q5=V#-i)9Np=iVnqXNl68l>-_K`Om14XrJ1jzt8HZY`~? zN+AZ-mxzc4Luk2p5tODgNQT)E=avfIb7|~6%YpO%o%4G*a6qHcX#P86UJq2ViQcGr z>ipi*oyuWZ{9yZ>J-g8Yz+4DAdvUYlNkl1B$tHTTSeC{*PkotZ-+G@+-0UbxxCUgo z-Dpv_Uq}YuN9ONZ(=3{6m^FEGC}NqTvX+H04{>IAjd?oeqoY!F$U0KQl8 z_^EQW`wNuHg5C5iN5wYrOvsV=U0$_>BNoquI4ZWu9QrAhg{y$lFF4&!_4YCbx#L?d z_Gd6+0mSp0BO@_l0S->;6!M#t%7U}&%HMy%paekf_?DZ?oxb_j;T47aCV+CeCjlt| tAVmg|Pp(?-Szu6P5HH0VjYgx9d;xfgn9SmD=~Dmz002ovPDHLkV1g<)&1V1r diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/pumpkin_raw.png b/Resources/Textures/_CP14/Objects/Consumable/Food/pie.rsi/pumpkin_raw.png deleted file mode 100644 index 2157a98544b31b5a3c6ab2f1aec43a79ec12cd86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5;mP)49x-p9ntpan0RaD^i~a2|y~-N^^_QB6bZD+K#KsHk* zalC=1J(52U08s8Zv4%Ru+F1gR`0`So&88Wk> z-wWT0-;&Cokj<32$lZPx$ZAnByR9J=Wl|M_vKp4iK+75MyqUh3m0J}&EihnwEZ$YHcZxHI{?%<%%p_@oH zr68Te4{+k*&_PH`AQzVuTvACUK|@B7xR?;M^zL-@e$xy0-1|It_mTh-iA3_>$%$_0 zbd7k{`ti}BP)}}gVoa$G0Py_)s#^L{Yg$Dp$Q-XZr8Wp5Of4Y CrystallEdge migration zone end