Botany (#2357)
* plants and seeds go brrrr * update plants * P L A N T * brrrr * Hydroponics actually work! How about that? * Reuse resource path in visualizer * They lied to us. * Several stuffs * more werk * Add a bunch of plants * Logs go brr. * Brrr moment. * Remove unused method * Important comment. * Seed inventory, yo! * tomato moment * Balance consumption * Makes hydroponics pourable * Adds plant metabolism effect for sugar, the same as glucose. * Eggplant moment * Apple moment * Corn moment * Chanterelle mushroom moment * prototype tweaks * Seed extractor moment * typo * IPlantMetabolizable doc improvement * I should trust my gut instinct more often. * egg-plant..... * localization * Make WaterLevel and NutritionLevel setters private * Less code repetition! Wooo!
This commit is contained in:
committed by
GitHub
parent
7c57d10531
commit
484eb0bba4
49
Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs
Normal file
49
Content.Server/Chemistry/PlantMetabolism/AdjustAttribute.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
#nullable enable
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.Interfaces.Random;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
public abstract class AdjustAttribute : IPlantMetabolizable
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||
|
||||
public float Amount { get; private set; }
|
||||
public float Prob { get; private set; }
|
||||
|
||||
public void ExposeData(ObjectSerializer serializer)
|
||||
{
|
||||
serializer.DataField(this, x => x.Amount, "amount", 1f);
|
||||
serializer.DataField(this, x => x.Prob, "prob", 1f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the plant holder can metabolize the reagent or not. Checks if it has an alive plant by default.
|
||||
/// </summary>
|
||||
/// <param name="plantHolder">The entity holding the plant</param>
|
||||
/// <param name="plantHolderComponent">The plant holder component</param>
|
||||
/// <param name="mustHaveAlivePlant">Whether to check if it has an alive plant or not</param>
|
||||
/// <returns></returns>
|
||||
public bool CanMetabolize(IEntity plantHolder, [NotNullWhen(true)] out PlantHolderComponent? plantHolderComponent, bool mustHaveAlivePlant = true)
|
||||
{
|
||||
plantHolderComponent = null;
|
||||
|
||||
if (plantHolder.Deleted || !plantHolder.TryGetComponent(out plantHolderComponent)
|
||||
|| mustHaveAlivePlant && (plantHolderComponent.Seed == null || plantHolderComponent.Dead))
|
||||
return false;
|
||||
|
||||
if (Prob >= 1f)
|
||||
return true;
|
||||
|
||||
return !(Prob <= 0f) && _robustRandom.Prob(Prob);
|
||||
}
|
||||
|
||||
public abstract void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f);
|
||||
}
|
||||
}
|
||||
20
Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs
Normal file
20
Content.Server/Chemistry/PlantMetabolism/AdjustHealth.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustHealth : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp))
|
||||
return;
|
||||
|
||||
plantHolderComp.Health += Amount;
|
||||
plantHolderComp.CheckHealth();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustMutationLevel : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp, false))
|
||||
return;
|
||||
|
||||
plantHolderComp.MutationLevel += Amount * plantHolderComp.MutationMod * customPlantMetabolism;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustMutationMod : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp))
|
||||
return;
|
||||
|
||||
plantHolderComp.MutationMod += Amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs
Normal file
21
Content.Server/Chemistry/PlantMetabolism/AdjustNutrition.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustNutrition : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp, false))
|
||||
return;
|
||||
|
||||
plantHolderComp.AdjustNutrient(Amount);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
19
Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs
Normal file
19
Content.Server/Chemistry/PlantMetabolism/AdjustPests.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustPests : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp))
|
||||
return;
|
||||
|
||||
plantHolderComp.PestLevel += Amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs
Normal file
20
Content.Server/Chemistry/PlantMetabolism/AdjustToxins.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustToxins : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp, false))
|
||||
return;
|
||||
|
||||
plantHolderComp.Toxins += Amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs
Normal file
20
Content.Server/Chemistry/PlantMetabolism/AdjustWater.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustWater : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp, false))
|
||||
return;
|
||||
|
||||
plantHolderComp.AdjustWater(Amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs
Normal file
20
Content.Server/Chemistry/PlantMetabolism/AdjustWeeds.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AdjustWeeds : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp, false))
|
||||
return;
|
||||
|
||||
plantHolderComp.WeedLevel += Amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
19
Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs
Normal file
19
Content.Server/Chemistry/PlantMetabolism/AffectGrowth.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class AffectGrowth : AdjustAttribute
|
||||
{
|
||||
public override void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (!CanMetabolize(plantHolder, out var plantHolderComp))
|
||||
return;
|
||||
|
||||
plantHolderComp.AffectGrowth((int) Amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
38
Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs
Normal file
38
Content.Server/Chemistry/PlantMetabolism/Clonexadone.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.Interfaces.Random;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class Clonexadone : IPlantMetabolizable
|
||||
{
|
||||
public void ExposeData(ObjectSerializer serializer)
|
||||
{
|
||||
}
|
||||
|
||||
public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1)
|
||||
{
|
||||
if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp)
|
||||
|| plantHolderComp.Seed == null || plantHolderComp.Dead)
|
||||
return;
|
||||
|
||||
var deviation = 0;
|
||||
var seed = plantHolderComp.Seed;
|
||||
var random = IoCManager.Resolve<IRobustRandom>();
|
||||
if (plantHolderComp.Age > seed.Maturation)
|
||||
deviation = (int) Math.Max(seed.Maturation - 1, plantHolderComp.Age - random.Next(7, 10));
|
||||
else
|
||||
deviation = (int) (seed.Maturation / seed.GrowthStages);
|
||||
plantHolderComp.Age -= deviation;
|
||||
plantHolderComp.SkipAging++;
|
||||
plantHolderComp.ForceUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
45
Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs
Normal file
45
Content.Server/Chemistry/PlantMetabolism/Diethylamine.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.Interfaces.Random;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class Diethylamine : IPlantMetabolizable
|
||||
{
|
||||
public void ExposeData(ObjectSerializer serializer)
|
||||
{
|
||||
}
|
||||
|
||||
public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1)
|
||||
{
|
||||
if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp)
|
||||
|| plantHolderComp.Seed == null || plantHolderComp.Dead ||
|
||||
plantHolderComp.Seed.Immutable)
|
||||
return;
|
||||
|
||||
var random = IoCManager.Resolve<IRobustRandom>();
|
||||
|
||||
var chance = MathHelper.Lerp(15f, 125f, plantHolderComp.Seed.Lifespan) * 2f * customPlantMetabolism;
|
||||
if (random.Prob(chance))
|
||||
{
|
||||
plantHolderComp.CheckForDivergence(true);
|
||||
plantHolderComp.Seed.Lifespan++;
|
||||
}
|
||||
|
||||
chance = MathHelper.Lerp(15f, 125f, plantHolderComp.Seed.Endurance) * 2f * customPlantMetabolism;
|
||||
if (random.Prob(chance))
|
||||
{
|
||||
plantHolderComp.CheckForDivergence(true);
|
||||
plantHolderComp.Seed.Endurance++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
47
Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs
Normal file
47
Content.Server/Chemistry/PlantMetabolism/RobustHarvest.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Botany;
|
||||
using Content.Shared.Interfaces.Chemistry;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.Interfaces.Random;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Server.Chemistry.PlantMetabolism
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public class RobustHarvest : IPlantMetabolizable
|
||||
{
|
||||
public void ExposeData(ObjectSerializer serializer)
|
||||
{
|
||||
}
|
||||
|
||||
public void Metabolize(IEntity plantHolder, float customPlantMetabolism = 1f)
|
||||
{
|
||||
if (plantHolder.Deleted || !plantHolder.TryGetComponent(out PlantHolderComponent? plantHolderComp)
|
||||
|| plantHolderComp.Seed == null || plantHolderComp.Dead ||
|
||||
plantHolderComp.Seed.Immutable)
|
||||
return;
|
||||
|
||||
var random = IoCManager.Resolve<IRobustRandom>();
|
||||
|
||||
var chance = MathHelper.Lerp(15f, 150f, plantHolderComp.Seed.Potency) * 3.5f * customPlantMetabolism;
|
||||
|
||||
if (random.Prob(chance))
|
||||
{
|
||||
plantHolderComp.CheckForDivergence(true);
|
||||
plantHolderComp.Seed.Potency++;
|
||||
}
|
||||
|
||||
chance = MathHelper.Lerp(6f, 2f, plantHolderComp.Seed.Yield) * 0.15f * customPlantMetabolism;
|
||||
|
||||
if (random.Prob(chance))
|
||||
{
|
||||
plantHolderComp.CheckForDivergence(true);
|
||||
plantHolderComp.Seed.Yield--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user