diff --git a/Content.Server/Botany/Components/SeedComponent.cs b/Content.Server/Botany/Components/SeedComponent.cs index 3e729dc906..f475ec3cfc 100644 --- a/Content.Server/Botany/Components/SeedComponent.cs +++ b/Content.Server/Botany/Components/SeedComponent.cs @@ -15,6 +15,12 @@ namespace Content.Server.Botany.Components [DataField("seed")] public SeedData? Seed; + /// + /// If not null, overrides the plant's initial health. Otherwise, the plant's initial health is set to the Endurance value. + /// + [DataField] + public float? HealthOverride = null; + /// /// Name of a base seed prototype that is used if is null. /// diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index c9389f832e..f64fcb3c43 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -104,11 +104,12 @@ public sealed partial class BotanySystem : EntitySystem /// /// Spawns a new seed packet on the floor at a position, then tries to put it in the user's hands if possible. /// - public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, EntityUid user) + public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, EntityUid user, float? healthOverride = null) { var seed = Spawn(proto.PacketPrototype, coords); var seedComp = EnsureComp(seed); seedComp.Seed = proto; + seedComp.HealthOverride = healthOverride; var name = Loc.GetString(proto.Name); var noun = Loc.GetString(proto.Noun); diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 601dca3685..86f7be6d7b 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -71,6 +71,17 @@ public sealed class PlantHolderSystem : EntitySystem } } + private int GetCurrentGrowthStage(Entity entity) + { + var (uid, component) = entity; + + if (component.Seed == null) + return 0; + + var result = Math.Max(1, (int) (component.Age * component.Seed.GrowthStages / component.Seed.Maturation)); + return result; + } + private void OnExamine(Entity entity, ref ExaminedEvent args) { if (!args.IsInDetailsRange) @@ -148,6 +159,7 @@ public sealed class PlantHolderSystem : EntitySystem if (!_botany.TryGetSeed(seeds, out var seed)) return; + float? seedHealth = seeds.HealthOverride; var name = Loc.GetString(seed.Name); var noun = Loc.GetString(seed.Noun); _popup.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message", @@ -157,7 +169,14 @@ public sealed class PlantHolderSystem : EntitySystem component.Seed = seed; component.Dead = false; component.Age = 1; - component.Health = component.Seed.Endurance; + if (seedHealth is float realSeedHealth) + { + component.Health = realSeedHealth; + } + else + { + component.Health = component.Seed.Endurance; + } component.LastCycle = _gameTiming.CurTime; QueueDel(args.Used); @@ -262,16 +281,15 @@ public sealed class PlantHolderSystem : EntitySystem return; } - component.Health -= (_random.Next(3, 5) * 10); - - if (!component.Harvest) + if (GetCurrentGrowthStage(entity) <= 1) { - _popup.PopupCursor(Loc.GetString("plant-holder-component-early-sample"), args.User); + _popup.PopupCursor(Loc.GetString("plant-holder-component-early-sample-message"), args.User); return; } + component.Health -= (_random.Next(3, 5) * 10); component.Seed.Unique = false; - var seed = _botany.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates, args.User); + var seed = _botany.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates, args.User, component.Health); _randomHelper.RandomOffset(seed, 0.25f); var displayName = Loc.GetString(component.Seed.DisplayName); _popup.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message", @@ -904,7 +922,7 @@ public sealed class PlantHolderSystem : EntitySystem } else if (component.Age < component.Seed.Maturation) { - var growthStage = Math.Max(1, (int) (component.Age * component.Seed.GrowthStages / component.Seed.Maturation)); + var growthStage = GetCurrentGrowthStage((uid, component)); _appearance.SetData(uid, PlantHolderVisuals.PlantRsi, component.Seed.PlantRsi.ToString(), app); _appearance.SetData(uid, PlantHolderVisuals.PlantState, $"stage-{growthStage}", app); diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 01d713ab34..0e8c4137f4 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -32,4 +32,4 @@ plant-holder-component-light-improper-warning = The [color=yellow]improper light plant-holder-component-heat-improper-warning = The [color=orange]improper temperature level alert[/color] is blinking. plant-holder-component-pressure-improper-warning = The [color=lightblue]improper environment pressure alert[/color] is blinking. plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. -plant-holder-component-early-sample = It is not ready to sample, but you cut a bit of the plant anyway. +plant-holder-component-early-sample-message = The plant hasn't grown enough to take a sample yet.