From 753a627c753f783ab3711563cc8b4b47e19bef1a Mon Sep 17 00:00:00 2001 From: nuke <47336974+nuke-makes-games@users.noreply.github.com> Date: Wed, 9 Sep 2020 18:32:31 -0400 Subject: [PATCH] Add text coloring for inspected solution containers, code cleanup (#2010) * Initial commit * remove helper * fixes * small fix --- Content.Client/EntryPoint.cs | 2 +- .../Nutrition/Drink/DrinkValueCon.cs | 2 +- .../Nutrition/Food/FoodValueCon.cs | 2 +- Content.Server/Atmos/GasSprayerComponent.cs | 2 +- .../ExplosionReactionEffect.cs | 2 +- .../Body/Circulatory/BloodstreamComponent.cs | 6 +- .../Body/Digestive/StomachComponent.cs | 12 +- .../Chemistry/ChemMasterComponent.cs | 28 +- .../Components/Chemistry/InjectorComponent.cs | 92 +++-- .../Components/Chemistry/PillComponent.cs | 5 +- .../Components/Chemistry/PourableComponent.cs | 40 +- .../Chemistry/ReagentDispenserComponent.cs | 22 +- ...onent.cs => SolutionContainerComponent.cs} | 297 +++++++-------- .../TransformableContainerComponent.cs | 8 +- .../Components/Chemistry/VaporComponent.cs | 8 +- .../Components/Fluids/BucketComponent.cs | 12 +- .../Components/Fluids/CanSpillComponent.cs | 48 --- .../Components/Fluids/MopComponent.cs | 17 +- .../Components/Fluids/PuddleComponent.cs | 6 +- .../Components/Fluids/SpillableComponent.cs | 59 +++ .../Components/Fluids/SprayComponent.cs | 8 +- .../Interactable/WelderComponent.cs | 2 +- .../Components/Kitchen/MicrowaveComponent.cs | 20 +- .../Components/Nutrition/DrinkComponent.cs | 54 ++- .../Components/Nutrition/FoodComponent.cs | 6 +- Content.Shared/Chemistry/ReagentPrototype.cs | 29 +- Content.Shared/Chemistry/Solution.cs | 4 +- Content.Shared/Chemistry/SolutionCaps.cs | 23 +- ...cs => SharedSolutionContainerComponent.cs} | 16 +- Resources/Maps/saltern.yml | 18 +- .../Entities/Clothing/Gloves/gloves.yml | 4 +- .../Entities/Clothing/Head/animals.yml | 2 +- .../Constructible/Power/microwave.yml | 4 +- .../Storage/StorageTanks/fuel_tank.yml | 2 +- .../Storage/StorageTanks/storage_tank.yml | 4 +- .../Storage/StorageTanks/water_tank.yml | 2 +- .../Entities/Mobs/Species/human.yml | 4 +- .../Entities/Objects/Consumable/drinks.yml | 61 +-- .../Objects/Consumable/drinks_bottles.yml | 17 +- .../Objects/Consumable/drinks_cans.yml | 19 +- .../Objects/Consumable/drinks_cups.yml | 37 +- .../Entities/Objects/Consumable/food.yml | 358 +++++++++--------- .../Consumable/kitchen_reagent_containers.yml | 5 +- .../Objects/Consumable/trash_drinks.yml | 5 +- .../Objects/Misc/fire_extinguisher.yml | 4 +- .../Entities/Objects/Specific/chemistry.yml | 32 +- .../Entities/Objects/Specific/janitor.yml | 24 +- .../Entities/Objects/Tools/tools.yml | 4 +- Resources/Prototypes/Entities/chemistry.yml | 4 +- Resources/Prototypes/Entities/puddle.yml | 4 +- Resources/Prototypes/Reagents/chemicals.yml | 28 +- Resources/Prototypes/Reagents/drinks.yml | 84 +++- Resources/Prototypes/Reagents/elements.yml | 30 +- .../Prototypes/Reagents/food_reagents.yml | 1 + Resources/Prototypes/Reagents/medicine.yml | 82 +++- .../Prototypes/Recipes/Reactions/drinks.yml | 36 +- 56 files changed, 981 insertions(+), 726 deletions(-) rename Content.Server/GameObjects/Components/Chemistry/{SolutionComponent.cs => SolutionContainerComponent.cs} (68%) delete mode 100644 Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs create mode 100644 Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs rename Content.Shared/GameObjects/Components/Chemistry/{SharedSolutionComponent.cs => SharedSolutionContainerComponent.cs} (71%) diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 006199f5e7..cce2333942 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -64,7 +64,7 @@ namespace Content.Client factory.Register(); factory.Register(); - factory.Register(); + factory.Register(); factory.Register(); factory.Register(); diff --git a/Content.Server/AI/Utility/Considerations/Nutrition/Drink/DrinkValueCon.cs b/Content.Server/AI/Utility/Considerations/Nutrition/Drink/DrinkValueCon.cs index b69f9a53ad..9d0e5f6004 100644 --- a/Content.Server/AI/Utility/Considerations/Nutrition/Drink/DrinkValueCon.cs +++ b/Content.Server/AI/Utility/Considerations/Nutrition/Drink/DrinkValueCon.cs @@ -10,7 +10,7 @@ namespace Content.Server.AI.Utility.Considerations.Nutrition.Drink { var target = context.GetState().GetValue(); - if (!target.TryGetComponent(out SolutionComponent drink)) + if (!target.TryGetComponent(out SolutionContainerComponent drink)) { return 0.0f; } diff --git a/Content.Server/AI/Utility/Considerations/Nutrition/Food/FoodValueCon.cs b/Content.Server/AI/Utility/Considerations/Nutrition/Food/FoodValueCon.cs index 78277572ae..200303fef8 100644 --- a/Content.Server/AI/Utility/Considerations/Nutrition/Food/FoodValueCon.cs +++ b/Content.Server/AI/Utility/Considerations/Nutrition/Food/FoodValueCon.cs @@ -10,7 +10,7 @@ namespace Content.Server.AI.Utility.Considerations.Nutrition.Food { var target = context.GetState().GetValue(); - if (!target.TryGetComponent(out SolutionComponent food)) + if (!target.TryGetComponent(out SolutionContainerComponent food)) { return 0.0f; } diff --git a/Content.Server/Atmos/GasSprayerComponent.cs b/Content.Server/Atmos/GasSprayerComponent.cs index 99d166b297..0f5897c6ee 100644 --- a/Content.Server/Atmos/GasSprayerComponent.cs +++ b/Content.Server/Atmos/GasSprayerComponent.cs @@ -41,7 +41,7 @@ namespace Content.Server.Atmos public void AfterInteract(AfterInteractEventArgs eventArgs) { - if (!Owner.TryGetComponent(out SolutionComponent tank)) + if (!Owner.TryGetComponent(out SolutionContainerComponent tank)) return; if (tank.Solution.GetReagentQuantity(_fuelType) == 0) diff --git a/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs b/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs index b9c5530fea..5133ba4602 100644 --- a/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs +++ b/Content.Server/Chemistry/ReactionEffects/ExplosionReactionEffect.cs @@ -40,7 +40,7 @@ namespace Content.Server.Chemistry.ReactionEffects float floatIntensity = (float)intensity; if (solutionEntity == null) return; - if(!solutionEntity.TryGetComponent(out SolutionComponent solution)) + if(!solutionEntity.TryGetComponent(out SolutionContainerComponent solution)) return; //Handle scaling diff --git a/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs b/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs index 769a5e42c5..27f2b0c21e 100644 --- a/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs +++ b/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs @@ -22,7 +22,7 @@ namespace Content.Server.GameObjects.Components.Body.Circulatory /// /// Internal solution for reagent storage /// - [ViewVariables] private SolutionComponent _internalSolution; + [ViewVariables] private SolutionContainerComponent _internalSolution; /// /// Empty volume of internal solution @@ -31,13 +31,13 @@ namespace Content.Server.GameObjects.Components.Body.Circulatory [ViewVariables] public GasMixture Air { get; set; } - [ViewVariables] public SolutionComponent Solution => _internalSolution; + [ViewVariables] public SolutionContainerComponent Solution => _internalSolution; public override void Initialize() { base.Initialize(); - _internalSolution = Owner.EnsureComponent(); + _internalSolution = Owner.EnsureComponent(); _internalSolution.MaxVolume = _initialMaxVolume; } diff --git a/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs b/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs index 4d2d67eb2b..08e2049129 100644 --- a/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs +++ b/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs @@ -24,10 +24,10 @@ namespace Content.Server.GameObjects.Components.Body.Digestive /// public ReagentUnit MaxVolume { - get => Owner.TryGetComponent(out SolutionComponent? solution) ? solution.MaxVolume : ReagentUnit.Zero; + get => Owner.TryGetComponent(out SolutionContainerComponent? solution) ? solution.MaxVolume : ReagentUnit.Zero; set { - if (Owner.TryGetComponent(out SolutionComponent? solution)) + if (Owner.TryGetComponent(out SolutionContainerComponent? solution)) { solution.MaxVolume = value; } @@ -64,9 +64,9 @@ namespace Content.Server.GameObjects.Components.Body.Digestive { base.Startup(); - if (!Owner.EnsureComponent(out SolutionComponent solution)) + if (!Owner.EnsureComponent(out SolutionContainerComponent solution)) { - Logger.Warning($"Entity {Owner} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionComponent)}"); + Logger.Warning($"Entity {Owner} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } solution.MaxVolume = _initialMaxVolume; @@ -74,7 +74,7 @@ namespace Content.Server.GameObjects.Components.Body.Digestive public bool TryTransferSolution(Solution solution) { - if (!Owner.TryGetComponent(out SolutionComponent? solutionComponent)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solutionComponent)) { return false; } @@ -104,7 +104,7 @@ namespace Content.Server.GameObjects.Components.Body.Digestive /// The time since the last update in seconds. public void Update(float frameTime) { - if (!Owner.TryGetComponent(out SolutionComponent? solutionComponent) || + if (!Owner.TryGetComponent(out SolutionContainerComponent? solutionComponent) || !Owner.TryGetComponent(out BloodstreamComponent? bloodstream)) { return; diff --git a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs index c0e69913ab..0092150d03 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs @@ -42,14 +42,12 @@ namespace Content.Server.GameObjects.Components.Chemistry { [ViewVariables] private ContainerSlot _beakerContainer = default!; [ViewVariables] private string _packPrototypeId = ""; - [ViewVariables] private bool HasBeaker => _beakerContainer.ContainedEntity != null; - [ViewVariables] private bool _bufferModeTransfer = true; private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; - [ViewVariables] private readonly SolutionComponent BufferSolution = new SolutionComponent(); + [ViewVariables] private readonly SolutionContainerComponent BufferSolution = new SolutionContainerComponent(); [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(ChemMasterUiKey.Key); @@ -179,7 +177,7 @@ namespace Content.Server.GameObjects.Components.Chemistry "", Owner.Name, new List(), BufferSolution.ReagentList.ToList(), _bufferModeTransfer, BufferSolution.CurrentVolume, BufferSolution.MaxVolume); } - var solution = beaker.GetComponent(); + var solution = beaker.GetComponent(); return new ChemMasterBoundUserInterfaceState(Powered, true, solution.CurrentVolume, solution.MaxVolume, beaker.Name, Owner.Name, solution.ReagentList.ToList(), BufferSolution.ReagentList.ToList(), _bufferModeTransfer, BufferSolution.CurrentVolume, BufferSolution.MaxVolume); } @@ -191,7 +189,7 @@ namespace Content.Server.GameObjects.Components.Chemistry } /// - /// If this component contains an entity with a , eject it. + /// If this component contains an entity with a , eject it. /// Tries to eject into user's hands first, then ejects onto chem master if both hands are full. /// private void TryEject(IEntity user) @@ -213,7 +211,7 @@ namespace Content.Server.GameObjects.Components.Chemistry { if (!HasBeaker && _bufferModeTransfer) return; var beaker = _beakerContainer.ContainedEntity; - var beakerSolution = beaker.GetComponent(); + var beakerSolution = beaker.GetComponent(); if (isBuffer) { foreach (var reagent in BufferSolution.Solution.Contents) @@ -283,7 +281,7 @@ namespace Content.Server.GameObjects.Components.Chemistry var bufferSolution = BufferSolution.Solution.SplitSolution(actualVolume); - bottle.TryGetComponent(out var bottleSolution); + bottle.TryGetComponent(out var bottleSolution); bottleSolution?.Solution.AddSolution(bufferSolution); //Try to give them the bottle @@ -317,7 +315,7 @@ namespace Content.Server.GameObjects.Components.Chemistry var bufferSolution = BufferSolution.Solution.SplitSolution(actualVolume); - pill.TryGetComponent(out var pillSolution); + pill.TryGetComponent(out var pillSolution); pillSolution?.Solution.AddSolution(bufferSolution); //Try to give them the bottle @@ -368,7 +366,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Called when you click the owner entity with something in your active hand. If the entity in your hand - /// contains a , if you have hands, and if the chem master doesn't already + /// contains a , if you have hands, and if the chem master doesn't already /// hold a container, it will be added to the chem master. /// /// Data relevant to the event such as the actor which triggered it. @@ -377,27 +375,27 @@ namespace Content.Server.GameObjects.Components.Chemistry { if (!args.User.TryGetComponent(out IHandsComponent? hands)) { - Owner.PopupMessage(args.User, Loc.GetString("You have no hands.")); + Owner.PopupMessage(args.User, Loc.GetString("You have no hands!")); return true; } if (hands.GetActiveHand == null) { - Owner.PopupMessage(args.User, Loc.GetString("You have nothing on your hand.")); + Owner.PopupMessage(args.User, Loc.GetString("You have nothing in your hand!")); return false; } var activeHandEntity = hands.GetActiveHand.Owner; - if (activeHandEntity.TryGetComponent(out var solution)) + if (activeHandEntity.TryGetComponent(out var solution)) { if (HasBeaker) { Owner.PopupMessage(args.User, Loc.GetString("This ChemMaster already has a container in it.")); } - else if ((solution.Capabilities & SolutionCaps.FitsInDispenser) == 0) //Close enough to a chem master... + else if (!solution.CanUseWithChemDispenser) { //If it can't fit in the chem master, don't put it in. For example, buckets and mop buckets can't fit. - Owner.PopupMessage(args.User, Loc.GetString("That can't fit in the ChemMaster.")); + Owner.PopupMessage(args.User, Loc.GetString("The {0:theName} is too large for the ChemMaster!", activeHandEntity)); } else { @@ -407,7 +405,7 @@ namespace Content.Server.GameObjects.Components.Chemistry } else { - Owner.PopupMessage(args.User, Loc.GetString("You can't put this in the ChemMaster.")); + Owner.PopupMessage(args.User, Loc.GetString("You can't put {0:theName} in the ChemMaster!", activeHandEntity)); } return true; diff --git a/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs b/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs index d315ffcceb..a7e4e8ec38 100644 --- a/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs @@ -61,12 +61,8 @@ namespace Content.Server.GameObjects.Components.Chemistry { base.Startup(); - Owner.EnsureComponent(); - - if (Owner.TryGetComponent(out SolutionComponent? solution)) - { - solution.Capabilities |= SolutionCaps.Injector; - } + var solution = Owner.EnsureComponent(); + solution.Capabilities = SolutionContainerCaps.AddTo | SolutionContainerCaps.RemoveFrom; // Set _toggleState based on prototype _toggleState = _injectOnly ? InjectorToggleMode.Inject : InjectorToggleMode.Draw; @@ -111,30 +107,51 @@ namespace Content.Server.GameObjects.Components.Chemistry if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) return; //Make sure we have the attacking entity - if (eventArgs.Target == null || !Owner.TryGetComponent(out SolutionComponent? solution) || !solution.Injector) + if (eventArgs.Target == null || !Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return; } var targetEntity = eventArgs.Target; - //Handle injecting/drawing for solutions - if (targetEntity.TryGetComponent(out var targetSolution) && targetSolution.Injectable) + + // Handle injecting/drawing for solutions + if (targetEntity.TryGetComponent(out var targetSolution)) { if (_toggleState == InjectorToggleMode.Inject) { - TryInject(targetSolution, eventArgs.User); + if (solution.CanRemoveSolutions && targetSolution.CanAddSolutions) + { + TryInject(targetSolution, eventArgs.User); + } + else + { + eventArgs.User.PopupMessage(eventArgs.User, Loc.GetString("You aren't able to transfer to {0:theName}!", targetSolution.Owner)); + } } else if (_toggleState == InjectorToggleMode.Draw) { - TryDraw(targetSolution, eventArgs.User); + if (targetSolution.CanRemoveSolutions && solution.CanAddSolutions) + { + TryDraw(targetSolution, eventArgs.User); + } + else + { + eventArgs.User.PopupMessage(eventArgs.User, Loc.GetString("You aren't able to draw from {0:theName}!", targetSolution.Owner)); + } } } - else //Handle injecting into bloodstream + else // Handle injecting into bloodstream { - if (targetEntity.TryGetComponent(out BloodstreamComponent? bloodstream) && - _toggleState == InjectorToggleMode.Inject) + if (targetEntity.TryGetComponent(out BloodstreamComponent? bloodstream) && _toggleState == InjectorToggleMode.Inject) { - TryInjectIntoBloodstream(bloodstream, eventArgs.User); + if (solution.CanRemoveSolutions) + { + TryInjectIntoBloodstream(bloodstream, eventArgs.User); + } + else + { + eventArgs.User.PopupMessage(eventArgs.User, Loc.GetString("You aren't able to inject {0:theName}!", targetEntity)); + } } } } @@ -152,88 +169,91 @@ namespace Content.Server.GameObjects.Components.Chemistry private void TryInjectIntoBloodstream(BloodstreamComponent targetBloodstream, IEntity user) { - if (!Owner.TryGetComponent(out SolutionComponent? solution) || - solution.CurrentVolume == 0) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution) || solution.CurrentVolume == 0) { return; } - //Get transfer amount. May be smaller than _transferAmount if not enough room + // Get transfer amount. May be smaller than _transferAmount if not enough room var realTransferAmount = ReagentUnit.Min(_transferAmount, targetBloodstream.EmptyVolume); + if (realTransferAmount <= 0) { - Owner.PopupMessage(user, Loc.GetString("Container full.")); + Owner.PopupMessage(user, Loc.GetString("You aren't able to inject {0:theName}!", targetBloodstream.Owner)); return; } - //Move units from attackSolution to targetSolution + // Move units from attackSolution to targetSolution var removedSolution = solution.SplitSolution(realTransferAmount); + if (!targetBloodstream.TryTransferSolution(removedSolution)) { return; } - Owner.PopupMessage(user, Loc.GetString("Injected {0}u", removedSolution.TotalVolume)); + Owner.PopupMessage(user, Loc.GetString("You inject {0}u into {1:theName}!", removedSolution.TotalVolume, targetBloodstream.Owner)); Dirty(); } - private void TryInject(SolutionComponent targetSolution, IEntity user) + private void TryInject(SolutionContainerComponent targetSolution, IEntity user) { - if (!Owner.TryGetComponent(out SolutionComponent? solution) || - solution.CurrentVolume == 0) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution) || solution.CurrentVolume == 0) { return; } - //Get transfer amount. May be smaller than _transferAmount if not enough room + // Get transfer amount. May be smaller than _transferAmount if not enough room var realTransferAmount = ReagentUnit.Min(_transferAmount, targetSolution.EmptyVolume); + if (realTransferAmount <= 0) { - Owner.PopupMessage(user, Loc.GetString("Container full.")); + Owner.PopupMessage(user, Loc.GetString("{0:theName} is already full!", targetSolution.Owner)); return; } - //Move units from attackSolution to targetSolution + // Move units from attackSolution to targetSolution var removedSolution = solution.SplitSolution(realTransferAmount); + if (!targetSolution.TryAddSolution(removedSolution)) { return; } - Owner.PopupMessage(user, Loc.GetString("Injected {0}u", removedSolution.TotalVolume)); + Owner.PopupMessage(user, Loc.GetString("You transfter {0}u to {1:theName}", removedSolution.TotalVolume, targetSolution.Owner)); Dirty(); } - private void TryDraw(SolutionComponent targetSolution, IEntity user) + private void TryDraw(SolutionContainerComponent targetSolution, IEntity user) { - if (!Owner.TryGetComponent(out SolutionComponent? solution) || - solution.EmptyVolume == 0) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution) || solution.EmptyVolume == 0) { return; } - //Get transfer amount. May be smaller than _transferAmount if not enough room + // Get transfer amount. May be smaller than _transferAmount if not enough room var realTransferAmount = ReagentUnit.Min(_transferAmount, targetSolution.CurrentVolume); + if (realTransferAmount <= 0) { - Owner.PopupMessage(user, Loc.GetString("Container empty")); + Owner.PopupMessage(user, Loc.GetString("{0:theName} is empty!", targetSolution.Owner)); return; } - //Move units from attackSolution to targetSolution + // Move units from attackSolution to targetSolution var removedSolution = targetSolution.SplitSolution(realTransferAmount); + if (!solution.TryAddSolution(removedSolution)) { return; } - Owner.PopupMessage(user, Loc.GetString("Drew {0}u", removedSolution.TotalVolume)); + Owner.PopupMessage(user, Loc.GetString("Drew {0}u from {1:theName}", removedSolution.TotalVolume, targetSolution.Owner)); Dirty(); } public override ComponentState GetComponentState() { - Owner.TryGetComponent(out SolutionComponent? solution); + Owner.TryGetComponent(out SolutionContainerComponent? solution); var currentVolume = solution?.CurrentVolume ?? ReagentUnit.Zero; var maxVolume = solution?.MaxVolume ?? ReagentUnit.Zero; diff --git a/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs b/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs index ce4a461b69..ad6d8238e0 100644 --- a/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs @@ -29,7 +29,7 @@ namespace Content.Server.GameObjects.Components.Chemistry [ViewVariables] private string _trashPrototype; [ViewVariables] - private SolutionComponent _contents; + private SolutionContainerComponent _contents; [ViewVariables] private ReagentUnit _transferAmount; @@ -45,7 +45,8 @@ namespace Content.Server.GameObjects.Components.Chemistry public override void Initialize() { base.Initialize(); - _contents = Owner.GetComponent(); + + _contents = Owner.GetComponent(); } bool IUse.UseEntity(UseEntityEventArgs eventArgs) diff --git a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs index b6a4b279fe..ac747c962a 100644 --- a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs @@ -48,22 +48,22 @@ namespace Content.Server.GameObjects.Components.Chemistry async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { //Get target solution component - if (!Owner.TryGetComponent(out var targetSolution)) + if (!Owner.TryGetComponent(out var targetSolution)) return false; //Get attack solution component var attackEntity = eventArgs.Using; - if (!attackEntity.TryGetComponent(out var attackSolution)) + if (!attackEntity.TryGetComponent(out var attackSolution)) return false; // Calculate possibe solution transfer - if (targetSolution.CanPourIn && attackSolution.CanPourOut) + if (targetSolution.CanAddSolutions && attackSolution.CanRemoveSolutions) { // default logic (beakers and glasses) // transfer solution from object in hand to attacked return TryTransfer(eventArgs, attackSolution, targetSolution); } - else if (targetSolution.CanPourOut && attackSolution.CanPourIn) + else if (targetSolution.CanRemoveSolutions && attackSolution.CanAddSolutions) { // storage tanks and sinks logic // drain solution from attacked object to object in hand @@ -74,26 +74,38 @@ namespace Content.Server.GameObjects.Components.Chemistry return false; } - bool TryTransfer(InteractUsingEventArgs eventArgs, SolutionComponent fromSolution, SolutionComponent toSolution) + bool TryTransfer(InteractUsingEventArgs eventArgs, SolutionContainerComponent fromSolution, SolutionContainerComponent toSolution) { var fromEntity = fromSolution.Owner; - if (!fromEntity.TryGetComponent(out var fromPourable)) - return false; - //Get transfer amount. May be smaller than _transferAmount if not enough room - var realTransferAmount = ReagentUnit.Min(fromPourable.TransferAmount, toSolution.EmptyVolume); - if (realTransferAmount <= 0) //Special message if container is full + if (!fromEntity.TryGetComponent(out var fromPourable)) { - Owner.PopupMessage(eventArgs.User, Loc.GetString("Container is full")); return false; } + //Get transfer amount. May be smaller than _transferAmount if not enough room + var realTransferAmount = ReagentUnit.Min(fromPourable.TransferAmount, toSolution.EmptyVolume); + + if (realTransferAmount <= 0) // Special message if container is full + { + Owner.PopupMessage(eventArgs.User, Loc.GetString("{0:theName} is full!", toSolution.Owner)); + return false; + } + //Move units from attackSolution to targetSolution var removedSolution = fromSolution.SplitSolution(realTransferAmount); - if (!toSolution.TryAddSolution(removedSolution)) - return false; - Owner.PopupMessage(eventArgs.User, Loc.GetString("Transferred {0}u", removedSolution.TotalVolume)); + if (removedSolution.TotalVolume <= ReagentUnit.Zero) + { + return false; + } + + if (!toSolution.TryAddSolution(removedSolution)) + { + return false; + } + + Owner.PopupMessage(eventArgs.User, Loc.GetString("You transfer {0}u to {1:theName}.", removedSolution.TotalVolume, toSolution.Owner)); return true; } diff --git a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs index c326671bd1..d35237b669 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs @@ -47,9 +47,7 @@ namespace Content.Server.GameObjects.Components.Chemistry [ViewVariables] private bool HasBeaker => _beakerContainer.ContainedEntity != null; [ViewVariables] private ReagentUnit _dispenseAmount = ReagentUnit.New(10); - - [ViewVariables] - private SolutionComponent? Solution => _beakerContainer.ContainedEntity?.GetComponent(); + [ViewVariables] private SolutionContainerComponent? Solution => _beakerContainer.ContainedEntity.GetComponent(); private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; @@ -210,7 +208,7 @@ namespace Content.Server.GameObjects.Components.Chemistry "", Inventory, Owner.Name, null, _dispenseAmount); } - var solution = beaker.GetComponent(); + var solution = beaker.GetComponent(); return new ReagentDispenserBoundUserInterfaceState(Powered, true, solution.CurrentVolume, solution.MaxVolume, beaker.Name, Inventory, Owner.Name, solution.ReagentList.ToList(), _dispenseAmount); } @@ -222,7 +220,7 @@ namespace Content.Server.GameObjects.Components.Chemistry } /// - /// If this component contains an entity with a , eject it. + /// If this component contains an entity with a , eject it. /// Tries to eject into user's hands first, then ejects onto dispenser if both hands are full. /// private void TryEject(IEntity user) @@ -241,26 +239,26 @@ namespace Content.Server.GameObjects.Components.Chemistry } /// - /// If this component contains an entity with a , remove all of it's reagents / solutions. + /// If this component contains an entity with a , remove all of it's reagents / solutions. /// private void TryClear() { if (!HasBeaker) return; - var solution = _beakerContainer.ContainedEntity.GetComponent(); + var solution = _beakerContainer.ContainedEntity.GetComponent(); solution.RemoveAllSolution(); UpdateUserInterface(); } /// - /// If this component contains an entity with a , attempt to dispense the specified reagent to it. + /// If this component contains an entity with a , attempt to dispense the specified reagent to it. /// /// The index of the reagent in Inventory. private void TryDispense(int dispenseIndex) { if (!HasBeaker) return; - var solution = _beakerContainer.ContainedEntity.GetComponent(); + var solution = _beakerContainer.ContainedEntity.GetComponent(); solution.TryAddReagent(Inventory[dispenseIndex].ID, _dispenseAmount, out _); UpdateUserInterface(); @@ -292,7 +290,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Called when you click the owner entity with something in your active hand. If the entity in your hand - /// contains a , if you have hands, and if the dispenser doesn't already + /// contains a , if you have hands, and if the dispenser doesn't already /// hold a container, it will be added to the dispenser. /// /// Data relevant to the event such as the actor which triggered it. @@ -312,13 +310,13 @@ namespace Content.Server.GameObjects.Components.Chemistry } var activeHandEntity = hands.GetActiveHand.Owner; - if (activeHandEntity.TryGetComponent(out var solution)) + if (activeHandEntity.TryGetComponent(out var solution)) { if (HasBeaker) { Owner.PopupMessage(args.User, Loc.GetString("This dispenser already has a container in it.")); } - else if ((solution.Capabilities & SolutionCaps.FitsInDispenser) == 0) + else if ((solution.Capabilities & SolutionContainerCaps.FitsInDispenser) == 0) { //If it can't fit in the dispenser, don't put it in. For example, buckets and mop buckets can't fit. Owner.PopupMessage(args.User, Loc.GetString("That can't fit in the dispenser.")); diff --git a/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs b/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs similarity index 68% rename from Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs rename to Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs index f987e1f2a2..ba62a048e7 100644 --- a/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs @@ -20,6 +20,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; using Robust.Shared.ViewVariables; +using System; namespace Content.Server.GameObjects.Components.Chemistry { @@ -27,41 +28,26 @@ namespace Content.Server.GameObjects.Components.Chemistry /// ECS component that manages a liquid solution of reagents. /// [RegisterComponent] - public class SolutionComponent : SharedSolutionComponent, IExamine + public class SolutionContainerComponent : SharedSolutionContainerComponent, IExamine { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; private IEnumerable _reactions; - private AudioSystem _audioSystem; - private ChemistrySystem _chemistrySystem; - - private SpriteComponent _spriteComponent; - - private Solution _containedSolution = new Solution(); - private ReagentUnit _maxVolume; - private SolutionCaps _capabilities; private string _fillInitState; private int _fillInitSteps; private string _fillPathString = "Objects/Specific/Chemistry/fillings.rsi"; private ResourcePath _fillPath; private SpriteSpecifier _fillSprite; - - /// - /// The maximum volume of the container. - /// - [ViewVariables(VVAccess.ReadWrite)] - public ReagentUnit MaxVolume - { - get => _maxVolume; - set => _maxVolume = value; // Note that the contents won't spill out if the capacity is reduced. - } + private AudioSystem _audioSystem; + private ChemistrySystem _chemistrySystem; + private SpriteComponent _spriteComponent; /// /// The total volume of all the of the reagents in the container. /// [ViewVariables] - public ReagentUnit CurrentVolume => _containedSolution.TotalVolume; + public ReagentUnit CurrentVolume => Solution.TotalVolume; /// /// The volume without reagents remaining in the container. @@ -79,49 +65,35 @@ namespace Content.Server.GameObjects.Components.Chemistry /// The current capabilities of this container (is the top open to pour? can I inject it into another object?). /// [ViewVariables(VVAccess.ReadWrite)] - public SolutionCaps Capabilities - { - get => _capabilities; - set => _capabilities = value; - } + public SolutionContainerCaps Capabilities { get; set; } + /// + /// The contained solution. + /// [ViewVariables] - public Solution Solution - { - get => _containedSolution; - set => _containedSolution = value; - } - - public IReadOnlyList ReagentList => _containedSolution.Contents; + public Solution Solution { get; set; } /// - /// Shortcut for Capabilities PourIn flag to avoid binary operators. + /// The maximum volume of the container. /// - public bool CanPourIn => (Capabilities & SolutionCaps.PourIn) != 0; - /// - /// Shortcut for Capabilities PourOut flag to avoid binary operators. - /// - public bool CanPourOut => (Capabilities & SolutionCaps.PourOut) != 0; - /// - /// Shortcut for Capabilities Injectable flag - /// - public bool Injectable => (Capabilities & SolutionCaps.Injectable) != 0; - /// - /// Shortcut for Capabilities Injector flag - /// - public bool Injector => (Capabilities & SolutionCaps.Injector) != 0; + [ViewVariables(VVAccess.ReadWrite)] + public ReagentUnit MaxVolume { get; set; } - public bool NoExamine => (Capabilities & SolutionCaps.NoExamine) != 0; + public IReadOnlyList ReagentList => Solution.Contents; + public bool CanExamineContents => (Capabilities & SolutionContainerCaps.NoExamine) == 0; + public bool CanUseWithChemDispenser => (Capabilities & SolutionContainerCaps.FitsInDispenser) != 0; + public bool CanAddSolutions => (Capabilities & SolutionContainerCaps.AddTo) != 0; + public bool CanRemoveSolutions => (Capabilities & SolutionContainerCaps.RemoveFrom) != 0; /// public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - serializer.DataField(ref _maxVolume, "maxVol", ReagentUnit.New(0)); - serializer.DataField(ref _containedSolution, "contents", _containedSolution); - serializer.DataField(ref _capabilities, "caps", SolutionCaps.None); - serializer.DataField(ref _fillInitState, "fillingState", ""); + serializer.DataField(this, x => MaxVolume, "maxVol", ReagentUnit.New(0)); + serializer.DataField(this, x => Solution, "contents", new Solution()); + serializer.DataField(this, x => Capabilities, "caps", SolutionContainerCaps.AddTo | SolutionContainerCaps.RemoveFrom); + serializer.DataField(ref _fillInitState, "fillingState", string.Empty); serializer.DataField(ref _fillInitSteps, "fillingSteps", 7); } @@ -149,15 +121,18 @@ namespace Content.Server.GameObjects.Components.Chemistry public void RemoveAllSolution() { - _containedSolution.RemoveAllSolution(); + Solution.RemoveAllSolution(); OnSolutionChanged(false); } public bool TryRemoveReagent(string reagentId, ReagentUnit quantity) { - if (!ContainsReagent(reagentId, out var currentQuantity)) return false; + if (!ContainsReagent(reagentId, out var currentQuantity)) + { + return false; + } - _containedSolution.RemoveReagent(reagentId, quantity); + Solution.RemoveReagent(reagentId, quantity); OnSolutionChanged(false); return true; } @@ -170,23 +145,25 @@ namespace Content.Server.GameObjects.Components.Chemistry public bool TryRemoveSolution(ReagentUnit quantity) { if (CurrentVolume == 0) + { return false; - - _containedSolution.RemoveSolution(quantity); + } + + Solution.RemoveSolution(quantity); OnSolutionChanged(false); return true; } public Solution SplitSolution(ReagentUnit quantity) { - var solutionSplit = _containedSolution.SplitSolution(quantity); + var solutionSplit = Solution.SplitSolution(quantity); OnSolutionChanged(false); return solutionSplit; } protected void RecalculateColor() { - if (_containedSolution.TotalVolume == 0) + if (Solution.TotalVolume == 0) { SubstanceColor = Color.Transparent; return; @@ -195,16 +172,23 @@ namespace Content.Server.GameObjects.Components.Chemistry Color mixColor = default; var runningTotalQuantity = ReagentUnit.New(0); - foreach (var reagent in _containedSolution) + foreach (var reagent in Solution) { runningTotalQuantity += reagent.Quantity; - if(!_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto)) + if (!_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto)) + { continue; + } + if (mixColor == default) + { mixColor = proto.SubstanceColor; - mixColor = Color.InterpolateBetween(mixColor, proto.SubstanceColor, - (1 / runningTotalQuantity.Float()) * reagent.Quantity.Float()); + continue; + } + + var interpolateValue = (1 / runningTotalQuantity.Float()) * reagent.Quantity.Float(); + mixColor = Color.InterpolateBetween(mixColor, proto.SubstanceColor, interpolateValue); } SubstanceColor = mixColor; @@ -214,56 +198,53 @@ namespace Content.Server.GameObjects.Components.Chemistry /// Transfers solution from the held container to the target container. /// [Verb] - private sealed class FillTargetVerb : Verb + private sealed class FillTargetVerb : Verb { - protected override void GetData(IEntity user, SolutionComponent component, VerbData data) + protected override void GetData(IEntity user, SolutionContainerComponent component, VerbData data) { if (!ActionBlockerSystem.CanInteract(user) || !user.TryGetComponent(out var hands) || hands.GetActiveHand == null || hands.GetActiveHand.Owner == component.Owner || - !hands.GetActiveHand.Owner.TryGetComponent(out var solution)) + !hands.GetActiveHand.Owner.TryGetComponent(out var solution) || + !solution.CanRemoveSolutions || + !component.CanAddSolutions) { data.Visibility = VerbVisibility.Invisible; return; } - if ((solution.Capabilities & SolutionCaps.PourOut) != 0 && - (component.Capabilities & SolutionCaps.PourIn) != 0) - { - var heldEntityName = hands.GetActiveHand.Owner?.Prototype?.Name ?? ""; - var myName = component.Owner.Prototype?.Name ?? ""; + var heldEntityName = hands.GetActiveHand.Owner?.Prototype?.Name ?? ""; + var myName = component.Owner.Prototype?.Name ?? ""; - var locHeldEntityName = Loc.GetString(heldEntityName); - var locMyName = Loc.GetString(myName); + var locHeldEntityName = Loc.GetString(heldEntityName); + var locMyName = Loc.GetString(myName); - data.Text = Loc.GetString("Transfer liquid from [{0}] to [{1}].", locHeldEntityName, locMyName); - return; - } - - data.Visibility = VerbVisibility.Invisible; + data.Visibility = VerbVisibility.Visible; + data.Text = Loc.GetString("Transfer liquid from [{0}] to [{1}].", locHeldEntityName, locMyName); } - protected override void Activate(IEntity user, SolutionComponent component) + protected override void Activate(IEntity user, SolutionContainerComponent component) { - if (!user.TryGetComponent(out var hands)) + if (!user.TryGetComponent(out var hands) || hands.GetActiveHand == null) + { return; - - if (hands.GetActiveHand == null) - return; - - if (!hands.GetActiveHand.Owner.TryGetComponent(out var handSolutionComp)) - return; - - if ((handSolutionComp.Capabilities & SolutionCaps.PourOut) == 0 || (component.Capabilities & SolutionCaps.PourIn) == 0) + } + + if (!hands.GetActiveHand.Owner.TryGetComponent(out var handSolutionComp) || + !handSolutionComp.CanRemoveSolutions || + !component.CanAddSolutions) + { return; + } var transferQuantity = ReagentUnit.Min(component.MaxVolume - component.CurrentVolume, handSolutionComp.CurrentVolume, ReagentUnit.New(10)); - // nothing to transfer if (transferQuantity <= 0) + { return; - + } + var transferSolution = handSolutionComp.SplitSolution(transferQuantity); component.TryAddSolution(transferSolution); } @@ -271,44 +252,37 @@ namespace Content.Server.GameObjects.Components.Chemistry void IExamine.Examine(FormattedMessage message, bool inDetailsRange) { - if (NoExamine) + if (!CanExamineContents) { return; } - message.AddText(Loc.GetString("Contains:\n")); if (ReagentList.Count == 0) { - message.AddText("Nothing.\n"); + message.AddText(Loc.GetString("It's empty.")); } - foreach (var reagent in ReagentList) + else if (ReagentList.Count == 1) { + var reagent = ReagentList[0]; + if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto)) { - if (inDetailsRange) - { - message.AddText($"{proto.Name}: {reagent.Quantity}u\n"); - } - else - { - //This is trash but it shows the general idea - var color = proto.SubstanceColor; - var colorIsh = "Red"; - if (color.G > color.R) - { - colorIsh = "Green"; - } - if (color.B > color.G && color.B > color.R) - { - colorIsh = "Blue"; - } - - message.AddText(Loc.GetString("A {0} liquid\n", colorIsh)); - } + var colorStr = $" [color={proto.GetSubstanceTextColor().ToHexNoAlpha()}]"; + message.AddText(Loc.GetString("It contains a")); + message.AddMarkup(colorStr + Loc.GetString(proto.PhysicalDescription) + "[/color] "); + message.AddText(Loc.GetString("substance.")); } - else + } + else + { + var reagent = ReagentList.Max(); + + if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto)) { - message.AddText(Loc.GetString("Unknown reagent: {0}u\n", reagent.Quantity)); + var colorStr = $" [color={SubstanceColor.ToHexNoAlpha()}]"; + message.AddText(Loc.GetString("It contains a")); + message.AddMarkup(colorStr + Loc.GetString(proto.PhysicalDescription) + "[/color] "); + message.AddText(Loc.GetString("mixture of substances.")); } } } @@ -317,55 +291,53 @@ namespace Content.Server.GameObjects.Components.Chemistry /// Transfers solution from a target container to the held container. /// [Verb] - private sealed class EmptyTargetVerb : Verb + private sealed class EmptyTargetVerb : Verb { - protected override void GetData(IEntity user, SolutionComponent component, VerbData data) + protected override void GetData(IEntity user, SolutionContainerComponent component, VerbData data) { if (!ActionBlockerSystem.CanInteract(user) || !user.TryGetComponent(out var hands) || hands.GetActiveHand == null || hands.GetActiveHand.Owner == component.Owner || - !hands.GetActiveHand.Owner.TryGetComponent(out var solution)) + !hands.GetActiveHand.Owner.TryGetComponent(out var solution) || + !solution.CanAddSolutions || + !component.CanRemoveSolutions) { data.Visibility = VerbVisibility.Invisible; return; } - if ((solution.Capabilities & SolutionCaps.PourIn) != 0 && - (component.Capabilities & SolutionCaps.PourOut) != 0) + var heldEntityName = hands.GetActiveHand.Owner?.Prototype?.Name ?? ""; + var myName = component.Owner.Prototype?.Name ?? ""; + + var locHeldEntityName = Loc.GetString(heldEntityName); + var locMyName = Loc.GetString(myName); + + data.Visibility = VerbVisibility.Visible; + data.Text = Loc.GetString("Transfer liquid from [{0}] to [{1}].", locMyName, locHeldEntityName); + return; + } + + protected override void Activate(IEntity user, SolutionContainerComponent component) + { + if (!user.TryGetComponent(out var hands) || hands.GetActiveHand == null) { - var heldEntityName = hands.GetActiveHand.Owner?.Prototype?.Name ?? ""; - var myName = component.Owner.Prototype?.Name ?? ""; - - var locHeldEntityName = Loc.GetString(heldEntityName); - var locMyName = Loc.GetString(myName); - - data.Text = Loc.GetString("Transfer liquid from [{0}] to [{1}].", locMyName, locHeldEntityName); return; } - data.Visibility = VerbVisibility.Invisible; - } - - protected override void Activate(IEntity user, SolutionComponent component) - { - if (!user.TryGetComponent(out var hands)) - return; - - if (hands.GetActiveHand == null) - return; - - if(!hands.GetActiveHand.Owner.TryGetComponent(out var handSolutionComp)) - return; - - if ((handSolutionComp.Capabilities & SolutionCaps.PourIn) == 0 || (component.Capabilities & SolutionCaps.PourOut) == 0) + if(!hands.GetActiveHand.Owner.TryGetComponent(out var handSolutionComp) || + !handSolutionComp.CanAddSolutions || + !component.CanRemoveSolutions) + { return; + } var transferQuantity = ReagentUnit.Min(handSolutionComp.MaxVolume - handSolutionComp.CurrentVolume, component.CurrentVolume, ReagentUnit.New(10)); - // pulling from an empty container, pointless to continue if (transferQuantity <= 0) + { return; + } var transferSolution = component.SplitSolution(transferQuantity); handSolutionComp.TryAddSolution(transferSolution); @@ -401,7 +373,7 @@ namespace Content.Server.GameObjects.Components.Chemistry public bool TryAddReagent(string reagentId, ReagentUnit quantity, out ReagentUnit acceptedQuantity, bool skipReactionCheck = false, bool skipColor = false) { - var toAcceptQuantity = MaxVolume - _containedSolution.TotalVolume; + var toAcceptQuantity = MaxVolume - Solution.TotalVolume; if (quantity > toAcceptQuantity) { acceptedQuantity = toAcceptQuantity; @@ -412,7 +384,7 @@ namespace Content.Server.GameObjects.Components.Chemistry acceptedQuantity = quantity; } - _containedSolution.AddReagent(reagentId, acceptedQuantity); + Solution.AddReagent(reagentId, acceptedQuantity); if (!skipColor) { RecalculateColor(); } @@ -424,10 +396,10 @@ namespace Content.Server.GameObjects.Components.Chemistry public bool TryAddSolution(Solution solution, bool skipReactionCheck = false, bool skipColor = false) { - if (solution.TotalVolume > (MaxVolume - _containedSolution.TotalVolume)) + if (solution.TotalVolume > (MaxVolume - Solution.TotalVolume)) return false; - _containedSolution.AddSolution(solution); + Solution.AddSolution(solution); if (!skipColor) { RecalculateColor(); } @@ -487,18 +459,20 @@ namespace Content.Server.GameObjects.Components.Chemistry TryRemoveReagent(reactant.Key, amountToRemove); } } - //Add products + + // Add products foreach (var product in reaction.Products) { TryAddReagent(product.Key, product.Value * unitReactions, out var acceptedQuantity, true); } - //Trigger reaction effects + + // Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(Owner, unitReactions.Double()); } - //Play reaction sound client-side + // Play reaction sound client-side _audioSystem.PlayAtCoords("/Audio/Effects/Chemistry/bubbles.ogg", Owner.Transform.Coordinates); } @@ -510,7 +484,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// Return true if the solution contains the reagent. public bool ContainsReagent(string reagentId, out ReagentUnit quantity) { - foreach (var reagent in _containedSolution.Contents) + foreach (var reagent in Solution.Contents) { if (reagent.ReagentId == reagentId) { @@ -518,43 +492,50 @@ namespace Content.Server.GameObjects.Components.Chemistry return true; } } + quantity = ReagentUnit.New(0); return false; } public string GetMajorReagentId() { - if (_containedSolution.Contents.Count == 0) + if (Solution.Contents.Count == 0) { return ""; } - var majorReagent = _containedSolution.Contents.OrderByDescending(reagent => reagent.Quantity).First();; + + var majorReagent = Solution.Contents.OrderByDescending(reagent => reagent.Quantity).First();; return majorReagent.ReagentId; } protected void UpdateFillIcon() { - if (string.IsNullOrEmpty(_fillInitState)) return; + if (string.IsNullOrEmpty(_fillInitState)) + { + return; + } var percentage = (CurrentVolume / MaxVolume).Double(); var level = ContentHelpers.RoundToLevels(percentage * 100, 100, _fillInitSteps); //Transformed glass uses special fancy sprites so we don't bother - if (level == 0 || Owner.TryGetComponent(out var transformableContainerComponent) - && transformableContainerComponent.Transformed) + if (level == 0 || (Owner.TryGetComponent(out var transformComp) && transformComp.Transformed)) { _spriteComponent.LayerSetColor(1, Color.Transparent); return; } - _fillSprite = new SpriteSpecifier.Rsi(_fillPath, _fillInitState+level); + + _fillSprite = new SpriteSpecifier.Rsi(_fillPath, _fillInitState + level); _spriteComponent.LayerSetSprite(1, _fillSprite); - _spriteComponent.LayerSetColor(1,SubstanceColor); + _spriteComponent.LayerSetColor(1, SubstanceColor); } protected virtual void OnSolutionChanged(bool skipColor) { if (!skipColor) + { RecalculateColor(); + } UpdateFillIcon(); _chemistrySystem.HandleSolutionChange(Owner); diff --git a/Content.Server/GameObjects/Components/Chemistry/TransformableContainerComponent.cs b/Content.Server/GameObjects/Components/Chemistry/TransformableContainerComponent.cs index 24f4879d55..1768c74936 100644 --- a/Content.Server/GameObjects/Components/Chemistry/TransformableContainerComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/TransformableContainerComponent.cs @@ -42,13 +42,13 @@ namespace Content.Server.GameObjects.Components.Chemistry { base.Startup(); - if (!Owner.EnsureComponent(out SolutionComponent solution)) + if (!Owner.EnsureComponent(out SolutionContainerComponent solution)) { Logger.Warning( - $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionComponent)}"); + $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } - solution.Capabilities |= SolutionCaps.FitsInDispenser; + solution.Capabilities |= SolutionContainerCaps.FitsInDispenser; } public void CancelTransformation() @@ -68,7 +68,7 @@ namespace Content.Server.GameObjects.Components.Chemistry void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) { - var solution = eventArgs.Owner.GetComponent(); + var solution = eventArgs.Owner.GetComponent(); //Transform container into initial state when emptied if (_currentReagent != null && solution.ReagentList.Count == 0) { diff --git a/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs b/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs index 3d89de3d30..68fadf41ad 100644 --- a/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs @@ -31,10 +31,10 @@ namespace Content.Server.GameObjects.Components.Chemistry { base.Initialize(); - if (!Owner.EnsureComponent(out SolutionComponent _)) + if (!Owner.EnsureComponent(out SolutionContainerComponent _)) { Logger.Warning( - $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionComponent)}"); + $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } } @@ -59,7 +59,7 @@ namespace Content.Server.GameObjects.Components.Chemistry public void Update() { - if (!Owner.TryGetComponent(out SolutionComponent contents)) + if (!Owner.TryGetComponent(out SolutionContainerComponent contents)) return; if (!_running) @@ -94,7 +94,7 @@ namespace Content.Server.GameObjects.Components.Chemistry return false; } - if (!Owner.TryGetComponent(out SolutionComponent contents)) + if (!Owner.TryGetComponent(out SolutionContainerComponent contents)) { return false; } diff --git a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs index ee190c6461..0352e86c3f 100644 --- a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs @@ -24,17 +24,17 @@ namespace Content.Server.GameObjects.Components.Fluids public ReagentUnit MaxVolume { - get => Owner.TryGetComponent(out SolutionComponent? solution) ? solution.MaxVolume : ReagentUnit.Zero; + get => Owner.TryGetComponent(out SolutionContainerComponent? solution) ? solution.MaxVolume : ReagentUnit.Zero; set { - if (Owner.TryGetComponent(out SolutionComponent? solution)) + if (Owner.TryGetComponent(out SolutionContainerComponent? solution)) { solution.MaxVolume = value; } } } - public ReagentUnit CurrentVolume => Owner.TryGetComponent(out SolutionComponent? solution) + public ReagentUnit CurrentVolume => Owner.TryGetComponent(out SolutionContainerComponent? solution) ? solution.CurrentVolume : ReagentUnit.Zero; @@ -50,12 +50,12 @@ namespace Content.Server.GameObjects.Components.Fluids public override void Initialize() { base.Initialize(); - Owner.EnsureComponent(); + Owner.EnsureComponent(); } private bool TryGiveToMop(MopComponent mopComponent) { - if (!Owner.TryGetComponent(out SolutionComponent? contents)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? contents)) { return false; } @@ -88,7 +88,7 @@ namespace Content.Server.GameObjects.Components.Fluids public async Task InteractUsing(InteractUsingEventArgs eventArgs) { - if (!Owner.TryGetComponent(out SolutionComponent? contents)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? contents)) { return false; } diff --git a/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs b/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs deleted file mode 100644 index bee90b967c..0000000000 --- a/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Server.GameObjects.Components.Chemistry; -using Content.Shared.Chemistry; -using Content.Shared.GameObjects.EntitySystems; -using Content.Shared.GameObjects.Verbs; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Localization; - -namespace Content.Server.GameObjects.Components.Fluids -{ - [RegisterComponent] - public class CanSpillComponent : Component - { - public override string Name => "CanSpill"; - // TODO: If the Owner doesn't have a SolutionComponent straight up just have this remove itself? - - /// - /// Transfers solution from the held container to the target container. - /// - [Verb] - private sealed class FillTargetVerb : Verb - { - protected override void GetData(IEntity user, CanSpillComponent component, VerbData data) - { - if (!ActionBlockerSystem.CanInteract(user) || - !component.Owner.TryGetComponent(out SolutionComponent solutionComponent)) - { - data.Visibility = VerbVisibility.Invisible; - return; - } - - data.Text = Loc.GetString("Spill liquid"); - data.Visibility = solutionComponent.CurrentVolume > ReagentUnit.Zero - ? VerbVisibility.Visible - : VerbVisibility.Disabled; - } - - protected override void Activate(IEntity user, CanSpillComponent component) - { - var solutionComponent = component.Owner.GetComponent(); - // Need this as when we split the component's owner may be deleted - var entityLocation = component.Owner.Transform.Coordinates; - var solution = solutionComponent.SplitSolution(solutionComponent.CurrentVolume); - solution.SpillAt(entityLocation, "PuddleSmear"); - } - } - } -} diff --git a/Content.Server/GameObjects/Components/Fluids/MopComponent.cs b/Content.Server/GameObjects/Components/Fluids/MopComponent.cs index 857b53399d..9bffea6e02 100644 --- a/Content.Server/GameObjects/Components/Fluids/MopComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/MopComponent.cs @@ -22,14 +22,14 @@ namespace Content.Server.GameObjects.Components.Fluids { public override string Name => "Mop"; - public SolutionComponent? Contents => Owner.GetComponentOrNull(); + public SolutionContainerComponent? Contents => Owner.GetComponentOrNull(); public ReagentUnit MaxVolume { - get => Owner.GetComponentOrNull()?.MaxVolume ?? ReagentUnit.Zero; + get => Owner.GetComponentOrNull()?.MaxVolume ?? ReagentUnit.Zero; set { - if (Owner.TryGetComponent(out SolutionComponent? solution)) + if (Owner.TryGetComponent(out SolutionContainerComponent? solution)) { solution.MaxVolume = value; } @@ -37,7 +37,7 @@ namespace Content.Server.GameObjects.Components.Fluids } public ReagentUnit CurrentVolume => - Owner.GetComponentOrNull()?.CurrentVolume ?? ReagentUnit.Zero; + Owner.GetComponentOrNull()?.CurrentVolume ?? ReagentUnit.Zero; // Currently there's a separate amount for pickup and dropoff so // Picking up a puddle requires multiple clicks @@ -60,15 +60,15 @@ namespace Content.Server.GameObjects.Components.Fluids { base.Initialize(); - if (!Owner.EnsureComponent(out SolutionComponent _)) + if (!Owner.EnsureComponent(out SolutionContainerComponent _)) { - Logger.Warning($"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionComponent)}"); + Logger.Warning($"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } } void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { - if (!Owner.TryGetComponent(out SolutionComponent? contents)) return; + if (!Owner.TryGetComponent(out SolutionContainerComponent? contents)) return; if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) return; if (CurrentVolume <= 0) @@ -76,7 +76,6 @@ namespace Content.Server.GameObjects.Components.Fluids return; } - //Solution solution; if (eventArgs.Target == null) { // Drop the liquid on the mop on to the ground @@ -98,7 +97,7 @@ namespace Content.Server.GameObjects.Components.Fluids if (transferAmount == 0) { - if(puddleComponent.EmptyHolder) //The puddle doesn't actually *have* reagents, for example vomit because there's no "vomit" reagent. + if (puddleComponent.EmptyHolder) //The puddle doesn't actually *have* reagents, for example vomit because there's no "vomit" reagent. { puddleComponent.Owner.Delete(); transferAmount = ReagentUnit.Min(ReagentUnit.New(5), CurrentVolume); diff --git a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs index a26703122e..4ec98b6b43 100644 --- a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs @@ -94,7 +94,7 @@ namespace Content.Server.GameObjects.Components.Fluids private ReagentUnit _overflowVolume; private ReagentUnit OverflowLeft => CurrentVolume - OverflowVolume; - private SolutionComponent _contents; + private SolutionContainerComponent _contents; public bool EmptyHolder => _contents.ReagentList.Count == 0; private int _spriteVariants; // Whether the underlying solution color should be used @@ -118,13 +118,13 @@ namespace Content.Server.GameObjects.Components.Fluids { base.Initialize(); - if (Owner.TryGetComponent(out SolutionComponent solutionComponent)) + if (Owner.TryGetComponent(out SolutionContainerComponent solutionComponent)) { _contents = solutionComponent; } else { - _contents = Owner.AddComponent(); + _contents = Owner.AddComponent(); } _snapGrid = Owner.EnsureComponent(); diff --git a/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs b/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs new file mode 100644 index 0000000000..c6528086de --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs @@ -0,0 +1,59 @@ +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.GameObjects.Verbs; +using Content.Shared.Interfaces; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; + +namespace Content.Server.GameObjects.Components.Fluids +{ + [RegisterComponent] + public class SpillableComponent : Component + { + public override string Name => "Spillable"; + + /// + /// Transfers solution from the held container to the floor. + /// + [Verb] + private sealed class SpillTargetVerb : Verb + { + protected override void GetData(IEntity user, SpillableComponent component, VerbData data) + { + if (!ActionBlockerSystem.CanInteract(user) || + !component.Owner.TryGetComponent(out SolutionContainerComponent solutionComponent) || + !solutionComponent.CanRemoveSolutions) + { + data.Visibility = VerbVisibility.Invisible; + return; + } + + data.Text = Loc.GetString("Spill liquid"); + data.Visibility = solutionComponent.CurrentVolume > ReagentUnit.Zero ? VerbVisibility.Visible : VerbVisibility.Disabled; + } + + protected override void Activate(IEntity user, SpillableComponent component) + { + if (component.Owner.TryGetComponent(out var solutionComponent)) + { + if (!solutionComponent.CanRemoveSolutions) + { + user.PopupMessage(user, Loc.GetString("You can't pour anything from {0:theName}!", component.Owner)); + } + + if (solutionComponent.CurrentVolume.Float() <= 0) + { + user.PopupMessage(user, Loc.GetString("{0:theName} is empty!", component.Owner)); + } + + // Need this as when we split the component's owner may be deleted + var entityLocation = component.Owner.Transform.Coordinates; + var solution = solutionComponent.SplitSolution(solutionComponent.CurrentVolume); + solution.SpillAt(entityLocation, "PuddleSmear"); + } + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs index 9d42b72acc..234e6c4848 100644 --- a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs @@ -45,16 +45,16 @@ namespace Content.Server.GameObjects.Components.Fluids set => _sprayVelocity = value; } - public ReagentUnit CurrentVolume => Owner.GetComponentOrNull()?.CurrentVolume ?? ReagentUnit.Zero; + public ReagentUnit CurrentVolume => Owner.GetComponentOrNull()?.CurrentVolume ?? ReagentUnit.Zero; public override void Initialize() { base.Initialize(); - if (!Owner.EnsureComponent(out SolutionComponent _)) + if (!Owner.EnsureComponent(out SolutionContainerComponent _)) { Logger.Warning( - $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionComponent)}"); + $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } } @@ -78,7 +78,7 @@ namespace Content.Server.GameObjects.Components.Fluids if (eventArgs.ClickLocation.GetGridId(_serverEntityManager) != playerPos.GetGridId(_serverEntityManager)) return; - if (!Owner.TryGetComponent(out SolutionComponent contents)) + if (!Owner.TryGetComponent(out SolutionContainerComponent contents)) return; var direction = (eventArgs.ClickLocation.Position - playerPos.Position).Normalized; diff --git a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs index eadd2adb0e..f1f4a8893d 100644 --- a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs @@ -48,7 +48,7 @@ namespace Content.Server.GameObjects.Components.Interactable private bool _welderLit; private WelderSystem _welderSystem = default!; private SpriteComponent? _spriteComponent; - private SolutionComponent? _solutionComponent; + private SolutionContainerComponent? _solutionComponent; private PointLightComponent? _pointLightComponent; public string? WeldSoundCollection { get; set; } diff --git a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs index 66c3eea090..88873c2c2a 100644 --- a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs @@ -63,7 +63,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private uint _currentCookTimerTime = 1; private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; - private bool _hasContents => Owner.TryGetComponent(out SolutionComponent? solution) && (solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0); + private bool _hasContents => Owner.TryGetComponent(out SolutionContainerComponent? solution) && (solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0); private bool _uiDirty = true; private bool _lostPower = false; private int _currentCookTimeButtonIndex = 0; @@ -88,7 +88,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { base.Initialize(); - Owner.EnsureComponent(); + Owner.EnsureComponent(); _storage = ContainerManagerComponent.Ensure("microwave_entity_container", Owner, out var existed); _audioSystem = EntitySystem.Get(); @@ -165,7 +165,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _uiDirty = true; } - if (_uiDirty && Owner.TryGetComponent(out SolutionComponent? solution)) + if (_uiDirty && Owner.TryGetComponent(out SolutionContainerComponent? solution)) { UserInterface?.SetState(new MicrowaveUpdateUserInterfaceState ( @@ -216,13 +216,13 @@ namespace Content.Server.GameObjects.Components.Kitchen if (itemEntity.TryGetComponent(out var attackPourable)) { - if (!itemEntity.TryGetComponent(out var attackSolution) - || !attackSolution.CanPourOut) + if (!itemEntity.TryGetComponent(out var attackSolution) + || !attackSolution.CanRemoveSolutions) { return false; } - if (!Owner.TryGetComponent(out SolutionComponent? solution)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return false; } @@ -355,7 +355,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void VaporizeReagents() { - if (Owner.TryGetComponent(out SolutionComponent? solution)) + if (Owner.TryGetComponent(out SolutionContainerComponent? solution)) { solution.RemoveAllSolution(); } @@ -363,7 +363,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void VaporizeReagentQuantity(Solution.ReagentQuantity reagentQuantity) { - if (Owner.TryGetComponent(out SolutionComponent? solution)) + if (Owner.TryGetComponent(out SolutionContainerComponent? solution)) { solution?.TryRemoveReagent(reagentQuantity.ReagentId, reagentQuantity.Quantity); } @@ -399,7 +399,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void SubtractContents(FoodRecipePrototype recipe) { - if (!Owner.TryGetComponent(out SolutionComponent? solution)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return; } @@ -434,7 +434,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private MicrowaveSuccessState CanSatisfyRecipe(FoodRecipePrototype recipe, Dictionary solids) { - if (!Owner.TryGetComponent(out SolutionComponent? solution)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return MicrowaveSuccessState.RecipeFail; } diff --git a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs index a84ed3bc25..ac511c3d24 100644 --- a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs @@ -35,7 +35,7 @@ namespace Content.Server.GameObjects.Components.Nutrition public override string Name => "Drink"; [ViewVariables] - private SolutionComponent _contents; + private SolutionContainerComponent _contents; [ViewVariables] private string _useSound; [ViewVariables] @@ -56,9 +56,9 @@ namespace Content.Server.GameObjects.Components.Nutrition { base.ExposeData(serializer); serializer.DataField(ref _useSound, "useSound", "/Audio/Items/drink.ogg"); - serializer.DataField(ref _defaultToOpened, "isOpen", false); //For things like cups of coffee. - serializer.DataField(ref _soundCollection, "openSounds","canOpenSounds"); - serializer.DataField(ref _pressurized, "pressurized",false); + serializer.DataField(ref _defaultToOpened, "isOpen", false); // For things like cups of coffee. + serializer.DataField(ref _soundCollection, "openSounds", "canOpenSounds"); + serializer.DataField(ref _pressurized, "pressurized", false); serializer.DataField(ref _burstSound, "burstSound", "/Audio/Effects/flash_bang.ogg"); } @@ -66,14 +66,13 @@ namespace Content.Server.GameObjects.Components.Nutrition { base.Initialize(); Owner.TryGetComponent(out _appearanceComponent); - if(!Owner.TryGetComponent(out _contents)) + + if (!Owner.TryGetComponent(out _contents)) { - _contents = Owner.AddComponent(); + _contents = Owner.AddComponent(); } - _contents.Capabilities = SolutionCaps.PourIn - | SolutionCaps.PourOut - | SolutionCaps.Injectable; + _contents.Capabilities = SolutionContainerCaps.AddTo | SolutionContainerCaps.RemoveFrom; Opened = _defaultToOpened; UpdateAppearance(); } @@ -83,11 +82,11 @@ namespace Content.Server.GameObjects.Components.Nutrition UpdateAppearance(); } - private void UpdateAppearance() { _appearanceComponent?.SetData(SharedFoodComponent.FoodVisuals.Visual, _contents.CurrentVolume.Float()); } + bool IUse.UseEntity(UseEntityEventArgs args) { if (!Opened) @@ -100,13 +99,20 @@ namespace Content.Server.GameObjects.Components.Nutrition Opened = true; return false; } + + if (_contents.CurrentVolume.Float() <= 0) + { + args.User.PopupMessage(Loc.GetString("{0:theName} is empty!", Owner)); + return true; + } + return TryUseDrink(args.User); } //Force feeding a drink to someone. void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { - TryUseDrink(eventArgs.Target); + TryUseDrink(eventArgs.Target, forced: true); } public void Examine(FormattedMessage message, bool inDetailsRange) @@ -118,25 +124,28 @@ namespace Content.Server.GameObjects.Components.Nutrition var color = Empty ? "gray" : "yellow"; var openedText = Loc.GetString(Empty ? "Empty" : "Opened"); message.AddMarkup(Loc.GetString("[color={0}]{1}[/color]", color, openedText)); - } - private bool TryUseDrink(IEntity target) + private bool TryUseDrink(IEntity target, bool forced = false) { - if (target == null) + if (target == null || !_contents.CanRemoveSolutions) { return false; } if (!Opened) { - target.PopupMessage(Loc.GetString("Open it first!")); + target.PopupMessage(Loc.GetString("Open {0:theName} first!", Owner)); return false; } if (_contents.CurrentVolume.Float() <= 0) { - target.PopupMessage(Loc.GetString("It's empty!")); + if (!forced) + { + target.PopupMessage(Loc.GetString("{0:theName} is empty!", Owner)); + } + return false; } @@ -147,18 +156,23 @@ namespace Content.Server.GameObjects.Components.Nutrition var transferAmount = ReagentUnit.Min(TransferAmount, _contents.CurrentVolume); var split = _contents.SplitSolution(transferAmount); + if (stomachComponent.TryTransferSolution(split)) { - if (_useSound == null) return false; + if (_useSound == null) + { + return false; + } + EntitySystem.Get().PlayFromEntity(_useSound, target, AudioParams.Default.WithVolume(-2f)); target.PopupMessage(Loc.GetString("Slurp")); UpdateAppearance(); return true; } - //Stomach was full or can't handle whatever solution we have. + // Stomach was full or can't handle whatever solution we have. _contents.TryAddSolution(split); - target.PopupMessage(Loc.GetString("You've had enough {0}!", Owner.Name)); + target.PopupMessage(Loc.GetString("You've had enough {0:theName}!", Owner)); return false; } @@ -167,7 +181,7 @@ namespace Content.Server.GameObjects.Components.Nutrition if (_pressurized && !Opened && _random.Prob(0.25f) && - Owner.TryGetComponent(out SolutionComponent component)) + Owner.TryGetComponent(out SolutionContainerComponent component)) { Opened = true; diff --git a/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs b/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs index 88b34282b8..fbe2a6e0d5 100644 --- a/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs @@ -41,7 +41,7 @@ namespace Content.Server.GameObjects.Components.Nutrition { get { - if (!Owner.TryGetComponent(out SolutionComponent? solution)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return 0; } @@ -83,7 +83,7 @@ namespace Content.Server.GameObjects.Components.Nutrition public override void Initialize() { base.Initialize(); - Owner.EnsureComponent(); + Owner.EnsureComponent(); } bool IUse.UseEntity(UseEntityEventArgs eventArgs) @@ -110,7 +110,7 @@ namespace Content.Server.GameObjects.Components.Nutrition public virtual bool TryUseFood(IEntity? user, IEntity? target, UtensilComponent? utensilUsed = null) { - if (!Owner.TryGetComponent(out SolutionComponent? solution)) + if (!Owner.TryGetComponent(out SolutionContainerComponent? solution)) { return false; } diff --git a/Content.Shared/Chemistry/ReagentPrototype.cs b/Content.Shared/Chemistry/ReagentPrototype.cs index e863895650..14da28ea20 100644 --- a/Content.Shared/Chemistry/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/ReagentPrototype.cs @@ -6,6 +6,7 @@ using Robust.Shared.Maths; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using YamlDotNet.RepresentationModel; +using System; namespace Content.Shared.Chemistry { @@ -19,6 +20,7 @@ namespace Content.Shared.Chemistry private string _id; private string _name; private string _description; + private string _physicalDescription; private Color _substanceColor; private List _metabolism; private string _spritePath; @@ -26,7 +28,9 @@ namespace Content.Shared.Chemistry public string ID => _id; public string Name => _name; public string Description => _description; + public string PhysicalDescription => _physicalDescription; public Color SubstanceColor => _substanceColor; + //List of metabolism effects this reagent has, should really only be used server-side. public List Metabolism => _metabolism; public string SpriteReplacementPath => _spritePath; @@ -43,13 +47,36 @@ namespace Content.Shared.Chemistry serializer.DataField(ref _id, "id", string.Empty); serializer.DataField(ref _name, "name", string.Empty); serializer.DataField(ref _description, "desc", string.Empty); + serializer.DataField(ref _physicalDescription, "physicalDesc", string.Empty); serializer.DataField(ref _substanceColor, "color", Color.White); serializer.DataField(ref _spritePath, "spritePath", string.Empty); if (_moduleManager.IsServerModule) - serializer.DataField(ref _metabolism, "metabolism", new List {new DefaultMetabolizable()}); + { + serializer.DataField(ref _metabolism, "metabolism", new List { new DefaultMetabolizable() }); + } else + { _metabolism = new List { new DefaultMetabolizable() }; + } + } + + /// + /// If the substance color is too dark we user a lighter version to make the text color readable when the user examines a solution. + /// + public Color GetSubstanceTextColor() + { + var highestValue = MathF.Max(SubstanceColor.R, MathF.Max(SubstanceColor.G, SubstanceColor.B)); + var difference = 0.5f - highestValue; + + if (difference > 0f) + { + return new Color(SubstanceColor.R + difference, + SubstanceColor.G + difference, + SubstanceColor.B + difference); + } + + return SubstanceColor; } } } diff --git a/Content.Shared/Chemistry/Solution.cs b/Content.Shared/Chemistry/Solution.cs index 9db9a0a101..988bf74402 100644 --- a/Content.Shared/Chemistry/Solution.cs +++ b/Content.Shared/Chemistry/Solution.cs @@ -246,7 +246,7 @@ namespace Content.Shared.Chemistry } [Serializable, NetSerializable] - public readonly struct ReagentQuantity + public readonly struct ReagentQuantity: IComparable { public readonly string ReagentId; public readonly ReagentUnit Quantity; @@ -262,6 +262,8 @@ namespace Content.Shared.Chemistry { return $"{ReagentId}:{Quantity}"; } + + public int CompareTo(ReagentQuantity other) { return Quantity.Float().CompareTo(other.Quantity.Float()); } } #region Enumeration diff --git a/Content.Shared/Chemistry/SolutionCaps.cs b/Content.Shared/Chemistry/SolutionCaps.cs index 6f5ecb3bda..c1047d265b 100644 --- a/Content.Shared/Chemistry/SolutionCaps.cs +++ b/Content.Shared/Chemistry/SolutionCaps.cs @@ -8,15 +8,19 @@ namespace Content.Shared.Chemistry /// [Flags] [Serializable, NetSerializable] - public enum SolutionCaps + public enum SolutionContainerCaps { - None = 0, + None = 0, - PourIn = 1, - PourOut = 2, + /// + /// Can solutions be added into the container? + /// + AddTo = 1, - Injector = 4, - Injectable = 8, + /// + /// Can solutions be removed from the container? + /// + RemoveFrom = 2, /// /// Allows the container to be placed in a ReagentDispenserComponent. @@ -24,8 +28,11 @@ namespace Content.Shared.Chemistry /// Allows us to have obscenely large containers that are harder to abuse in chem dispensers /// since they can't be placed directly in them. /// - FitsInDispenser = 16, + FitsInDispenser = 4, - NoExamine = 32, + /// + /// Can people examine the solution in the container or is it impossible to see? + /// + NoExamine = 8, } } diff --git a/Content.Shared/GameObjects/Components/Chemistry/SharedSolutionComponent.cs b/Content.Shared/GameObjects/Components/Chemistry/SharedSolutionContainerComponent.cs similarity index 71% rename from Content.Shared/GameObjects/Components/Chemistry/SharedSolutionComponent.cs rename to Content.Shared/GameObjects/Components/Chemistry/SharedSolutionContainerComponent.cs index 93fa5d5aab..170cf22944 100644 --- a/Content.Shared/GameObjects/Components/Chemistry/SharedSolutionComponent.cs +++ b/Content.Shared/GameObjects/Components/Chemistry/SharedSolutionContainerComponent.cs @@ -4,9 +4,9 @@ using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Chemistry { - public class SharedSolutionComponent : Component + public class SharedSolutionContainerComponent : Component { - public override string Name => "Solution"; + public override string Name => "SolutionContainer"; /// public sealed override uint? NetID => ContentNetIDs.SOLUTION; @@ -28,13 +28,13 @@ namespace Content.Shared.GameObjects.Components.Chemistry { base.HandleComponentState(curState, nextState); - if(curState == null) + if (curState == null) + { return; - - var compState = (SolutionComponentState)curState; - - //TODO: Make me work! + } + + // var compState = (SolutionComponentState)curState; + // Is there anything we even need to sync with client? } - } } diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index eaaf44c683..6604650a1c 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -580,8 +580,8 @@ entities: pos: -15.694785,24.608267 rot: -1.5707963267948966 rad type: Transform - - caps: PourIn, PourOut, Injectable - type: Solution + - caps: AddTo, RemoveFrom + type: SolutionContainer - anchored: False type: Collidable - uid: 60 @@ -718,8 +718,8 @@ entities: pos: -3.470539,16.956116 rot: -1.5707963267948966 rad type: Transform - - caps: PourIn, PourOut, Injectable - type: Solution + - caps: AddTo, RemoveFrom + type: SolutionContainer - anchored: False type: Collidable - uid: 74 @@ -1037,8 +1037,8 @@ entities: - parent: 857 pos: 8.661116,25.513401 type: Transform - - caps: PourIn, PourOut, Injectable - type: Solution + - caps: AddTo, RemoveFrom + type: SolutionContainer - anchored: False type: Collidable - uid: 114 @@ -22848,7 +22848,7 @@ entities: rot: 3.141592653589793 rad type: Transform - fillingSteps: 0 - type: Solution + type: SolutionContainer - anchored: False type: Collidable - uid: 1219 @@ -32479,8 +32479,8 @@ entities: pos: -8.476567,-17.420076 rot: -1.5707963267948966 rad type: Transform - - caps: PourIn, PourOut, Injectable - type: Solution + - caps: AddTo, RemoveFrom + type: SolutionContainer - anchored: False type: Collidable - uid: 2454 diff --git a/Resources/Prototypes/Entities/Clothing/Gloves/gloves.yml b/Resources/Prototypes/Entities/Clothing/Gloves/gloves.yml index 7f51cc42d8..dcfea05baf 100644 --- a/Resources/Prototypes/Entities/Clothing/Gloves/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Gloves/gloves.yml @@ -118,8 +118,8 @@ - type: entity parent: GlovesBase id: GlovesGray - name: gray gloves - description: Regular gray gloves that do not keep you from frying. + name: grey gloves + description: Regular grey gloves that do not keep you from frying. components: - type: Sprite sprite: Clothing/Gloves/gray.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Head/animals.yml b/Resources/Prototypes/Entities/Clothing/Head/animals.yml index 93e1dcc86b..ebbfd9698e 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/animals.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/animals.yml @@ -28,7 +28,7 @@ parent: HatBase id: HatMouseGray name: mouse gray - description: This is a head of a gray mouse. Squeak! + description: This is a head of a grey mouse. Squeak! components: - type: Sprite sprite: Clothing/Head/mouse_gray.rsi diff --git a/Resources/Prototypes/Entities/Constructible/Power/microwave.yml b/Resources/Prototypes/Entities/Constructible/Power/microwave.yml index 30dc14f5f8..9dc60af17e 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/microwave.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/microwave.yml @@ -10,9 +10,9 @@ - type: Microwave - type: Clickable - type: InteractionOutline - - type: Solution + - type: SolutionContainer maxVol: 100 - caps: 1 + caps: AddTo - type: Appearance visuals: - type: MicrowaveVisualizer diff --git a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/fuel_tank.yml b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/fuel_tank.yml index cc088b766c..5778b28f9a 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/fuel_tank.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/fuel_tank.yml @@ -13,7 +13,7 @@ heavyImpactRange: 2 lightImpactRange: 6 flashRange: 5 - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.WeldingFuel diff --git a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml index f13e61dbe2..0a0e90e161 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml @@ -27,9 +27,9 @@ Anchored: false - type: Destructible deadThreshold: 10 - - type: Solution + - type: SolutionContainer maxVol: 1500 - caps: 2 + caps: RemoveFrom - type: Pourable transferAmount: 100.0 placement: diff --git a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/water_tank.yml b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/water_tank.yml index 5e6c0b5909..a8c7490fe3 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/water_tank.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/water_tank.yml @@ -17,7 +17,7 @@ id: WaterTankFull suffix: Full components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.H2O diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 24a01b43c6..6e369a458a 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -18,9 +18,9 @@ - type: Hunger - type: Thirst # Organs - - type: Solution + - type: SolutionContainer maxVol: 250 - caps: 32 + caps: AddTo, RemoveFrom, NoExamine - type: Bloodstream max_volume: 100 - type: Stomach diff --git a/Resources/Prototypes/Entities/Objects/Consumable/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/drinks.yml index a2f00630a2..2d03a07a9f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/drinks.yml @@ -6,8 +6,9 @@ id: DrinkBase abstract: true components: - - type: Solution + - type: SolutionContainer maxVol: 50 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: Drink @@ -15,7 +16,7 @@ state: icon - type: Icon state: icon - - type: CanSpill + - type: Spillable - type: entity parent: DrinkBase @@ -35,10 +36,10 @@ sprite: Objects/Consumable/Drinks/glass_clear.rsi - type: Icon sprite: Objects/Consumable/Drinks/glass_clear.rsi - - type: Solution + - type: SolutionContainer fillingState: glass maxVol: 50 - caps: 16 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: TransformableContainer @@ -47,9 +48,9 @@ parent: DrinkGlassBase id: DrinkAleglass name: ale - description: A dark alchoholic beverage made by malted barley and yeast. + description: A dark alchoholic beverage made with malted barley and yeast. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -66,7 +67,7 @@ name: anti-freeze description: Ultimate refreshment. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -84,7 +85,7 @@ name: atomic bomb glass description: Nuclear proliferation never tasted so good. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -102,7 +103,7 @@ name: b-52 glass description: Coffee, Irish Cream, and cognac. You will get bombed. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -144,7 +145,7 @@ name: beer # beer it is. coffee. beer? coff-ee? be-er? c-o... b-e description: An alcoholic beverage made from malted grains, hops, yeast, and water. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -161,7 +162,7 @@ name: beer glass description: An alcoholic beverage made from malted grains, hops, yeast, and water. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -305,7 +306,7 @@ name: coffee description: Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -322,7 +323,7 @@ name: cognac glass description: A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -339,7 +340,7 @@ name: space cola bottle description: Cola. in space components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -356,7 +357,7 @@ name: cream description: Dairy product composed of the higher-fat layer skimmed from the top of milk before homogenization. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -373,7 +374,7 @@ name: cuba libre glass description: Rum, mixed with cola. Viva la revolucion. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -642,7 +643,7 @@ name: milk description: An opaque white liquid produced by the mammary glands of mammals. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -804,7 +805,7 @@ name: ice glass description: Water frozen into a solid state. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -821,7 +822,7 @@ name: irish car bomb description: Mmm, tastes like chocolate cake... components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -838,7 +839,7 @@ name: irish coffee glass description: Coffee, and alcohol. More fun than a Mimosa to drink in the morning. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -855,7 +856,7 @@ name: irish cream glass description: Whiskey-imbued cream, what else would you expect from the Irish. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -908,7 +909,7 @@ name: kahlua glass description: A widely known, Mexican coffee-flavoured liqueur. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1045,7 +1046,7 @@ name: the manly dorf glass description: Beer and Ale, brought together in a delicious mix. Intended for true men only. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1098,7 +1099,7 @@ name: milk jug description: An opaque white liquid produced by the mammary glands of mammals. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1597,7 +1598,7 @@ name: syndicate bomb description: Tastes like terrorism! components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1614,7 +1615,7 @@ name: tea glass description: Tasty black tea. Contains caffeine. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1631,7 +1632,7 @@ name: teapot # short and stout description: An elegant teapot. It simply oozes class. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1822,7 +1823,7 @@ name: whiskey cola glass description: Whiskey, mixed with cola. Surprisingly refreshing. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1839,7 +1840,7 @@ name: special blend whiskey glass description: Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -1892,7 +1893,7 @@ name: wine glass description: An premium alchoholic beverage made from distilled grape juice. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/drinks_bottles.yml index 7e153d80b8..e1eabe3746 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/drinks_bottles.yml @@ -5,14 +5,15 @@ components: - type: Drink openSounds: bottleOpenSounds - - type: Solution + - type: SolutionContainer + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: Sprite state: icon - type: Icon state: icon - - type: CanSpill + - type: Spillable - type: entity parent: DrinkBottleBaseFull @@ -44,7 +45,7 @@ name: magm-ale description: A true dorf's drink of choice. components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: @@ -73,7 +74,7 @@ name: cognac bottle description: A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time. components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: @@ -114,7 +115,7 @@ name: kahlua bottle description: A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: @@ -191,7 +192,7 @@ name: vodka bottle description: Aah, vodka. Prime choice of drink AND fuel by Russians worldwide. components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: @@ -208,7 +209,7 @@ name: uncle git's special reserve description: A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES. components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: @@ -225,7 +226,7 @@ name: doublebearded bearded special wine bottle description: A faint aura of unease and asspainery surrounds the bottle. components: - - type: Solution + - type: SolutionContainer maxVol: 80 contents: reagents: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/drinks_cans.yml index 0723ed75d4..1e1223e8fd 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/drinks_cans.yml @@ -6,8 +6,9 @@ - type: Drink openSounds: canOpenSounds pressurized: true - - type: Solution + - type: SolutionContainer maxVol: 20 + caps: AddTo, RemoveFrom contents: reagents: - ReagentId: chem.Cola @@ -18,7 +19,7 @@ state: icon - type: Icon state: icon - - type: CanSpill + - type: Spillable - type: entity parent: DrinkCanBaseFull @@ -26,7 +27,7 @@ name: space cola description: A refreshing beverage. components: - - type: Solution + - type: SolutionContainer - type: Sprite sprite: Objects/Consumable/Drinks/cola.rsi - type: Icon @@ -37,8 +38,8 @@ - type: entity parent: DrinkCanBaseFull id: DrinkIceTeaCan - name: ice tea can - description: A can of refreshing ice tea. + name: iced tea can + description: A refreshing can of iced tea. components: - type: Sprite sprite: Objects/Consumable/Drinks/ice_tea_can.rsi @@ -51,7 +52,7 @@ parent: DrinkCanBaseFull id: DrinkLemonLimeCan name: lemon-lime can - description: You wanted ORANGE. It gave you Lemon Lime. + description: You wanted ORANGE. It gave you Lemon-Lime. components: - type: Sprite sprite: Objects/Consumable/Drinks/lemon-lime.rsi @@ -64,7 +65,7 @@ parent: DrinkCanBaseFull id: DrinkGrapeCan name: grape soda can - description: 'Sweetened drink with a grape flavor and a deep purple color.' + description: Sweetened drink with a grape flavor and a deep purple color. components: - type: Sprite sprite: Objects/Consumable/Drinks/purple_can.rsi @@ -156,8 +157,8 @@ - type: entity parent: DrinkCanBaseFull id: DrinkEnergyDrink - name: Energy drink - description: '' + name: red bool energy drink + description: A can of Red Bool, with enough caffeine to kill a horse. components: - type: Drink - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Consumable/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/drinks_cups.yml index 6200536472..257f1021fd 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/drinks_cups.yml @@ -5,8 +5,9 @@ name: base cup abstract: true components: - - type: Solution + - type: SolutionContainer maxVol: 20 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: Drink @@ -15,7 +16,7 @@ state: icon - type: Icon state: icon - - type: CanSpill + - type: Spillable - type: entity parent: DrinkBaseCup @@ -23,7 +24,7 @@ name: golden cup description: A golden cup components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/golden_cup.rsi @@ -36,7 +37,7 @@ name: insulated pitcher description: A stainless steel insulated pitcher. Everyone's best friend in the morning. components: - - type: Solution + - type: SolutionContainer maxVol: 15 - type: Sprite sprite: Objects/Consumable/Drinks/pitcher.rsi @@ -55,7 +56,7 @@ name: mug description: A plain white mug. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug.rsi @@ -74,7 +75,7 @@ name: mug black description: A sleek black mug. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_black.rsi @@ -93,7 +94,7 @@ name: mug blue description: A blue and black mug. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_blue.rsi @@ -112,7 +113,7 @@ name: mug green description: A pale green and pink mug. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_green.rsi @@ -131,7 +132,7 @@ name: mug heart description: A white mug, it prominently features a red heart. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_heart.rsi @@ -150,7 +151,7 @@ name: mug metal description: A metal mug. You're not sure which metal. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_metal.rsi @@ -169,7 +170,7 @@ name: mug moebius description: A mug with a Moebius Laboratories logo on it. Not even your morning coffee is safe from corporate advertising. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_moebius.rsi @@ -188,7 +189,7 @@ name: "#1 mug" description: "A white mug, it prominently features a #1." components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_one.rsi @@ -207,7 +208,7 @@ name: mug rainbow description: A rainbow mug. The colors are almost as blinding as a welder. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_rainbow.rsi @@ -226,7 +227,7 @@ name: mug red description: A red and black mug. components: - - type: Solution + - type: SolutionContainer maxVol: 10 - type: Sprite sprite: Objects/Consumable/Drinks/mug_red.rsi @@ -257,7 +258,7 @@ name: Coffee description: Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -274,7 +275,7 @@ name: Teacup description: A plain white porcelain teacup. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: @@ -295,9 +296,9 @@ parent: DrinkBaseCup id: DrinkLean name: Lean - description: Bro Drake has such a cool fade bro Drake is the best bro c'mon bro he's + description: Bro Drake has such a cool fade bro Drake is the best bro c'mon bro. components: - - type: Solution + - type: SolutionContainer maxVol: 20 contents: reagents: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/food.yml b/Resources/Prototypes/Entities/Objects/Consumable/food.yml index 77c33ed7b0..262c7e2770 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/food.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/food.yml @@ -27,7 +27,7 @@ components: - type: Food trash: TrashRaisins - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -45,7 +45,7 @@ id: FoodAesirSalad description: Probably too incredible for mortal men to fully enjoy. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -62,7 +62,7 @@ id: FoodAmanitaPie description: Sweet and tasty poison pie. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -80,7 +80,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -97,7 +97,7 @@ # description: # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # - type: Sprite # sprite: Objects/Consumable/Food/ambrosiavulgariscrushed.rsi @@ -112,7 +112,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -128,7 +128,7 @@ id: FoodApplePie description: A pie containing sweet sweet love... or apple. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -146,7 +146,7 @@ # description: # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # - type: Sprite # sprite: Objects/Consumable/Food/bacon.rsi @@ -159,7 +159,7 @@ id: FoodBadRecipe description: Someone should be demoted from chef for this. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -175,7 +175,7 @@ id: FoodBaguette description: Bon appetit! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -193,7 +193,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -211,7 +211,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -229,7 +229,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -246,7 +246,7 @@ # description: # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # - type: Sprite # sprite: Objects/Consumable/Food/bearmeat.rsi @@ -261,7 +261,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -279,7 +279,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -297,7 +297,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -315,7 +315,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -333,7 +333,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -351,7 +351,7 @@ components: - type: Food trash: TrashCandy - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -369,7 +369,7 @@ id: FoodCandyCorn description: It's a handful of candy corn. Cannot be stored in a detective's hat, alas. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -387,7 +387,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -405,7 +405,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -423,7 +423,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -439,7 +439,7 @@ id: FoodCheeseburger description: The cheese adds a good flavor. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -459,7 +459,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -475,7 +475,7 @@ id: FoodCheeseWedge description: A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -493,7 +493,7 @@ components: - type: Food trash: TrashCheesieHonkers - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -511,7 +511,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -527,7 +527,7 @@ id: FoodCherryPie description: Taste so good, make a grown man cry. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -545,7 +545,7 @@ components: - type: Food trash: TrashChips - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -565,7 +565,7 @@ components: - type: Item size: 10 - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -583,7 +583,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -599,7 +599,7 @@ id: FoodChocolateEgg description: Such sweet, fattening food. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -615,7 +615,7 @@ id: FoodClownBurger description: This tastes funny... components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -633,7 +633,7 @@ id: FoodClownsTears description: Not very funny. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -650,7 +650,7 @@ # description: # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 3 # - type: Sprite @@ -666,7 +666,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -683,7 +683,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -697,7 +697,7 @@ name: cookie!!! description: COOKIE!!! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -713,7 +713,7 @@ name: cracker description: It's a salted cracker. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -731,7 +731,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -749,7 +749,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -766,7 +766,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -780,7 +780,7 @@ name: donk-pocket description: The food of choice for the seasoned traitor. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -796,7 +796,7 @@ name: donut description: Goes great with Robust Coffee. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -814,7 +814,7 @@ name: frosted donut description: Goes great with Robust Coffee. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -832,7 +832,7 @@ name: egg-blue description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -850,7 +850,7 @@ name: egg-green description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -868,7 +868,7 @@ name: egg-mime description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -886,7 +886,7 @@ name: egg-orange description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -904,7 +904,7 @@ name: egg-purple description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -922,7 +922,7 @@ name: egg-rainbow description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -940,7 +940,7 @@ name: egg-red description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -959,7 +959,7 @@ name: egg-yellow description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -977,7 +977,7 @@ name: egg description: An egg! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -997,7 +997,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1014,7 +1014,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1030,7 +1030,7 @@ components: - type: Food trash: TrashTray - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1047,7 +1047,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1062,7 +1062,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1076,7 +1076,7 @@ name: fish and chips description: I do say so myself chap. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1092,7 +1092,7 @@ name: fillet -o- carp sandwich description: Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1111,7 +1111,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1125,7 +1125,7 @@ name: fish fingers description: A finger of fish. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1142,7 +1142,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1156,7 +1156,7 @@ name: fortune cookie description: A true prophecy in each cookie! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1172,7 +1172,7 @@ name: fried egg description: A fried egg, with a touch of salt and pepper. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1190,7 +1190,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1208,7 +1208,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1226,7 +1226,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1242,7 +1242,7 @@ name: human-burger description: A bloody burger. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1262,7 +1262,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1279,7 +1279,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1295,7 +1295,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1311,7 +1311,7 @@ name: hotdog description: Unrelated to dogs, maybe. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1328,7 +1328,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1342,7 +1342,7 @@ name: huge mushroom (slice) description: A slice from a huge mushroom. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1360,7 +1360,7 @@ components: - type: Food # trash: TODO - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1376,7 +1376,7 @@ name: jelly donut description: You jelly? components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1392,7 +1392,7 @@ name: frosted jelly donut description: You jelly? components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1408,7 +1408,7 @@ name: jelly burger description: Culinary delight..? components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1428,7 +1428,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1446,7 +1446,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1465,7 +1465,7 @@ components: - type: Food # trash: TODO - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1482,7 +1482,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1497,7 +1497,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1513,7 +1513,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1531,7 +1531,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1547,7 +1547,7 @@ name: liquidfood ration #\improper? description: A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy? components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1563,7 +1563,7 @@ name: loaded baked potato description: Totally baked. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1579,7 +1579,7 @@ name: meat description: A slab of meat. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1595,7 +1595,7 @@ name: meatball description: A great meal all round. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1615,7 +1615,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1633,7 +1633,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1651,7 +1651,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1669,7 +1669,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1685,7 +1685,7 @@ name: meat pizza (slice) description: A slice of a meaty pizza. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1703,7 +1703,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1721,7 +1721,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1737,7 +1737,7 @@ name: mime burger description: Its taste defies language. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1753,7 +1753,7 @@ name: mint description: It is only wafer thin. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1770,7 +1770,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1784,7 +1784,7 @@ name: monkey-burger description: The cornerstone of every nutritious breakfast. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1802,7 +1802,7 @@ name: monkey cube description: Just add water! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1820,7 +1820,7 @@ components: - type: Food trash: TrashTray - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1837,7 +1837,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1852,7 +1852,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1866,7 +1866,7 @@ name: mushroom pizza slice description: Maybe it is the last slice of pizza in your life. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1884,7 +1884,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1903,7 +1903,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1921,7 +1921,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1938,7 +1938,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -1954,7 +1954,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1972,7 +1972,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -1990,7 +1990,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2007,7 +2007,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2021,7 +2021,7 @@ name: plump helm biscuit description: This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2037,7 +2037,7 @@ name: margherita pizza (slice) description: A slice of the classic pizza. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2055,7 +2055,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2071,7 +2071,7 @@ name: plump pie description: I bet you love stuff made out of plump helmets! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2089,7 +2089,7 @@ components: - type: Food trash: TrashPopcorn - - type: Solution + - type: SolutionContainer transfer_amount: 1 contents: reagents: @@ -2106,7 +2106,7 @@ name: poppy pretzel description: It's all twisted up! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2124,7 +2124,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2142,7 +2142,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2156,7 +2156,7 @@ name: roburger description: The lettuce is the only organic component. Beep. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2174,7 +2174,7 @@ components: - type: Food trash: TrashWaffles - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2191,7 +2191,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2206,7 +2206,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2222,7 +2222,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2240,7 +2240,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2257,7 +2257,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2272,7 +2272,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2286,7 +2286,7 @@ name: sausage # sanga description: A piece of mixed, long meat. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2303,7 +2303,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2318,7 +2318,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2332,7 +2332,7 @@ name: scaredy's private reserve beef jerky description: Beef jerky made from the finest space cows. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2353,7 +2353,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2371,7 +2371,7 @@ components: - type: Food trash: TrashWaffles - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2390,7 +2390,7 @@ components: - type: Food trash: TrashWaffles - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2407,7 +2407,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2421,7 +2421,7 @@ name: space twinkie description: Guaranteed to survive longer then you will. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2439,7 +2439,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2455,7 +2455,7 @@ name: spaghetti description: A bundle of raw spaghetti. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2471,7 +2471,7 @@ name: spell burger description: This is absolutely Ei Nath. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2489,7 +2489,7 @@ name: spesslaw description: A lawyers favourite components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2505,7 +2505,7 @@ name: stew description: A nice and warm stew. Healthy and strong. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2523,7 +2523,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2539,7 +2539,7 @@ name: stuffing description: Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2556,7 +2556,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2571,7 +2571,7 @@ # description: '' # components: # - type: Food -# - type: Solution +# - type: SolutionContainer # uses: 1 # restore_amount: 1 # - type: Sprite @@ -2585,7 +2585,7 @@ name: Super Bite Burger description: This is a mountain of a burger. FOOD! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2603,7 +2603,7 @@ components: - type: Food trash: TrashSyndiCakes - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2619,7 +2619,7 @@ name: taco description: Take a bite! components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2637,7 +2637,7 @@ components: - type: Food trash: TrashTastyBread - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2655,7 +2655,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2671,7 +2671,7 @@ name: tofu description: We all love tofu. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2689,7 +2689,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2705,7 +2705,7 @@ name: tofu burger description: What.. is that meat? components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2725,7 +2725,7 @@ components: - type: Food # trash: TODO - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2741,7 +2741,7 @@ name: tofurkey description: A fake turkey made from tofu. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2757,7 +2757,7 @@ name: tomato slice description: A slice from a huge tomato components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2775,7 +2775,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2791,7 +2791,7 @@ name: two bread description: It is very bitter and winy. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2809,7 +2809,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2825,7 +2825,7 @@ name: vegetable pizza (slice) description: A slice of the most green pizza of all pizzas not containing green ingredients components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2843,7 +2843,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2861,7 +2861,7 @@ components: - type: Food trash: TrashWaffles - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2877,7 +2877,7 @@ name: watermelon (slice) description: A slice of watery goodness. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2895,7 +2895,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2913,7 +2913,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2929,7 +2929,7 @@ name: xenoburger description: Smells caustic. Tastes like heresy. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2949,7 +2949,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2965,7 +2965,7 @@ name: xenomeat description: Yum. components: - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -2983,7 +2983,7 @@ components: - type: Food trash: TrashPlate - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -3001,7 +3001,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Bleach @@ -3020,7 +3020,7 @@ components: - type: Food trash: TrashSnackBowl - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -3038,7 +3038,7 @@ components: - type: Food trash: TrashBananaPeel - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment @@ -3055,7 +3055,7 @@ description: It makes you irrationally angry just looking at it. components: - type: Food - - type: Solution + - type: SolutionContainer contents: reagents: - ReagentId: chem.Nutriment diff --git a/Resources/Prototypes/Entities/Objects/Consumable/kitchen_reagent_containers.yml b/Resources/Prototypes/Entities/Objects/Consumable/kitchen_reagent_containers.yml index e33a5bf33f..940bdee2be 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/kitchen_reagent_containers.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/kitchen_reagent_containers.yml @@ -4,8 +4,9 @@ name: flour description: Not to be confused with flower. components: - - type: Solution + - type: SolutionContainer maxVol: 50 + caps: AddTo, RemoveFrom contents: reagents: - ReagentId: chem.Flour @@ -19,4 +20,4 @@ - type: Icon sprite: Objects/Consumable/Food/flour.rsi state: icon - - type: CanSpill + - type: Spillable diff --git a/Resources/Prototypes/Entities/Objects/Consumable/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/trash_drinks.yml index 7ea2dc9275..b03140442e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/trash_drinks.yml @@ -11,13 +11,14 @@ state: icon - type: Icon state: icon - - type: Solution + - type: SolutionContainer maxVol: 10 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: Drink isOpen: true - - type: CanSpill + - type: Spillable # Containers diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index f1c5501fe1..493e448846 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -14,9 +14,9 @@ - type: Item sprite: Objects/Misc/fire_extinguisher.rsi size: 10 - - type: Solution + - type: SolutionContainer maxVol: 1000 - caps: 9 + caps: AddTo, RemoveFrom, NoExamine contents: reagents: - ReagentId: chem.H2O diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index 7528a15332..047e74ec72 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -11,13 +11,13 @@ - type: Item sprite: Objects/Specific/Chemistry/beakers.rsi HeldPrefix: beaker - - type: Solution + - type: SolutionContainer fillingState: beaker maxVol: 50 - caps: 27 + caps: AddTo, RemoveFrom, FitsInDispenser # can add and remove solutions and fits in the chemmaster. - type: Pourable transferAmount: 5.0 - - type: CanSpill + - type: Spillable - type: entity name: large beaker @@ -32,13 +32,13 @@ - type: Item sprite: Objects/Specific/Chemistry/beakers.rsi HeldPrefix: beaker - - type: Solution + - type: SolutionContainer fillingState: beakerlarge maxVol: 100 - caps: 27 + caps: AddTo, RemoveFrom, FitsInDispenser - type: Pourable transferAmount: 5.0 - - type: CanSpill + - type: Spillable - type: entity name: dropper @@ -50,14 +50,14 @@ texture: Objects/Specific/Chemistry/dropper.rsi/dropper.png - type: Icon texture: Objects/Specific/Chemistry/dropper.rsi/dropper.png - - type: Solution + - type: SolutionContainer fillingState: dropper fillingSteps: 2 maxVol: 5 - caps: 19 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5.0 - - type: CanSpill + - type: Spillable - type: entity name: syringe @@ -69,14 +69,14 @@ texture: Objects/Specific/Chemistry/syringe.rsi/0.png - type: Icon texture: Objects/Specific/Chemistry/syringe.rsi/0.png - - type: Solution + - type: SolutionContainer fillingState: syringe fillingSteps: 5 maxVol: 15 - caps: 19 + caps: AddTo, RemoveFrom - type: Injector injectOnly: false - - type: CanSpill + - type: Spillable - type: entity name: bottle @@ -84,15 +84,16 @@ id: bottle components: - type: Drink - - type: Solution + - type: SolutionContainer maxVol: 30 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5 - type: Sprite texture: Objects/Specific/Chemistry/bottle.rsi/bottle.png - type: Icon texture: Objects/Specific/Chemistry/bottle.rsi/bottle.png - - type: CanSpill + - type: Spillable - type: entity name: pill @@ -101,8 +102,9 @@ description: It's not a suppository. components: - type: Pill - - type: Solution + - type: SolutionContainer maxVol: 50 + caps: RemoveFrom - type: Sprite texture: Objects/Specific/Chemistry/pills.rsi/pill.png - type: Icon diff --git a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml index 419856502b..0a7dffcd5a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml @@ -14,9 +14,9 @@ size: 10 sprite: Objects/Specific/Janitorial/mop.rsi - type: Mop - - type: Solution + - type: SolutionContainer maxVol: 10 - caps: 1 + caps: AddTo, RemoveFrom - type: LoopingSound - type: entity @@ -33,9 +33,9 @@ - type: InteractionOutline - type: Bucket - type: LoopingSound - - type: Solution + - type: SolutionContainer maxVol: 500 - caps: 3 + caps: AddTo, RemoveFrom - type: Collidable shapes: - !type:PhysShapeAabb @@ -49,14 +49,14 @@ - type: Physics mass: 5 anchored: false - - type: CanSpill + - type: Spillable - type: Pullable - type: entity parent: BaseItem name: bucket id: Bucket - description: "Dear God." + description: It's a boring old bucket. components: - type: Clickable - type: Sprite @@ -66,9 +66,9 @@ texture: Objects/Specific/Janitorial/bucket.png - type: Bucket - type: LoopingSound - - type: Solution + - type: SolutionContainer maxVol: 500 - caps: 3 + caps: AddTo, RemoveFrom - type: Collidable shapes: - !type:PhysShapeAabb @@ -79,7 +79,7 @@ - type: Physics mass: 5 anchored: false - - type: CanSpill + - type: Spillable - type: entity name: wet floor sign @@ -190,12 +190,12 @@ texture: Objects/Specific/Janitorial/cleaner.png - type: Icon texture: Objects/Specific/Janitorial/cleaner.png - - type: Solution + - type: SolutionContainer maxVol: 100 - caps: 1 + caps: AddTo, RemoveFrom - type: Pourable transferAmount: 5.0 - - type: CanSpill + - type: Spillable - type: Spray transferAmount: 10 sprayVelocity: 5 diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index bb8b312c91..ad297957de 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -89,9 +89,9 @@ - type: ItemCooldown - type: MeleeWeapon - type: ItemStatus - - type: Solution + - type: SolutionContainer maxVol: 100 - caps: 9 + caps: AddTo, NoExamine contents: reagents: - ReagentId: chem.WeldingFuel diff --git a/Resources/Prototypes/Entities/chemistry.yml b/Resources/Prototypes/Entities/chemistry.yml index 4dc90f70a0..a1861d7994 100644 --- a/Resources/Prototypes/Entities/chemistry.yml +++ b/Resources/Prototypes/Entities/chemistry.yml @@ -4,7 +4,7 @@ name: "reagent item" abstract: true components: - - type: Solution + - type: SolutionContainer maxVol: 5 - type: entity @@ -14,7 +14,7 @@ components: - type: SnapGrid offset: Center - - type: Solution + - type: SolutionContainer maxVol: 50 - type: Vapor - type: Physics diff --git a/Resources/Prototypes/Entities/puddle.yml b/Resources/Prototypes/Entities/puddle.yml index f4a6faaab8..fcfb393adf 100644 --- a/Resources/Prototypes/Entities/puddle.yml +++ b/Resources/Prototypes/Entities/puddle.yml @@ -7,8 +7,8 @@ offset: Center - type: Sprite drawdepth: FloorObjects - - type: Solution - caps: 1 + - type: SolutionContainer + caps: AddTo, RemoveFrom - type: Puddle spill_sound: /Audio/Effects/Fluids/splat.ogg recolor: true diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 482f42721c..468ef7f909 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -2,6 +2,7 @@ id: chem.Nutriment name: nutriment desc: All the vitamins, minerals, and carbohydrates the body needs in pure form. + physicalDesc: opaque color: "#664330" metabolism: - !type:DefaultFood @@ -11,6 +12,7 @@ id: chem.H2SO4 name: sulfuric acid desc: A highly corrosive, oily, colorless liquid. + physicalDesc: oily color: "#BF8C00" boilingPoint: 337.0 meltingPoint: 10.31 @@ -18,7 +20,8 @@ - type: reagent id: chem.H2O name: water - desc: A tasty colorless liquid. + desc: A colorless liquid that humans need in order to survive. + physicalDesc: translucent color: "#c0e0ff20" boilingPoint: 100.0 meltingPoint: 0.0 @@ -30,6 +33,7 @@ id: chem.Ice name: ice desc: Frozen water. + physicalDesc: frosty color: "#bed8e6" meltingPoint: 0.0 boilingPoint: 100.0 @@ -38,7 +42,8 @@ id: chem.Phoron name: phoron desc: Funky, space-magic pixie dust. You probably shouldn't eat this, but we both know you will anyways. - color: "#500064" + physicalDesc: gaseous + color: "#7e009e" boilingPoint: -127.3 # Random values picked between the actual values for CO2 and O2 meltingPoint: -186.4 @@ -46,6 +51,7 @@ id: chem.Ethanol name: ethanol desc: A simple alcohol, makes you drunk if consumed, flammable. + physicalDesc: strong-smelling color: "#b05b3c" boilingPoint: 78.2 meltingPoint: -114.1 @@ -54,6 +60,7 @@ id: chem.Glucose name: glucose desc: A simple sugar found in many foods. + physicalDesc: syrupy color: "#ffffff" boilingPoint: 340282300000000000000000000000000000000 #Fun fact: Glucose can't boil. So let's just set it to the maximum float value. meltingPoint: 146.0 @@ -62,6 +69,7 @@ id: chem.Ammonia name: ammonia desc: An effective fertilizer which is better than what is available to the botanist initially, though it isn't as powerful as Diethylamine + physicalDesc: pungent color: "#77b58e" boilingPoint: -33.0 meltingPoint: -77.7 @@ -70,6 +78,7 @@ id: chem.Bleach name: bleach desc: Heavy duty cleaner that can clean tiles the same as Space Cleaner and also decontaminate clothes. Extremely toxic when ingested. + physicalDesc: strong-smelling color: "#a1000b" boilingPoint: 111.0 meltingPoint: -5.0 @@ -78,6 +87,7 @@ id: chem.Diethylamine name: diethylamine desc: A very potent fertilizer. + physicalDesc: strong-smelling color: "#a1000b" boilingPoint: 55.5 meltingPoint: -50.0 @@ -86,6 +96,7 @@ id: chem.FoamingAgent name: foaming agent desc: Makes foam such as that required in metal foam grenades + physicalDesc: foamy color: "#215263" boilingPoint: 418.0 # I went with ammonium lauryl sulfate as the basis for this meltingPoint: 7.4 # I made this up @@ -94,6 +105,7 @@ id: chem.PolytrinicAcid name: polytrinic acid desc: An extremely corrosive chemical substance. The slightest touch of it will melt off most masks and headgear, and it deals extreme damage to anyone who comes directly into contact with it. Spraying it on other items will usually melt them too, which does make it useful if the clown has covered the entire hallway in banana peels. + physicalDesc: strong-smelling color: "#a1000b" boilingPoint: 78.2 # This isn't a real chemical... meltingPoint: -19.4 @@ -102,7 +114,8 @@ id: chem.SpaceCleaner name: space cleaner desc: This is able to clean almost all surfaces of almost anything that may dirty them. The janitor is likely to appreciate refills. - color: "#215263" + physicalDesc: lemony fresh + color: "#c8ff69" boilingPoint: 147.0 # Made this up, loosely based on bleach meltingPoint: -11.0 @@ -110,6 +123,7 @@ id: chem.SpaceLube name: space lube desc: Space Lube is a high performance lubricant intended for maintenance of extremely complex mechanical equipment (and certainly not used to make people slip). + physicalDesc: shiny color: "#77b58e" boilingPoint: 290.0 # Glycerin meltingPoint: 18.2 @@ -118,6 +132,7 @@ id: chem.TableSalt name: table salt desc: Commonly known as salt, Sodium Chloride is often used to season food or kill borers instantly. + physicalDesc: grainy color: "#a1000b" boilingPoint: 1465.0 meltingPoint: 800.7 @@ -126,7 +141,8 @@ id: chem.Thermite name: thermite desc: A mixture that becomes extremely hot when ignited, and which can burn straight through walls when applied and ignited. It'll slowly inflict burn damage to anybody dumb enough to ingest it, but can't be ignited inside inside said dumb person. - color: "#77b58e" + physicalDesc: grainy + color: "#757245" boilingPoint: 2977.0 # Aluminum oxide meltingPoint: 2030.0 @@ -134,7 +150,8 @@ id: chem.UnstableMutagen name: unstable mutagen desc: Causes mutations when injected into living people or plants. High doses may be lethal, especially in humans. - color: "#77b58e" + physicalDesc: glowing + color: "#00ff5f" boilingPoint: 340282300000000000000000000000000000000 # Ethidium bromide, which doesn't boil. meltingPoint: 261.0 @@ -142,6 +159,7 @@ id: chem.WeldingFuel name: welding fuel desc: Used by welders to weld. + physicalDesc: oily color: "#a76b1c" boilingPoint: -84.7 # Acetylene. Close enough. meltingPoint: -80.7 diff --git a/Resources/Prototypes/Reagents/drinks.yml b/Resources/Prototypes/Reagents/drinks.yml index 6c93906100..13a308e3b6 100644 --- a/Resources/Prototypes/Reagents/drinks.yml +++ b/Resources/Prototypes/Reagents/drinks.yml @@ -2,6 +2,7 @@ id: chem.Whiskey name: whiskey desc: An alcoholic beverage made from fermented grain mash + physicalDesc: strong-smelling color: "#664300" spritePath: whiskeyglass.rsi @@ -9,13 +10,15 @@ id: chem.Ale name: ale desc: A type of beer brewed using a warm fermentation method, resulting in a sweet, full-bodied and fruity taste. - color: "#664300" + physicalDesc: bubbly + color: "#663100" spritePath: aleglass.rsi - type: reagent id: chem.Wine name: wine desc: An alcoholic drink made from fermented grapes + physicalDesc: translucent color: "#7E4043" spritePath: wineglass.rsi @@ -23,19 +26,36 @@ id: chem.Beer name: beer desc: A cold pint of pale lager. - color: "#664300" + physicalDesc: bubbly + color: "#cfa85f" spritePath: beerglass.rsi - type: reagent id: chem.Vodka name: vodka desc: The glass contain wodka. Xynta. - color: "#664300" + physicalDesc: strong-smelling + color: "#d1d1d155" + +- type: reagent + id: chem.Moonshine + name: moonshine + desc: Artisanal homemade liquor. What could go wrong? + physicalDesc: strong-smelling + color: "#d1d7d155" + +- type: reagent + id: chem.Tequila + name: tequila + desc: This stuff will get you fucked up. + physicalDesc: strong-smelling + color: "#d7d1d155" - type: reagent id: chem.Kahlua name: kahlua desc: A widely known, Mexican coffee-flavoured liqueur. In production since 1936! + physicalDesc: cloudy color: "#664300" spritePath: kahluaglass.rsi @@ -43,6 +63,7 @@ id: chem.Cognac name: cognac desc: A sweet and strongly alcoholic drink, twice distilled and left to mature for several years. Classy as fornication. + physicalDesc: strong-smelling color: "#AB3C05" spritePath: cognacglass.rsi @@ -50,6 +71,7 @@ id: chem.ManlyDorf name: manly dorf desc: A dwarfy concoction made from ale and beer. Intended for stout dwarves only. + physicalDesc: bubbly color: "#664300" spritePath: manlydorfglass.rsi @@ -57,6 +79,7 @@ id: chem.CubaLibre name: cuba libre desc: A classic mix of rum and cola. + physicalDesc: bubbly color: "#3E1B00" spritePath: cubalibreglass.rsi @@ -64,6 +87,7 @@ id: chem.IrishCarBomb name: irish car bomb desc: A troubling mixture of irish cream and ale. + physicalDesc: bubbly color: "#2E6671" spritePath: irishcarbomb.rsi @@ -71,6 +95,7 @@ id: chem.IrishCoffee name: irish coffee desc: Coffee served with irish cream. Regular cream just isn't the same! + physicalDesc: cloudy color: "#664300" spritePath: irishcoffeeglass.rsi @@ -78,6 +103,7 @@ id: chem.IrishCream name: irish cream desc: Whiskey-imbued cream. What else could you expect from the Irish. + physicalDesc: creamy color: "#664300" spritePath: irishcreamglass.rsi @@ -85,6 +111,7 @@ id: chem.B52 name: b-52 desc: Coffee, irish cream, and cognac. You will get bombed. + physicalDesc: bubbly color: "#664300" spritePath: b52glass.rsi @@ -92,6 +119,7 @@ id: chem.AtomicBomb name: atomic bomb desc: Nuclear proliferation never tasted so good. + physicalDesc: cloudy color: "#666300" spritePath: atomicbombglass.rsi @@ -99,6 +127,7 @@ id: chem.WhiskeyCola name: whiskey cola desc: An innocent-looking mixture of cola and whiskey. Delicious. + physicalDesc: bubbly color: "#3E1B00" spritePath: whiskeycolaglass.rsi @@ -106,22 +135,24 @@ id: chem.SyndicateBomb name: syndicate bomb desc: Somebody set us up the bomb! - color: "#2E6671" + physicalDesc: opaque + color: "#2E6660" spritePath: syndicatebomb.rsi - type: reagent id: chem.Antifreeze name: antifreeze desc: The ultimate refreshment. - color: "#664300" + physicalDesc: translucent + color: "#ff7d63" spritePath: antifreeze.rsi - - type: reagent id: chem.Cola name: cola desc: A sweet, carbonated soft drink. Caffeine free. - color: "#100800" + physicalDesc: fizzy + color: "#422912" metabolism: - !type:DefaultDrink rate: 1 @@ -130,6 +161,7 @@ id: chem.Coffee name: coffee desc: A drink made from brewed coffee beans. Contains a moderate amount of caffeine. + physicalDesc: aromatic color: "#664300" metabolism: - !type:DefaultDrink @@ -139,7 +171,8 @@ id: chem.Tea name: tea desc: A made by boiling leaves of the tea tree, Camellia sinensis. - color: "#101000" + physicalDesc: aromatic + color: "#8a5a3a" metabolism: - !type:DefaultDrink rate: 1 @@ -148,6 +181,7 @@ id: chem.Cream name: cream desc: The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh? + physicalDesc: creamy color: "#DFD7AF" metabolism: - !type:DefaultDrink @@ -157,16 +191,48 @@ id: chem.Milk name: milk desc: An opaque white liquid produced by the mammary glands of mammals. + physicalDesc: opaque color: "#DFDFDF" metabolism: - !type:DefaultDrink rate: 1 +- type: reagent + id: chem.SpoiledMilk + name: spoiled milk + desc: This milk has gone rancid. + physicalDesc: putrid + color: "#faffba" + metabolism: + - !type:DefaultDrink + rate: 1 + +- type: reagent + id: chem.CreamyDelight + name: creamy delight + desc: A combination of cream, wine and moonshine. Why would you do this? + physicalDesc: foul + color: "#a6969a" + metabolism: + - !type:DefaultDrink + rate: 1 + - type: reagent id: chem.Lean name: lean - desc: Turn up for days + desc: Turn up for days. + physicalDesc: bubbly color: "#9400D3" metabolism: - !type:DefaultDrink rate: 1 + +- type: reagent + id: chem.LeanShine + name: leanshine + desc: Lean mixed with moonshine. Turn up for months. + physicalDesc: bubbly + color: "#9d5fb8" + metabolism: + - !type:DefaultDrink + rate: 1 \ No newline at end of file diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index 50900bea4b..23a3213e50 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -2,6 +2,7 @@ id: chem.H name: hydrogen desc: A light, flammable gas. + physicalDesc: gaseous color: "#808080" boilingPoint: -253.0 meltingPoint: -259.2 @@ -10,6 +11,7 @@ id: chem.O name: oxygen desc: An oxidizing, colorless gas. + physicalDesc: gaseous color: "#808080" boilingPoint: -183.0 meltingPoint: -218.4 @@ -19,7 +21,8 @@ id: chem.S name: sulfur desc: A yellow, crystalline solid. - color: "#FFFACD" + physicalDesc: powdery + color: "#fff385" boilingPoint: 445.0 meltingPoint: 120.0 @@ -27,6 +30,7 @@ id: chem.C name: carbon desc: A black, crystalline solid. + physicalDesc: crystalline color: "#22282b" boilingPoint: 4200.0 meltingPoint: 3550.0 @@ -34,7 +38,8 @@ - type: reagent id: chem.Al name: aluminum - desc: A silvery-white, soft, non-magnetic, and ductile metal. + desc: A silver, soft, non-magnetic, and ductile metal. + physicalDesc: metallic color: "#848789" boilingPoint: 2327.0 meltingPoint: 660.0 @@ -43,6 +48,7 @@ id: chem.Cu name: copper desc: A soft, malleable, and ductile metal with very high thermal and electrical conductivity. + physicalDesc: metallic color: "#b05b3c" boilingPoint: 2595.0 meltingPoint: 1083.0 @@ -51,6 +57,7 @@ id: chem.N name: nitrogen desc: A colorless, odorless unreactive gas. Highly stable. + physicalDesc: gaseous color: "#808080" boilingPoint: -195.8 meltingPoint: -210.0 @@ -59,6 +66,7 @@ id: chem.Fe name: iron desc: A silvery-grey metal which forms iron oxides (rust) with contact with air. Commonly alloyed with other elements to create alloys such as steel. + physicalDesc: metallic color: "#434b4d" boilingPoint: 2862.0 meltingPoint: 1538.0 @@ -67,6 +75,7 @@ id: chem.F name: fluorine desc: A highly toxic pale yellow gas. Extremely reactive. + physicalDesc: gaseous color: "#808080" boilingPoint: -188.11 meltingPoint: -219.67 @@ -75,6 +84,7 @@ id: chem.Si name: silicon desc: A hard and brittle crystalline solid with a blue-grey color. + physicalDesc: crystalline color: "#364266" boilingPoint: 3265.0 meltingPoint: 1414.0 @@ -83,6 +93,7 @@ id: chem.Cl name: chlorine desc: A yellow-green gas which is toxic to humans. + physicalDesc: gaseous color: "#a2ff00" meltingPoint: -101.5 boilingPoint: -34.04 @@ -91,6 +102,7 @@ id: chem.Li name: lithium desc: A soft, silvery-white alkali metal. It is highly reactive, and ignites if it makes contact with water. + physicalDesc: shiny color: "#c6c8cc" meltingPoint: 180.5 boilingPoint: 1330.0 @@ -99,6 +111,7 @@ id: chem.Hg name: mercury desc: A silver metal which is liquid at room temperature. It is highly toxic to humans. + physicalDesc: shiny color: "#929296" meltingPoint: -38.83 boilingPoint: 356.73 @@ -107,14 +120,16 @@ id: chem.P name: phosphorus desc: A reactive metal used in pyrotechnics and weapons. - color: "#803330" + physicalDesc: powdery + color: "#ede4e4" meltingPoint: 44.2 boilingPoint: 280.5 - type: reagent id: chem.K name: potassium - desc: A soft, silvery-white metal. Even more reactive than lithium. + desc: A soft, shiny grey metal. Even more reactive than lithium. + physicalDesc: shiny color: "#c6c8cc" meltingPoint: 65.5 boilingPoint: 759.0 @@ -123,6 +138,7 @@ id: chem.Ra name: radium desc: A radioactive metal, silvery-white in it's pure form. It glows due to it's radioactivity and is highly toxic. + physicalDesc: glowing color: "#00ff04" meltingPoint: 700.0 boilingPoint: 1737.0 @@ -131,6 +147,7 @@ id: chem.Na name: sodium desc: A silvery-white alkali metal. Highly reactive in it's pure form. + physicalDesc: metallic color: "#c6c8cc" meltingPoint: 97.8 boilingPoint: 883.0 @@ -138,7 +155,8 @@ - type: reagent id: chem.U name: uranium - desc: A silvery-white metallic chemical element in the actinide series, weakly radioactive. - color: "#00ff06" + desc: A grey metallic chemical element in the actinide series, weakly radioactive. + physicalDesc: metallic + color: "#8fa191" meltingPoint: 1133.0 boilingPoint: 4131.0 diff --git a/Resources/Prototypes/Reagents/food_reagents.yml b/Resources/Prototypes/Reagents/food_reagents.yml index f967c66d30..e1ff042454 100644 --- a/Resources/Prototypes/Reagents/food_reagents.yml +++ b/Resources/Prototypes/Reagents/food_reagents.yml @@ -2,6 +2,7 @@ id: chem.Flour name: flour desc: Used for baking. + physicalDesc: powdery color: "#FFFFFF" metabolism: - !type:DefaultFood diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 69ecf8f435..a0a9558af6 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -2,245 +2,285 @@ id: chem.Alkycosine name: alkycosine desc: Lessens the damage to neurological tissue. More effective at treating brain damage than alkysine and also a fairly effective painkiller as well. Caution is needed in its creation to avoid mixing bleach and the chlorine needed to make alkysine. + physicalDesc: strong-smelling color: "#9e232b" - type: reagent id: chem.Alkysine name: alkysine desc: Lessens the damage to neurological tissue, effective even after catastrophic injury. Used for treating brain damage and also a fairly effective painkiller. - color: "#a1000b" + physicalDesc: oily + color: "#ff8c00" - type: reagent id: chem.Dylovene name: dylovene desc: A broad-spectrum anti-toxin, which treats toxin damage in the blood stream. Overdosing will cause vomiting, dizzyness and pain. + physicalDesc: translucent color: "#3a1d8a" - type: reagent id: chem.Arithrazine name: arithrazine desc: A slightly unstable medication used for the most extreme any serious case of radiation poisoning. Lowers radiation level at over twice the rate Hyronalin does and will heal toxin damage at the same time. Deals very minor brute damage to the patient over time, but the patient's body will typically out-regenerate it easily. + physicalDesc: cloudy color: "#bd5902" - type: reagent id: chem.Bicaridine name: bicaridine desc: An analgesic which is highly effective at treating brute damage. It is useful for stabilizing people who have been severely beaten, as well as treating less life-threatening injuries. In the case of bleeding (internal or external), bicaridine will slow down the bleeding heavily. If the dosage exceeds the overdose limit, it'll stop it outright. + physicalDesc: opaque color: "#ffaa00" - type: reagent id: chem.Cryoxadone name: cryoxadone desc: Required for the proper function of cryogenics. Heals all standard types of damage very swiftly, but only works in temperatures under 170K (usually this means cryo cells). Can also slowly heal clone damage, such as caused by cloning or Slimes. + physicalDesc: fizzy color: "#0091ff" - type: reagent id: chem.Clonexadone name: clonexadone - desc: Heals standard damage in the same as Cryoxadone, with the same temperature requirement. Significantly more effective than the former at treating clone damage, although both can be used simultaneously. Best used in cryo cells. - color: "#0091ff" + desc: Heals standard damage in the same as Cryoxadone, with the same temperature requirement. Significantly more effective than the former at treating cellular damage, although both can be used simultaneously. Best used in cryo cells. + physicalDesc: bubbly + color: "#0666ff" - type: reagent id: chem.Citalopram name: citalopram desc: Prevents hallucination slightly. + physicalDesc: cloudy color: "#21693c" - type: reagent id: chem.Dermaline name: dermaline - desc: An advanced chemical that is more effective at treating burns damage than Kelotane. + desc: An advanced chemical that is more effective at treating burn damage than Kelotane. + physicalDesc: translucent color: "#215263" - type: reagent id: chem.Dexalin name: dexalin desc: Used for treating oxygen deprivation. In most cases where it is likely to be needed, the strength of Dexalin Plus will probably be more useful (Results in 1 unit instead of 2). + physicalDesc: opaque color: "#0041a8" - type: reagent id: chem.DexalinPlus name: dexalin plus desc: Used in treatment of extreme cases of oxygen deprivation. Even a single unit immediately counters all oxygen loss, which is hugely useful in many circumstances. Any dose beyond this will continue to counter oxygen loss until it is metabolized, essentially removing the need to breathe. - color: "#297691" + physicalDesc: cloudy + color: "#4da0bd" - type: reagent id: chem.Ethylredoxrazine name: ethylredoxrazine desc: Neutralises the effects of alcohol in the blood stream. Though it is commonly needed, it is rarely requested. + physicalDesc: opaque color: "#2d5708" - type: reagent id: chem.Hyperzine name: hyperzine desc: A highly effective, long lasting muscle stimulant. It allows greater freedom of movement in bulky clothing although it has the side effect of causing some twitching. Dangerous in higher doses. + physicalDesc: translucent color: "#17bd61" - type: reagent id: chem.Hyronalin name: hyronalin desc: A weak treatment for radiation damage. Considered to be useful mainly for genetic modification, where it reduces radiation levels, and thus the chance of genetic mutations. Largely outclassed by Arithrazine. - color: "#17ac61" + physicalDesc: cloudy + color: "#4cb580" - type: reagent id: chem.Imidazoline name: imidazoline desc: Effective in treating eye trauma. It heals damage caused by physical or chemical trauma, though it is ineffective in treating genetic defects in the eyes. + physicalDesc: pungent color: "#f7ef00" - type: reagent id: chem.Inacusiate name: inacusiate - desc: You only need 1u for Inacusiate work. Cures deafness instantly. Useful after an explosion. - color: "#f7ef00" + desc: You only need 1u for Inacusiate to be effective. Cures deafness instantly. Useful after an explosion. + physicalDesc: pungent + color: "#c4c04b" - type: reagent id: chem.Inaprovaline name: inaprovaline desc: Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients- it stops oxygen loss when the patient is in critical health. It'll also slow down bleeding (internal or external) by half while in the body. Acts as a decent painkiller. - color: "#73103b" + physicalDesc: opaque + color: "#731024" - type: reagent id: chem.Kelotane name: kelotane desc: Treats burn damage and prevents infection. + physicalDesc: strong-smelling color: "#bf3d19" - type: reagent id: chem.Leporazine name: leporazine desc: This keeps a patient's body temperature stable. High doses can allow short periods of unprotected EVA, but prevents use of the cryogenics tubes. + physicalDesc: pungent color: "#ff7db5" - type: reagent id: chem.Methylin name: methylin desc: An intelligence enhancer, also used in the treatment of attention deficit hyperactivity disorder. Also known as Ritalin. Allows monkeys (not diona nymphs) to understand human speech and improves their dexterity as long as they have some in their system. Causes toxin and brain damage in higher doses. + physicalDesc: acrid color: "#a700c4" - type: reagent id: chem.Oxycodone name: oxycodone desc: A very effective painkiller, about 250% as strong as Tramadol. + physicalDesc: acrid color: "#c4a300" - type: reagent id: chem.Phalanximine name: phalanximine desc: Used in the treatment of cancer, is as effective as Anti-Toxin. Causes moderate radiation and hair loss. + physicalDesc: acrid color: "#c8ff75" - type: reagent id: chem.Paroxetine name: paroxetine desc: Prevents hallucination, but has a 10% chance of causing intense hallucinations. - color: "#c8ff75" + physicalDesc: acrid + color: "#fffbad" - type: reagent id: chem.Ryetalyn name: ryetalyn desc: You only need 1u for Ryetalin to work. Deactivates genetic defects and powers, restoring a patient to an ideal state. May be useful if genetics is unable to function properly. Deactivated effects return if the patient's genes are modified again. + physicalDesc: cloudy color: "#532fd4" - type: reagent id: chem.Spaceacillin name: spaceacillin desc: A theta-lactam antibiotic. A common and very useful medicine, effective against many diseases likely to be encountered in space. Slows progression of diseases. - color: "#7f2fd4" + physicalDesc: opaque + color: "#9942f5" - type: reagent id: chem.Synaptizine name: synaptizine desc: Toxic, but treats hallucinations, drowsiness & halves the duration of paralysis, stuns and knockdowns. It is metabolized very slowly. One unit is enough to treat hallucinations; two units is deadly. + physicalDesc: pungent color: "#d49a2f" - - type: reagent id: chem.Tramadol name: tramadol desc: A simple, yet effective painkiller. Very effective for patients in shock. + physicalDesc: strong-smelling color: "#2f6ed4" - type: reagent id: chem.Tricordrazine name: tricordrazine desc: A wide-spectrum stimulant, originally derived from Cordrazine. Is capable of healing all four main damage types simultaneously, however it only heals at half the rate of conventional healing chemicals. Because of its low potency, it's best used as a supplement to other medicines. + physicalDesc: opaque color: "#00e5ff" - type: reagent id: chem.Vaccine name: vaccine desc: Introduces antigens to the body, allowing the immune system to produce enough antibodies to combat present or future infections. Is blank by default, vaccine carrying antigen is produced at a centrifuge. Each unit raises the associated antibody concentration by 20% so at most 5 units are needed to cure the strongest diseases. - color: "#ba0b60" + physicalDesc: translucent + color: "#ffc9f6" - type: reagent id: chem.Albuterol name: albuterol desc: A bronchodilator that relaxes muscles in the airways and increases air flow to the lungs. It'll remove mucus from your system as long as it's inside your body. Only useful to people with the Asthma disability. - color: "#00e5ff" + physicalDesc: cloudy + color: "#00b89f" - type: reagent id: chem.ChloralHydrate name: chloral hydrate desc: A powerful sedative which causes death in doses upwards of 16.2 units. Sends the patient to sleep almost instantly. - color: "#00e5ff" + physicalDesc: acrid + color: "#18c9b1" - type: reagent id: chem.Creatine name: creatine desc: A muscle-building drug that grants the user enormous strength, before their muscles seize and tear their own body to shreds. In practical terms, 1-25 units just causes toxin damage, and 26 units turns you into a hulk with all its associated benefits with the side effect of taking a little toxin damage over time. You'll remain as a hulk until it's all metabolized, at which point you'll take 200 brute damage and gib. With the correct administration, it can be the most potent drug there is, but even at the best of times it is best considered a double-edged sword. + physicalDesc: cloudy color: "#a1000b" - type: reagent id: chem.Cryptobiolin name: cryptobiolin desc: Causes confusion and dizziness. This is essential to make Spaceacillin. - color: "#00e5ff" + physicalDesc: fizzy + color: "#081a80" - type: reagent id: chem.HeartbreakerToxin name: heartbreaker toxin desc: A hallucinogenic compound that is illegal under space law. A synthetic drug derived from Mindbreaker toxin, it blocks some neurological signals to the respiratory system which causes choking. - color: "#00e5ff" + physicalDesc: strong-smelling + color: "#5f959c" - type: reagent id: chem.Impedrezene name: impedrezene desc: A narcotic that impedes one's ability by slowing down the higher brain cell functions. Causes massive brain damage. + physicalDesc: acrid color: "#215263" - type: reagent id: chem.Lexorin name: lexorin desc: Temporarily stops respiration and causes tissue damage. Large doses are fatal, and will cause people to pass out very quickly. Dexalin and Dexalin Plus will both remove it, however. - color: "#a1000b" + physicalDesc: pungent + color: "#6b0007" - type: reagent id: chem.Lipozine name: lipozine desc: Causes weight loss upon consumption. - color: "#215263" + physicalDesc: oily + color: "#2690b5" - type: reagent id: chem.MindbreakerToxin name: mindbreaker toxin desc: A potent hallucinogenic compound that is illegal under space law. Formerly known as LSD. + physicalDesc: opaque color: "#77b58e" - type: reagent id: chem.Soporific name: soporific (sleep-toxin) desc: A less powerful sedative that takes a while to work, intended to help insomniacs and patients that are too aggressive to be treated normally. Takes roughly 50 seconds to make the patient fall asleep. Is safe in large quantities. Can be counteracted with Anti-Toxin. + physicalDesc: acrid color: "#215263" - type: reagent id: chem.Sterilizine name: sterilizine desc: Helps the patient when used during surgery, may also decontaminate objects and surfaces that bear pathogens. Is currently useless due to infections not being a thing. - color: "#215263" + physicalDesc: strong-smelling + color: "#7cad37" - type: reagent id: chem.SpaceDrugs name: space drugs desc: An illegal compound which induces a number of effects such as loss of balance and visual artefacts. - color: "#a1000b" + physicalDesc: syrupy + color: "#63806e" diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index d3dda3f121..efff2ca418 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -100,4 +100,38 @@ chem.Ice: amount: 1 products: - chem.Antifreeze: 4 \ No newline at end of file + chem.Antifreeze: 4 + +- type: reaction + id: react.Moonshine + reactants: + chem.Vodka: + amount: 1 + chem.Tequila: + amount: 1 + chem.Whiskey: + amount: 1 + products: + chem.Moonshine: 3 + +- type: reaction + id: react.CreamyDelight + reactants: + chem.Moonshine: + amount: 1 + chem.Cream: + amount: 1 + chem.Wine: + amount: 1 + products: + chem.CreamyDelight: 3 + +- type: reaction + id: react.LeanShine + reactants: + chem.Lean: + amount: 1 + chem.Moonshine: + amount: 1 + products: + chem.LeanShine: 2 \ No newline at end of file