From f76a087e916f27f368c4066ad066d715e47b914c Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 26 Apr 2020 15:44:20 -0500 Subject: [PATCH 01/26] Add meal recipe prototype class and yaml file. Add bare bones MicrowaveComponent. --- .../Kitchen/KitchenMicrowaveComponent.cs | 34 +++++++++++++ .../Kitchen/MicrowaveMealRecipePrototype.cs | 51 +++++++++++++++++++ Resources/Prototypes/Kitchen/meal_recipes.yml | 7 +++ 3 files changed, 92 insertions(+) create mode 100644 Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs create mode 100644 Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs create mode 100644 Resources/Prototypes/Kitchen/meal_recipes.yml diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs new file mode 100644 index 0000000000..a997471845 --- /dev/null +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -0,0 +1,34 @@ +using Content.Server.GameObjects.Components.Sound; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Audio; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Kitchen +{ + [RegisterComponent] + + public class KitchenMicrowaveComponent : Component, IActivate + { + +#pragma warning disable 649 + [Dependency] private readonly IPrototypeManager _prototypeManager; +#pragma warning restore 649 + + public override string Name => "Microwave"; + + public void Activate(ActivateEventArgs eventArgs) + { + + } + } +} diff --git a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs new file mode 100644 index 0000000000..d20d63025b --- /dev/null +++ b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Robust.Shared.Localization; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.Kitchen +{ + /// + /// A recipe for space microwaves. + /// + + [Prototype("microwaveMealRecipe")] + + public class FoodRecipe : IPrototype, IIndexedPrototype + { + + public string ID {get; private set;} + public string Name {get; private set;} + + public string Description {get; private set;} + + public Dictionary Ingredients {get; private set;} + + private const char Seperator = ','; + + public void LoadFrom(YamlMappingNode mapping) + { + ID = mapping.GetNode("id").ToString(); + Name = Loc.GetString(mapping.GetNode("name").ToString()); + Description = Loc.GetString(mapping.GetNode("description").ToString()); + if(mapping.TryGetNode("ingredients", out YamlSequenceNode tempDict)) + { + Ingredients = new Dictionary(); + foreach (var node in tempDict.Children) + { + var pair = node.ToString(); + if (pair == null) continue; + + var split = pair.Split(Seperator); + var ingnName = split[0]; + if (int.TryParse(split[1], out var amt)) Ingredients.Add(ingnName, amt); + + } + } + + } + } +} diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml new file mode 100644 index 0000000000..4082dad6eb --- /dev/null +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -0,0 +1,7 @@ +- type: microwaveMealRecipe + id: RecipeBurger + name: "Burger" + description: "A burger, in space." + ingredients: + - "Flour,15" + - "Meat,5" From 7e4d4bb1d4723d3a8defc07362f4ed52ed149a25 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 26 Apr 2020 23:14:02 -0500 Subject: [PATCH 02/26] Reformat the way recipe prototypes work to something sensible. More work on Microwave component. --- Content.Client/EntryPoint.cs | 1 + .../Kitchen/KitchenMicrowaveComponent.cs | 113 +++++++++++++++++- .../Kitchen/MicrowaveMealRecipePrototype.cs | 24 ++-- Resources/Prototypes/Entities/kitchen.yml | 30 +++++ Resources/Prototypes/Kitchen/meal_recipes.yml | 20 +++- 5 files changed, 160 insertions(+), 28 deletions(-) create mode 100644 Resources/Prototypes/Entities/kitchen.yml diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index c8ab1376c7..35fb7b7748 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -143,6 +143,7 @@ namespace Content.Client "Bucket", "Puddle", "CanSpill", + "Microwave" }; foreach (var ignoreName in registerIgnore) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index a997471845..13f2c36411 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -1,34 +1,135 @@ +using System.Collections.Generic; using Content.Server.GameObjects.Components.Sound; using Content.Server.GameObjects.EntitySystems; +using Content.Server.GameObjects.Components; using Content.Shared.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Prototypes; -using Robust.Shared.Random; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; using Robust.Shared.ViewVariables; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Chemistry; +using Robust.Shared.Serialization; +using Robust.Shared.Interfaces.GameObjects; +using Content.Shared.Kitchen; namespace Content.Server.GameObjects.Components.Kitchen { [RegisterComponent] - + [ComponentReference(typeof(IActivate))] public class KitchenMicrowaveComponent : Component, IActivate { #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; + [Dependency] private readonly IEntityManager _entityManager; #pragma warning restore 649 public override string Name => "Microwave"; - public void Activate(ActivateEventArgs eventArgs) + private AppearanceComponent _appearanceComponent; + + [ViewVariables] + private string _useSound; + [ViewVariables] + private string _outputPrototype; + [ViewVariables] + private SolutionComponent _contents; + + private static List _allRecipes; + + public override void ExposeData(ObjectSerializer serializer) { + base.ExposeData(serializer); + if(_allRecipes == null) + { + _allRecipes = new List(); + foreach (var recipe in _prototypeManager.EnumeratePrototypes()) + { + + _allRecipes.Add(recipe); + + } + _allRecipes.Sort(new RecipeComparer()); + } } + + private class RecipeComparer : IComparer + { + int IComparer.Compare(MicrowaveMealRecipePrototype x, MicrowaveMealRecipePrototype y) + { + if(x == null || y == null) + { + return 0; + } + + if(x.Ingredients.Count < y.Ingredients.Count) + { + return 1; + } + + return 0; + } + } + + public override void Initialize() + { + base.Initialize(); + if (_contents == null) + { + if (Owner.TryGetComponent(out SolutionComponent solutionComponent)) + { + _contents = solutionComponent; + } + else + { + _contents = Owner.AddComponent(); + } + } + } + + void IActivate.Activate(ActivateEventArgs eventArgs) + { + if(_contents.ReagentList.Count > 0) + { + DetermineRecipe(); + } + + } + + private void DetermineRecipe() + { + foreach (var r in _allRecipes) + { + if(CheckReagents(r)) + { + var outputFromRecipe = r.OutPutPrototype; + _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); + } + } + } + + private bool CheckReagents(MicrowaveMealRecipePrototype recipe) + { + foreach(var ingredient in recipe.Ingredients) + { + var ingName = ingredient.Key.ToString(); + var ingQuantity = ingredient.Value; + if (!_contents.ContainsReagent(ingName, out var amt) && amt != ingQuantity) return false; + _contents.TryRemoveReagent(ingName, ReagentUnit.New(ingQuantity)); + + //This doesnt work. + + } + return true; + + } + + + } } diff --git a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs index d20d63025b..c0804a7530 100644 --- a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs @@ -14,35 +14,25 @@ namespace Content.Shared.Kitchen [Prototype("microwaveMealRecipe")] - public class FoodRecipe : IPrototype, IIndexedPrototype + public class MicrowaveMealRecipePrototype : IPrototype, IIndexedPrototype { public string ID {get; private set;} public string Name {get; private set;} - public string Description {get; private set;} - - public Dictionary Ingredients {get; private set;} - - private const char Seperator = ','; - + public string OutPutPrototype { get; private set; } + public Dictionary Ingredients {get; private set;} public void LoadFrom(YamlMappingNode mapping) { ID = mapping.GetNode("id").ToString(); Name = Loc.GetString(mapping.GetNode("name").ToString()); - Description = Loc.GetString(mapping.GetNode("description").ToString()); - if(mapping.TryGetNode("ingredients", out YamlSequenceNode tempDict)) + OutPutPrototype = mapping.GetNode("output").ToString(); + if(mapping.TryGetNode("ingredients", out YamlMappingNode ingDict)) { Ingredients = new Dictionary(); - foreach (var node in tempDict.Children) + foreach (var kvp in ingDict.Children) { - var pair = node.ToString(); - if (pair == null) continue; - - var split = pair.Split(Seperator); - var ingnName = split[0]; - if (int.TryParse(split[1], out var amt)) Ingredients.Add(ingnName, amt); - + Ingredients.Add(kvp.Key.ToString(), kvp.Value.AsInt()); } } diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml new file mode 100644 index 0000000000..a3daf036b4 --- /dev/null +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -0,0 +1,30 @@ +- type: entity + id: KitchenMicrowave + name: Microwave + description: It's magic. + components: + - type: Microwave + - type: Clickable + - type: InteractionOutline + - type: Solution + maxVol: 100 + caps: 1 + + - type: Collidable + shapes: + - !type:PhysShapeAabb + bounds: "-0.5,0,0.5,1" + layer: 15 + IsScrapingFloor: true + - type: Sprite + netsync: false + sprite: Buildings/medical_scanner.rsi + layers: + - state: scanner_open + map: ["enum.MedicalScannerVisualLayers.Machine"] + - state: scanner_terminal_blue + map: ["enum.MedicalScannerVisualLayers.Terminal"] + - type: PowerDevice + - type: Icon + sprite: Buildings/medical_scanner.rsi + state: scanner_open diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 4082dad6eb..2b088ed8be 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -1,7 +1,17 @@ - type: microwaveMealRecipe - id: RecipeBurger - name: "Burger" - description: "A burger, in space." + id: RecipeCheeseburger + name: "Cheeseburger Recipe" + output: FoodCheeseburger ingredients: - - "Flour,15" - - "Meat,5" + chem.H2O: 15 + chem.Nutriment: 5 + +- type: microwaveMealRecipe + id: RecipeFlashlight + name: "Flashlight Recipe" + output: FlashlightLantern + ingredients: + chem.H2O: 15 + chem.Nutriment: 20 + chem.Glucose: 5 + From 24842418c326d4427e0cbe43b4eb526a1bc281ea Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 27 Apr 2020 00:27:25 -0500 Subject: [PATCH 03/26] Rewrite recipe prototype. Fix comparer in microwavecomponent. --- .../Kitchen/KitchenMicrowaveComponent.cs | 20 +++++++++---- .../Kitchen/MicrowaveMealRecipePrototype.cs | 30 +++++++++---------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 13f2c36411..e120a3e43e 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -67,11 +67,16 @@ namespace Content.Server.GameObjects.Components.Kitchen return 0; } - if(x.Ingredients.Count < y.Ingredients.Count) + if (x.Ingredients.Count < y.Ingredients.Count) { return 1; } + if (x.Ingredients.Count > y.Ingredients.Count) + { + return -1; + } + return 0; } } @@ -109,7 +114,9 @@ namespace Content.Server.GameObjects.Components.Kitchen { var outputFromRecipe = r.OutPutPrototype; _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); + return; } + } } @@ -119,13 +126,14 @@ namespace Content.Server.GameObjects.Components.Kitchen { var ingName = ingredient.Key.ToString(); var ingQuantity = ingredient.Value; - if (!_contents.ContainsReagent(ingName, out var amt) && amt != ingQuantity) return false; - _contents.TryRemoveReagent(ingName, ReagentUnit.New(ingQuantity)); - - //This doesnt work. + if (_contents.ContainsReagent(ingName, out var amt) && amt >= ingQuantity) + { + _contents.TryRemoveReagent(ingName, ReagentUnit.New(ingQuantity)); + return true; + } } - return true; + return false; } diff --git a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs index c0804a7530..7b93cbbb3e 100644 --- a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Robust.Shared.Localization; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; using Robust.Shared.Utility; using YamlDotNet.RepresentationModel; @@ -17,25 +18,24 @@ namespace Content.Shared.Kitchen public class MicrowaveMealRecipePrototype : IPrototype, IIndexedPrototype { - public string ID {get; private set;} - public string Name {get; private set;} + private string _id; + private string _name; + private string _output; + private Dictionary _ingredients; + + public string ID => _id; + public string Name => Loc.GetString(_name); + public string OutPutPrototype => _output; + public IReadOnlyDictionary Ingredients => _ingredients; - public string OutPutPrototype { get; private set; } - public Dictionary Ingredients {get; private set;} public void LoadFrom(YamlMappingNode mapping) { - ID = mapping.GetNode("id").ToString(); - Name = Loc.GetString(mapping.GetNode("name").ToString()); - OutPutPrototype = mapping.GetNode("output").ToString(); - if(mapping.TryGetNode("ingredients", out YamlMappingNode ingDict)) - { - Ingredients = new Dictionary(); - foreach (var kvp in ingDict.Children) - { - Ingredients.Add(kvp.Key.ToString(), kvp.Value.AsInt()); - } - } + var serializer = YamlObjectSerializer.NewReader(mapping); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _output, "output", string.Empty); + serializer.DataField(ref _ingredients, "ingredients", new Dictionary()); } } } From d0f18b2f66f5b1a2d49266f79b9a654a17ff2914 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Tue, 28 Apr 2020 19:15:43 -0500 Subject: [PATCH 04/26] Add Eris microwave RSI. Cleaned up the Microwave component code. --- .../Kitchen/KitchenMicrowaveComponent.cs | 25 +++++++----------- Resources/Prototypes/Entities/kitchen.yml | 12 +++------ .../Textures/Objects/Kitchen/microwave.dmi | Bin 0 -> 2309 bytes .../Objects/Kitchen/microwave.rsi/meta.json | 1 + .../Objects/Kitchen/microwave.rsi/mw.png | Bin 0 -> 636 bytes .../Objects/Kitchen/microwave.rsi/mw0.png | Bin 0 -> 614 bytes .../Objects/Kitchen/microwave.rsi/mw1.png | Bin 0 -> 825 bytes .../Objects/Kitchen/microwave.rsi/mwb.png | Bin 0 -> 1159 bytes .../Kitchen/microwave.rsi/mwbloody.png | Bin 0 -> 824 bytes .../Kitchen/microwave.rsi/mwbloody0.png | Bin 0 -> 824 bytes .../Kitchen/microwave.rsi/mwbloody1.png | Bin 0 -> 1165 bytes .../Kitchen/microwave.rsi/mwbloodyo.png | Bin 0 -> 1306 bytes .../Objects/Kitchen/microwave.rsi/mwo.png | Bin 0 -> 1095 bytes 13 files changed, 15 insertions(+), 23 deletions(-) create mode 100644 Resources/Textures/Objects/Kitchen/microwave.dmi create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mw.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mw0.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mw1.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwb.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloody.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloody0.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloody1.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloodyo.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mwo.png diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index e120a3e43e..b3a9927a38 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -101,26 +101,21 @@ namespace Content.Server.GameObjects.Components.Kitchen { if(_contents.ReagentList.Count > 0) { - DetermineRecipe(); - } - - } - - private void DetermineRecipe() - { - foreach (var r in _allRecipes) - { - if(CheckReagents(r)) + foreach (var r in _allRecipes) { - var outputFromRecipe = r.OutPutPrototype; - _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); - return; - } + if (CanSatisfyRecipe(r)) + { + var outputFromRecipe = r.OutPutPrototype; + _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); + return; + } + } } + } - private bool CheckReagents(MicrowaveMealRecipePrototype recipe) + private bool CanSatisfyRecipe(MicrowaveMealRecipePrototype recipe) { foreach(var ingredient in recipe.Ingredients) { diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml index a3daf036b4..d7d9f9803b 100644 --- a/Resources/Prototypes/Entities/kitchen.yml +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -18,13 +18,9 @@ IsScrapingFloor: true - type: Sprite netsync: false - sprite: Buildings/medical_scanner.rsi - layers: - - state: scanner_open - map: ["enum.MedicalScannerVisualLayers.Machine"] - - state: scanner_terminal_blue - map: ["enum.MedicalScannerVisualLayers.Terminal"] + sprite: Objects/Kitchen/microwave.rsi + state: mw0 - type: PowerDevice - type: Icon - sprite: Buildings/medical_scanner.rsi - state: scanner_open + sprite: Objects/Kitchen/microwave.rsi + state: mw0 diff --git a/Resources/Textures/Objects/Kitchen/microwave.dmi b/Resources/Textures/Objects/Kitchen/microwave.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0b96c553c029dbf9425455259fdc59b88c2990ea GIT binary patch literal 2309 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json b/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json new file mode 100644 index 0000000000..b03b51e24c --- /dev/null +++ b/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "AGPL v3", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris", "states": [{"name": "mw", "directions": 1, "delays": [[1.0]]}, {"name": "mw0", "directions": 1, "delays": [[1.0]]}, {"name": "mw1", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwb", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody0", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody1", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwbloodyo", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwo", "directions": 1, "delays": [[0.1, 0.1]]}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mw.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mw.png new file mode 100644 index 0000000000000000000000000000000000000000..88e285a134e152ceb158d89b7de51f32a7fb3038 GIT binary patch literal 636 zcmV-?0)zdDP)7iz#lDs2FN@E{s;`T1pXIy0S|_@Q)DbviJ^^x)3Zy zQH#4Qgt`z-7u8sz%`{1!CQe+$Tr$bTnwKKvgW;Sxa~|J4_uez`k0Aj}Ok64}`#fxJ zeldIu1_!%Rq&Bb1r68AKdHKEsUjwT)oERWQ^FUvC6{2Jz=xfI_Nk}1ARV!R|uFv?pfwOf&Ybo;Sh#HUZJ~OimAODP#guJO8`g4 zPn2ECKtu7JodUgp+o>4mfIkpsJTk`n51#-yG<<;9t8a+M&l8D6fX=(HkyZgnCX*x* zkA+=qfzKc0%UXslStOecyupUjpG#rbcH8}cw9xSqs$6X?qx3(m++jcTvja{w6{2Jah zUr9T~b9t+IGBX0}(Nsm5Hh132+Hl%`v@CxIL2ooO!sy~iju`4nSEr-WXMnc2CnjpBMp082pnJaMs0000O!y- zMJ?{K5b8qIO*NKilg^}06K7n+UNU*KP9BPoKMd#0x##h}=gvI?{}>X$rI}l=H zMmSe!%m9phO%c) zR|GbTUi`kFuH{}3^u`NE91Fz;$4XUZC}g6SYaxFkLs}KRtWdSu?^6&sefB)6>I1+u zcUW3_(&Sv9)Q#NKJ^K@|q$tmxE&y;cbER#7n-0{=eF?l;Ss)w^3w`$*io#o^?yg~N z=r%zd&hD;DrIMoq>-iGcLA*W_k5cLA@%l`#gJK%C?0{)}B6WO5==GSLoA22uZiECd zbLpa8_}=`X^y_DID5>)B!K2n^GQa=>4Dh${3)T4xuj_A{TL1t607*qoM6N<$f@i=V ADF6Tf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mw1.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mw1.png new file mode 100644 index 0000000000000000000000000000000000000000..7525b08a80b0afb87484c16816907bc95afbe418 GIT binary patch literal 825 zcmV-91IGM`P)adhG(D?PPSiEIad2^xZU8Zn5UvVO*~;UZ0D8&x&i9(L(Q3c zK_QbM=o?tpY;kDTKFY2-8kBH4B|I)a8%aCW{*+6(kjqQ!vh;^3f-|LO=46@l^!!Hkgk!lz@+8 zJ$SudrJVTh6 zEw9?M8u#ilawOxN$F{y3R3vZe>Y0}GH^|p!shgWJ+ z`$0mq+C)PAC zX5fE@1TZx8e%aR;;Ne5PW^%_4LG5EZj*t0vH$=5*q?F&h7SgUQuHxYK+cEU(MP? zV!*L~orBo`hG78K$x^A5;MY5_&)NCSP?LhrNFS+Gir~mW!CA6dP}CT0YM$BoTQoP8 zg~Ym+M$=8=@%V<$Q>hfHA`{&C911iy7WwY`%VL~J3mga$$Vb7jd&~y{8*Nd*D zF$@D$kwr>0-4rRY2WH>bp}_R?B#FcT!JR_@T)1$-p#WIv(6uzGB8zdQtpubhvQR-) z~ zb^Bhzkxt$oIVjZ7bW@zpj`e&ZF(8z+uN@uzR;&>_w6yMEI2;0Cc{wKxqI-9fOr}U) zKl6`II(GK7Xx*M3jve~|O|MOdD8j3kMmaZjl5=Axxq4|7fZqPM7&`PCh5QTvN8UNG zsYCnxdfP&NM!XGnh|%n}IYGLzGTXCJR7GZf{%65oPfjy3+)euSuMX$savjFXLq>+X zg>8G#s-?yIRxQQjaYsQqUPD(_rWmktsp%#yEzM%iES8v?TcCS)2X0r9;%XVUtBAQO zv43A1rU`R%3#3xN;b|y{`OP2#aAoBh=Kw7)`MEt?RVLs!G4c|b%mSfM1h1z^HYXE} zwqfM!$z&EV@)CakD%qS&z;BYxRVBB-z7>d3SE0-56s%?$c)XmWZ-0~@E?L~tvWtMv zB)8H)gS+1P~y*Q9X@ZFT^$iT?lq=vEE4cl4^+LBss$|qIB@6)yW0H# z+*{0X_Ut(Veh>HVRr4M2nM5LC0FpNs1s@6pX>4?{ucrfmpJuEz{k`o>-B<)xfsHRE z5x|<%%BfQ)0C;2YLjbb5JdOUUWRXaiJ9qAqU6Bd+OtLF7{k`oZZ{Ek_E|D+P<8hY& ziGa^!>c%4dz3rU8SS{pdrr^hk6Ern7i9WbkkBKXldRXPr5)2*)bN=F-!w%rll4WOi z4%N%50#SsOQ$Km~MD%M6r807Tsph#ddCS3V^wde^4TG#vppaXj=hdU4UxA{=_~_%~ z;^Sif>(O*mNLuMDYE1kc+1qD90yz5KyX8L~*E=R()W_)MpqsD1`bPSD%PnkS3tRXP Z@E1>Q>DdI?1+oAD002ovPDHLkV1h!}IXeIV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloody.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloody.png new file mode 100644 index 0000000000000000000000000000000000000000..3b144ce3107415c417fe1a8edd5d387360545275 GIT binary patch literal 824 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloodyo.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mwbloodyo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d90ec33cc4ce8d94f530b880e58e3502921a8c2 GIT binary patch literal 1306 zcmV+#1?BpQP)c~f1=q0q}zdX>#JT&(%!|}@I(^*!R7jt7FK&N2_!W&`Hrw z?m!dyh3gm{?k2x*9dB&=8biT6eA76XjQ`a#zS9 z7}PNSyN10jzPS7hfZMmOQ&wKZQO6PVFCXLdsyYCcE-k|Axd1>{acd;_L4ObT15SK` z1i<}(la)p@lcF7yXvY|Es)8T%_avO1neh9bvm={Z*x+sipkKCeSF}g!;lNFzoeZTt zF`+@9^(S*OrxK?m0AR=V2HG!d;hk59uo{PA3@ZnkuwL3pryyYx?F{;Ruqa8;Dv2lo z`hd~lZaM{tuHseze2Sxql#FkYZCEeu+ z1J=CPLoeX!ogdfu;_3s`2Ap_-l}0mKLBgW6{YnyY2bwSxw^AE$QaRAX=x{f+%2r9H zneaEb8}TY_lV~SLw&5i-`v4ir_SoQV#3DB{UwD8eYI{tTYH?iMvzBaKE;Xet&TNe} zwqDwaUy#U=ZTOVn{er|?LfQ8MWyP)Z0li8>fEg!XCj8OW2O=}yFWZ+c@T?mHPWl9iL0}LljS4!v9oX_>(gY;p`$Rhy zxtVdtGIUDN;aMMdETgYsNX0igmZ4o<$HJ$etJpp*KjwJoP2iwU+>cKIgl$WKPC=qx zY1ad7K#3sHmNev8CF2u^?{652;nz0|(MD@hp6Uz;4?NOR6W7?&^aAyOC(7QVlxo+Mse6EO{+_*h zrR=|am-8zYa=zkOcmUT&#u7R+9e@1ZcMrw))|9|le7-6H^YaYk?mA5=>OJ_@wtW~1 z=JCf4FaeqhGZXF}Oi?xy5NStWHr6Y@WWgumOK*Pq$oP?up`(r?%n_gF+kKk>Fs=QF zj*gRfJr{`nP)UWB7_#VSKdJf{N*7qDr->crpKH2X zeLDE61bp$OBXafZkuPeLGL`IvN-N(iT7zcM8vJ)?|2_V!W;Lr>&FXQ~UvxiO7D}nc Qwg3PC07*qoM6N<$f=YRG@&Et; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mwo.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mwo.png new file mode 100644 index 0000000000000000000000000000000000000000..35ed2e9baefc6863c2e16b225835293991eeed81 GIT binary patch literal 1095 zcmV-N1i1T&P)Qct0CE>!%?0S$gS&|%@%YbcswVCq)kh{9v~sWp*IgO z8n?bVFO)9v<2ESWe(xua{G&zLwdv zTMk9?PkJ1%I>Dtl+*O|5WPJ^8-_pMb!go=t@x<|^!FVF;GK6r1mMKc z*Lkq@Wrl};1mKwt6J|5mih>lG65NdFRF8pcPQK`i;BuDWT_?C~{HLDSvZ3UU_0K8t z^#Jp80Y3li2mrlT9)@~=yK%d#`1qp_*uK4(Dwl}CAYw7vSzIol%pO-g8VbdX!KvZz zY)GC9GOwj9fn)u1iZimmK;J+o%Z@ONtg}o!Ncctt0O6=U<5(oPS&Coe+Pn@!p}Ip& zHhxKQ82||pbb|UZlVp8B$T1;Z)GIrS1x{6o00dTM5DT1?+12;)nfS@%;qRo>j+rFe z0X4tXU@}`_5-yTRa~9%3;^VUbxbNA=)a7r|d~UTz-7XeyqIw5p;{%8@Q>xYi5GvhS zePji=x4xN3WPx}r4!(fQQKyHMSOq&eUIAdiH^`2Tw*fE+Wo{25Uf za3(&$^u#cCRy6@qA+jYH3Jg*1x<8|jtN_1^odaNN^?hlMUSAARg!uSDc6Ih(t!rVy zH<;#Ut!u#`l=IWcE__jGFAIXY4_7Asx2Mk|ir^}g5*I4nin}3Mlu1vw#2-D6AQY_2 zloh~eG-5Ja3C;S`9KXL1L(qu~Bx>1D7XZ6Dds0t6snNcJ0DSU8ErKozfS8D}+H_`= zD*lk4{SQg6*w*$J()=bp-T#O$D}c#tCA<)no`7#0fZa{4+_*l%QY4!4d;d(ebaCb_ zg(X+#SYBf{5eQya4C40r-))#LD?q8uMXAk2Y$YsndiJ@)8$OU^OI|C!tN{K$E@Lv4 z0`TP1@6q4?6(hp~jE!B|5PYrfav4!-Y_;Ia3h?OTpQb8x;Eh)SX$$stA6D^4Rj>8B zdM)_+wUbHkrJv6Ut79(NS*01jp|M$PXl%ZnM*Dxk&nvII^2%#7>M!1f2SN%;yF>s0 N002ovPDHLkV1oB+5kLR{ literal 0 HcmV?d00001 From 8e0185f892a2fe4612e4889e3afa80c392c25c3f Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Wed, 29 Apr 2020 21:04:08 -0500 Subject: [PATCH 05/26] Refactor "output" to "result" for recipes/prototypes. Remove a debug recipe from meal_recipes.yml Add food.yml for food related reagents: sugar, flour, etc. --- .../Kitchen/KitchenMicrowaveComponent.cs | 2 +- .../Kitchen/MicrowaveMealRecipePrototype.cs | 6 +++--- Resources/Prototypes/Kitchen/meal_recipes.yml | 14 ++------------ Resources/Prototypes/Reagents/food.yml | 8 ++++++++ 4 files changed, 14 insertions(+), 16 deletions(-) create mode 100644 Resources/Prototypes/Reagents/food.yml diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index b3a9927a38..878096cd5b 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -105,7 +105,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { if (CanSatisfyRecipe(r)) { - var outputFromRecipe = r.OutPutPrototype; + var outputFromRecipe = r.Result; _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); return; } diff --git a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs index 7b93cbbb3e..c7a20faf8f 100644 --- a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs @@ -20,12 +20,12 @@ namespace Content.Shared.Kitchen private string _id; private string _name; - private string _output; + private string _result; private Dictionary _ingredients; public string ID => _id; public string Name => Loc.GetString(_name); - public string OutPutPrototype => _output; + public string Result => _result; public IReadOnlyDictionary Ingredients => _ingredients; public void LoadFrom(YamlMappingNode mapping) @@ -34,7 +34,7 @@ namespace Content.Shared.Kitchen serializer.DataField(ref _id, "id", string.Empty); serializer.DataField(ref _name, "name", string.Empty); - serializer.DataField(ref _output, "output", string.Empty); + serializer.DataField(ref _result, "result", string.Empty); serializer.DataField(ref _ingredients, "ingredients", new Dictionary()); } } diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 2b088ed8be..2c1c261fcc 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -1,17 +1,7 @@ - type: microwaveMealRecipe id: RecipeCheeseburger name: "Cheeseburger Recipe" - output: FoodCheeseburger + result: FoodCheeseburger ingredients: - chem.H2O: 15 + chem.Flour: 15 chem.Nutriment: 5 - -- type: microwaveMealRecipe - id: RecipeFlashlight - name: "Flashlight Recipe" - output: FlashlightLantern - ingredients: - chem.H2O: 15 - chem.Nutriment: 20 - chem.Glucose: 5 - diff --git a/Resources/Prototypes/Reagents/food.yml b/Resources/Prototypes/Reagents/food.yml new file mode 100644 index 0000000000..6c838830da --- /dev/null +++ b/Resources/Prototypes/Reagents/food.yml @@ -0,0 +1,8 @@ +- type: reagent + id: chem.Flour + name: Flour + desc: Used for baking. + color: "#FFFFFF" + metabolism: + - !type:DefaultFood + rate: 1 From 93c3e86c9fb9d59a0edb7564836820ab1c832cdb Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Thu, 30 Apr 2020 18:08:51 -0500 Subject: [PATCH 06/26] Unfuck mostly everything. --- Content.Server/EntryPoint.cs | 3 + .../Kitchen/KitchenMicrowaveComponent.cs | 55 +++---------------- Content.Server/ServerContentIoC.cs | 2 + Content.Shared/EntryPoint.cs | 3 +- Content.Shared/Kitchen/RecipeManager.cs | 52 ++++++++++++++++++ .../Kitchen/MicrowaveMealRecipePrototype.cs | 4 +- Resources/Prototypes/Entities/kitchen.yml | 2 +- 7 files changed, 69 insertions(+), 52 deletions(-) create mode 100644 Content.Shared/Kitchen/RecipeManager.cs rename Content.Shared/{ => Prototypes}/Kitchen/MicrowaveMealRecipePrototype.cs (91%) diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index 7a97e2f538..6eb0c31d8c 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -4,6 +4,7 @@ using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameTicking; using Content.Server.Preferences; using Content.Server.Sandbox; +using Content.Shared.Kitchen; using Robust.Server.Interfaces.Player; using Robust.Shared.ContentPack; using Robust.Shared.Interfaces.GameObjects; @@ -70,6 +71,7 @@ namespace Content.Server logManager.GetSawmill("Storage").Level = LogLevel.Info; IoCManager.Resolve().StartInit(); + } public override void PostInit() @@ -79,6 +81,7 @@ namespace Content.Server _gameTicker.Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().FinishInit(); + IoCManager.Resolve().Initialize(); } public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 878096cd5b..62dbda34ad 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -14,6 +14,7 @@ using Content.Server.GameObjects.Components.Chemistry; using Content.Shared.Chemistry; using Robust.Shared.Serialization; using Robust.Shared.Interfaces.GameObjects; +using Content.Shared.Prototypes.Kitchen; using Content.Shared.Kitchen; namespace Content.Server.GameObjects.Components.Kitchen @@ -24,61 +25,19 @@ namespace Content.Server.GameObjects.Components.Kitchen { #pragma warning disable 649 - [Dependency] private readonly IPrototypeManager _prototypeManager; [Dependency] private readonly IEntityManager _entityManager; + [Dependency] private readonly RecipeManager _recipeManager; #pragma warning restore 649 public override string Name => "Microwave"; - private AppearanceComponent _appearanceComponent; - - [ViewVariables] - private string _useSound; - [ViewVariables] - private string _outputPrototype; [ViewVariables] private SolutionComponent _contents; - private static List _allRecipes; - public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - if(_allRecipes == null) - { - _allRecipes = new List(); - foreach (var recipe in _prototypeManager.EnumeratePrototypes()) - { - _allRecipes.Add(recipe); - - } - _allRecipes.Sort(new RecipeComparer()); - } - - } - - private class RecipeComparer : IComparer - { - int IComparer.Compare(MicrowaveMealRecipePrototype x, MicrowaveMealRecipePrototype y) - { - if(x == null || y == null) - { - return 0; - } - - if (x.Ingredients.Count < y.Ingredients.Count) - { - return 1; - } - - if (x.Ingredients.Count > y.Ingredients.Count) - { - return -1; - } - - return 0; - } } public override void Initialize() @@ -101,12 +60,12 @@ namespace Content.Server.GameObjects.Components.Kitchen { if(_contents.ReagentList.Count > 0) { - foreach (var r in _allRecipes) + foreach(var r in _recipeManager.Recipes) { - if (CanSatisfyRecipe(r)) + if(CanSatisfyRecipe(r)) { - var outputFromRecipe = r.Result; - _entityManager.SpawnEntity(outputFromRecipe, Owner.Transform.GridPosition); + var resultPrototype = r.Result; + _entityManager.SpawnEntity(resultPrototype, Owner.Transform.GridPosition); return; } @@ -115,7 +74,7 @@ namespace Content.Server.GameObjects.Components.Kitchen } - private bool CanSatisfyRecipe(MicrowaveMealRecipePrototype recipe) + private bool CanSatisfyRecipe(MealRecipePrototype recipe) { foreach(var ingredient in recipe.Ingredients) { diff --git a/Content.Server/ServerContentIoC.cs b/Content.Server/ServerContentIoC.cs index f4bb04b9cc..7ca422e4c4 100644 --- a/Content.Server/ServerContentIoC.cs +++ b/Content.Server/ServerContentIoC.cs @@ -8,6 +8,7 @@ using Content.Server.Preferences; using Content.Server.Sandbox; using Content.Server.Utility; using Content.Shared.Chemistry; +using Content.Shared.Kitchen; using Content.Shared.Interfaces; using Content.Shared.Interfaces.Chemistry; using Robust.Shared.IoC; @@ -28,6 +29,7 @@ namespace Content.Server IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); } } } diff --git a/Content.Shared/EntryPoint.cs b/Content.Shared/EntryPoint.cs index a9df20ff2a..8975f3fbb4 100644 --- a/Content.Shared/EntryPoint.cs +++ b/Content.Shared/EntryPoint.cs @@ -6,7 +6,7 @@ using Robust.Shared.IoC; using Robust.Shared.Prototypes; - namespace Content.Shared +namespace Content.Shared { public class EntryPoint : GameShared { @@ -55,5 +55,6 @@ _tileDefinitionManager.Initialize(); } + } } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs new file mode 100644 index 0000000000..81c15279c1 --- /dev/null +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using Content.Shared.Prototypes.Kitchen; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Kitchen +{ + + public class RecipeManager + { +#pragma warning disable 649 + [Dependency] private readonly IPrototypeManager _prototypeManager; +#pragma warning restore 649 + public List Recipes { get; private set; } + + public void Initialize() + { + Recipes = new List(); + foreach (var item in _prototypeManager.EnumeratePrototypes()) + { + Recipes.Add(item); + } + + Recipes.Sort(new RecipeComparer()); + } + private class RecipeComparer : IComparer + { + int IComparer.Compare(MealRecipePrototype x, MealRecipePrototype y) + { + if (x == null || y == null) + { + return 0; + } + + if (x.Ingredients.Count < y.Ingredients.Count) + { + return 1; + } + + if (x.Ingredients.Count > y.Ingredients.Count) + { + return -1; + } + + return 0; + } + + + } + } +} diff --git a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs similarity index 91% rename from Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs rename to Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index c7a20faf8f..d61d11590d 100644 --- a/Content.Shared/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -7,7 +7,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Utility; using YamlDotNet.RepresentationModel; -namespace Content.Shared.Kitchen +namespace Content.Shared.Prototypes.Kitchen { /// /// A recipe for space microwaves. @@ -15,7 +15,7 @@ namespace Content.Shared.Kitchen [Prototype("microwaveMealRecipe")] - public class MicrowaveMealRecipePrototype : IPrototype, IIndexedPrototype + public class MealRecipePrototype : IPrototype, IIndexedPrototype { private string _id; diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml index d7d9f9803b..064550b61b 100644 --- a/Resources/Prototypes/Entities/kitchen.yml +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -13,7 +13,7 @@ - type: Collidable shapes: - !type:PhysShapeAabb - bounds: "-0.5,0,0.5,1" + bounds: "-0.25,-0.4,0.25,0.4" layer: 15 IsScrapingFloor: true - type: Sprite From 5d4c0609ec5ffeb5e7568f511116d23089f68650 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Thu, 30 Apr 2020 23:07:27 -0500 Subject: [PATCH 07/26] ShadowCommander is MVP. --- .../Kitchen/KitchenMicrowaveComponent.cs | 37 +++++++++---------- Content.Shared/Kitchen/RecipeManager.cs | 10 ++--- .../Kitchen/MicrowaveMealRecipePrototype.cs | 2 +- Resources/Prototypes/Kitchen/meal_recipes.yml | 4 +- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 62dbda34ad..8ccaa8c91a 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -1,14 +1,6 @@ -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Sound; -using Content.Server.GameObjects.EntitySystems; -using Content.Server.GameObjects.Components; -using Content.Shared.Audio; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; +using Content.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Prototypes; using Robust.Shared.ViewVariables; using Content.Server.GameObjects.Components.Chemistry; using Content.Shared.Chemistry; @@ -64,33 +56,40 @@ namespace Content.Server.GameObjects.Components.Kitchen { if(CanSatisfyRecipe(r)) { + RemoveContents(r); var resultPrototype = r.Result; _entityManager.SpawnEntity(resultPrototype, Owner.Transform.GridPosition); return; } - } } - } - private bool CanSatisfyRecipe(MealRecipePrototype recipe) + private bool CanSatisfyRecipe(FoodRecipePrototype recipe) { - foreach(var ingredient in recipe.Ingredients) + foreach (var item in recipe.Ingredients) { - var ingName = ingredient.Key.ToString(); - var ingQuantity = ingredient.Value; - if (_contents.ContainsReagent(ingName, out var amt) && amt >= ingQuantity) + if (!_contents.ContainsReagent(item.Key, out var amount)) { - _contents.TryRemoveReagent(ingName, ReagentUnit.New(ingQuantity)); - return true; + return false; } + if (amount.Int() < item.Value) + { + return false; + } } - return false; + return true; } + private void RemoveContents(FoodRecipePrototype recipe) + { + foreach(var item in recipe.Ingredients) + { + _contents.TryRemoveReagent(item.Key, ReagentUnit.New(item.Value)); + } + } } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs index 81c15279c1..6b653ee96a 100644 --- a/Content.Shared/Kitchen/RecipeManager.cs +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -12,21 +12,21 @@ namespace Content.Shared.Kitchen #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; #pragma warning restore 649 - public List Recipes { get; private set; } + public List Recipes { get; private set; } public void Initialize() { - Recipes = new List(); - foreach (var item in _prototypeManager.EnumeratePrototypes()) + Recipes = new List(); + foreach (var item in _prototypeManager.EnumeratePrototypes()) { Recipes.Add(item); } Recipes.Sort(new RecipeComparer()); } - private class RecipeComparer : IComparer + private class RecipeComparer : IComparer { - int IComparer.Compare(MealRecipePrototype x, MealRecipePrototype y) + int IComparer.Compare(FoodRecipePrototype x, FoodRecipePrototype y) { if (x == null || y == null) { diff --git a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index d61d11590d..f120499af4 100644 --- a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -15,7 +15,7 @@ namespace Content.Shared.Prototypes.Kitchen [Prototype("microwaveMealRecipe")] - public class MealRecipePrototype : IPrototype, IIndexedPrototype + public class FoodRecipePrototype : IPrototype, IIndexedPrototype { private string _id; diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 2c1c261fcc..a383a7fbce 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -1,7 +1,7 @@ - type: microwaveMealRecipe id: RecipeCheeseburger - name: "Cheeseburger Recipe" + name: Cheeseburger Recipe result: FoodCheeseburger ingredients: - chem.Flour: 15 + chem.H2O: 15 chem.Nutriment: 5 From b2aca9a686fbd7981a6fc187957ea45158ef9df4 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Fri, 1 May 2020 03:37:21 -0500 Subject: [PATCH 08/26] Add microwave visualizer. Clean up microwave code. --- .../Components/Kitchen/MicrowaveVisualizer.cs | 50 +++++++++ .../Kitchen/KitchenMicrowaveComponent.cs | 56 +++++++-- .../Research/SharedLatheComponent.cs | 2 +- Content.Shared/Kitchen/SharedMicrowave.cs | 18 +++ Resources/Audio/machines/ding.ogg | Bin 0 -> 16007 bytes Resources/Prototypes/Entities/kitchen.yml | 10 +- Resources/Prototypes/Kitchen/meal_recipes.yml | 8 ++ .../Textures/Objects/Kitchen/microwave.dmi | Bin 2309 -> 2180 bytes .../Objects/Kitchen/microwave.rsi/meta.json | 106 +++++++++++++++++- .../microwave.rsi/mw_running_unlit.png | Bin 0 -> 2286 bytes .../Kitchen/microwave.rsi/mw_unlit.png | Bin 0 -> 1698 bytes 11 files changed, 238 insertions(+), 12 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs create mode 100644 Content.Shared/Kitchen/SharedMicrowave.cs create mode 100644 Resources/Audio/machines/ding.ogg create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mw_running_unlit.png create mode 100644 Resources/Textures/Objects/Kitchen/microwave.rsi/mw_unlit.png diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs new file mode 100644 index 0000000000..7cfcd07253 --- /dev/null +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -0,0 +1,50 @@ +using Content.Shared.GameObjects.Components.Power; +using Content.Shared.Kitchen; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Client.GameObjects.Components.Kitchen +{ + public sealed class MicrowaveVisualizer : AppearanceVisualizer + { + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + var sprite = component.Owner.GetComponent(); + if (!component.TryGetData(PowerDeviceVisuals.VisualState, out MicrowaveVisualState state)) + { + state = MicrowaveVisualState.PoweredIdle; + } + switch (state) + { + case MicrowaveVisualState.PoweredIdle: + sprite.LayerSetState(MicrowaveVisualizerLayers.Base, "mw"); + sprite.LayerSetState(MicrowaveVisualizerLayers.BaseUnlit, "mw_unlit"); + break; + + case MicrowaveVisualState.Cooking: + sprite.LayerSetState(MicrowaveVisualizerLayers.Base, "mw"); + sprite.LayerSetState(MicrowaveVisualizerLayers.BaseUnlit, "mw_running_unlit"); + break; + + } + + var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered); + sprite.LayerSetVisible(MicrowaveVisualizerLayers.BaseUnlit, glowingPartsVisible); + + + } + + public enum MicrowaveVisualizerLayers + { + Base, + BaseUnlit + } + } + + +} diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 8ccaa8c91a..93cf571478 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -8,6 +8,11 @@ using Robust.Shared.Serialization; using Robust.Shared.Interfaces.GameObjects; using Content.Shared.Prototypes.Kitchen; using Content.Shared.Kitchen; +using Robust.Shared.Timers; +using Robust.Server.GameObjects; +using Content.Shared.GameObjects.Components.Power; +using Robust.Server.GameObjects.EntitySystems; +using Content.Server.GameObjects.Components.Power; namespace Content.Server.GameObjects.Components.Kitchen { @@ -17,19 +22,28 @@ namespace Content.Server.GameObjects.Components.Kitchen { #pragma warning disable 649 + [Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly RecipeManager _recipeManager; #pragma warning restore 649 public override string Name => "Microwave"; + private int _cookTimeSeconds; + private string _badRecipeName; [ViewVariables] private SolutionComponent _contents; + private AppearanceComponent _appearance; + + private AudioSystem _audioSystem; + + private PowerDeviceComponent _powerDevice; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - + serializer.DataField(ref _badRecipeName, "failureResult", "FoodBadRecipe"); + serializer.DataField(ref _cookTimeSeconds, "cookTime", 5000); } public override void Initialize() @@ -46,23 +60,43 @@ namespace Content.Server.GameObjects.Components.Kitchen _contents = Owner.AddComponent(); } } + + _appearance = Owner.GetComponent(); + _powerDevice = Owner.GetComponent(); + _audioSystem = _entitySystemManager.GetEntitySystem(); } void IActivate.Activate(ActivateEventArgs eventArgs) { - if(_contents.ReagentList.Count > 0) + if (_contents.ReagentList.Count == 0 || !_powerDevice.Powered) { - foreach(var r in _recipeManager.Recipes) + return; + } + foreach(var r in _recipeManager.Recipes) + { + if(CanSatisfyRecipe(r)) { - if(CanSatisfyRecipe(r)) + SetAppearance(MicrowaveVisualState.Cooking); + Timer.Spawn(_cookTimeSeconds, () => { RemoveContents(r); - var resultPrototype = r.Result; - _entityManager.SpawnEntity(resultPrototype, Owner.Transform.GridPosition); - return; - } + _entityManager.SpawnEntity(r.Result, Owner.Transform.GridPosition); + + _audioSystem.Play("/Audio/machines/ding.ogg"); + SetAppearance(MicrowaveVisualState.PoweredIdle); + }); + return; } } + + SetAppearance(MicrowaveVisualState.Cooking); + Timer.Spawn(_cookTimeSeconds, () => + { + _contents.RemoveAllSolution(); + _entityManager.SpawnEntity(_badRecipeName, Owner.Transform.GridPosition); + _audioSystem.Play("/Audio/machines/ding.ogg"); + SetAppearance(MicrowaveVisualState.PoweredIdle); + }); } private bool CanSatisfyRecipe(FoodRecipePrototype recipe) @@ -91,6 +125,10 @@ namespace Content.Server.GameObjects.Components.Kitchen } } - + private void SetAppearance(MicrowaveVisualState state) + { + if (_appearance != null || Owner.TryGetComponent(out _appearance)) + _appearance.SetData(PowerDeviceVisuals.VisualState, state); + } } } diff --git a/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs b/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs index dabae088fb..6b290d551d 100644 --- a/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs +++ b/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs @@ -1,4 +1,4 @@ -// Only unused on .NET Core due to KeyValuePair.Deconstruct +// Only unused on .NET Core due to KeyValuePair.Deconstruct // ReSharper disable once RedundantUsingDirective using Robust.Shared.Utility; using System; diff --git a/Content.Shared/Kitchen/SharedMicrowave.cs b/Content.Shared/Kitchen/SharedMicrowave.cs new file mode 100644 index 0000000000..94ac50e1cc --- /dev/null +++ b/Content.Shared/Kitchen/SharedMicrowave.cs @@ -0,0 +1,18 @@ +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Shared.Kitchen +{ + + [Serializable, NetSerializable] + public enum MicrowaveVisualState + { + Off, + PoweredIdle, + Cooking + } + + +} diff --git a/Resources/Audio/machines/ding.ogg b/Resources/Audio/machines/ding.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ff1e3ebbc9990da3a7492abad96bf32ea5760941 GIT binary patch literal 16007 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml index 064550b61b..806ef99b7f 100644 --- a/Resources/Prototypes/Entities/kitchen.yml +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -9,6 +9,9 @@ - type: Solution maxVol: 100 caps: 1 + - type: Appearance + visuals: + - type: MicrowaveVisualizer - type: Collidable shapes: @@ -19,7 +22,12 @@ - type: Sprite netsync: false sprite: Objects/Kitchen/microwave.rsi - state: mw0 + layers: + - state: mw0 + map: ["enum.MicrowaveVisualizerLayers.Base"] + - state: mw_unlit + shader: unshaded + map: ["enum.MicrowaveVisualizerLayers.BaseUnlit"] - type: PowerDevice - type: Icon sprite: Objects/Kitchen/microwave.rsi diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index a383a7fbce..f763dc616b 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -5,3 +5,11 @@ ingredients: chem.H2O: 15 chem.Nutriment: 5 + +- type: microwaveMealRecipe + id: RecipeFlashlight + name: Flashlight Recipe + result: FoodCheeseWedge + ingredients: + chem.H2O: 15 + chem.Glucose: 5 diff --git a/Resources/Textures/Objects/Kitchen/microwave.dmi b/Resources/Textures/Objects/Kitchen/microwave.dmi index 0b96c553c029dbf9425455259fdc59b88c2990ea..a3cb98f9c14d5fd5fe9bb2c191c860815381f929 100644 GIT binary patch delta 1839 zcmV+~2hjM15`+HubEQfX;Wb#zQ^upVvP9?!#0)W}WV&r00ZaNO2!e3C9^rw{4LXX@gF z=;4HAWl?c&O_9_p45y)EqMS;hn@XabO_LA-fl;ogTIJhu*U)y-%y!t)cih!<+thW} z&~@3uL*v?S*3WdywLH?maf@v+a&bD4KpbLYJ=Yx%mmw3;2M21j$m9S300DGTPE!Ct z=GbNc005Vh;sIcP5}_s^yBeUqDXBS$l^|gq6b%MM7@9!WVOWJ>Z#~)ZZ^<^U^CZN%?FKIKH7!U~eeI{^RZYe-xgk_mk<=5zA)Qbq=Kvl*ITF%IkIQnQ zaO(A&46ANx4?kQOJku7 z1OaAd-gPn%7$}JbU0#mJH{hM)i&Z^PRlgXW11&Q!J2&TKz%Vp}3HPI;FJcdDoKJSnzJYUw#kmSh(N{f4dbm1v46GK2;sjRMzLy3H3UZe8 zezs>e2pUjG?+mOej1vs2;MqqL3QGe~dQ=}EoMU*5jo+(mk5Uxnd8!ZWpC_yj41B78 zNNm*3*a?vcdz!d@(1s_h4-9g%M(YbLc+&a+Wwocoe`>My|NrhENXUi$05GAg zwzK1NJUs6YXqsSJrfJ!>O`B%ZjPeIRgN=}L?U!F4#QF!|j6pTFerFDZ284iD0$!<9 zy#I_A-TnXo(>Cj-X;QS&H0?OoY`f0FTekMFX^RHj{(#+WZ~d-KK`FX_zQ>pqpI5*) zAYGuq0yKXE3msUdMVn{_qTFWOu3NT6ZGhi}3dw}q9{{_cIqP@KfMCGo7}MhwDjERb z{Q*tD@mpq{T20Gr`lrC>HfVJ`0myADl!2f>0JgpL`!4wX0Y0x_P>)yOd|+U9&dmU| z>n2N(g==6iqugfP_PHH@s}GdMpr-x7*Y6q~4Km2Nqy=+grcyPQgNSeUC9K9)spxB{*pdCK|1H}&g1MT?%I7s^k dQl;uj{{e1D#C7Fdv`zp3002ovPDHLkV1j8id*uKC delta 1969 zcmV;i2Tu5e5rqC0004`ktJAHt*BaHUO<_gtgxw1xw22ny*Smy zHXd0Y0FwX!>HubEQfX;Wb#zSJ)^Oa`Z*8z1ZQLHu!%o!5P2SH+=;4Iw;)HyXE@r0> z>B(nhWl?c&P3Yl)=iq{o&MFe!)^MkxW1^f&p_@vgoK3E%T9X6;fl=k#ao5mx*}_BP z+HcFXJlD{5i)}G-aXOGd9AaZV*BuX+ArsLD2f)C<(#&?)(s$g|blcQ**3Wd(z;S?$ zq@n--00DGTPE!Ct=GbNc005Pf)&XFDVpjt+GbJ@Au@WS#gQ6jyR1F41xFU%dH97hD zDV0PkB+6Q_N|J*BqK&wKP*!mDa{)&m0E#1h-2(=cmH+?-Zb?KzRCt{2T8)3xL>Ml# zVb%;HgOo23_93HcN6V6`KtNrXFeU@#rrb?N1#JA-3VzIH3JChcuYcP2l3eb8k~B^D zL9(Bi=UBG&Y3_aU-X-hv@|H?lj&0k^fb9{$iw^-TsBfDXOu{|MwjCm7y{9ZMLy{UOwuGMN`T2+~VeSoqesrwHEuwRwj z2^fFyPyh$R{Hq}_UY4uX!>`rUBS*(4gmJ{mj;>CX!y`3#svXW zUIz5GIJf|hZ%hO-&LM*&e7ISh1WPP1B{Q&!09t* z+zc3oW>CO!T*$!LbLY-F0)iRv1uz~mAfgfGAp;_~fcM`2fC`vvn5Jf$=bhusi8)`u z{Jwqju7Ci10gRsuW?(LV%-8E51_sZ-=?hfA#RcQMsZp5cjfI6vd-s^We@|B*82wa#k?2*s*N%{c=&xzcPxSBU>Ib8rCDjk&&gcF;&fll4AE?*8$k)9e z6%^og+}4TSCUk)J!_1iY{yoOugZ-YI99}<|Tq&c^RrSW|O^O?IY8z z4(SlxRlo&!{=MD`xZ74lKy3YB1^6#ib^6wAAnts5`_>(Q_$~@?>Ic+vlWvC)s|)dQ zn+x##dn<&9fSCHh$_nsbeXXj;LBTiE-`>9E2vk*s0`-G7*0D|qqyWCbk6eJ~-&-w> zLlBUzegGNJ+iUB+yS=;mz23UshCNUX?g6-JLNLJ=CLl)0fal*^4UoVte})T4tREnB zw*1}qs@m><_14zbe)zH1)Ae;7G7vl;_FV_|AS8h9fj|bBf7iSuv|56HPgy@es@kK% z*4OT>-J{?AC1B?}cLBkeDhTcY(Z4&FAMo!f>j%ia1$)AS00qyddr-#~aWf#^1;hP& z%K8C{3Ph>SPxSAp>jQ{>6oRL)f}D>7h&_rE&QJ7z?^)Lm3jbdC_W}h9ym0k_qJN+e z@ShZr;Quq`i~fP9=^qe3vp;+Pz}|5GK#YIq{R7z8AcjWh`03E00sP`3q5tSuT=aPe z@6;dqCN?e8v~1fZeY0;y`UhhCJLiuYM58=aFra?`A8m5J*=(}^Ijwp12aHYI?3$)Y zKt|txv?KikG5%fXAK2Vryf%X){R0rQ>GMtO3y@9{Oa=6R#ug~BOpEkE4CVr+hWdBj zKY%x}=JJpM9O)l`n2c`{Q2@qH{h^QH`Yp3dtiEOTg(XPv??V3o-eCMDj`j~UAt>XU z_yiYl`iz$WVs}lNAPYP)<^mG@yU;&?JK8UQ4zH1M9O)kb0UcNbmk(rs5N8kEhv;w*xu$4`AYd z)gOKzz~|6EK(@YrptiO3hgwm8C{Uola3uQotdZ#7vlo!y-3kGPfb0b%`1h=l=-;zO zqJPg^K$3sYTmbX$PyWC*n0Lp&Yk&Urgc*mdA^3OAw!1XEWo!5Qc5VWgf48ZBx4V{Y z5gX&baee|k|88Tg3kv}L-L~@0fal*(ZR+1`-@oT5!1wP4_3sAt@5VpHKzwrqJPg`K;hpD|6ZWL{~P}TuqOgG$KJaP00000NkvXXu0mjf Dv~1n1 diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json b/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json index b03b51e24c..e1c3ede466 100644 --- a/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json +++ b/Resources/Textures/Objects/Kitchen/microwave.rsi/meta.json @@ -1 +1,105 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "AGPL v3", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris", "states": [{"name": "mw", "directions": 1, "delays": [[1.0]]}, {"name": "mw0", "directions": 1, "delays": [[1.0]]}, {"name": "mw1", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwb", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody0", "directions": 1, "delays": [[1.0]]}, {"name": "mwbloody1", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwbloodyo", "directions": 1, "delays": [[0.1, 0.1]]}, {"name": "mwo", "directions": 1, "delays": [[0.1, 0.1]]}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "AGPL v3", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris", + "states": [ + { + "name": "mw", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mw_unlit", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mw0", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mw_running_unlit", + "directions": 1, + "delays": [ + [ + 1.0, + 1.0 + ] + ] + }, + { + "name": "mwb", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mwbloody", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mwbloody0", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "mwbloody1", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "mwbloodyo", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "mwo", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Kitchen/microwave.rsi/mw_running_unlit.png b/Resources/Textures/Objects/Kitchen/microwave.rsi/mw_running_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..d259712b6dd8404f1d1a7d801a5b32f96adc6785 GIT binary patch literal 2286 zcmb_e4Qvxt9KV4KHh~Z^IvMJDTNnt}`{>=Zy{y944pyMsT&o*`%Jn|lbM4)Ecca}h z8S?`JGDAcY1sCSxCqZ$M!4lX&VnF#&ln`79U!tf}KE%xsiJPxoTc#OEh)wR@yZ8R@ z|Ns4e|KEGBt18OoO~{^-4METZPpP{Syyt)i9+wH)wwC43gIAVTy2yZ_+b74L3~2qE zIS`cDA^WS%YVSgpS0ffqPy?bR7SVt;1QpJXX&hf8ns7i2%8C=YxMLRr%YqZBqP@6R zbBQ6jv|bl|^<{p(zJ_-Q$n1yU!Wau2L`0K=W0A08urVi+@XLaJd>BLEgo#<>M2g}8 z;c9OM>{4|RrY#K06O4L;oy5}Zi zfiEW#GEI%euxK=DiCQhH9>fTT1Na~@l0<<8YSbwv7ef^zFXh248oVxRrmQM(+#?rI zYfUEtkPf8~(b8@eBS{k=42y9ZMp*E8N(n=OPupp=dN>hW;4v{QMnuIlfGv@>)k3PN z8X@&MuG7>12mq+{debpR#1e_5Ll|bsGLS}+kP)p7f1M^`m7<~6>bzL848Y8bXQQz$ zUF1wv_p53+Rj7&-WS9h5!_%u|MNp&0jA08zH)o1Ygv3c4#VM3@_z4?JFsv1nk7jXv z$keL}vQ#(Rlm^xH<5t!RI>YRMUIfnMZfq&=tfcA@4x}naxS)t>N)Un51hOtQtm+^n zz-1ji?s2&)bXAhWV8W=JR}6bfTnyo07?iXS37}pt>ro7oQ+Uzib|Qcli!2MQNZaj# z1D8;nK+vctQ37h`Z4OkVc#^V94u-&~)Oxqd*T#zeeN2KpF^Zm5zO<#e$q2)O%C{bAPwZ*a?Q44n+vX&kpRD2+2X8lWixkY;62!X_~| zPjL>Be2b=zdB&UHrO+$4 zW&fJd-*71USQhr^Nk{X61D`*&zjNU9nf|Mjf6_+HZ2j1G>Dc~>lxubEth?oNgYqZh zUAsF6Cgq*GV$CgS9vyqKdUWgY^X)sX@~z))e0XrREwbil^Hnbu-|zclV)*0d`t!<5i{o`W{;L`g-z_w5flh*(A6aT} z`!rzs%A4TI5G#V1=L8JnULx_ZqK|p8S{JVk9gHFQennp`9D?0O6I4aUfm`w*H60(6 zgOcev$oAd<7BT|^`G#pjWMbrDw+yB~U3tq`h_`F&Q(x+-qIdH=#fC8$3`zsLB(jcS z27%(R49kKF0p($mlOasx@{FOzCC#EVk3<3rM$#7jyrL_mlMv!`PMgSSnpDD!AxRCh zgo=>HKt|`dw4e3H&KWg$kHiPD+9H`Vb8gn1VYKh~y3z@GS zs4%7pITkHjhbcFZuL6y>S)P*Q%ZwcpkJ$=2&i{ zf$NFPNkVzOR?$^*N>Rjc==&bAYytyTG$(NaNC;)n;mo%g;-2GrGy9sL{h|d5`^jlw zf+~(j@@N>ErW+s_xIqX5-$AgAhzlulY$pgj*Y@2R+qEoG2a@y_SqoK6F;dGSPRJ4T zk?F$FavVs!HiEQF{Ln3z%a-RBZ9ncLyctPVlaFWeJhdNmxgvc+mrT4%5#|Gu@zsvX-BY{Jc$|1i4xTLi*-AOlv?%@9uKhpK zr)i;Gl61J5u!dd)V-&M!QWWFA^&0Oj%&i$*4Z~tNpTg>4KF4{Ys53RC*-JMcs0qJQ zudTLrZ_x)2AFllP)^ndNeSPznrMu@Z^p8G2v3?o-aS6Qg>CusY>;B5``|IEQ+Wf7$ z_v-gwZpfqMFK)m1$?cziTDo)h&-dPW;SSz=WcS?(ZE*4YwGS`<9T#7b`r20QtE+qO F{{!9c75D%E literal 0 HcmV?d00001 From a5fa18476551c648a31cdb4fcdd218ce205c8a7d Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Fri, 1 May 2020 03:38:48 -0500 Subject: [PATCH 09/26] Reformat 'PoweredIdle' to 'Idle' --- .../GameObjects/Components/Kitchen/MicrowaveVisualizer.cs | 4 ++-- .../Components/Kitchen/KitchenMicrowaveComponent.cs | 4 ++-- Content.Shared/Kitchen/SharedMicrowave.cs | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index 7cfcd07253..bebc196dfc 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -17,11 +17,11 @@ namespace Content.Client.GameObjects.Components.Kitchen var sprite = component.Owner.GetComponent(); if (!component.TryGetData(PowerDeviceVisuals.VisualState, out MicrowaveVisualState state)) { - state = MicrowaveVisualState.PoweredIdle; + state = MicrowaveVisualState.Idle; } switch (state) { - case MicrowaveVisualState.PoweredIdle: + case MicrowaveVisualState.Idle: sprite.LayerSetState(MicrowaveVisualizerLayers.Base, "mw"); sprite.LayerSetState(MicrowaveVisualizerLayers.BaseUnlit, "mw_unlit"); break; diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 93cf571478..02f451ce57 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -83,7 +83,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _entityManager.SpawnEntity(r.Result, Owner.Transform.GridPosition); _audioSystem.Play("/Audio/machines/ding.ogg"); - SetAppearance(MicrowaveVisualState.PoweredIdle); + SetAppearance(MicrowaveVisualState.Idle); }); return; } @@ -95,7 +95,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _contents.RemoveAllSolution(); _entityManager.SpawnEntity(_badRecipeName, Owner.Transform.GridPosition); _audioSystem.Play("/Audio/machines/ding.ogg"); - SetAppearance(MicrowaveVisualState.PoweredIdle); + SetAppearance(MicrowaveVisualState.Idle); }); } diff --git a/Content.Shared/Kitchen/SharedMicrowave.cs b/Content.Shared/Kitchen/SharedMicrowave.cs index 94ac50e1cc..a2b5b49e58 100644 --- a/Content.Shared/Kitchen/SharedMicrowave.cs +++ b/Content.Shared/Kitchen/SharedMicrowave.cs @@ -9,8 +9,7 @@ namespace Content.Shared.Kitchen [Serializable, NetSerializable] public enum MicrowaveVisualState { - Off, - PoweredIdle, + Idle, Cooking } From a65d60dc2c6f8af3268e9835c7ea57771eae52f1 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Fri, 1 May 2020 17:17:05 -0500 Subject: [PATCH 10/26] Refactor SoundComponent for stopping sounds. --- .../Components/Sound/SoundComponent.cs | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/Content.Client/GameObjects/Components/Sound/SoundComponent.cs b/Content.Client/GameObjects/Components/Sound/SoundComponent.cs index c36f79fe83..076ac902a6 100644 --- a/Content.Client/GameObjects/Components/Sound/SoundComponent.cs +++ b/Content.Client/GameObjects/Components/Sound/SoundComponent.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using System.Linq; using Content.Shared.GameObjects.Components.Sound; +using Microsoft.DiaSymReader; using Robust.Client.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; @@ -15,7 +17,7 @@ namespace Content.Client.GameObjects.Components.Sound [RegisterComponent] public class SoundComponent : SharedSoundComponent { - private readonly List _schedules = new List(); + private readonly Dictionary _audioStreams = new Dictionary(); private AudioSystem _audioSystem; #pragma warning disable 649 [Dependency] private readonly IRobustRandom _random; @@ -23,26 +25,27 @@ namespace Content.Client.GameObjects.Components.Sound public override void StopAllSounds() { - foreach (var schedule in _schedules) + foreach (var kvp in _audioStreams) { - schedule.Play = false; + kvp.Key.Play = false; + kvp.Value.Stop(); } - _schedules.Clear(); + _audioStreams.Clear(); } public override void StopScheduledSound(string filename) { - foreach (var schedule in _schedules.ToArray()) + foreach (var kvp in _audioStreams) { - if (schedule.Filename != filename) continue; - schedule.Play = false; - _schedules.Remove(schedule); + if (kvp.Key.Filename != filename) continue; + kvp.Key.Play = false; + kvp.Value.Stop(); + _audioStreams.Remove(kvp.Key); } } public override void AddScheduledSound(ScheduledSound schedule) { - _schedules.Add(schedule); Play(schedule); } @@ -54,16 +57,11 @@ namespace Content.Client.GameObjects.Components.Sound { if (!schedule.Play) return; // We make sure this hasn't changed. if (_audioSystem == null) _audioSystem = IoCManager.Resolve().GetEntitySystem(); - _audioSystem.Play(schedule.Filename, Owner, schedule.AudioParams); + _audioStreams.Add(schedule,_audioSystem.Play(schedule.Filename, Owner, schedule.AudioParams)); - if (schedule.Times == 0) - { - _schedules.Remove(schedule); - return; - } + if (schedule.Times == 0) return; - if (schedule.Times > 0) - schedule.Times--; + if (schedule.Times > 0) schedule.Times--; Play(schedule); }); From 13fba25edc0648c4fe58de00e8f06756ae0ffdcd Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Fri, 1 May 2020 17:19:04 -0500 Subject: [PATCH 11/26] A shit ton of microwave stuff i can't really explain this. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 16 +++ .../Components/Kitchen/MicrowaveVisualizer.cs | 33 ++++-- .../Kitchen/KitchenMicrowaveComponent.cs | 100 ++++++++++-------- Content.Shared/Kitchen/RecipeManager.cs | 4 +- .../Kitchen/MicrowaveMealRecipePrototype.cs | 20 ++-- .../Audio/machines/microwave_done_beep.ogg | Bin 0 -> 18523 bytes Resources/Audio/machines/microwave_loop.ogg | Bin 0 -> 74414 bytes .../Audio/machines/microwave_start_beep.ogg | Bin 0 -> 5743 bytes Resources/Prototypes/Entities/kitchen.yml | 1 + Resources/Prototypes/Kitchen/meal_recipes.yml | 2 + 10 files changed, 116 insertions(+), 60 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs create mode 100644 Resources/Audio/machines/microwave_done_beep.ogg create mode 100644 Resources/Audio/machines/microwave_loop.ogg create mode 100644 Resources/Audio/machines/microwave_start_beep.ogg diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs new file mode 100644 index 0000000000..7c15ecb885 --- /dev/null +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -0,0 +1,16 @@ +using Robust.Client.GameObjects.Components.UserInterface; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Client.GameObjects.Components.Kitchen +{ + public class MicrowaveBoundUserInterface : BoundUserInterface + { + + public MicrowaveBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner,uiKey) + { + + } + } +} diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index bebc196dfc..124dafb8e2 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -1,20 +1,34 @@ -using Content.Shared.GameObjects.Components.Power; +using System.Reflection.Metadata.Ecma335; +using Content.Client.GameObjects.Components.Sound; +using Content.Shared.GameObjects.Components.Power; +using Content.Shared.GameObjects.Components.Sound; using Content.Shared.Kitchen; -using Robust.Client.Animations; using Robust.Client.GameObjects; +using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Interfaces.GameObjects.Components; -using System; -using System.Collections.Generic; -using System.Text; +using Robust.Shared.Audio; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Kitchen { public sealed class MicrowaveVisualizer : AppearanceVisualizer - { + { + private SoundComponent _soundComponent; + private const string _microwaveSoundLoop = "/Audio/machines/microwave_loop.ogg"; + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + //_audioSystem = IoCManager.Resolve().GetEntitySystem(); + + } + public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); var sprite = component.Owner.GetComponent(); + _soundComponent ??= component.Owner.GetComponent(); if (!component.TryGetData(PowerDeviceVisuals.VisualState, out MicrowaveVisualState state)) { state = MicrowaveVisualState.Idle; @@ -24,11 +38,18 @@ namespace Content.Client.GameObjects.Components.Kitchen case MicrowaveVisualState.Idle: sprite.LayerSetState(MicrowaveVisualizerLayers.Base, "mw"); sprite.LayerSetState(MicrowaveVisualizerLayers.BaseUnlit, "mw_unlit"); + _soundComponent.StopAllSounds(); break; case MicrowaveVisualState.Cooking: sprite.LayerSetState(MicrowaveVisualizerLayers.Base, "mw"); sprite.LayerSetState(MicrowaveVisualizerLayers.BaseUnlit, "mw_running_unlit"); + var audioParams = AudioParams.Default; + audioParams.Loop = true; + var schedSound = new ScheduledSound(); + schedSound.Filename = _microwaveSoundLoop; + schedSound.AudioParams = audioParams; + _soundComponent.AddScheduledSound(schedSound); break; } diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 02f451ce57..63c2da2b10 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -1,4 +1,6 @@ -using Content.Server.GameObjects.EntitySystems; +using System; +using System.Linq; +using Content.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.ViewVariables; @@ -12,6 +14,8 @@ using Robust.Shared.Timers; using Robust.Server.GameObjects; using Content.Shared.GameObjects.Components.Power; using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.GameObjects.Components.Container; +using Robust.Shared.Log; using Content.Server.GameObjects.Components.Power; namespace Content.Server.GameObjects.Components.Kitchen @@ -29,38 +33,38 @@ namespace Content.Server.GameObjects.Components.Kitchen public override string Name => "Microwave"; - private int _cookTimeSeconds; + private int _cookTimeDefault; + private int _cookTimeMultiplier; //For upgrades and stuff I guess? private string _badRecipeName; [ViewVariables] private SolutionComponent _contents; + [ViewVariables] + public bool _busy = false; + private AppearanceComponent _appearance; private AudioSystem _audioSystem; private PowerDeviceComponent _powerDevice; + + private Container _storage; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataField(ref _badRecipeName, "failureResult", "FoodBadRecipe"); - serializer.DataField(ref _cookTimeSeconds, "cookTime", 5000); + serializer.DataField(ref _cookTimeDefault, "cookTime", 5); + serializer.DataField(ref _cookTimeMultiplier, "cookTimeMultiplier", 1000); } public override void Initialize() { base.Initialize(); - if (_contents == null) - { - if (Owner.TryGetComponent(out SolutionComponent solutionComponent)) - { - _contents = solutionComponent; - } - else - { - _contents = Owner.AddComponent(); - } - } + _contents ??= Owner.TryGetComponent(out SolutionComponent solutionComponent) + ? solutionComponent + : Owner.AddComponent(); + _storage = ContainerManagerComponent.Ensure("microwave_entity_container", Owner, out var existed); _appearance = Owner.GetComponent(); _powerDevice = Owner.GetComponent(); _audioSystem = _entitySystemManager.GetEntitySystem(); @@ -68,40 +72,50 @@ namespace Content.Server.GameObjects.Components.Kitchen void IActivate.Activate(ActivateEventArgs eventArgs) { - if (_contents.ReagentList.Count == 0 || !_powerDevice.Powered) + + if (!_powerDevice.Powered || _busy) return; + if (_contents.ReagentList.Count <= 0) { return; } - foreach(var r in _recipeManager.Recipes) - { - if(CanSatisfyRecipe(r)) - { - SetAppearance(MicrowaveVisualState.Cooking); - Timer.Spawn(_cookTimeSeconds, () => - { - RemoveContents(r); - _entityManager.SpawnEntity(r.Result, Owner.Transform.GridPosition); - - _audioSystem.Play("/Audio/machines/ding.ogg"); - SetAppearance(MicrowaveVisualState.Idle); - }); - return; - } - } - - SetAppearance(MicrowaveVisualState.Cooking); - Timer.Spawn(_cookTimeSeconds, () => - { - _contents.RemoveAllSolution(); - _entityManager.SpawnEntity(_badRecipeName, Owner.Transform.GridPosition); - _audioSystem.Play("/Audio/machines/ding.ogg"); - SetAppearance(MicrowaveVisualState.Idle); - }); + _busy = true; + wzhzhzh(); } + //This is required. + private void wzhzhzh() + { + foreach(var r in _recipeManager.Recipes) + { + + var success = CanSatisfyRecipe(r); + SetAppearance(MicrowaveVisualState.Cooking); + _audioSystem.Play("/Audio/machines/microwave_start_beep.ogg"); + var time = success ? r._cookTime : _cookTimeDefault; + Timer.Spawn(time * _cookTimeMultiplier, () => + { + + if (success) + { + SubtractContents(r); + } + else + { + _contents.RemoveAllSolution(); + } + + var entityToSpawn = success ? r._result : _badRecipeName; + _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); + _audioSystem.Play("/Audio/machines/microwave_done_beep.ogg"); + SetAppearance(MicrowaveVisualState.Idle); + _busy = false; + }); + return; + } + } private bool CanSatisfyRecipe(FoodRecipePrototype recipe) { - foreach (var item in recipe.Ingredients) + foreach (var item in recipe._ingredients) { if (!_contents.ContainsReagent(item.Key, out var amount)) { @@ -117,9 +131,9 @@ namespace Content.Server.GameObjects.Components.Kitchen return true; } - private void RemoveContents(FoodRecipePrototype recipe) + private void SubtractContents(FoodRecipePrototype recipe) { - foreach(var item in recipe.Ingredients) + foreach(var item in recipe._ingredients) { _contents.TryRemoveReagent(item.Key, ReagentUnit.New(item.Value)); } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs index 6b653ee96a..eb238b105d 100644 --- a/Content.Shared/Kitchen/RecipeManager.cs +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -33,12 +33,12 @@ namespace Content.Shared.Kitchen return 0; } - if (x.Ingredients.Count < y.Ingredients.Count) + if (x._ingredients.Count < y._ingredients.Count) { return 1; } - if (x.Ingredients.Count > y.Ingredients.Count) + if (x._ingredients.Count > y._ingredients.Count) { return -1; } diff --git a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index f120499af4..4a61598629 100644 --- a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -18,24 +18,26 @@ namespace Content.Shared.Prototypes.Kitchen public class FoodRecipePrototype : IPrototype, IIndexedPrototype { - private string _id; - private string _name; - private string _result; - private Dictionary _ingredients; + public string _id; + public string _name => Loc.GetString(Name); + private string Name; + public string _result; + public IReadOnlyDictionary _ingredients => Ingredients; + private Dictionary Ingredients; + public int _cookTime; public string ID => _id; - public string Name => Loc.GetString(_name); - public string Result => _result; - public IReadOnlyDictionary Ingredients => _ingredients; public void LoadFrom(YamlMappingNode mapping) { var serializer = YamlObjectSerializer.NewReader(mapping); serializer.DataField(ref _id, "id", string.Empty); - serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref Name, "name", string.Empty); serializer.DataField(ref _result, "result", string.Empty); - serializer.DataField(ref _ingredients, "ingredients", new Dictionary()); + serializer.DataField(ref Ingredients, "ingredients", new Dictionary()); + serializer.DataField(ref _cookTime, "time", 5); } + } } diff --git a/Resources/Audio/machines/microwave_done_beep.ogg b/Resources/Audio/machines/microwave_done_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e11bd45107f4cd74c94d5e67aa6f4103cc6b6ac9 GIT binary patch literal 18523 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/machines/microwave_loop.ogg b/Resources/Audio/machines/microwave_loop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d72097e73b5c914134b1bcee2a3f41ab437e0a11 GIT binary patch literal 74414 zcmd42byQu?^C0+u;2PY6dk7xf-JPJp;b8$D?(P!Y-Q8Uh+#$GIkcSh31`;xt&*%G_ znLRtRbN1{%d(Wk5satecS9O=6Vr8WPf(8BO5#jx};^6SLABG&p?US=981m8u6VUbV z$bbEAhf#U?^1nYXU%~(__R5tq;gu)}}|%`_RMGt}qgBZ(l%?9v&g ziSm&pA^765IS^cp3clrR+v<)MiV!Sf4OK??4D~p5Fp=5kml~FW9IXpBKYflFmcCry zQo3!lSSx7=dZxM}<6yFSlsFQRMhxRnvbwxDBCQJs{~@VHoIHbAdp4x1B{kJ7y22$< z9!g`bC@#wwnkbK0qMso9jy2FI%&{oUOR8!4 zF7jw;-MJbrzq}M&=6EkyMPyQwF{Wy5>V4 zNL;WbpEc9ap^GEc;-Q=a)8Sz@WSWmY3o^_L&4xrdTe4dNaM=*-U`xh-Yq^7mVz!kp zeZzcZ!A{bI09uYG#>!+PflGv933Do=kj*O!B$SE(j}{|t77fr?qdB8g$P^VN zsGm?IYYxjX=KQ;IBoK%)1Xo>_GW0)11Z5bZ=_q4ab`T0vMR8#i$2d#VB*(-{aa!Lr z&40!=h$Vqm(~Pa4)Ux=&tfm8+ZHqCd2d-&Zl4mRdcA4=X`UL>ngG6NhSxou`a|C5+ zw(~e+c|PnvY}CFVyN3{zq(}qG1Y$i-uHic zUCI7gqAUn>BpX*O8&xbDx5t}E15-d*1p*Pha1%pR5pUd{Y$A|`7)n|ar*6eKlx{l3kg}p)9Sez5 zm#HaAHf4G1maHCIF${1EEGh8A5&}&B6-W&P3SpOJEXFmB;Va9Qh+%}LL&De(Ng;83 z(0mtlCTO;cviu++&@9V_sPogOK$PX_3jqEAAp$?B1>Zj7!H8yq0>lypReo}*C3C6Z zN@=(ls&N@E{}f!jQPj{9n$^_O(6V3E)Y45AoZ%9h*VLNf(pm(Xz}b;1rL|~3@9Mhl zqP3Z7zkYA1kME|YWxuIuxc**i`Oa|l&R2KI)$FIB)~({atI)iQ#iFadzN?|(y`n~{ z(sGK$ysQ0siiM%O#p*rxyo=$ymc^=z;i{X3PMe|bo$tJB=yr<5M;!}YLN~+vQ2phU z0~fE#13NVDtrZhpQo>u-2`w zhFj>ai^cYG=(etdA#duetFK9l{q6?~T|U3v52>5?DHZ^#5B95s+Pe5*A0KiK?tJ$= zTn&jFHldT9muMrG#ZTk&i}q$2zMHz1AKl}23HiVL*sG|l%c^BYD`P?Za(+78^wirJ zQ+xVU2{f73`x{PsuYdQ}vlN{@_S;PK*RQp*Z}d8_d~qb5ust1TKkZd(b@ln^fiiII z;%ew=X*hD{>ar)p>o*Q;EzHZ-;*5(HP%^^?@WO!NX(9{Fbqg7EQyHR4k2(vjJ8O%< zr4`^@uwJHBW+}L`kukHD1)K@i%eBnREXydh&aAb~EUk_zWt=Fr8E*t%Cb8Y{@Y_nDg&V0fAHmj6r zqSpSY_jJ6`p|a8rzjc=bifmvOS*M6$1tUi5dUOd)1o_4ZzH`+Z_RzG$!uXlbr}H& zgWG-`kQ0Cf?<|0>SuT5hEiHW>rNveYfCYgg)r3oF6_BDOrNw4@-Bf#%R*PK#xXnWU z&UHD(_2aVd-m=B!VQ1s{L}SfUWz}Qr#Z$lIY3&ab5Qxwb1VUmfK*J?�EtGr$UTL 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Ϗ`qYU!dy-F1&LarqEJ&)SnaEUxEiA6`76*`CF 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 NZC3+ed0l&e5CHtWis=9V literal 0 HcmV?d00001 diff --git a/Resources/Audio/machines/microwave_start_beep.ogg b/Resources/Audio/machines/microwave_start_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43f6c24660d3fecca5eacc9cd4ba20aa5542f92f GIT binary patch literal 5743 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 Date: Fri, 1 May 2020 23:34:04 -0500 Subject: [PATCH 12/26] Microwave interface. --- Content.Client/EntryPoint.cs | 6 +- .../Kitchen/MicrowaveBoundUserInterface.cs | 30 ++++++ .../Components/Kitchen/MicrowaveMenu.cs | 95 +++++++++++++++++++ .../Components/Kitchen/MicrowaveVisualizer.cs | 9 +- .../Kitchen/KitchenMicrowaveComponent.cs | 72 +++++++++++--- Content.Shared/GameObjects/ContentNetIDs.cs | 1 + .../Kitchen/SharedMicrowaveComponent.cs | 60 ++++++++++++ Resources/Prototypes/Entities/kitchen.yml | 5 + 8 files changed, 256 insertions(+), 22 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs create mode 100644 Content.Shared/Kitchen/SharedMicrowaveComponent.cs diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 35fb7b7748..971096182b 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -15,6 +15,7 @@ using Content.Shared.GameObjects.Components.Chemistry; using Content.Shared.GameObjects.Components.Markers; using Content.Shared.GameObjects.Components.Research; using Content.Shared.GameObjects.Components.VendingMachines; +using Content.Shared.Kitchen; using Robust.Client; using Robust.Client.Interfaces; using Robust.Client.Interfaces.Graphics.Overlays; @@ -142,8 +143,7 @@ namespace Content.Client "Mop", "Bucket", "Puddle", - "CanSpill", - "Microwave" + "CanSpill" }; foreach (var ignoreName in registerIgnore) @@ -161,7 +161,7 @@ namespace Content.Client factory.Register(); factory.Register(); factory.Register(); - + factory.Register(); prototypes.RegisterIgnore("material"); prototypes.RegisterIgnore("reaction"); //Chemical reactions only needed by server. Reactions checks are server-side. prototypes.RegisterIgnore("barSign"); diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 7c15ecb885..1fdd84c7e6 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -2,15 +2,45 @@ using System; using System.Collections.Generic; using System.Text; +using Content.Shared.Kitchen; +using Robust.Shared.GameObjects.Components.UserInterface; namespace Content.Client.GameObjects.Components.Kitchen { public class MicrowaveBoundUserInterface : BoundUserInterface { + private MicrowaveMenu _menu; public MicrowaveBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner,uiKey) { } + + protected override void Open() + { + base.Open(); + _menu = new MicrowaveMenu(this); + _menu.OpenCentered(); + _menu.OnClose += Close; + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (!(state is MicrowaveUserInterfaceState cstate)) + return; + _menu.RefreshReagents(cstate.ContainedReagents); + + } + + public void Cook() + { + SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); + } + + public void Eject() + { + SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); + } } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs new file mode 100644 index 0000000000..0b7016fdba --- /dev/null +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects; +using Content.Shared.Kitchen; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; + +namespace Content.Client.GameObjects.Components.Kitchen +{ + public class MicrowaveMenu : SS14Window + { + protected override Vector2? CustomSize => (512, 256); + + public MicrowaveBoundUserInterface Owner { get; set; } + + private List _heldReagents; + + private VBoxContainer InnerScrollContainer { get; set; } + + public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) + { + Owner = owner; + _heldReagents = new List(); + Title = Loc.GetString("Microwave"); + var vbox = new VBoxContainer() + { + SizeFlagsVertical = SizeFlags.Fill + }; + + var startButton = new Button() + { + Label = { Text = Loc.GetString("START")} + }; + var ejectButton = new Button() + { + Label = { Text = Loc.GetString("EJECT CONTENTS")} + }; + var scrollContainer = new ScrollContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand + }; + + InnerScrollContainer = new VBoxContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand + }; + + scrollContainer.AddChild(InnerScrollContainer); + vbox.AddChild(startButton); + vbox.AddChild(ejectButton); + vbox.AddChild(scrollContainer); + Contents.AddChild(vbox); + startButton.OnPressed += OnCookButtonPressed; + ejectButton.OnPressed += OnEjectButtonPressed; + + } + + private void OnEjectButtonPressed(BaseButton.ButtonEventArgs obj) + { + Owner.Eject(); + } + + private void OnCookButtonPressed(BaseButton.ButtonEventArgs args) + { + Owner.Cook(); + + } + + + public void RefreshReagents(List reagents) + { + InnerScrollContainer.RemoveAllChildren(); + foreach (var item in reagents) + { + IoCManager.Resolve().TryIndex(item.ReagentId, out ReagentPrototype proto); + + InnerScrollContainer.AddChild(new Label() + { + + Text = $"{item.Quantity} {proto.Name}" + }); + } + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + InnerScrollContainer.Dispose(); + } + } +} diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index 124dafb8e2..e7c443074c 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -1,14 +1,14 @@ -using System.Reflection.Metadata.Ecma335; +using System; +using System.Reflection.Metadata.Ecma335; using Content.Client.GameObjects.Components.Sound; using Content.Shared.GameObjects.Components.Power; using Content.Shared.GameObjects.Components.Sound; using Content.Shared.Kitchen; using Robust.Client.GameObjects; -using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Interfaces.GameObjects.Components; using Robust.Shared.Audio; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.IoC; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Serialization; using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Kitchen @@ -60,6 +60,7 @@ namespace Content.Client.GameObjects.Components.Kitchen } + public enum MicrowaveVisualizerLayers { Base, diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 63c2da2b10..cd7c932235 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using Content.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -15,24 +14,22 @@ using Robust.Server.GameObjects; using Content.Shared.GameObjects.Components.Power; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.GameObjects.Components.Container; -using Robust.Shared.Log; using Content.Server.GameObjects.Components.Power; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.Interfaces.GameObjects; namespace Content.Server.GameObjects.Components.Kitchen { [RegisterComponent] [ComponentReference(typeof(IActivate))] - public class KitchenMicrowaveComponent : Component, IActivate + public class KitchenMicrowaveComponent : SharedMicrowaveComponent, IActivate, ISolutionChange { - #pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly RecipeManager _recipeManager; #pragma warning restore 649 - public override string Name => "Microwave"; - private int _cookTimeDefault; private int _cookTimeMultiplier; //For upgrades and stuff I guess? private string _badRecipeName; @@ -42,6 +39,10 @@ namespace Content.Server.GameObjects.Components.Kitchen [ViewVariables] public bool _busy = false; + private bool Powered => _powerDevice.Powered; + + private bool HasContents => _contents.ReagentList.Count > 0; + private AppearanceComponent _appearance; private AudioSystem _audioSystem; @@ -49,6 +50,9 @@ namespace Content.Server.GameObjects.Components.Kitchen private PowerDeviceComponent _powerDevice; private Container _storage; + + private BoundUserInterface _userInterface; + void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -68,23 +72,48 @@ namespace Content.Server.GameObjects.Components.Kitchen _appearance = Owner.GetComponent(); _powerDevice = Owner.GetComponent(); _audioSystem = _entitySystemManager.GetEntitySystem(); + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(MicrowaveUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; + } + private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage message) + { + if (!Powered || _busy) return; + + switch (message.Message) + { + case MicrowaveStartCookMessage msg : + if (!HasContents) return; + UpdateUserInterface(); + wzhzhzh(); + break; + + case MicrowaveEjectMessage msg : + if (!HasContents) return; + EjectReagents(); + UpdateUserInterface(); + break; + } + + } + + void IActivate.Activate(ActivateEventArgs eventArgs) { - - if (!_powerDevice.Powered || _busy) return; - if (_contents.ReagentList.Count <= 0) - { + if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) return; - } - _busy = true; - wzhzhzh(); + if (!Powered) return; + UpdateUserInterface(); + _userInterface.Open(actor.playerSession); + } //This is required. private void wzhzhzh() { + _busy = true; foreach(var r in _recipeManager.Recipes) { @@ -101,7 +130,7 @@ namespace Content.Server.GameObjects.Components.Kitchen } else { - _contents.RemoveAllSolution(); + EjectReagents(); } var entityToSpawn = success ? r._result : _badRecipeName; @@ -113,6 +142,14 @@ namespace Content.Server.GameObjects.Components.Kitchen return; } } + + /// + /// This actually deletes all the reagents. + /// + private void EjectReagents() + { + _contents.RemoveAllSolution(); + } private bool CanSatisfyRecipe(FoodRecipePrototype recipe) { foreach (var item in recipe._ingredients) @@ -144,5 +181,10 @@ namespace Content.Server.GameObjects.Components.Kitchen if (_appearance != null || Owner.TryGetComponent(out _appearance)) _appearance.SetData(PowerDeviceVisuals.VisualState, state); } + + private void UpdateUserInterface() + { + _userInterface.SetState(new MicrowaveUserInterfaceState(_contents.Solution.Contents.ToList())); + } } } diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index ef69972f4d..f9832cc751 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -42,5 +42,6 @@ public const uint PAPER = 1037; public const uint REAGENT_INJECTOR = 1038; public const uint GHOST = 1039; + public const uint MICROWAVE = 1040; } } diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs new file mode 100644 index 0000000000..59e34aa82f --- /dev/null +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Components.UserInterface; + + +namespace Content.Shared.Kitchen +{ + + public class SharedMicrowaveComponent : Component + { + + public override string Name => "Microwave"; + public override uint? NetID => ContentNetIDs.MICROWAVE; + + [Serializable, NetSerializable] + public class MicrowaveStartCookMessage : BoundUserInterfaceMessage + { + public MicrowaveStartCookMessage() + { + } + } + + [Serializable, NetSerializable] + public class MicrowaveEjectMessage : BoundUserInterfaceMessage + { + public MicrowaveEjectMessage() + { + } + } + } + + [NetSerializable, Serializable] + public class MicrowaveUserInterfaceState : BoundUserInterfaceState + { + public readonly List ContainedReagents; + public MicrowaveUserInterfaceState(List contained) + { + ContainedReagents = contained; + } + } + + [Serializable, NetSerializable] + public enum MicrowaveVisualState + { + Idle, + Cooking + } + + [NetSerializable, Serializable] + public enum MicrowaveUiKey + { + Key + } + +} diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml index 5828bd07ea..f517051c87 100644 --- a/Resources/Prototypes/Entities/kitchen.yml +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -13,6 +13,11 @@ visuals: - type: MicrowaveVisualizer - type: Sound + - type: UserInterface + interfaces: + - key: enum.MicrowaveUiKey.Key + type: MicrowaveBoundUserInterface + - type: Collidable shapes: From dba0949c5b586e7646c199960d5201643d42c7e8 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sat, 2 May 2020 01:29:20 -0500 Subject: [PATCH 13/26] Add (not working) basis for allowing solids (entities) in recipes. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 3 +- .../Components/Kitchen/MicrowaveMenu.cs | 18 +++- .../Kitchen/KitchenMicrowaveComponent.cs | 100 ++++++++++++++++-- Content.Shared/Kitchen/RecipeManager.cs | 4 +- Content.Shared/Kitchen/SharedMicrowave.cs | 17 --- .../Kitchen/SharedMicrowaveComponent.cs | 8 +- .../Kitchen/MicrowaveMealRecipePrototype.cs | 10 +- .../Entities/Items/Consumables/food.yml | 16 +-- Resources/Prototypes/Kitchen/meal_recipes.yml | 12 +-- 9 files changed, 132 insertions(+), 56 deletions(-) delete mode 100644 Content.Shared/Kitchen/SharedMicrowave.cs diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 1fdd84c7e6..6a07143798 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; +using Content.Client.GameObjects.Components.Mobs; using Content.Shared.Kitchen; using Robust.Shared.GameObjects.Components.UserInterface; @@ -29,7 +30,7 @@ namespace Content.Client.GameObjects.Components.Kitchen base.UpdateState(state); if (!(state is MicrowaveUserInterfaceState cstate)) return; - _menu.RefreshReagents(cstate.ContainedReagents); + _menu.RefreshContents(cstate.ReagentsReagents, cstate.ContainedSolids); } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index 0b7016fdba..83a4a84552 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -2,8 +2,10 @@ using Content.Shared.Chemistry; using Content.Shared.GameObjects; using Content.Shared.Kitchen; +using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Maths; @@ -37,7 +39,7 @@ namespace Content.Client.GameObjects.Components.Kitchen }; var ejectButton = new Button() { - Label = { Text = Loc.GetString("EJECT CONTENTS")} + Label = { Text = Loc.GetString("EJECT REAGENTS")} }; var scrollContainer = new ScrollContainer() { @@ -71,7 +73,7 @@ namespace Content.Client.GameObjects.Components.Kitchen } - public void RefreshReagents(List reagents) + public void RefreshContents(List reagents, Dictionary solids) { InnerScrollContainer.RemoveAllChildren(); foreach (var item in reagents) @@ -84,6 +86,18 @@ namespace Content.Client.GameObjects.Components.Kitchen Text = $"{item.Quantity} {proto.Name}" }); } + + foreach (var item in solids) + { + IoCManager.Resolve().TryIndex(item.Key, out EntityPrototype proto); + var solidLabel = new Button() + { + Text = $"{item.Value} {proto.Name}" + }; + + InnerScrollContainer.AddChild(solidLabel); + } + } protected override void Dispose(bool disposing) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index cd7c932235..8f7fc05429 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -1,9 +1,11 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using Content.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.ViewVariables; using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Nutrition; using Content.Shared.Chemistry; using Robust.Shared.Serialization; using Robust.Shared.Interfaces.GameObjects; @@ -17,17 +19,19 @@ using Robust.Server.GameObjects.Components.Container; using Content.Server.GameObjects.Components.Power; using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Prototypes; namespace Content.Server.GameObjects.Components.Kitchen { [RegisterComponent] [ComponentReference(typeof(IActivate))] - public class KitchenMicrowaveComponent : SharedMicrowaveComponent, IActivate, ISolutionChange + public class KitchenMicrowaveComponent : SharedMicrowaveComponent, IActivate, IAttackBy, ISolutionChange { #pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly RecipeManager _recipeManager; + [Dependency] private readonly IPrototypeManager _prototypeManager; #pragma warning restore 649 private int _cookTimeDefault; @@ -41,7 +45,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private bool Powered => _powerDevice.Powered; - private bool HasContents => _contents.ReagentList.Count > 0; + private bool HasContents => _contents.ReagentList.Count > 0 || _entityContents.Count > 0; private AppearanceComponent _appearance; @@ -51,6 +55,8 @@ namespace Content.Server.GameObjects.Components.Kitchen private Container _storage; + private Dictionary _entityContents; + private BoundUserInterface _userInterface; void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); public override void ExposeData(ObjectSerializer serializer) @@ -74,6 +80,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _audioSystem = _entitySystemManager.GetEntitySystem(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MicrowaveUiKey.Key); + _entityContents = new Dictionary(); _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; } @@ -92,7 +99,8 @@ namespace Content.Server.GameObjects.Components.Kitchen case MicrowaveEjectMessage msg : if (!HasContents) return; - EjectReagents(); + DestroyReagents(); + EjectSolids(); UpdateUserInterface(); break; } @@ -110,6 +118,31 @@ namespace Content.Server.GameObjects.Components.Kitchen } + public bool AttackBy(AttackByEventArgs eventArgs) + { + var itemEntity = eventArgs.User.GetComponent().GetActiveHand.Owner; + if (itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) + { + if (_entityContents.TryGetValue(itemEntity.Prototype.ID, out var quantity) && quantity > 0) + { + quantity++; + food.Owner.Delete(); + UpdateUserInterface(); + return true; + } + else + { + _storage.Insert(food.Owner); + } + + _entityContents.Add(itemEntity.Prototype.ID, 1); + UpdateUserInterface(); + return true; + } + + return false; + } + //This is required. private void wzhzhzh() { @@ -130,7 +163,8 @@ namespace Content.Server.GameObjects.Components.Kitchen } else { - EjectReagents(); + DestroyReagents(); + EjectSolids(); } var entityToSpawn = success ? r._result : _badRecipeName; @@ -139,6 +173,8 @@ namespace Content.Server.GameObjects.Components.Kitchen SetAppearance(MicrowaveVisualState.Idle); _busy = false; }); + _busy = false; + UpdateUserInterface(); return; } } @@ -146,20 +182,54 @@ namespace Content.Server.GameObjects.Components.Kitchen /// /// This actually deletes all the reagents. /// - private void EjectReagents() + private void DestroyReagents() { _contents.RemoveAllSolution(); } + + private void EjectSolids() + { + + foreach (var item in _storage.ContainedEntities.ToList()) + { + _storage.Remove(item); + } + + foreach (var kvp in _entityContents) + { + if (kvp.Value > 1 && _prototypeManager.TryIndex(kvp.Key, out EntityPrototype proto)) + { + for(int i = 0; i <= kvp.Value - 1; i++) + _entityManager.SpawnEntity(proto.Name, Owner.Transform.GridPosition); + + } + } + + _entityContents.Clear(); + } private bool CanSatisfyRecipe(FoodRecipePrototype recipe) { - foreach (var item in recipe._ingredients) + foreach (var reagent in recipe._ingReagents) { - if (!_contents.ContainsReagent(item.Key, out var amount)) + if (!_contents.ContainsReagent(reagent.Key, out var amount)) { return false; } - if (amount.Int() < item.Value) + if (amount.Int() < reagent.Value) + { + return false; + } + } + + foreach (var solid in recipe._ingSolids) + { + if (!_entityContents.TryGetValue(solid.Key, out var amount)) + { + return false; + } + + if (amount < solid.Value) { return false; } @@ -170,10 +240,16 @@ namespace Content.Server.GameObjects.Components.Kitchen private void SubtractContents(FoodRecipePrototype recipe) { - foreach(var item in recipe._ingredients) + foreach(var item in recipe._ingReagents) { _contents.TryRemoveReagent(item.Key, ReagentUnit.New(item.Value)); } + + foreach(var item in recipe._ingSolids) + { + _entityContents.TryGetValue(item.Key, out var value); + value -= item.Value; + } } private void SetAppearance(MicrowaveVisualState state) @@ -184,7 +260,9 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UpdateUserInterface() { - _userInterface.SetState(new MicrowaveUserInterfaceState(_contents.Solution.Contents.ToList())); + _userInterface.SetState(new MicrowaveUserInterfaceState(_contents.Solution.Contents.ToList(), solids:_entityContents)); } + + } } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs index eb238b105d..72772f2434 100644 --- a/Content.Shared/Kitchen/RecipeManager.cs +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -33,12 +33,12 @@ namespace Content.Shared.Kitchen return 0; } - if (x._ingredients.Count < y._ingredients.Count) + if (x._ingReagents.Count < y._ingReagents.Count) { return 1; } - if (x._ingredients.Count > y._ingredients.Count) + if (x._ingReagents.Count > y._ingReagents.Count) { return -1; } diff --git a/Content.Shared/Kitchen/SharedMicrowave.cs b/Content.Shared/Kitchen/SharedMicrowave.cs deleted file mode 100644 index a2b5b49e58..0000000000 --- a/Content.Shared/Kitchen/SharedMicrowave.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Robust.Shared.Serialization; -using System; -using System.Collections.Generic; -using System.Text; - -namespace Content.Shared.Kitchen -{ - - [Serializable, NetSerializable] - public enum MicrowaveVisualState - { - Idle, - Cooking - } - - -} diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index 59e34aa82f..fa506fd107 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -37,10 +37,12 @@ namespace Content.Shared.Kitchen [NetSerializable, Serializable] public class MicrowaveUserInterfaceState : BoundUserInterfaceState { - public readonly List ContainedReagents; - public MicrowaveUserInterfaceState(List contained) + public readonly List ReagentsReagents; + public readonly Dictionary ContainedSolids; + public MicrowaveUserInterfaceState(List reagents, Dictionary solids) { - ContainedReagents = contained; + ReagentsReagents = reagents; + ContainedSolids = solids; } } diff --git a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index 4a61598629..f54a1ac86c 100644 --- a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -22,8 +22,11 @@ namespace Content.Shared.Prototypes.Kitchen public string _name => Loc.GetString(Name); private string Name; public string _result; - public IReadOnlyDictionary _ingredients => Ingredients; - private Dictionary Ingredients; + public IReadOnlyDictionary _ingReagents => IngredientsReagents; + public IReadOnlyDictionary _ingSolids => IngredientsSolids; + + private Dictionary IngredientsReagents; + private Dictionary IngredientsSolids; public int _cookTime; public string ID => _id; @@ -35,7 +38,8 @@ namespace Content.Shared.Prototypes.Kitchen serializer.DataField(ref _id, "id", string.Empty); serializer.DataField(ref Name, "name", string.Empty); serializer.DataField(ref _result, "result", string.Empty); - serializer.DataField(ref Ingredients, "ingredients", new Dictionary()); + serializer.DataField(ref IngredientsReagents, "reagents", new Dictionary()); + serializer.DataField(ref IngredientsSolids, "solids", new Dictionary()); serializer.DataField(ref _cookTime, "time", 5); } diff --git a/Resources/Prototypes/Entities/Items/Consumables/food.yml b/Resources/Prototypes/Entities/Items/Consumables/food.yml index 8e6dd97175..7ab00d754b 100644 --- a/Resources/Prototypes/Entities/Items/Consumables/food.yml +++ b/Resources/Prototypes/Entities/Items/Consumables/food.yml @@ -90,7 +90,7 @@ # name: Ambrosia vulgar is crushed # parent: FoodBase # id: FoodAmbrosiaVulgarIsCrushed -# description: +# description: # components: # - type: Food # uses: 1 @@ -137,7 +137,7 @@ # name: Bacon # parent: FoodBase # id: FoodBacon -# description: +# description: # components: # - type: Food # uses: 1 @@ -182,7 +182,7 @@ name: Bread (slice) parent: FoodBase id: FoodBreadSlice - description: + description: components: - type: Food contents: @@ -199,7 +199,7 @@ name: Banana bread (slice) parent: FoodBase id: FoodBananaBreadSlice - description: + description: components: - type: Food contents: @@ -233,7 +233,7 @@ # name: Bear meat # parent: FoodBase # id: FoodBearMeat -# description: +# description: # components: # - type: Food # uses: 1 @@ -612,7 +612,7 @@ # name: Cocoa # parent: FoodBase # id: FoodCocoa -# description: +# description: # components: # - type: Food # uses: 1 @@ -1482,11 +1482,11 @@ - type: Icon sprite: Objects/Food/loadedbakedpotato.rsi -#- type: entity +# - type: entity # parent: FoodBase # id: FoodMeat # name: Meat -# description: '' +# description: A slab of meat. # components: # - type: Food # uses: 1 diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 660f7eef2a..a1c3fc51ba 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -3,15 +3,9 @@ name: Cheeseburger Recipe result: FoodCheeseburger time: 10 - ingredients: + reagents: chem.H2O: 15 chem.Nutriment: 5 + solids: + FoodMeatBreadSlice: 1 -- type: microwaveMealRecipe - id: RecipeFlashlight - name: Flashlight Recipe - result: FoodCheeseWedge - time: 5 - ingredients: - chem.H2O: 15 - chem.Glucose: 5 From 0f61c2fadf4c01d35e93af5fbbcc293d38c2530e Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 3 May 2020 01:34:00 -0500 Subject: [PATCH 14/26] Microwave UI + solids implemented. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 13 +- .../Components/Kitchen/MicrowaveMenu.cs | 38 +--- .../Components/Kitchen/MicrowaveVisualizer.cs | 2 - .../Kitchen/KitchenMicrowaveComponent.cs | 207 +++++++++++------- Content.Shared/Kitchen/RecipeManager.cs | 4 +- .../Kitchen/SharedMicrowaveComponent.cs | 18 +- .../Kitchen/MicrowaveMealRecipePrototype.cs | 29 +-- Resources/Prototypes/Kitchen/meal_recipes.yml | 4 +- 8 files changed, 186 insertions(+), 129 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 6a07143798..bb70363912 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -1,8 +1,4 @@ using Robust.Client.GameObjects.Components.UserInterface; -using System; -using System.Collections.Generic; -using System.Text; -using Content.Client.GameObjects.Components.Mobs; using Content.Shared.Kitchen; using Robust.Shared.GameObjects.Components.UserInterface; @@ -28,9 +24,9 @@ namespace Content.Client.GameObjects.Components.Kitchen protected override void UpdateState(BoundUserInterfaceState state) { base.UpdateState(state); - if (!(state is MicrowaveUserInterfaceState cstate)) + if (!(state is MicrowaveUpdateUserInterfaceState cstate)) return; - _menu.RefreshContents(cstate.ReagentsReagents, cstate.ContainedSolids); + _menu.RefreshContentsDisplay(cstate.ReagentsReagents, cstate.ContainedSolids); } @@ -43,5 +39,10 @@ namespace Content.Client.GameObjects.Components.Kitchen { SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); } + + public void EjectSolidWithIndex(int index) + { + SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(index)); + } } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index 83a4a84552..828b06ad25 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -1,11 +1,9 @@ using System.Collections.Generic; using Content.Shared.Chemistry; -using Content.Shared.GameObjects; -using Content.Shared.Kitchen; -using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Maths; @@ -17,7 +15,7 @@ namespace Content.Client.GameObjects.Components.Kitchen { protected override Vector2? CustomSize => (512, 256); - public MicrowaveBoundUserInterface Owner { get; set; } + private MicrowaveBoundUserInterface Owner { get; set; } private List _heldReagents; @@ -35,11 +33,11 @@ namespace Content.Client.GameObjects.Components.Kitchen var startButton = new Button() { - Label = { Text = Loc.GetString("START")} + Label = { Text = Loc.GetString("START"), FontColorOverride = Color.Green} }; var ejectButton = new Button() { - Label = { Text = Loc.GetString("EJECT REAGENTS")} + Label = { Text = Loc.GetString("EJECT REAGENTS"),FontColorOverride = Color.Red} }; var scrollContainer = new ScrollContainer() { @@ -56,24 +54,12 @@ namespace Content.Client.GameObjects.Components.Kitchen vbox.AddChild(ejectButton); vbox.AddChild(scrollContainer); Contents.AddChild(vbox); - startButton.OnPressed += OnCookButtonPressed; - ejectButton.OnPressed += OnEjectButtonPressed; + startButton.OnPressed += args => Owner.Cook(); + ejectButton.OnPressed += args => Owner.Eject(); } - private void OnEjectButtonPressed(BaseButton.ButtonEventArgs obj) - { - Owner.Eject(); - } - - private void OnCookButtonPressed(BaseButton.ButtonEventArgs args) - { - Owner.Cook(); - - } - - - public void RefreshContents(List reagents, Dictionary solids) + public void RefreshContentsDisplay(List reagents, List solids) { InnerScrollContainer.RemoveAllChildren(); foreach (var item in reagents) @@ -82,20 +68,20 @@ namespace Content.Client.GameObjects.Components.Kitchen InnerScrollContainer.AddChild(new Label() { - Text = $"{item.Quantity} {proto.Name}" }); } foreach (var item in solids) { - IoCManager.Resolve().TryIndex(item.Key, out EntityPrototype proto); - var solidLabel = new Button() + var name = IoCManager.Resolve().GetEntity(item).Prototype.Name; + var solidButton = new Button() { - Text = $"{item.Value} {proto.Name}" + Text = $"{name}" }; - InnerScrollContainer.AddChild(solidLabel); + solidButton.OnPressed += args => Owner.EjectSolidWithIndex(solids.IndexOf(item)); + InnerScrollContainer.AddChild(solidButton); } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index e7c443074c..2c38876680 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -20,8 +20,6 @@ namespace Content.Client.GameObjects.Components.Kitchen public override void LoadData(YamlMappingNode node) { base.LoadData(node); - //_audioSystem = IoCManager.Resolve().GetEntitySystem(); - } public override void OnChangeData(AppearanceComponent component) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 8f7fc05429..7b72081d1c 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -20,6 +20,8 @@ using Content.Server.GameObjects.Components.Power; using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.Prototypes; +using Robust.Shared.Localization; +using Content.Server.Interfaces; namespace Content.Server.GameObjects.Components.Kitchen { @@ -32,20 +34,23 @@ namespace Content.Server.GameObjects.Components.Kitchen [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly RecipeManager _recipeManager; [Dependency] private readonly IPrototypeManager _prototypeManager; + [Dependency] private readonly IServerNotifyManager _notifyManager; #pragma warning restore 649 private int _cookTimeDefault; private int _cookTimeMultiplier; //For upgrades and stuff I guess? private string _badRecipeName; + private string _startCookingSound; + private string _cookingCompleteSound; [ViewVariables] - private SolutionComponent _contents; + private SolutionComponent _solution; [ViewVariables] - public bool _busy = false; + private bool _busy = false; private bool Powered => _powerDevice.Powered; - private bool HasContents => _contents.ReagentList.Count > 0 || _entityContents.Count > 0; + private bool HasContents => _solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0; private AppearanceComponent _appearance; @@ -55,7 +60,8 @@ namespace Content.Server.GameObjects.Components.Kitchen private Container _storage; - private Dictionary _entityContents; + private Dictionary _solids; + private List _solidsVisualList; private BoundUserInterface _userInterface; void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); @@ -65,12 +71,14 @@ namespace Content.Server.GameObjects.Components.Kitchen serializer.DataField(ref _badRecipeName, "failureResult", "FoodBadRecipe"); serializer.DataField(ref _cookTimeDefault, "cookTime", 5); serializer.DataField(ref _cookTimeMultiplier, "cookTimeMultiplier", 1000); + serializer.DataField(ref _startCookingSound, "beginCookingSound","/Audio/machines/microwave_start_beep.ogg" ); + serializer.DataField(ref _cookingCompleteSound, "foodDoneSound","/Audio/machines/microwave_done_beep.ogg" ); } public override void Initialize() { base.Initialize(); - _contents ??= Owner.TryGetComponent(out SolutionComponent solutionComponent) + _solution ??= Owner.TryGetComponent(out SolutionComponent solutionComponent) ? solutionComponent : Owner.AddComponent(); @@ -80,33 +88,53 @@ namespace Content.Server.GameObjects.Components.Kitchen _audioSystem = _entitySystemManager.GetEntitySystem(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MicrowaveUiKey.Key); - _entityContents = new Dictionary(); + + _solids = new Dictionary(); + _solidsVisualList = new List(); _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; } private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage message) { - if (!Powered || _busy) return; + if (!Powered || _busy || !HasContents) return; switch (message.Message) { case MicrowaveStartCookMessage msg : - if (!HasContents) return; - UpdateUserInterface(); wzhzhzh(); break; case MicrowaveEjectMessage msg : - if (!HasContents) return; - DestroyReagents(); + VaporizeReagents(); EjectSolids(); UpdateUserInterface(); break; + + case MicrowaveEjectSolidIndexedMessage msg: + EjectIndexedSolid(msg.index); + UpdateUserInterface(); + break; } } + private void SetAppearance(MicrowaveVisualState state) + { + if (_appearance != null || Owner.TryGetComponent(out _appearance)) + _appearance.SetData(PowerDeviceVisuals.VisualState, state); + } + + private void UpdateUserInterface() + { + _solidsVisualList.Clear(); + foreach(var item in _storage.ContainedEntities.ToList()) + { + _solidsVisualList.Add(item.Uid); + } + + _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents.ToList(), _solidsVisualList)); + } void IActivate.Activate(ActivateEventArgs eventArgs) { @@ -121,25 +149,51 @@ namespace Content.Server.GameObjects.Components.Kitchen public bool AttackBy(AttackByEventArgs eventArgs) { var itemEntity = eventArgs.User.GetComponent().GetActiveHand.Owner; - if (itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) + + if(itemEntity.TryGetComponent(out var attackPourable)) { - if (_entityContents.TryGetValue(itemEntity.Prototype.ID, out var quantity) && quantity > 0) + //Get target and check if it can be poured into + if (!Owner.TryGetComponent(out var mySolution) + || !mySolution.CanPourIn) { - quantity++; - food.Owner.Delete(); - UpdateUserInterface(); - return true; - } - else - { - _storage.Insert(food.Owner); + return false; } - _entityContents.Add(itemEntity.Prototype.ID, 1); - UpdateUserInterface(); + if (!itemEntity.TryGetComponent(out var attackSolution) + || !attackSolution.CanPourOut) + { + return false; + } + + //Get transfer amount. May be smaller than _transferAmount if not enough room + var realTransferAmount = ReagentUnit.Min(attackPourable.TransferAmount, mySolution.EmptyVolume); + if (realTransferAmount <= 0) //Special message if container is full + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User, + Loc.GetString("Container is full")); + return false; + } + + //Move units from attackSolution to targetSolution + var removedSolution = attackSolution.SplitSolution(realTransferAmount); + if (!mySolution.TryAddSolution(removedSolution)) + return false; + + _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User, + Loc.GetString("Transferred {0}u", removedSolution.TotalVolume)); return true; } + if (itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) + { + var ent = food.Owner; //Get the entity of the ItemComponent. + + _storage.Insert(ent); + + UpdateUserInterface(); + return true; + } + return false; } @@ -147,13 +201,28 @@ namespace Content.Server.GameObjects.Components.Kitchen private void wzhzhzh() { _busy = true; + // Convert storage into Dictionary of ingredients + _solids.Clear(); + foreach(var item in _storage.ContainedEntities.ToList()) + { + if(_solids.ContainsKey(item.Prototype.ID)) + { + _solids[item.Prototype.ID]++; + } + else + { + _solids.Add(item.Prototype.ID, 1); + } + } + + // Check recipes foreach(var r in _recipeManager.Recipes) { var success = CanSatisfyRecipe(r); SetAppearance(MicrowaveVisualState.Cooking); - _audioSystem.Play("/Audio/machines/microwave_start_beep.ogg"); - var time = success ? r._cookTime : _cookTimeDefault; + _audioSystem.Play(_startCookingSound); + var time = success ? r.CookTime : _cookTimeDefault; Timer.Spawn(time * _cookTimeMultiplier, () => { @@ -163,28 +232,33 @@ namespace Content.Server.GameObjects.Components.Kitchen } else { - DestroyReagents(); - EjectSolids(); + VaporizeReagents(); + VaporizeSolids(); } - var entityToSpawn = success ? r._result : _badRecipeName; + var entityToSpawn = success ? r.Result : _badRecipeName; _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); - _audioSystem.Play("/Audio/machines/microwave_done_beep.ogg"); + _audioSystem.Play(_cookingCompleteSound); SetAppearance(MicrowaveVisualState.Idle); _busy = false; }); - _busy = false; UpdateUserInterface(); return; } } - /// - /// This actually deletes all the reagents. - /// - private void DestroyReagents() + private void VaporizeReagents() { - _contents.RemoveAllSolution(); + _solution.RemoveAllSolution(); + + } + + private void VaporizeSolids() + { + foreach (var item in _storage.ContainedEntities.ToList()) + { + item.Delete(); + } } private void EjectSolids() @@ -195,23 +269,34 @@ namespace Content.Server.GameObjects.Components.Kitchen _storage.Remove(item); } - foreach (var kvp in _entityContents) - { - if (kvp.Value > 1 && _prototypeManager.TryIndex(kvp.Key, out EntityPrototype proto)) - { - for(int i = 0; i <= kvp.Value - 1; i++) - _entityManager.SpawnEntity(proto.Name, Owner.Transform.GridPosition); + _solids.Clear(); + } - } + private void EjectIndexedSolid(int index) + { + var entityToRemove = _storage.ContainedEntities.ToArray()[index]; + _storage.Remove(entityToRemove); + } + + + private void SubtractContents(FoodRecipePrototype recipe) + { + foreach(var kvp in recipe.IngredientsReagents) + { + _solution.TryRemoveReagent(kvp.Key, ReagentUnit.New(kvp.Value)); } - _entityContents.Clear(); + foreach (var solid in recipe.IngredientsSolids) + { + _solids[solid.Key] -= solid.Value; + } } + private bool CanSatisfyRecipe(FoodRecipePrototype recipe) { - foreach (var reagent in recipe._ingReagents) + foreach (var reagent in recipe.IngredientsReagents) { - if (!_contents.ContainsReagent(reagent.Key, out var amount)) + if (!_solution.ContainsReagent(reagent.Key, out var amount)) { return false; } @@ -222,14 +307,14 @@ namespace Content.Server.GameObjects.Components.Kitchen } } - foreach (var solid in recipe._ingSolids) + foreach (var solid in recipe.IngredientsSolids) { - if (!_entityContents.TryGetValue(solid.Key, out var amount)) + if (!_solids.ContainsKey(solid.Key)) { return false; } - if (amount < solid.Value) + if (_solids[solid.Key] < solid.Value) { return false; } @@ -238,31 +323,5 @@ namespace Content.Server.GameObjects.Components.Kitchen return true; } - private void SubtractContents(FoodRecipePrototype recipe) - { - foreach(var item in recipe._ingReagents) - { - _contents.TryRemoveReagent(item.Key, ReagentUnit.New(item.Value)); - } - - foreach(var item in recipe._ingSolids) - { - _entityContents.TryGetValue(item.Key, out var value); - value -= item.Value; - } - } - - private void SetAppearance(MicrowaveVisualState state) - { - if (_appearance != null || Owner.TryGetComponent(out _appearance)) - _appearance.SetData(PowerDeviceVisuals.VisualState, state); - } - - private void UpdateUserInterface() - { - _userInterface.SetState(new MicrowaveUserInterfaceState(_contents.Solution.Contents.ToList(), solids:_entityContents)); - } - - } } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs index 72772f2434..454c21a440 100644 --- a/Content.Shared/Kitchen/RecipeManager.cs +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -33,12 +33,12 @@ namespace Content.Shared.Kitchen return 0; } - if (x._ingReagents.Count < y._ingReagents.Count) + if (x.IngredientsReagents.Count < y.IngredientsReagents.Count) { return 1; } - if (x._ingReagents.Count > y._ingReagents.Count) + if (x.IngredientsReagents.Count > y.IngredientsReagents.Count) { return -1; } diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index fa506fd107..bbe20d244b 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -6,6 +6,7 @@ using Robust.Shared.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.GameObjects.Components; using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Interfaces.GameObjects; namespace Content.Shared.Kitchen @@ -32,14 +33,25 @@ namespace Content.Shared.Kitchen { } } + + [Serializable, NetSerializable] + public class MicrowaveEjectSolidIndexedMessage : BoundUserInterfaceMessage + { + + public int index; + public MicrowaveEjectSolidIndexedMessage(int i) + { + index = i; + } + } } [NetSerializable, Serializable] - public class MicrowaveUserInterfaceState : BoundUserInterfaceState + public class MicrowaveUpdateUserInterfaceState : BoundUserInterfaceState { public readonly List ReagentsReagents; - public readonly Dictionary ContainedSolids; - public MicrowaveUserInterfaceState(List reagents, Dictionary solids) + public readonly List ContainedSolids; + public MicrowaveUpdateUserInterfaceState(List reagents, List solids) { ReagentsReagents = reagents; ContainedSolids = solids; diff --git a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index f54a1ac86c..abae3d5eb1 100644 --- a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -18,16 +18,17 @@ namespace Content.Shared.Prototypes.Kitchen public class FoodRecipePrototype : IPrototype, IIndexedPrototype { - public string _id; - public string _name => Loc.GetString(Name); - private string Name; - public string _result; - public IReadOnlyDictionary _ingReagents => IngredientsReagents; - public IReadOnlyDictionary _ingSolids => IngredientsSolids; + private string _id; + public string Name => Loc.GetString(Name); + private string _name; + public string Result; + public int CookTime; + public IReadOnlyDictionary IngredientsReagents => _ingsReagents; + public IReadOnlyDictionary IngredientsSolids => _ingsSolids; + + private Dictionary _ingsReagents; + private Dictionary _ingsSolids; - private Dictionary IngredientsReagents; - private Dictionary IngredientsSolids; - public int _cookTime; public string ID => _id; @@ -36,11 +37,11 @@ namespace Content.Shared.Prototypes.Kitchen var serializer = YamlObjectSerializer.NewReader(mapping); serializer.DataField(ref _id, "id", string.Empty); - serializer.DataField(ref Name, "name", string.Empty); - serializer.DataField(ref _result, "result", string.Empty); - serializer.DataField(ref IngredientsReagents, "reagents", new Dictionary()); - serializer.DataField(ref IngredientsSolids, "solids", new Dictionary()); - serializer.DataField(ref _cookTime, "time", 5); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref Result, "result", string.Empty); + serializer.DataField(ref _ingsReagents, "reagents", new Dictionary()); + serializer.DataField(ref _ingsSolids, "solids", new Dictionary()); + serializer.DataField(ref CookTime, "time", 5); } } diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index a1c3fc51ba..356f254188 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -2,10 +2,10 @@ id: RecipeCheeseburger name: Cheeseburger Recipe result: FoodCheeseburger - time: 10 + time: 1 reagents: chem.H2O: 15 chem.Nutriment: 5 solids: - FoodMeatBreadSlice: 1 + Food4NoRaisins: 2 From 4f7deb8452c6b6522e1f423ade801244d69c1571 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 3 May 2020 03:09:54 -0500 Subject: [PATCH 15/26] Next up timer buttons --- .../Kitchen/MicrowaveBoundUserInterface.cs | 70 +++++++++++--- .../Components/Kitchen/MicrowaveMenu.cs | 94 +++++++++---------- .../Kitchen/KitchenMicrowaveComponent.cs | 7 +- .../Kitchen/SharedMicrowaveComponent.cs | 6 +- 4 files changed, 109 insertions(+), 68 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index bb70363912..a9f676fc48 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -1,6 +1,14 @@ using Robust.Client.GameObjects.Components.UserInterface; using Content.Shared.Kitchen; using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Content.Shared.Chemistry; +using Robust.Shared.GameObjects; +using System.Collections.Generic; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Client.UserInterface.Controls; +using Robust.Client.GameObjects; namespace Content.Client.GameObjects.Components.Kitchen { @@ -8,6 +16,8 @@ namespace Content.Client.GameObjects.Components.Kitchen { private MicrowaveMenu _menu; + private Dictionary _solids = new Dictionary(); + public MicrowaveBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner,uiKey) { @@ -17,32 +27,70 @@ namespace Content.Client.GameObjects.Components.Kitchen { base.Open(); _menu = new MicrowaveMenu(this); + _menu.OpenCentered(); _menu.OnClose += Close; + _menu.StartButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); + _menu.EjectButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); + _menu.IngredientsList.OnItemSelected += args => EjectSolidWithIndex(args.ItemIndex); } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + { + return; + } + _solids?.Clear(); + _menu?.Dispose(); + } + + protected override void UpdateState(BoundUserInterfaceState state) { base.UpdateState(state); if (!(state is MicrowaveUpdateUserInterfaceState cstate)) + { return; - _menu.RefreshContentsDisplay(cstate.ReagentsReagents, cstate.ContainedSolids); + } + + RefreshContentsDisplay(cstate.ReagentsReagents, cstate.ContainedSolids); } - public void Cook() - { - SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); - } - - public void Eject() - { - SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); - } public void EjectSolidWithIndex(int index) { - SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(index)); + SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[index])); + } + + public void RefreshContentsDisplay(List reagents, List solids) + { + _menu.IngredientsList.Clear(); + foreach (var item in reagents) + { + IoCManager.Resolve().TryIndex(item.ReagentId, out ReagentPrototype proto); + + _menu.IngredientsList.AddItem($"{item.Quantity} {proto.Name}"); + } + + _solids.Clear(); + foreach (var entityID in solids) + { + var entity = IoCManager.Resolve().GetEntity(entityID); + + if (entity.TryGetComponent(out IconComponent icon)) + { + var itemItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); + + var index = _menu.IngredientsList.IndexOf(itemItem); + _solids.Add(index, entityID); + } + + + } + } } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index 828b06ad25..1c43d5cdac 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -17,79 +17,73 @@ namespace Content.Client.GameObjects.Components.Kitchen private MicrowaveBoundUserInterface Owner { get; set; } - private List _heldReagents; + public Button StartButton { get;} + public Button EjectButton { get;} - private VBoxContainer InnerScrollContainer { get; set; } + public GridContainer TimerButtons { get; } + + public ItemList IngredientsList { get;} public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) { Owner = owner; - _heldReagents = new List(); Title = Loc.GetString("Microwave"); - var vbox = new VBoxContainer() + var hSplit = new HSplitContainer { + SizeFlagsHorizontal = SizeFlags.Fill, SizeFlagsVertical = SizeFlags.Fill }; - var startButton = new Button() + + IngredientsList = new ItemList { - Label = { Text = Loc.GetString("START"), FontColorOverride = Color.Green} - }; - var ejectButton = new Button() - { - Label = { Text = Loc.GetString("EJECT REAGENTS"),FontColorOverride = Color.Red} - }; - var scrollContainer = new ScrollContainer() - { - SizeFlagsVertical = SizeFlags.FillExpand + SizeFlagsVertical = SizeFlags.Expand, + SelectMode = ItemList.ItemListSelectMode.Button, + SizeFlagsStretchRatio = 8, + CustomMinimumSize = (100,100) }; - InnerScrollContainer = new VBoxContainer() + hSplit.AddChild(IngredientsList); + + var vSplit = new VSplitContainer(); + hSplit.AddChild(vSplit); + + var buttonGridContainer = new GridContainer { - SizeFlagsVertical = SizeFlags.FillExpand + Columns = 2, + }; + StartButton = new Button + { + Text = Loc.GetString("START"), + }; + EjectButton = new Button + { + Text = Loc.GetString("EJECT CONTENTS"), + }; + buttonGridContainer.AddChild(StartButton); + buttonGridContainer.AddChild(EjectButton); + vSplit.AddChild(buttonGridContainer); + + + TimerButtons = new GridContainer + { + Columns = 5, + }; - scrollContainer.AddChild(InnerScrollContainer); - vbox.AddChild(startButton); - vbox.AddChild(ejectButton); - vbox.AddChild(scrollContainer); - Contents.AddChild(vbox); - startButton.OnPressed += args => Owner.Cook(); - ejectButton.OnPressed += args => Owner.Eject(); + vSplit.AddChild(TimerButtons); + + + Contents.AddChild(hSplit); + } - public void RefreshContentsDisplay(List reagents, List solids) - { - InnerScrollContainer.RemoveAllChildren(); - foreach (var item in reagents) - { - IoCManager.Resolve().TryIndex(item.ReagentId, out ReagentPrototype proto); - - InnerScrollContainer.AddChild(new Label() - { - Text = $"{item.Quantity} {proto.Name}" - }); - } - - foreach (var item in solids) - { - var name = IoCManager.Resolve().GetEntity(item).Prototype.Name; - var solidButton = new Button() - { - Text = $"{name}" - }; - - solidButton.OnPressed += args => Owner.EjectSolidWithIndex(solids.IndexOf(item)); - InnerScrollContainer.AddChild(solidButton); - } - - } + protected override void Dispose(bool disposing) { base.Dispose(disposing); - InnerScrollContainer.Dispose(); } } } diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 7b72081d1c..d678c7f7e6 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -112,7 +112,7 @@ namespace Content.Server.GameObjects.Components.Kitchen break; case MicrowaveEjectSolidIndexedMessage msg: - EjectIndexedSolid(msg.index); + EjectIndexedSolid(msg.EntityID); UpdateUserInterface(); break; } @@ -272,10 +272,9 @@ namespace Content.Server.GameObjects.Components.Kitchen _solids.Clear(); } - private void EjectIndexedSolid(int index) + private void EjectIndexedSolid(EntityUid entityID) { - var entityToRemove = _storage.ContainedEntities.ToArray()[index]; - _storage.Remove(entityToRemove); + _storage.Remove(_entityManager.GetEntity(entityID)); } diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index bbe20d244b..4c9860dc43 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -38,10 +38,10 @@ namespace Content.Shared.Kitchen public class MicrowaveEjectSolidIndexedMessage : BoundUserInterfaceMessage { - public int index; - public MicrowaveEjectSolidIndexedMessage(int i) + public EntityUid EntityID; + public MicrowaveEjectSolidIndexedMessage(EntityUid entityID) { - index = i; + EntityID = entityID; } } } From d7d0bc71f9b69dad5fb0541fe4f0587e210dab89 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Sun, 3 May 2020 23:58:29 -0500 Subject: [PATCH 16/26] Microwave is done. Added an easter egg recipe and made the cheeseburger recipe more sensible. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 23 ++- .../Components/Kitchen/MicrowaveMenu.cs | 140 ++++++++++++--- .../Components/Kitchen/MicrowaveVisualizer.cs | 23 ++- .../Kitchen/KitchenMicrowaveComponent.cs | 169 ++++++++++++------ .../Kitchen/SharedMicrowaveComponent.cs | 14 +- .../Entities/Items/Consumables/food.yml | 17 ++ Resources/Prototypes/Kitchen/meal_recipes.yml | 18 +- 7 files changed, 295 insertions(+), 109 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index a9f676fc48..94fa205bb2 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -7,8 +7,10 @@ using Content.Shared.Chemistry; using Robust.Shared.GameObjects; using System.Collections.Generic; using Robust.Shared.Interfaces.GameObjects; -using Robust.Client.UserInterface.Controls; + + using Robust.Client.GameObjects; +using Robust.Client.UserInterface.Controls; namespace Content.Client.GameObjects.Components.Kitchen { @@ -32,7 +34,15 @@ namespace Content.Client.GameObjects.Components.Kitchen _menu.OnClose += Close; _menu.StartButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); _menu.EjectButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); - _menu.IngredientsList.OnItemSelected += args => EjectSolidWithIndex(args.ItemIndex); + _menu.IngredientsList.OnItemSelected += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[args.ItemIndex])); + _menu.OnCookTimeSelected += args => + { + var actualButton = args.Button as Button; + var newTime = (byte) int.Parse(actualButton.Text); + _menu.VisualCookTime = newTime; + SendMessage(new SharedMicrowaveComponent.MicrowaveSelectCookTimeMessage(newTime)); + }; + } protected override void Dispose(bool disposing) @@ -60,12 +70,7 @@ namespace Content.Client.GameObjects.Components.Kitchen } - public void EjectSolidWithIndex(int index) - { - SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[index])); - } - - public void RefreshContentsDisplay(List reagents, List solids) + private void RefreshContentsDisplay(List reagents, List solids) { _menu.IngredientsList.Clear(); foreach (var item in reagents) @@ -88,7 +93,7 @@ namespace Content.Client.GameObjects.Components.Kitchen _solids.Add(index, entityID); } - + } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index 1c43d5cdac..1c7e2e8ce9 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -1,13 +1,9 @@ -using System.Collections.Generic; -using Content.Shared.Chemistry; +using System; +using Robust.Client.Graphics.Drawing; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Maths; -using Robust.Shared.Prototypes; namespace Content.Client.GameObjects.Components.Kitchen { @@ -17,18 +13,26 @@ namespace Content.Client.GameObjects.Components.Kitchen private MicrowaveBoundUserInterface Owner { get; set; } + public event Action OnCookTimeSelected; + + public byte VisualCookTime { get; set; } + public Button StartButton { get;} public Button EjectButton { get;} - public GridContainer TimerButtons { get; } + public PanelContainer TimerFacePlate { get; } + + public ButtonGroup CookTimeButtonGroup { get; } + private VBoxContainer CookTimeButtonVbox { get; } public ItemList IngredientsList { get;} + private Label _cookTimeInfoLabel { get; } public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) { Owner = owner; Title = Loc.GetString("Microwave"); - var hSplit = new HSplitContainer + var hSplit = new HBoxContainer { SizeFlagsHorizontal = SizeFlags.Fill, SizeFlagsVertical = SizeFlags.Fill @@ -37,53 +41,135 @@ namespace Content.Client.GameObjects.Components.Kitchen IngredientsList = new ItemList { - SizeFlagsVertical = SizeFlags.Expand, + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, SelectMode = ItemList.ItemListSelectMode.Button, SizeFlagsStretchRatio = 8, - CustomMinimumSize = (100,100) + CustomMinimumSize = (200,256) }; hSplit.AddChild(IngredientsList); - var vSplit = new VSplitContainer(); + var vSplit = new VBoxContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + }; + hSplit.AddChild(vSplit); - var buttonGridContainer = new GridContainer + var buttonGridContainer = new VBoxContainer { - Columns = 2, + Align = BoxContainer.AlignMode.Center, + SizeFlagsStretchRatio = 3 }; + StartButton = new Button { - Text = Loc.GetString("START"), + Text = Loc.GetString("Start"), + TextAlign = Label.AlignMode.Center, + }; + EjectButton = new Button { - Text = Loc.GetString("EJECT CONTENTS"), + Text = Loc.GetString("Eject All Contents"), + ToolTip = Loc.GetString("This vaporizes all reagents, but ejects any solids."), + TextAlign = Label.AlignMode.Center, }; + buttonGridContainer.AddChild(StartButton); buttonGridContainer.AddChild(EjectButton); vSplit.AddChild(buttonGridContainer); - - TimerButtons = new GridContainer + CookTimeButtonGroup = new ButtonGroup(); + CookTimeButtonVbox = new VBoxContainer { - Columns = 5, - + SizeFlagsVertical = SizeFlags.FillExpand, + Align = BoxContainer.AlignMode.Center, }; - vSplit.AddChild(TimerButtons); + var index = 0; + for (var i = 0; i <= 12; i++) + { + var newButton = new Button + { + Text = (index <= 0 ? 1 : index).ToString(), + TextAlign = Label.AlignMode.Center, + Group = CookTimeButtonGroup, + }; + CookTimeButtonVbox.AddChild(newButton); + newButton.OnPressed += args => + { + OnCookTimeSelected?.Invoke(args); + _cookTimeInfoLabel.Text = $"{Loc.GetString("COOK TIME")}: {VisualCookTime}"; + }; + index+=5; + } + + _cookTimeInfoLabel = new Label + { + Text = Loc.GetString("COOK TIME:"), + Align = Label.AlignMode.Center, + Modulate = Color.White, + SizeFlagsVertical = SizeFlags.ShrinkCenter + }; + + var innerTimerPanel = new PanelContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + ModulateSelfOverride = Color.Red, + CustomMinimumSize = (100, 128), + PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black}, + + Children = + { + new VBoxContainer + { + + Children = + { + new PanelContainer + { + PanelOverride = new StyleBoxFlat(){BackgroundColor = Color.Red.WithAlpha(0.2f)}, + + Children = + { + _cookTimeInfoLabel + } + }, + + new ScrollContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand, + + Children = + { + CookTimeButtonVbox, + } + }, + + } + } + } + }; + + TimerFacePlate = new PanelContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + Children = + { + innerTimerPanel + }, + }; + + vSplit.AddChild(TimerFacePlate); Contents.AddChild(hSplit); - } - - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - } } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index 2c38876680..1591670f16 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -1,26 +1,19 @@ -using System; -using System.Reflection.Metadata.Ecma335; -using Content.Client.GameObjects.Components.Sound; +using Content.Client.GameObjects.Components.Sound; using Content.Shared.GameObjects.Components.Power; using Content.Shared.GameObjects.Components.Sound; using Content.Shared.Kitchen; using Robust.Client.GameObjects; using Robust.Client.Interfaces.GameObjects.Components; using Robust.Shared.Audio; -using Robust.Shared.GameObjects.Components.UserInterface; -using Robust.Shared.Serialization; -using YamlDotNet.RepresentationModel; +using Robust.Shared.Log; + namespace Content.Client.GameObjects.Components.Kitchen { public sealed class MicrowaveVisualizer : AppearanceVisualizer { private SoundComponent _soundComponent; - private const string _microwaveSoundLoop = "/Audio/machines/microwave_loop.ogg"; - public override void LoadData(YamlMappingNode node) - { - base.LoadData(node); - } + private const string MicrowaveSoundLoop = "/Audio/machines/microwave_loop.ogg"; public override void OnChangeData(AppearanceComponent component) { @@ -45,11 +38,15 @@ namespace Content.Client.GameObjects.Components.Kitchen var audioParams = AudioParams.Default; audioParams.Loop = true; var schedSound = new ScheduledSound(); - schedSound.Filename = _microwaveSoundLoop; + schedSound.Filename = MicrowaveSoundLoop; schedSound.AudioParams = audioParams; _soundComponent.AddScheduledSound(schedSound); break; + default: + Logger.Debug($"Something terrible happened in {this}"); + break; + } var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered); @@ -59,7 +56,7 @@ namespace Content.Client.GameObjects.Components.Kitchen } - public enum MicrowaveVisualizerLayers + private enum MicrowaveVisualizerLayers { Base, BaseUnlit diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index d678c7f7e6..db31904525 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -33,38 +33,55 @@ namespace Content.Server.GameObjects.Components.Kitchen [Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly RecipeManager _recipeManager; - [Dependency] private readonly IPrototypeManager _prototypeManager; [Dependency] private readonly IServerNotifyManager _notifyManager; #pragma warning restore 649 +#region YAMLSERIALIZE private int _cookTimeDefault; private int _cookTimeMultiplier; //For upgrades and stuff I guess? private string _badRecipeName; private string _startCookingSound; private string _cookingCompleteSound; +#endregion + +#region VIEWVARIABLES [ViewVariables] private SolutionComponent _solution; [ViewVariables] private bool _busy = false; + /// + /// This is a fixed offset of 5. + /// The cook times for all recipes should be divisible by 5,with a minimum of 1 second. + /// For right now, I don't think any recipe cook time should be greater than 60 seconds. + /// + [ViewVariables] + private byte _currentCookTimerTime { get; set; } +#endregion + private bool Powered => _powerDevice.Powered; private bool HasContents => _solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0; - private AppearanceComponent _appearance; + void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); private AudioSystem _audioSystem; + private AppearanceComponent _appearance; private PowerDeviceComponent _powerDevice; - private Container _storage; + private BoundUserInterface _userInterface; + private Container _storage; + /// + /// A dictionary of PrototypeIDs and integers representing quantity. + /// private Dictionary _solids; private List _solidsVisualList; - private BoundUserInterface _userInterface; - void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); + + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -97,22 +114,40 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage message) { - if (!Powered || _busy || !HasContents) return; + if (!Powered || _busy) + { + return; + } switch (message.Message) { case MicrowaveStartCookMessage msg : - wzhzhzh(); + if (HasContents) + { + wzhzhzh(); + } break; case MicrowaveEjectMessage msg : - VaporizeReagents(); - EjectSolids(); - UpdateUserInterface(); + if (HasContents) + { + VaporizeReagents(); + EjectSolids(); + UpdateUserInterface(); + } + break; case MicrowaveEjectSolidIndexedMessage msg: - EjectIndexedSolid(msg.EntityID); + if (HasContents) + { + EjectSolidWithIndex(msg.EntityID); + UpdateUserInterface(); + } + break; + + case MicrowaveSelectCookTimeMessage msg: + _currentCookTimerTime = msg.newCookTime; UpdateUserInterface(); break; } @@ -122,7 +157,10 @@ namespace Content.Server.GameObjects.Components.Kitchen private void SetAppearance(MicrowaveVisualState state) { if (_appearance != null || Owner.TryGetComponent(out _appearance)) + { _appearance.SetData(PowerDeviceVisuals.VisualState, state); + } + } private void UpdateUserInterface() @@ -138,9 +176,10 @@ namespace Content.Server.GameObjects.Components.Kitchen void IActivate.Activate(ActivateEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (!eventArgs.User.TryGetComponent(out IActorComponent actor) || !Powered) + { return; - if (!Powered) return; + } UpdateUserInterface(); _userInterface.Open(actor.playerSession); @@ -177,33 +216,34 @@ namespace Content.Server.GameObjects.Components.Kitchen //Move units from attackSolution to targetSolution var removedSolution = attackSolution.SplitSolution(realTransferAmount); if (!mySolution.TryAddSolution(removedSolution)) + { return false; + } _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User, Loc.GetString("Transferred {0}u", removedSolution.TotalVolume)); return true; } - if (itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) + if (!itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) { - var ent = food.Owner; //Get the entity of the ItemComponent. - - _storage.Insert(ent); - - UpdateUserInterface(); - return true; + return false; } - - return false; + + var ent = food.Owner; //Get the entity of the ItemComponent. + _storage.Insert(ent); + UpdateUserInterface(); + return true; + } - //This is required. + //This is required. It's 'cook'. private void wzhzhzh() { _busy = true; // Convert storage into Dictionary of ingredients _solids.Clear(); - foreach(var item in _storage.ContainedEntities.ToList()) + foreach(var item in _storage.ContainedEntities) { if(_solids.ContainsKey(item.Prototype.ID)) { @@ -216,35 +256,44 @@ namespace Content.Server.GameObjects.Components.Kitchen } // Check recipes + FoodRecipePrototype recipeToCook = null; foreach(var r in _recipeManager.Recipes) { - - var success = CanSatisfyRecipe(r); - SetAppearance(MicrowaveVisualState.Cooking); - _audioSystem.Play(_startCookingSound); - var time = success ? r.CookTime : _cookTimeDefault; - Timer.Spawn(time * _cookTimeMultiplier, () => + if (!CanSatisfyRecipe(r)) { + continue; + } - if (success) - { - SubtractContents(r); - } - else - { - VaporizeReagents(); - VaporizeSolids(); - } - - var entityToSpawn = success ? r.Result : _badRecipeName; - _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); - _audioSystem.Play(_cookingCompleteSound); - SetAppearance(MicrowaveVisualState.Idle); - _busy = false; - }); - UpdateUserInterface(); - return; + recipeToCook = r; } + + var goodMeal = (recipeToCook != null) + && + (_currentCookTimerTime == (byte)recipeToCook.CookTime) ? true : false; + + SetAppearance(MicrowaveVisualState.Cooking); + _audioSystem.Play(_startCookingSound); + Timer.Spawn(_currentCookTimerTime * _cookTimeMultiplier, () => + { + + if (goodMeal) + { + SubtractContents(recipeToCook); + } + else + { + VaporizeReagents(); + VaporizeSolids(); + } + + var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName; + _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); + _audioSystem.Play(_cookingCompleteSound); + SetAppearance(MicrowaveVisualState.Idle); + _busy = false; + }); + UpdateUserInterface(); + return; } private void VaporizeReagents() @@ -257,8 +306,10 @@ namespace Content.Server.GameObjects.Components.Kitchen { foreach (var item in _storage.ContainedEntities.ToList()) { + _storage.Remove(item); item.Delete(); } + _solids.Clear(); } private void EjectSolids() @@ -272,7 +323,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _solids.Clear(); } - private void EjectIndexedSolid(EntityUid entityID) + private void EjectSolidWithIndex(EntityUid entityID) { _storage.Remove(_entityManager.GetEntity(entityID)); } @@ -280,15 +331,27 @@ namespace Content.Server.GameObjects.Components.Kitchen private void SubtractContents(FoodRecipePrototype recipe) { - foreach(var kvp in recipe.IngredientsReagents) + foreach(var recipeReagent in recipe.IngredientsReagents) { - _solution.TryRemoveReagent(kvp.Key, ReagentUnit.New(kvp.Value)); + _solution.TryRemoveReagent(recipeReagent.Key, ReagentUnit.New(recipeReagent.Value)); } - foreach (var solid in recipe.IngredientsSolids) + foreach (var recipeSolid in recipe.IngredientsSolids) { - _solids[solid.Key] -= solid.Value; + for (var i = 0; i < recipeSolid.Value; i++) + { + foreach (var item in _storage.ContainedEntities.ToList()) + { + if (item.Prototype.ID == recipeSolid.Key) + { + _storage.Remove(item); + item.Delete(); + break; + } + } + } } + } private bool CanSatisfyRecipe(FoodRecipePrototype recipe) diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index 4c9860dc43..d0615c7a75 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -4,10 +4,7 @@ using Content.Shared.Chemistry; using Content.Shared.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; -using Robust.Shared.GameObjects.Components; using Robust.Shared.GameObjects.Components.UserInterface; -using Robust.Shared.Interfaces.GameObjects; - namespace Content.Shared.Kitchen { @@ -44,8 +41,19 @@ namespace Content.Shared.Kitchen EntityID = entityID; } } + [Serializable, NetSerializable] + public class MicrowaveSelectCookTimeMessage : BoundUserInterfaceMessage + { + public byte newCookTime; + public MicrowaveSelectCookTimeMessage(byte newTime) + { + newCookTime = newTime; + } + } } + + [NetSerializable, Serializable] public class MicrowaveUpdateUserInterfaceState : BoundUserInterfaceState { diff --git a/Resources/Prototypes/Entities/Items/Consumables/food.yml b/Resources/Prototypes/Entities/Items/Consumables/food.yml index 7ab00d754b..d07c9a4fe9 100644 --- a/Resources/Prototypes/Entities/Items/Consumables/food.yml +++ b/Resources/Prototypes/Entities/Items/Consumables/food.yml @@ -2865,3 +2865,20 @@ sprite: Objects/Food/xenomeatpie.rsi - type: Icon sprite: Objects/Food/xenomeatpie.rsi + +- type: entity + parent: FoodBase + id: DisgustingSweptSoup + name: Salty Sweet Miso Cola Soup + description: Jesus christ. + components: + - type: Food + contents: + reagents: + - ReagentId: chem.Bleach + Quantity: 15 + spawn_on_finish: TrashSnackBowl + - type: Sprite + sprite: Objects/Food/stew.rsi + - type: Icon + sprite: Objects/Food/stew.rsi diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 356f254188..7d936bc846 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -2,10 +2,20 @@ id: RecipeCheeseburger name: Cheeseburger Recipe result: FoodCheeseburger - time: 1 + time: 5 reagents: - chem.H2O: 15 - chem.Nutriment: 5 + chem.Nutriment: 10 solids: - Food4NoRaisins: 2 + FoodBreadSlice: 2 + + +- type: microwaveMealRecipe + id: RecipeMisoColaSoup + name: Salty Sweet MisoCola Soup Recipe + result: DisgustingSweptSoup + time: 15 + reagents: + chem.Cola: 5 + solids: + FoodMiloSoup: 1 From 46ef79af60c87aa1c94d8a29e7ce7803b13501d9 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 4 May 2020 00:16:05 -0500 Subject: [PATCH 17/26] Delete microwave.dmi, unneeded. Revert accidently changes to Shared EntryPoint.cs --- Content.Shared/EntryPoint.cs | 18 +++++++++++++++--- .../Textures/Objects/Kitchen/microwave.dmi | Bin 2180 -> 0 bytes 2 files changed, 15 insertions(+), 3 deletions(-) delete mode 100644 Resources/Textures/Objects/Kitchen/microwave.dmi diff --git a/Content.Shared/EntryPoint.cs b/Content.Shared/EntryPoint.cs index 8975f3fbb4..f2a1e7312e 100644 --- a/Content.Shared/EntryPoint.cs +++ b/Content.Shared/EntryPoint.cs @@ -1,23 +1,36 @@ using System; using System.Collections.Generic; + using System.Globalization; using Content.Shared.Maps; using Robust.Shared.ContentPack; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; + using Robust.Shared.Localization; using Robust.Shared.Prototypes; -namespace Content.Shared + namespace Content.Shared { public class EntryPoint : GameShared { + // If you want to change your codebase's language, do it here. + private const string Culture = "en-US"; + #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager; + [Dependency] private readonly ILocalizationManager _localizationManager; #pragma warning restore 649 + public override void PreInit() + { + IoCManager.InjectDependencies(this); + + // Default to en-US. + _localizationManager.LoadCulture(new CultureInfo(Culture)); + } + public override void Init() { - IoCManager.InjectDependencies(this); } public override void PostInit() @@ -55,6 +68,5 @@ namespace Content.Shared _tileDefinitionManager.Initialize(); } - } } diff --git a/Resources/Textures/Objects/Kitchen/microwave.dmi b/Resources/Textures/Objects/Kitchen/microwave.dmi deleted file mode 100644 index a3cb98f9c14d5fd5fe9bb2c191c860815381f929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmV-~2z&R5P)HubEQfX;Wb#zQ^upVvP9?!#0)W}WV&r00ZaNO2!e3C9^rw{4LXX@gF=;4HA zWl?c&O=i;%VPjN@fHIMZLd>8Zf`yfdjGMEpZL6eRsGwTW$4>e5r2h4~fQF~1p<|+) zN}-!dqMS{ThdG##Nn>P2WM)Nqdx)c(REB>#j)zI0prDtRmu6^vj*+6GqJyXa0M!5h zBTXZ!s zXH%P)Y?G00kBw_@Zcvkzq@A6ohlg#HlyKq8FUPeauBck&+i};>cGApt*wT00)pXm` zb=S~!*}_BP+Hcm+bj!6o(!gpdVq-nm9S@fw6VV3;YP87Y00001bW%=J z06^y0W&i*HmwHrKbVOxyV{&P5bZKvH004NLQ&w9TW`)L>QVxjGCPM{FF+f6%u7FSS1c$Y6>Ex(B0io9yAH+rPbYZ(cVEZ8M7X@yRcc(tg{V-#xhr+{4Lap1JxC zWl@J>!WVOWJ>Z#~)ZZ^<^U^CZN%?FKIKH7!U~eeIh+>}`poEz*V8YFSUKO{%fXho`p$r58W@g@XG7uOji3VL> zj>tFQo#TsDJy2D@7@Y$xGcY?h=VZVzG=mBEqoXliE^C2A1M`9TtW-p@TUX=OG86Tj)9PT10G)pXCMeLJA0W0xUy_4 zntXWXqOrXEVVrAj63S(PV~Pg`+Fyn)zp@-s5a6S$JjE;5Rt&U&GK`gL*H-rAeE1=b zBOG8OY<(kgIUXRS757FWOIO(li^I{+C*+yj^`)ij?QXRlxGY`1{4oaDFV76-nD+i< zGnjzO(kC}=6pHeGdDoKJSnzJYUw#kmSh(N{f4dbm1v46GK2;sjRMzLy3H3UZe8ezs>e2pUjG?+mOej1vs2 z;MqqL3QGe~dQ=}EoMU*5jo+(mk5Uxnd8!ZWpC_yj41B6cY}C%!36ThUnz(+@h9|5K z41Ct6K9H!s(26Io52!cY$T!^|6%yh)RCTIXDcf*u2hq>B;B5IlKHk1QFus;0pR4Nn z#x17xjg5`E)tv~@`a%mX7-(4^SVR7Ws!ra%gW&F$cW&RsN6`SU zAFw4gt=A~E>UeypM(YbLxL}|~ePC@3`Bz`7>N#}q&E&UtZgYdGN=T@FPz4=yN^ywz zfImj-3oUrk`T%A?uWoKN?ltb|_ZwS!73V-9e2#HclmZ0{C=D^-OL4AOb`RsS! zt7^5;*xcOw;m1Zp*SB=cK)8N@^Qwk(30agc!yJZXJ^sA_{5+uFRpd7nM{r@;F> zpXC&QMG)se2cEP(K%7gkA>0T^xPHLqm<|?oMi^WL9eC3E0ErtUq546m`aMy|NrhENXUi$05GAgwzK1NJUs6YXqsSJrfJ!>O`B%Z zjPeIRgN=}L?U!F4#QF!|j6pTFerFDZ284iD0$!<9y#I_A-TnXo(>Cj-X;QS&H0?Oo zY`f0FTekMFX^RHj{(#+WZ~d-KK`FYv$CwqLSHL$QU7)}MG=BpN9ayGCn`j22+-BUa zTed}QfZv4*$%NY<0K1?$>vzn6V8G=V)8iE?8UWz^0ZqX1TV|bFP0MWhr@-enXmvaR z$Zac>fuKJCw!QWHF8KWcKCfUcFQCQFcoYhW;=+-BVNxgDzyl*XW@ z{lVAo8XXNX;Bhoi!;|3fPzEUF=lCH;r_{uwQ=9}4=LX{jCFpQ|9r^(%@csb!%c}7i z!V>(qV4yu0`vb%RiQgZPq<;Wdf577>08WCyvYz}i9O1_z{P6+y4*+%h1OD9yKY;!L z+M$1-J?~nqKcLv5f1n*d00YGi{R8d!0XRte2U4Z#O8)_FNW^vJT(nLA0000 Date: Mon, 4 May 2020 00:18:46 -0500 Subject: [PATCH 18/26] trying that again --- Content.Shared/EntryPoint.cs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Content.Shared/EntryPoint.cs b/Content.Shared/EntryPoint.cs index f2a1e7312e..8975f3fbb4 100644 --- a/Content.Shared/EntryPoint.cs +++ b/Content.Shared/EntryPoint.cs @@ -1,36 +1,23 @@ using System; using System.Collections.Generic; - using System.Globalization; using Content.Shared.Maps; using Robust.Shared.ContentPack; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; - using Robust.Shared.Localization; using Robust.Shared.Prototypes; - namespace Content.Shared +namespace Content.Shared { public class EntryPoint : GameShared { - // If you want to change your codebase's language, do it here. - private const string Culture = "en-US"; - #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager; - [Dependency] private readonly ILocalizationManager _localizationManager; #pragma warning restore 649 - public override void PreInit() - { - IoCManager.InjectDependencies(this); - - // Default to en-US. - _localizationManager.LoadCulture(new CultureInfo(Culture)); - } - public override void Init() { + IoCManager.InjectDependencies(this); } public override void PostInit() @@ -68,5 +55,6 @@ _tileDefinitionManager.Initialize(); } + } } From d1376bcc3e856d04781e9dddc4d2bcad28cc6d87 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 4 May 2020 00:19:58 -0500 Subject: [PATCH 19/26] Remove unused 'ding.ogg' --- Resources/Audio/machines/ding.ogg | Bin 16007 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Resources/Audio/machines/ding.ogg diff --git a/Resources/Audio/machines/ding.ogg b/Resources/Audio/machines/ding.ogg deleted file mode 100644 index ff1e3ebbc9990da3a7492abad96bf32ea5760941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16007 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 From 0abd0d87842d5e9f43372dd49dd6485e64911912 Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 4 May 2020 00:24:19 -0500 Subject: [PATCH 20/26] revert entrypoint to master --- Content.Shared/EntryPoint.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Shared/EntryPoint.cs b/Content.Shared/EntryPoint.cs index 8975f3fbb4..a9df20ff2a 100644 --- a/Content.Shared/EntryPoint.cs +++ b/Content.Shared/EntryPoint.cs @@ -6,7 +6,7 @@ using Robust.Shared.IoC; using Robust.Shared.Prototypes; -namespace Content.Shared + namespace Content.Shared { public class EntryPoint : GameShared { @@ -55,6 +55,5 @@ namespace Content.Shared _tileDefinitionManager.Initialize(); } - } } From c34081c514383e561b06b59ea697e31142361f2d Mon Sep 17 00:00:00 2001 From: FL-OZ Date: Mon, 4 May 2020 00:25:41 -0500 Subject: [PATCH 21/26] revert sharedlathecomponent to master --- .../GameObjects/Components/Research/SharedLatheComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs b/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs index 6b290d551d..dabae088fb 100644 --- a/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs +++ b/Content.Shared/GameObjects/Components/Research/SharedLatheComponent.cs @@ -1,4 +1,4 @@ -// Only unused on .NET Core due to KeyValuePair.Deconstruct +// Only unused on .NET Core due to KeyValuePair.Deconstruct // ReSharper disable once RedundantUsingDirective using Robust.Shared.Utility; using System; From 4034458d26d7cfb384eb410c565cd92f45e03be1 Mon Sep 17 00:00:00 2001 From: FLOZ Date: Mon, 4 May 2020 13:54:54 -0400 Subject: [PATCH 22/26] Pretty up the microwave menu, add click sounds. Remove some unnecessary ToList() calls. Remove unnecessary IoC resolves. --- .../Kitchen/MicrowaveBoundUserInterface.cs | 10 ++++-- .../Components/Kitchen/MicrowaveMenu.cs | 22 ++++++++++--- .../Kitchen/KitchenMicrowaveComponent.cs | 33 +++++++++++++------ Content.Shared/Kitchen/RecipeManager.cs | 20 +++-------- .../Kitchen/SharedMicrowaveComponent.cs | 6 ++-- 5 files changed, 55 insertions(+), 36 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 94fa205bb2..68ebf1b5e7 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -16,6 +16,10 @@ namespace Content.Client.GameObjects.Components.Kitchen { public class MicrowaveBoundUserInterface : BoundUserInterface { +#pragma warning disable 649 + [Dependency] private readonly IEntityManager _entityManager; + [Dependency] private readonly IPrototypeManager _prototypeManager; +#pragma warning restore 649 private MicrowaveMenu _menu; private Dictionary _solids = new Dictionary(); @@ -38,7 +42,7 @@ namespace Content.Client.GameObjects.Components.Kitchen _menu.OnCookTimeSelected += args => { var actualButton = args.Button as Button; - var newTime = (byte) int.Parse(actualButton.Text); + var newTime = (uint) int.Parse(actualButton.Text); _menu.VisualCookTime = newTime; SendMessage(new SharedMicrowaveComponent.MicrowaveSelectCookTimeMessage(newTime)); }; @@ -75,7 +79,7 @@ namespace Content.Client.GameObjects.Components.Kitchen _menu.IngredientsList.Clear(); foreach (var item in reagents) { - IoCManager.Resolve().TryIndex(item.ReagentId, out ReagentPrototype proto); + _prototypeManager.TryIndex(item.ReagentId, out ReagentPrototype proto); _menu.IngredientsList.AddItem($"{item.Quantity} {proto.Name}"); } @@ -83,7 +87,7 @@ namespace Content.Client.GameObjects.Components.Kitchen _solids.Clear(); foreach (var entityID in solids) { - var entity = IoCManager.Resolve().GetEntity(entityID); + var entity = _entityManager.GetEntity(entityID); if (entity.TryGetComponent(out IconComponent icon)) { diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index 1c7e2e8ce9..f267c30371 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -1,5 +1,6 @@ using System; using Robust.Client.Graphics.Drawing; +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; @@ -15,7 +16,7 @@ namespace Content.Client.GameObjects.Components.Kitchen public event Action OnCookTimeSelected; - public byte VisualCookTime { get; set; } + public uint VisualCookTime = 1; public Button StartButton { get;} public Button EjectButton { get;} @@ -81,6 +82,13 @@ namespace Content.Client.GameObjects.Components.Kitchen buttonGridContainer.AddChild(StartButton); buttonGridContainer.AddChild(EjectButton); vSplit.AddChild(buttonGridContainer); + + //Padding + vSplit.AddChild(new Control + { + CustomMinimumSize = (0, 15), + SizeFlagsVertical = SizeFlags.Fill, + }); CookTimeButtonGroup = new ButtonGroup(); CookTimeButtonVbox = new VBoxContainer @@ -107,9 +115,12 @@ namespace Content.Client.GameObjects.Components.Kitchen index+=5; } + var cookTimeOneSecondButton = (Button)CookTimeButtonVbox.GetChild(0); + cookTimeOneSecondButton.Pressed = true; + _cookTimeInfoLabel = new Label { - Text = Loc.GetString("COOK TIME:"), + Text = Loc.GetString($"COOK TIME: {VisualCookTime}"), Align = Label.AlignMode.Center, Modulate = Color.White, SizeFlagsVertical = SizeFlags.ShrinkCenter @@ -120,18 +131,20 @@ namespace Content.Client.GameObjects.Components.Kitchen SizeFlagsVertical = SizeFlags.FillExpand, ModulateSelfOverride = Color.Red, CustomMinimumSize = (100, 128), - PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black}, + PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.5f)}, Children = { + new VBoxContainer { Children = { + new PanelContainer { - PanelOverride = new StyleBoxFlat(){BackgroundColor = Color.Red.WithAlpha(0.2f)}, + PanelOverride = new StyleBoxFlat(){BackgroundColor = Color.Gray.WithAlpha(0.2f)}, Children = { @@ -162,6 +175,7 @@ namespace Content.Client.GameObjects.Components.Kitchen SizeFlagsHorizontal = SizeFlags.FillExpand, Children = { + innerTimerPanel }, }; diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index db31904525..419c44dc30 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -22,6 +22,8 @@ using Robust.Server.Interfaces.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Localization; using Content.Server.Interfaces; +using Robust.Shared.Audio; +using YamlDotNet.Serialization.NodeTypeResolvers; namespace Content.Server.GameObjects.Components.Kitchen { @@ -57,7 +59,7 @@ namespace Content.Server.GameObjects.Components.Kitchen /// For right now, I don't think any recipe cook time should be greater than 60 seconds. ///
[ViewVariables] - private byte _currentCookTimerTime { get; set; } + private uint _currentCookTimerTime { get; set; } = 1; #endregion private bool Powered => _powerDevice.Powered; @@ -109,7 +111,6 @@ namespace Content.Server.GameObjects.Components.Kitchen _solids = new Dictionary(); _solidsVisualList = new List(); _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; - } private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage message) @@ -122,10 +123,7 @@ namespace Content.Server.GameObjects.Components.Kitchen switch (message.Message) { case MicrowaveStartCookMessage msg : - if (HasContents) - { - wzhzhzh(); - } + wzhzhzh(); break; case MicrowaveEjectMessage msg : @@ -133,6 +131,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { VaporizeReagents(); EjectSolids(); + ClickSound(); UpdateUserInterface(); } @@ -142,12 +141,14 @@ namespace Content.Server.GameObjects.Components.Kitchen if (HasContents) { EjectSolidWithIndex(msg.EntityID); + ClickSound(); UpdateUserInterface(); } break; case MicrowaveSelectCookTimeMessage msg: _currentCookTimerTime = msg.newCookTime; + ClickSound(); UpdateUserInterface(); break; } @@ -166,7 +167,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UpdateUserInterface() { _solidsVisualList.Clear(); - foreach(var item in _storage.ContainedEntities.ToList()) + foreach(var item in _storage.ContainedEntities) { _solidsVisualList.Add(item.Uid); } @@ -240,6 +241,11 @@ namespace Content.Server.GameObjects.Components.Kitchen //This is required. It's 'cook'. private void wzhzhzh() { + if (!HasContents) + { + return; + } + _busy = true; // Convert storage into Dictionary of ingredients _solids.Clear(); @@ -269,11 +275,11 @@ namespace Content.Server.GameObjects.Components.Kitchen var goodMeal = (recipeToCook != null) && - (_currentCookTimerTime == (byte)recipeToCook.CookTime) ? true : false; + (_currentCookTimerTime == (uint)recipeToCook.CookTime) ? true : false; SetAppearance(MicrowaveVisualState.Cooking); _audioSystem.Play(_startCookingSound); - Timer.Spawn(_currentCookTimerTime * _cookTimeMultiplier, () => + Timer.Spawn((int)(_currentCookTimerTime * _cookTimeMultiplier), () => { if (goodMeal) @@ -340,7 +346,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { for (var i = 0; i < recipeSolid.Value; i++) { - foreach (var item in _storage.ContainedEntities.ToList()) + foreach (var item in _storage.ContainedEntities) { if (item.Prototype.ID == recipeSolid.Key) { @@ -384,6 +390,13 @@ namespace Content.Server.GameObjects.Components.Kitchen return true; } + + private void ClickSound() + { + + _audioSystem.Play("/Audio/machines/machine_switch.ogg", AudioParams.Default.WithVolume(-2f)); + + } } } diff --git a/Content.Shared/Kitchen/RecipeManager.cs b/Content.Shared/Kitchen/RecipeManager.cs index 454c21a440..5ac01ad64f 100644 --- a/Content.Shared/Kitchen/RecipeManager.cs +++ b/Content.Shared/Kitchen/RecipeManager.cs @@ -24,29 +24,17 @@ namespace Content.Shared.Kitchen Recipes.Sort(new RecipeComparer()); } - private class RecipeComparer : IComparer + private class RecipeComparer : Comparer { - int IComparer.Compare(FoodRecipePrototype x, FoodRecipePrototype y) + public override int Compare(FoodRecipePrototype x, FoodRecipePrototype y) { if (x == null || y == null) { return 0; } - - if (x.IngredientsReagents.Count < y.IngredientsReagents.Count) - { - return 1; - } - - if (x.IngredientsReagents.Count > y.IngredientsReagents.Count) - { - return -1; - } - - return 0; + + return -x.IngredientsReagents.Count.CompareTo(y.IngredientsReagents.Count); } - - } } } diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index d0615c7a75..5707172db1 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -44,10 +44,10 @@ namespace Content.Shared.Kitchen [Serializable, NetSerializable] public class MicrowaveSelectCookTimeMessage : BoundUserInterfaceMessage { - public byte newCookTime; - public MicrowaveSelectCookTimeMessage(byte newTime) + public uint newCookTime; + public MicrowaveSelectCookTimeMessage(uint inputTime) { - newCookTime = newTime; + newCookTime = inputTime; } } } From 108bd36b8c2d3191519fe7963a0264ce2b688ae2 Mon Sep 17 00:00:00 2001 From: FLOZ Date: Mon, 4 May 2020 14:39:33 -0500 Subject: [PATCH 23/26] And not a single "ToList()" went home to their family that day..... --- .../Components/Kitchen/MicrowaveBoundUserInterface.cs | 2 +- .../Components/Kitchen/KitchenMicrowaveComponent.cs | 9 +++++---- Content.Shared/Kitchen/SharedMicrowaveComponent.cs | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 68ebf1b5e7..1d025efc28 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -74,7 +74,7 @@ namespace Content.Client.GameObjects.Components.Kitchen } - private void RefreshContentsDisplay(List reagents, List solids) + private void RefreshContentsDisplay(IReadOnlyList reagents, List solids) { _menu.IngredientsList.Clear(); foreach (var item in reagents) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 419c44dc30..6fcd84c124 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -172,7 +172,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _solidsVisualList.Add(item.Uid); } - _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents.ToList(), _solidsVisualList)); + _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, _solidsVisualList)); } void IActivate.Activate(ActivateEventArgs eventArgs) @@ -310,8 +310,9 @@ namespace Content.Server.GameObjects.Components.Kitchen private void VaporizeSolids() { - foreach (var item in _storage.ContainedEntities.ToList()) + for(var i = _storage.ContainedEntities.Count-1; i>=0; i--) { + var item = _storage.ContainedEntities.ElementAt(i); _storage.Remove(item); item.Delete(); } @@ -321,9 +322,9 @@ namespace Content.Server.GameObjects.Components.Kitchen private void EjectSolids() { - foreach (var item in _storage.ContainedEntities.ToList()) + for(var i = _storage.ContainedEntities.Count-1; i>=0; i--) { - _storage.Remove(item); + _storage.Remove(_storage.ContainedEntities.ElementAt(i)); } _solids.Clear(); diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index 5707172db1..253e9302d4 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -57,9 +57,9 @@ namespace Content.Shared.Kitchen [NetSerializable, Serializable] public class MicrowaveUpdateUserInterfaceState : BoundUserInterfaceState { - public readonly List ReagentsReagents; + public readonly IReadOnlyList ReagentsReagents; public readonly List ContainedSolids; - public MicrowaveUpdateUserInterfaceState(List reagents, List solids) + public MicrowaveUpdateUserInterfaceState(IReadOnlyList reagents, List solids) { ReagentsReagents = reagents; ContainedSolids = solids; From 69b34e74ce08f21cef627b837cc85fb0ed7b20d0 Mon Sep 17 00:00:00 2001 From: FLOZ Date: Mon, 4 May 2020 15:16:16 -0500 Subject: [PATCH 24/26] Seperated Reagent item list and Solid item list to allow for vaporizing particular reagents at will. (also fixes a really nasty null reference exception because they shared the same list before D: ) --- .../Kitchen/MicrowaveBoundUserInterface.cs | 36 +++++++++++++------ .../Components/Kitchen/MicrowaveMenu.cs | 23 ++++++++++-- .../Kitchen/KitchenMicrowaveComponent.cs | 15 +++++++- .../Kitchen/SharedMicrowaveComponent.cs | 11 ++++++ 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index 1d025efc28..e93d016806 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -23,22 +23,33 @@ namespace Content.Client.GameObjects.Components.Kitchen private MicrowaveMenu _menu; private Dictionary _solids = new Dictionary(); + private Dictionary _reagents =new Dictionary(); public MicrowaveBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner,uiKey) { - + } protected override void Open() { base.Open(); _menu = new MicrowaveMenu(this); - _menu.OpenCentered(); _menu.OnClose += Close; _menu.StartButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveStartCookMessage()); _menu.EjectButton.OnPressed += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectMessage()); - _menu.IngredientsList.OnItemSelected += args => SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[args.ItemIndex])); + _menu.IngredientsList.OnItemSelected += args => + { + SendMessage(new SharedMicrowaveComponent.MicrowaveEjectSolidIndexedMessage(_solids[args.ItemIndex])); + + }; + + _menu.IngredientsListReagents.OnItemSelected += args => + { + SendMessage( + new SharedMicrowaveComponent.MicrowaveVaporizeReagentIndexedMessage(_reagents[args.ItemIndex])); + }; + _menu.OnCookTimeSelected += args => { var actualButton = args.Button as Button; @@ -76,25 +87,28 @@ namespace Content.Client.GameObjects.Components.Kitchen private void RefreshContentsDisplay(IReadOnlyList reagents, List solids) { - _menu.IngredientsList.Clear(); - foreach (var item in reagents) + _reagents.Clear(); + _menu.IngredientsListReagents.Clear(); + foreach (var reagent in reagents) { - _prototypeManager.TryIndex(item.ReagentId, out ReagentPrototype proto); - - _menu.IngredientsList.AddItem($"{item.Quantity} {proto.Name}"); + _prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto); + var reagentAdded = _menu.IngredientsListReagents.AddItem($"{reagent.Quantity} {proto.Name}"); + var reagentIndex = _menu.IngredientsListReagents.IndexOf(reagentAdded); + _reagents.Add(reagentIndex, reagent); } _solids.Clear(); + _menu.IngredientsList.Clear(); foreach (var entityID in solids) { var entity = _entityManager.GetEntity(entityID); if (entity.TryGetComponent(out IconComponent icon)) { - var itemItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); + var solidItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); - var index = _menu.IngredientsList.IndexOf(itemItem); - _solids.Add(index, entityID); + var solidIndex = _menu.IngredientsList.IndexOf(solidItem); + _solids.Add(solidIndex, entityID); } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs index f267c30371..a2a9e02625 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs @@ -27,6 +27,8 @@ namespace Content.Client.GameObjects.Components.Kitchen private VBoxContainer CookTimeButtonVbox { get; } public ItemList IngredientsList { get;} + + public ItemList IngredientsListReagents { get; } private Label _cookTimeInfoLabel { get; } public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) @@ -39,16 +41,31 @@ namespace Content.Client.GameObjects.Components.Kitchen SizeFlagsVertical = SizeFlags.Fill }; + IngredientsListReagents = new ItemList + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + SelectMode = ItemList.ItemListSelectMode.Button, + SizeFlagsStretchRatio = 2, + CustomMinimumSize = (100,128) + }; IngredientsList = new ItemList { SizeFlagsVertical = SizeFlags.FillExpand, SizeFlagsHorizontal = SizeFlags.FillExpand, SelectMode = ItemList.ItemListSelectMode.Button, - SizeFlagsStretchRatio = 8, - CustomMinimumSize = (200,256) + SizeFlagsStretchRatio = 2, + CustomMinimumSize = (100,128) }; - + + hSplit.AddChild(IngredientsListReagents); + //Padding between the lists. + hSplit.AddChild(new Control + { + CustomMinimumSize = (0,5), + }); + hSplit.AddChild(IngredientsList); var vSplit = new VBoxContainer diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 6fcd84c124..14723c806d 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -145,7 +145,16 @@ namespace Content.Server.GameObjects.Components.Kitchen UpdateUserInterface(); } break; - + + case MicrowaveVaporizeReagentIndexedMessage msg: + if (HasContents) + { + _solution.TryRemoveReagent(msg.ReagentQuantity.ReagentId, msg.ReagentQuantity.Quantity); + ClickSound(); + UpdateUserInterface(); + } + break; + case MicrowaveSelectCookTimeMessage msg: _currentCookTimerTime = msg.newCookTime; ClickSound(); @@ -305,7 +314,11 @@ namespace Content.Server.GameObjects.Components.Kitchen private void VaporizeReagents() { _solution.RemoveAllSolution(); + } + private void VaporizeReagentWithIndex() + { + } private void VaporizeSolids() diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index 253e9302d4..31349c86b5 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -41,6 +41,17 @@ namespace Content.Shared.Kitchen EntityID = entityID; } } + + [Serializable, NetSerializable] + public class MicrowaveVaporizeReagentIndexedMessage : BoundUserInterfaceMessage + { + + public Solution.ReagentQuantity ReagentQuantity; + public MicrowaveVaporizeReagentIndexedMessage(Solution.ReagentQuantity reagentQuantity) + { + ReagentQuantity = reagentQuantity; + } + } [Serializable, NetSerializable] public class MicrowaveSelectCookTimeMessage : BoundUserInterfaceMessage { From b803bee2c0a98dd3ac3903828a5ec13a5ef61813 Mon Sep 17 00:00:00 2001 From: FLOZ Date: Mon, 4 May 2020 18:35:36 -0500 Subject: [PATCH 25/26] Remove unncessary class dictionary and list. Fix meal prototype properties. --- .../Kitchen/KitchenMicrowaveComponent.cs | 50 ++++++++----------- .../Kitchen/MicrowaveMealRecipePrototype.cs | 24 +++++---- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index 14723c806d..bf23b5134b 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -76,13 +76,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private BoundUserInterface _userInterface; private Container _storage; - /// - /// A dictionary of PrototypeIDs and integers representing quantity. - /// - private Dictionary _solids; - private List _solidsVisualList; - - + public override void ExposeData(ObjectSerializer serializer) { @@ -107,9 +101,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _audioSystem = _entitySystemManager.GetEntitySystem(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MicrowaveUiKey.Key); - - _solids = new Dictionary(); - _solidsVisualList = new List(); + _userInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; } @@ -149,7 +141,7 @@ namespace Content.Server.GameObjects.Components.Kitchen case MicrowaveVaporizeReagentIndexedMessage msg: if (HasContents) { - _solution.TryRemoveReagent(msg.ReagentQuantity.ReagentId, msg.ReagentQuantity.Quantity); + VaporizeReagentWithReagentQuantity(msg.ReagentQuantity); ClickSound(); UpdateUserInterface(); } @@ -175,13 +167,14 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UpdateUserInterface() { - _solidsVisualList.Clear(); + var solidsVisualList = new List(); + solidsVisualList.Clear(); foreach(var item in _storage.ContainedEntities) { - _solidsVisualList.Add(item.Uid); + solidsVisualList.Add(item.Uid); } - _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, _solidsVisualList)); + _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, solidsVisualList)); } void IActivate.Activate(ActivateEventArgs eventArgs) @@ -257,16 +250,17 @@ namespace Content.Server.GameObjects.Components.Kitchen _busy = true; // Convert storage into Dictionary of ingredients - _solids.Clear(); + var solidsDict = new Dictionary(); + solidsDict.Clear(); foreach(var item in _storage.ContainedEntities) { - if(_solids.ContainsKey(item.Prototype.ID)) + if(solidsDict.ContainsKey(item.Prototype.ID)) { - _solids[item.Prototype.ID]++; + solidsDict[item.Prototype.ID]++; } else { - _solids.Add(item.Prototype.ID, 1); + solidsDict.Add(item.Prototype.ID, 1); } } @@ -274,7 +268,7 @@ namespace Content.Server.GameObjects.Components.Kitchen FoodRecipePrototype recipeToCook = null; foreach(var r in _recipeManager.Recipes) { - if (!CanSatisfyRecipe(r)) + if (!CanSatisfyRecipe(r, solidsDict)) { continue; } @@ -316,9 +310,9 @@ namespace Content.Server.GameObjects.Components.Kitchen _solution.RemoveAllSolution(); } - private void VaporizeReagentWithIndex() + private void VaporizeReagentWithReagentQuantity(Solution.ReagentQuantity reagentQuantity) { - + _solution.TryRemoveReagent(reagentQuantity.ReagentId, reagentQuantity.Quantity); } private void VaporizeSolids() @@ -329,7 +323,6 @@ namespace Content.Server.GameObjects.Components.Kitchen _storage.Remove(item); item.Delete(); } - _solids.Clear(); } private void EjectSolids() @@ -339,13 +332,14 @@ namespace Content.Server.GameObjects.Components.Kitchen { _storage.Remove(_storage.ContainedEntities.ElementAt(i)); } - - _solids.Clear(); } private void EjectSolidWithIndex(EntityUid entityID) { - _storage.Remove(_entityManager.GetEntity(entityID)); + if (_entityManager.EntityExists(entityID)) + { + _storage.Remove(_entityManager.GetEntity(entityID)); + } } @@ -374,7 +368,7 @@ namespace Content.Server.GameObjects.Components.Kitchen } - private bool CanSatisfyRecipe(FoodRecipePrototype recipe) + private bool CanSatisfyRecipe(FoodRecipePrototype recipe, Dictionary solids) { foreach (var reagent in recipe.IngredientsReagents) { @@ -391,12 +385,12 @@ namespace Content.Server.GameObjects.Components.Kitchen foreach (var solid in recipe.IngredientsSolids) { - if (!_solids.ContainsKey(solid.Key)) + if (!solids.ContainsKey(solid.Key)) { return false; } - if (_solids[solid.Key] < solid.Value) + if (solids[solid.Key] < solid.Value) { return false; } diff --git a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs index abae3d5eb1..0d64a7d073 100644 --- a/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs +++ b/Content.Shared/Prototypes/Kitchen/MicrowaveMealRecipePrototype.cs @@ -19,29 +19,31 @@ namespace Content.Shared.Prototypes.Kitchen { private string _id; - public string Name => Loc.GetString(Name); private string _name; - public string Result; - public int CookTime; + private string _result; + private int _cookTime; + + private Dictionary _ingsReagents; + private Dictionary _ingsSolids; + + public string Name => Loc.GetString(_name); + public string ID => _id; + public string Result => _result; + public int CookTime => _cookTime; public IReadOnlyDictionary IngredientsReagents => _ingsReagents; public IReadOnlyDictionary IngredientsSolids => _ingsSolids; - private Dictionary _ingsReagents; - private Dictionary _ingsSolids; - - - public string ID => _id; - + public void LoadFrom(YamlMappingNode mapping) { var serializer = YamlObjectSerializer.NewReader(mapping); serializer.DataField(ref _id, "id", string.Empty); serializer.DataField(ref _name, "name", string.Empty); - serializer.DataField(ref Result, "result", string.Empty); + serializer.DataField(ref _result, "result", string.Empty); serializer.DataField(ref _ingsReagents, "reagents", new Dictionary()); serializer.DataField(ref _ingsSolids, "solids", new Dictionary()); - serializer.DataField(ref CookTime, "time", 5); + serializer.DataField(ref _cookTime, "time", 5); } } From c8e2624390b6a096f3bf0c5534c0508671a2f59c Mon Sep 17 00:00:00 2001 From: FLOZ Date: Mon, 4 May 2020 19:59:43 -0500 Subject: [PATCH 26/26] lol --- .../GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs index bf23b5134b..ac6ab14c65 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs @@ -168,7 +168,6 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UpdateUserInterface() { var solidsVisualList = new List(); - solidsVisualList.Clear(); foreach(var item in _storage.ContainedEntities) { solidsVisualList.Add(item.Uid); @@ -251,7 +250,6 @@ namespace Content.Server.GameObjects.Components.Kitchen _busy = true; // Convert storage into Dictionary of ingredients var solidsDict = new Dictionary(); - solidsDict.Clear(); foreach(var item in _storage.ContainedEntities) { if(solidsDict.ContainsKey(item.Prototype.ID))