Skip to content

Commit

Permalink
fryer system update
Browse files Browse the repository at this point in the history
  • Loading branch information
Cheackraze committed Feb 1, 2024
1 parent 6258084 commit eeced1a
Show file tree
Hide file tree
Showing 20 changed files with 1,009 additions and 904 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Content.Shared.Kitchen.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;

namespace Content.Client.Kitchen.Components
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Content.Shared.Kitchen.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;

namespace Content.Client.Kitchen.Components
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Content.Shared.Nyanotrasen.Kitchen.UI;
using Robust.Client.GameObjects;
using Content.Shared.Kitchen.UI;

namespace Content.Client.Nyanotrasen.Kitchen.UI
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using Content.Shared.Nyanotrasen.Kitchen.UI;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Content.Shared.Kitchen.UI;

namespace Content.Client.Nyanotrasen.Kitchen.UI
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Content.Shared.Clothing;
using Content.Shared.Hands;
using Content.Shared.Kitchen.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;

namespace Content.Client.Kitchen.Visualizers
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Robust.Client.GameObjects;
using Content.Client.Chemistry.Visualizers;
using Content.Client.Kitchen.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Kitchen.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;

namespace Content.Client.Kitchen.Visualizers
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Content.Shared.Kitchen.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;

namespace Content.Server.Kitchen.Components
{
Expand Down
29 changes: 14 additions & 15 deletions Content.Server/Nyanotrasen/Kitchen/Components/DeepFryerComponent.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Construction.Prototypes;
using Content.Shared.FixedPoint;
using Content.Shared.Nutrition;
using Content.Shared.Nyanotrasen.Kitchen;
using Content.Shared.Nyanotrasen.Kitchen.Components;
using Content.Shared.Whitelist;
using Robust.Shared.Audio;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set;
using Content.Server.Kitchen.EntitySystems;
using Content.Server.Nutrition;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Construction.Prototypes;
using Content.Shared.Kitchen.Components;
using Content.Shared.Nutrition;
using Content.Shared.FixedPoint;
using Content.Shared.Whitelist;

namespace Content.Server.Kitchen.Components
namespace Content.Server.Nyanotrasen.Kitchen.Components
{
[RegisterComponent]
[Access(typeof(DeepFryerSystem))]
[Access(typeof(SharedDeepfryerSystem))]
// This line appears to be depracted: [ComponentReference(typeof(SharedDeepFryerComponent))]
public sealed partial class DeepFryerComponent : SharedDeepFryerComponent
{
Expand Down Expand Up @@ -86,23 +85,23 @@ public sealed partial class DeepFryerComponent : SharedDeepFryerComponent

/// <summary>
/// What reagents are added to tasty deep-fried food?
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("goodReagents")]
public List<ReagentQuantity> GoodReagents { get; set; } = new();

/// <summary>
/// What reagents are added to terrible deep-fried food?
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("badReagents")]
public List<ReagentQuantity> BadReagents { get; set; } = new();

/// <summary>
/// What reagents replace every 1 unit of oil spent on frying?
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// JJ Comment: I removed Solution from this. Unsure if I need to replace it with something.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("wasteReagents")]
Expand Down Expand Up @@ -158,7 +157,7 @@ public sealed partial class DeepFryerComponent : SharedDeepFryerComponent
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("solutionSizeCoefficient")]
public FixedPoint2 SolutionSizeCoefficient { get; set; } = 0.5f;
public FixedPoint2 SolutionSizeCoefficient { get; set; } = 1f;

/// <summary>
/// What's the maximum amount of solution that should ever be imparted?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
using System.Text;
using Content.Server.Atmos.Components;
using Content.Server.Body.Components;
using Content.Server.Ghost.Roles.Components;
using Content.Server.Kitchen.Components;
using Content.Server.Nutrition.Components;
using Content.Server.Nyanotrasen.Kitchen.Components;
using Content.Server.Paper;
using Content.Shared.Atmos.Rotting;
using Content.Shared.Buckle.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.FixedPoint;
using Content.Shared.Mobs.Components;
using Content.Shared.NPC;
using Content.Shared.Nutrition.Components;
using Content.Shared.Nyanotrasen.Kitchen.Components;
using Robust.Shared.Random;

namespace Content.Server.Nyanotrasen.Kitchen.EntitySystems;

public sealed partial class DeepFryerSystem
{
/// <summary>
/// Make an item look deep-fried.
/// </summary>
public void MakeCrispy(EntityUid item)
{
EnsureComp<AppearanceComponent>(item);
EnsureComp<DeepFriedComponent>(item);

_appearanceSystem.SetData(item, DeepFriedVisuals.Fried, true);
}

/// <summary>
/// Turn a dead mob into food.
/// </summary>
/// <remarks>
/// This is meant to be an irreversible process, similar to gibbing.
/// </remarks>
public bool TryMakeMobIntoFood(EntityUid mob, MobStateComponent mobStateComponent, bool force = false)
{
// Don't do anything to mobs until they're dead.
if (force || _mobStateSystem.IsDead(mob, mobStateComponent))
{
RemComp<ActiveNPCComponent>(mob);
RemComp<AtmosExposedComponent>(mob);
RemComp<BarotraumaComponent>(mob);
RemComp<BuckleComponent>(mob);
RemComp<GhostTakeoverAvailableComponent>(mob);
RemComp<InternalsComponent>(mob);
RemComp<PerishableComponent>(mob);
RemComp<RespiratorComponent>(mob);
RemComp<RottingComponent>(mob);

// Ensure it's Food here, so it passes the whitelist.
var mobFoodComponent = EnsureComp<FoodComponent>(mob);
_solutionContainerSystem.EnsureSolution(mob, mobFoodComponent.Solution, out var alreadyHadFood);

if (!_solutionContainerSystem.TryGetSolution(mob, mobFoodComponent.Solution, out var mobFoodSolution))
return false;

// This line here is mainly for mice, because they have a food
// component that mirrors how much blood they have, which is
// used for the reagent grinder.
if (alreadyHadFood)
_solutionContainerSystem.RemoveAllSolution(mobFoodSolution.Value);

if (TryComp<BloodstreamComponent>(mob, out var bloodstreamComponent) && bloodstreamComponent.ChemicalSolution != null)
{
// Fry off any blood into protein.
var bloodSolution = bloodstreamComponent.BloodSolution;
var solPresent = bloodSolution!.Value.Comp.Solution.Volume;
_solutionContainerSystem.RemoveReagent(bloodSolution.Value, "Blood", FixedPoint2.MaxValue);
var bloodRemoved = solPresent - bloodSolution.Value.Comp.Solution.Volume;

var proteinQuantity = bloodRemoved * BloodToProteinRatio;
mobFoodSolution.Value.Comp.Solution.MaxVolume += proteinQuantity;
_solutionContainerSystem.TryAddReagent(mobFoodSolution.Value, "Protein", proteinQuantity);

// This is a heuristic. If you had blood, you might just taste meaty.
if (bloodRemoved > FixedPoint2.Zero)
EnsureComp<FlavorProfileComponent>(mob).Flavors.Add(MobFlavorMeat);

// Bring in whatever chemicals they had in them too.
mobFoodSolution.Value.Comp.Solution.MaxVolume +=
bloodstreamComponent.ChemicalSolution.Value.Comp.Solution.Volume;
_solutionContainerSystem.AddSolution(mobFoodSolution.Value,
bloodstreamComponent.ChemicalSolution.Value.Comp.Solution);
}

return true;
}

return false;
}

/// <summary>
/// Make an item actually edible.
/// </summary>
private void MakeEdible(EntityUid uid, DeepFryerComponent component, EntityUid item, FixedPoint2 solutionQuantity)
{
if (!TryComp<DeepFriedComponent>(item, out var deepFriedComponent))
{
_sawmill.Error($"{ToPrettyString(item)} is missing the DeepFriedComponent before being made Edible.");
return;
}

// Remove any components that wouldn't make sense anymore.
RemComp<ButcherableComponent>(item);

if (TryComp<PaperComponent>(item, out var paperComponent))
{
var stringBuilder = new StringBuilder();

for (var i = 0; i < paperComponent.Content.Length; ++i)
{
var uchar = paperComponent.Content.Substring(i, 1);

if (uchar == "\n" || _random.Prob(0.4f))
stringBuilder.Append(uchar);
else
stringBuilder.Append("x");
}

paperComponent.Content = stringBuilder.ToString();
}

var foodComponent = EnsureComp<FoodComponent>(item);
var extraSolution = new Solution();
if (TryComp(item, out FlavorProfileComponent? flavorProfileComponent))
{
HashSet<string> goodFlavors = new(flavorProfileComponent.Flavors);
goodFlavors.IntersectWith(component.GoodFlavors);

HashSet<string> badFlavors = new(flavorProfileComponent.Flavors);
badFlavors.IntersectWith(component.BadFlavors);

deepFriedComponent.PriceCoefficient = Math.Max(0.01f,
1.0f
+ goodFlavors.Count * component.GoodFlavorPriceBonus
- badFlavors.Count * component.BadFlavorPriceMalus);

if (goodFlavors.Count > 0)
{
foreach (var reagent in component.GoodReagents)
{
extraSolution.AddReagent(reagent.Reagent.ToString(), reagent.Quantity * goodFlavors.Count);

// Mask the taste of "medicine."
flavorProfileComponent.IgnoreReagents.Add(reagent.Reagent.ToString());
}
}

if (badFlavors.Count > 0)
{
foreach (var reagent in component.BadReagents)
{
extraSolution.AddReagent(reagent.Reagent.ToString(), reagent.Quantity * badFlavors.Count);
}
}
}
else
{
flavorProfileComponent = EnsureComp<FlavorProfileComponent>(item);
// TODO: Default flavor?
}

// Make sure there's enough room for the fryer solution.
var foodSolution = _solutionContainerSystem.EnsureSolution(item, foodComponent.Solution);
if (!_solutionContainerSystem.TryGetSolution(item, foodSolution.Name, out var foodContainer))
return;

// The solution quantity is used to give the fried food an extra
// buffer too, to support injectables or condiments.
foodSolution.MaxVolume = 2 * solutionQuantity + foodSolution.Volume + extraSolution.Volume;
_solutionContainerSystem.AddSolution(foodContainer.Value,
component.Solution.SplitSolution(solutionQuantity));
_solutionContainerSystem.AddSolution(foodContainer.Value, extraSolution);
_solutionContainerSystem.UpdateChemicals(foodContainer.Value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using Content.Server.Kitchen.Components;
using Content.Server.Nyanotrasen.Kitchen.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Database;
using Content.Shared.Hands.Components;
using Content.Shared.Interaction;
using Content.Shared.Item;
using Content.Shared.Nyanotrasen.Kitchen.UI;
using Content.Shared.Storage;
using Content.Shared.Tools.Components;

namespace Content.Server.Nyanotrasen.Kitchen.EntitySystems;

public sealed partial class DeepFryerSystem
{
public bool CanInsertItem(EntityUid uid, DeepFryerComponent component, EntityUid item)
{
// Keep this consistent with the checks in TryInsertItem.
return HasComp<ItemComponent>(item) &&
!HasComp<StorageComponent>(item) &&
component.Storage.ContainedEntities.Count < component.StorageMaxEntities;
}

private bool TryInsertItem(EntityUid uid, DeepFryerComponent component, EntityUid user, EntityUid item)
{
if (!HasComp<ItemComponent>(item))
{
_popupSystem.PopupEntity(
Loc.GetString("deep-fryer-interact-using-not-item"),
uid,
user);
return false;
}

if (HasComp<StorageComponent>(item))
{
_popupSystem.PopupEntity(
Loc.GetString("deep-fryer-storage-no-fit",
("item", item)),
uid,
user);
return false;
}

if (component.Storage.ContainedEntities.Count >= component.StorageMaxEntities)
{
_popupSystem.PopupEntity(
Loc.GetString("deep-fryer-storage-full"),
uid,
user);
return false;
}

if (!_handsSystem.TryDropIntoContainer(user, item, component.Storage))
return false;

AfterInsert(uid, component, item);

_adminLogManager.Add(LogType.Action, LogImpact.Low,
$"{ToPrettyString(user)} put {ToPrettyString(item)} inside {ToPrettyString(uid)}.");

return true;
}

private void OnInteractUsing(EntityUid uid, DeepFryerComponent component, InteractUsingEvent args)
{
if (args.Handled)
return;

// By default, allow entities with SolutionTransfer or Tool
// components to perform their usual actions. Inserting them (if
// the chef really wants to) will be supported through the UI.
if (HasComp<SolutionTransferComponent>(args.Used) ||
HasComp<ToolComponent>(args.Used))
return;

if (TryInsertItem(uid, component, args.User, args.Used))
args.Handled = true;
}

private void OnInsertItem(EntityUid uid, DeepFryerComponent component, DeepFryerInsertItemMessage args)
{
var user = args.Session.AttachedEntity;

if (user == null ||
!TryComp<HandsComponent>(user, out var handsComponent) ||
handsComponent.ActiveHandEntity == null)
return;

if (handsComponent.ActiveHandEntity != null)
TryInsertItem(uid, component, user.Value, handsComponent.ActiveHandEntity.Value);
}
}
Loading

0 comments on commit eeced1a

Please sign in to comment.