Skip to content

Commit

Permalink
Food System Multi types support
Browse files Browse the repository at this point in the history
  • Loading branch information
dvir001 committed May 3, 2024
1 parent 3fafed3 commit a41995a
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 100 deletions.
31 changes: 6 additions & 25 deletions Content.Server/Nutrition/Components/FoodComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,9 @@
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;

namespace Content.Server.Nutrition.Components;

public enum Quality : byte // Frontier
{
High,
Normal,
Junk,
Nasty,
Toxin,
Trash,
Fiber
}
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;

public enum FinalQuality : byte // Frontier
{
High,
Normal,
Junk,
Nasty,
Toxin,
Trash,
Fiber
}
namespace Content.Server.Nutrition.Components;

[RegisterComponent, Access(typeof(FoodSystem))]
public sealed partial class FoodComponent : Component
Expand Down Expand Up @@ -100,11 +80,12 @@ public sealed partial class FoodComponent : Component
/// <summary>
/// Frontier - Nasty food, used for goblins to know if they can eat it or not
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField] // Frontier
public Quality Quality = Quality.Normal;
[ViewVariables(VVAccess.ReadWrite), DataField] // Frontier
public string[] Quality = { "Normal" };

/// <summary>
/// Frontier - Edited by the system to find the final quility results
/// </summary>
public FinalQuality FinalQuality = FinalQuality.Normal;
[ViewVariables(VVAccess.ReadWrite), DataField] // Frontier
public string FinalQuality = "Normal";
}
142 changes: 67 additions & 75 deletions Content.Server/Nutrition/EntitySystems/FoodSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -271,45 +271,51 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
_reaction.DoEntityReaction(args.Target.Value, solution, ReactionMethod.Ingestion);
_stomach.TryTransferSolution(stomachToUse.Owner, split, stomachToUse);

/// Frontier - Goblin food system
if (entity.Comp.Quality == Quality.High)
entity.Comp.FinalQuality = FinalQuality.High;
else if (entity.Comp.Quality == Quality.Normal)
entity.Comp.FinalQuality = FinalQuality.Normal;
else if (entity.Comp.Quality == Quality.Junk)
entity.Comp.FinalQuality = FinalQuality.Junk;
else if (entity.Comp.Quality == Quality.Nasty)
entity.Comp.FinalQuality = FinalQuality.Nasty;
else if (entity.Comp.Quality == Quality.Toxin)
entity.Comp.FinalQuality = FinalQuality.Toxin;
else if (entity.Comp.Quality == Quality.Trash)
entity.Comp.FinalQuality = FinalQuality.Trash;

if (reverseFoodQuality)
/// Frontier - Food quality system
var foodQuality = entity.Comp.Quality;
var foodFinalQuality = entity.Comp.FinalQuality;

foreach (var quality in foodQuality)
{
if (entity.Comp.Quality == Quality.High)
entity.Comp.FinalQuality = FinalQuality.Toxin;
else if (entity.Comp.Quality == Quality.Normal)
entity.Comp.FinalQuality = FinalQuality.Nasty;
else if (entity.Comp.Quality == Quality.Nasty)
entity.Comp.FinalQuality = FinalQuality.Normal;
else if (entity.Comp.Quality == Quality.Toxin)
entity.Comp.FinalQuality = FinalQuality.High;
}
if (quality == null)
continue;
else if (quality == "High")
foodFinalQuality = "High";
else if (quality == "Normal")
foodFinalQuality = "Normal";
else if (quality == "Junk")
foodFinalQuality = "Junk";
else if (quality == "Nasty")
foodFinalQuality = "Nasty";
else if (quality == "Toxin")
foodFinalQuality = "Toxin";
else if (quality == "Trash")
foodFinalQuality = "Trash";

if (reverseFoodQuality)
{
if (quality == "High")
foodFinalQuality = "Toxin";
else if (quality == "Normal")
foodFinalQuality = "Nasty";
else if (quality == "Nasty")
foodFinalQuality = "Normal";
else if (quality == "Toxin")
foodFinalQuality = "High";
}

// TODO: Add detection for fried food on nasty to update it to toxin for goblins.
// TODO: Add inspect food but only for goblin eyes to see, goblins can tell food quality.
// TODO: Add detection for fried food on nasty to update it to toxin for goblins.
// TODO: Add inspect food but only for goblin eyes to see, goblins can tell food quality.

string[] toxinsRegent = { "Toxin", "CarpoToxin", "Mold", "Amatoxin", "SulfuricAcid" };
var speedRegent = "Stimulants";
var damagingRegent = "Toxin";
var emoteId = "Laugh";
string[] toxinsRegent = { "Toxin", "CarpoToxin", "Mold", "Amatoxin", "SulfuricAcid" };
var speedRegent = "Stimulants";
var damagingRegent = "Toxin";
var emoteId = "Laugh";

TryComp<BloodstreamComponent>(args.Target.Value, out var bloodStream);
TryComp<BloodstreamComponent>(args.Target.Value, out var bloodStream);

switch (entity.Comp.FinalQuality)
{
case FinalQuality.High:
if (foodFinalQuality == "High")
{
if (reverseFoodQuality)
{
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
Expand All @@ -321,12 +327,9 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
if (_solutionContainer.ResolveSolution(args.Target.Value, bloodStream!.ChemicalSolutionName, ref bloodStream.ChemicalSolution))
_solutionContainer.TryAddReagent(bloodStream.ChemicalSolution.Value, speedRegent, FixedPoint2.New((int) transferAmount / 3), out _); // Add to blood
}
else
{

}
break;
case FinalQuality.Normal:
}
else if (foodFinalQuality == "Normal")
{
if (reverseFoodQuality)
{
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
Expand All @@ -338,12 +341,9 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
if (_solutionContainer.ResolveSolution(args.Target.Value, bloodStream!.ChemicalSolutionName, ref bloodStream.ChemicalSolution))
_solutionContainer.TryAddReagent(bloodStream.ChemicalSolution.Value, speedRegent, FixedPoint2.New((int) transferAmount / 5), out _); // Add to blood
}
else
{

}
break;
case FinalQuality.Junk:
}
else if (foodFinalQuality == "Junk")
{
if (reverseFoodQuality)
{
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
Expand All @@ -355,12 +355,9 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
if (_solutionContainer.ResolveSolution(args.Target.Value, bloodStream!.ChemicalSolutionName, ref bloodStream.ChemicalSolution))
_solutionContainer.TryAddReagent(bloodStream.ChemicalSolution.Value, speedRegent, FixedPoint2.New((int) transferAmount / 7), out _); // Add to blood
}
else
{

}
break;
case FinalQuality.Nasty:
}
else if (foodFinalQuality == "Nasty")
{
if (reverseFoodQuality)
{
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
Expand All @@ -370,12 +367,9 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
_stuttering.DoStutter(args.Target.Value, TimeSpan.FromSeconds(5), false); // Gives stuttering
_jittering.DoJitter(args.Target.Value, TimeSpan.FromSeconds(5), true, 40f, 4f, true, null);
}
else
{

}
break;
case FinalQuality.Toxin:
}
else if (foodFinalQuality == "Toxin")
{
if (reverseFoodQuality)
{
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
Expand All @@ -389,24 +383,22 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
if (RobustRandom.Prob(.05f)) // 5% to puke
_vomit.Vomit(args.Target.Value);
}
else
{

}
break;
case FinalQuality.Trash:
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
}
else if (foodFinalQuality == "Trash")
{
if (reverseFoodQuality)
{
foreach (var reagent in toxinsRegent)
_solutionContainer.RemoveReagent(stomachToUse!.Solution.Value, reagent, FixedPoint2.New((int) transferAmount)); // Remove from body before it goes to blood
_solutionContainer.RemoveReagent(stomachToUse!.Solution.Value, "Flavorol", FixedPoint2.New((int) transferAmount)); // Remove from body before it goes to blood
if (_solutionContainer.ResolveSolution(stomachToUse.Owner, stomachToUse.BodySolutionName, ref stomachToUse.Solution))
{
foreach (var reagent in toxinsRegent)
_solutionContainer.RemoveReagent(stomachToUse!.Solution.Value, reagent, FixedPoint2.New((int) transferAmount)); // Remove from body before it goes to blood
_solutionContainer.RemoveReagent(stomachToUse!.Solution.Value, "Flavorol", FixedPoint2.New((int) transferAmount)); // Remove from body before it goes to blood
}
if (_solutionContainer.ResolveSolution(args.Target.Value, bloodStream!.ChemicalSolutionName, ref bloodStream.ChemicalSolution))
_solutionContainer.TryAddReagent(bloodStream.ChemicalSolution.Value, speedRegent, FixedPoint2.New((int) transferAmount), out _); // Add to blood
}
if (_solutionContainer.ResolveSolution(args.Target.Value, bloodStream!.ChemicalSolutionName, ref bloodStream.ChemicalSolution))
_solutionContainer.TryAddReagent(bloodStream.ChemicalSolution.Value, speedRegent, FixedPoint2.New((int) transferAmount), out _); // Add to blood
break;
default:
throw new ArgumentOutOfRangeException($"No implemented mask radio behavior for {entity.Comp.Quality}!");
} /// Frontier
}
}

var flavors = args.FlavorMessage;

Expand Down Expand Up @@ -554,7 +546,7 @@ private bool IsDigestibleBy(EntityUid food, FoodComponent component, List<(Stoma
foreach (var (comp, _) in stomachs)
{
// Frontier - Allow trash eating
if (!comp.TrashDigestion && component.Quality == Quality.Trash)
if (!comp.TrashDigestion && component.Quality.Contains("Trash"))
return false;
// Frontier - Allow trash eating

Expand Down

0 comments on commit a41995a

Please sign in to comment.