diff --git a/content/abilities/prototype_npc_abilities.json b/content/abilities/prototype_npc_abilities.json index 787c6fc..68fe760 100644 --- a/content/abilities/prototype_npc_abilities.json +++ b/content/abilities/prototype_npc_abilities.json @@ -5,7 +5,7 @@ "id": "prototype_npc_melee_strike", "displayName": "NPC Melee Strike", "baseDamage": 15, - "maxRange": 6.0, + "maxRange": 1.0, "cooldownSeconds": 3.0, "abilityKind": "attack" }, diff --git a/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionCatalogLoaderTests.cs b/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionCatalogLoaderTests.cs index b7964eb..6c56055 100644 --- a/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionCatalogLoaderTests.cs +++ b/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionCatalogLoaderTests.cs @@ -62,7 +62,7 @@ public class AbilityDefinitionCatalogLoaderTests "id": "prototype_npc_melee_strike", "displayName": "NPC Melee Strike", "baseDamage": 15, - "maxRange": 6.0, + "maxRange": 1.0, "cooldownSeconds": 3.0, "abilityKind": "attack" }, diff --git a/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionsWorldApiTests.cs b/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionsWorldApiTests.cs index 238accd..89073a6 100644 --- a/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionsWorldApiTests.cs +++ b/server/NeonSprawl.Server.Tests/Game/Combat/AbilityDefinitionsWorldApiTests.cs @@ -66,6 +66,6 @@ public class AbilityDefinitionsWorldApiTests var meleeStrike = body.Abilities.Single(a => a.Id == "prototype_npc_melee_strike"); Assert.Equal(15, meleeStrike.BaseDamage); - Assert.Equal(6.0, meleeStrike.MaxRange); + Assert.Equal(1.0, meleeStrike.MaxRange); } } diff --git a/server/NeonSprawl.Server.Tests/Game/Npc/PrototypeNpcTestFixtures.cs b/server/NeonSprawl.Server.Tests/Game/Npc/PrototypeNpcTestFixtures.cs index da4642b..186a5e2 100644 --- a/server/NeonSprawl.Server.Tests/Game/Npc/PrototypeNpcTestFixtures.cs +++ b/server/NeonSprawl.Server.Tests/Game/Npc/PrototypeNpcTestFixtures.cs @@ -44,7 +44,7 @@ public static class PrototypeNpcTestFixtures "NPC Melee Strike", 15, 3.0, - 6.0, + 1.0, "attack"), [PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot] = new( PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot, diff --git a/server/README.md b/server/README.md index b0f5ab9..68e7f1b 100644 --- a/server/README.md +++ b/server/README.md @@ -161,7 +161,7 @@ Per-NPC aggro holders live in **`Game/Npc/`** as **`IThreatStateStore`** + **`In | Rule | Behavior | |------|----------| | **Acquire** | First **damaging** cast on an NPC sets holder to the casting player when the row is empty (**`AggroOperations.TryAcquire`** from **`AbilityCastApi`**). Zero-damage abilities do not acquire. | -| **Attack range** | At telegraph resolve, damage applies only when the holder is within the bound attack ability's catalog **`maxRange`** of the NPC anchor (horizontal X/Z, inclusive). Melee strike **6 m**, ranged shot **10 m**, elite slam **8 m** — distinct from behavior **`aggroRadius`** (re-aggro) and tab-lock **6 m**. Out-of-range windups whiff (no damage; state still advances). | +| **Attack range** | At telegraph resolve, damage applies only when the holder is within the bound attack ability's catalog **`maxRange`** of the NPC anchor (horizontal X/Z, inclusive). Melee strike **1 m**, ranged shot **10 m**, elite slam **8 m** — distinct from behavior **`aggroRadius`** (re-aggro) and tab-lock **6 m**. Out-of-range windups whiff (no damage; state still advances). | | **Leash clear** | Holder clears when that player moves beyond the bound behavior def **`leashRadius`** from the NPC anchor (horizontal X/Z distance). Wired on **`POST /move`**, **`POST /move-stream`**, and before acquire on cast. | | **Defeat clear** | When **`ICombatEntityHealthStore`** marks the NPC **`defeated`**, **`NpcRuntimeOperations.TryStopOnTargetDefeat`** clears holder and resets runtime to **`idle`** (cast accept + lazy advance guard). | | **Re-aggro** | After clear, the same first-hit rule applies — no proximity auto-aggro in this slice. |