From aec558244eaf79ea2483e258b464dc1c7b98df54 Mon Sep 17 00:00:00 2001 From: Philippe Cloutier Date: Wed, 16 Sep 2026 21:57:12 -0400 Subject: [PATCH] chore: Increase HP for concrete layers to 50k --- .../data/plantrules/devrinol.txt | 4 +- .../data/plantrules/devrinol_wild.txt | 4 +- src/Perpetuum.Tests/Unit/PlantRuleTests.cs | 70 +++++++++++++++++++ 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 src/Perpetuum.Tests/Unit/PlantRuleTests.cs diff --git a/src/Perpetuum.ServerService2/data/plantrules/devrinol.txt b/src/Perpetuum.ServerService2/data/plantrules/devrinol.txt index 6fa33b23..1d1e316f 100644 --- a/src/Perpetuum.ServerService2/data/plantrules/devrinol.txt +++ b/src/Perpetuum.ServerService2/data/plantrules/devrinol.txt @@ -16,8 +16,8 @@ fruitingState=n-1 fruitDefinition=n-1 fruitAmount=n-1 maxAmount=n14630 -damageScale=f1 -health=N20,20,20,20 +damageScale=f0.005 +health=N250,250,250,250 allowedTerrainTypes=N0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 playerSeeded=n1 state_0=40,1 diff --git a/src/Perpetuum.ServerService2/data/plantrules/devrinol_wild.txt b/src/Perpetuum.ServerService2/data/plantrules/devrinol_wild.txt index 97d9cfc2..3999d44e 100644 --- a/src/Perpetuum.ServerService2/data/plantrules/devrinol_wild.txt +++ b/src/Perpetuum.ServerService2/data/plantrules/devrinol_wild.txt @@ -16,8 +16,8 @@ fruitingState=n-1 fruitDefinition=n-1 fruitAmount=n-1 maxAmount=n14630 -damageScale=f1 -health=N20,20,20,20 +damageScale=f0.005 +health=N250,250,250,250 allowedTerrainTypes=N0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 playerSeeded=n1 state_0=40,1 diff --git a/src/Perpetuum.Tests/Unit/PlantRuleTests.cs b/src/Perpetuum.Tests/Unit/PlantRuleTests.cs new file mode 100644 index 00000000..44b8d947 --- /dev/null +++ b/src/Perpetuum.Tests/Unit/PlantRuleTests.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using Perpetuum.GenXY; +using Perpetuum.Zones.Terrains.Materials.Plants; +using Xunit; + +namespace Perpetuum.Tests.Unit +{ + public class PlantRuleTests + { + [Fact] + public void PlantRule_Devrinol_ConcreteLayer_Has50kEffectiveHealth() + { + const string devrinolConfig = + "index=n19#" + + "name=$devrinol#" + + "blockingHeight=40,0,0,0#" + + "fertility=n3#" + + "placesConcrete=n1#" + + "damageScale=f0.005#" + + "health=N250,250,250,250#" + + "allowedTerrainTypes=N0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20#" + + "playerSeeded=n1#" + + "state_0=40,1#" + + "action_0=N19#" + + "state_1=N1,2#" + + "action_1=N19#" + + "state_2=42,3#" + + "action_2=N19#" + + "state_3=N3#" + + "action_3=N19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,0#"; + + IDictionary settings = GenxyConverter.Deserialize(devrinolConfig); + var rule = new PlantRule(settings); + + Assert.Equal(PlantType.Devrinol, rule.Type); + Assert.True(rule.PlacesConcrete); + Assert.True(rule.PlayerSeeded); + Assert.Equal(0.005, rule.DamageScale); + Assert.Equal(4, rule.Health.Length); + Assert.All(rule.Health, hp => Assert.Equal(250, hp)); + + // Effective HP across all states = Health / DamageScale = 250 / 0.005 = 50,000 + double effectiveHealth = rule.Health[0] / rule.DamageScale; + Assert.Equal(50000.0, effectiveHealth); + } + + [Fact] + public void PlantRule_Health_ClampedToByteRange() + { + var settings = new Dictionary + { + { k.blockingHeight, new[] { 0, 0, 0, 0, 0 } }, + { k.health, new[] { -10, 0, 100, 250, 300 } }, + { "state_0", new[] { 0 } }, + { "action_0", new[] { 0 } }, + { "state_1", new[] { 1 } }, + { "action_1", new[] { 0 } }, + { "state_2", new[] { 2 } }, + { "action_2", new[] { 0 } }, + { "state_3", new[] { 3 } }, + { "action_3", new[] { 0 } }, + { "state_4", new[] { 4 } }, + { "action_4", new[] { 0 } } + }; + + var rule = new PlantRule(settings); + Assert.Equal(new byte[] { 0, 0, 100, 250, 255 }, rule.Health); + } + } +}