diff --git a/Assets/_Project/Scripts/Authoring/Combat/AbilityDatabaseAuthoring.cs b/Assets/_Project/Scripts/Authoring/Combat/AbilityDatabaseAuthoring.cs
index cee311511..295529497 100644
--- a/Assets/_Project/Scripts/Authoring/Combat/AbilityDatabaseAuthoring.cs
+++ b/Assets/_Project/Scripts/Authoring/Combat/AbilityDatabaseAuthoring.cs
@@ -47,6 +47,7 @@ namespace ProjectM.Authoring
ProjectileSpeed = def.ProjectileSpeed,
Range = def.Range,
AutoTargetRange = def.AutoTargetRange,
+ Archetype = (byte)def.Archetype,
AutoTargetConeRadians = math.radians(def.AutoTargetConeDegrees),
CooldownTicks = def.CooldownTicks,
Name = def.DisplayName,
diff --git a/Assets/_Project/Scripts/Authoring/Combat/AbilityDefinition.cs b/Assets/_Project/Scripts/Authoring/Combat/AbilityDefinition.cs
index d56ca909e..c66ecf6a3 100644
--- a/Assets/_Project/Scripts/Authoring/Combat/AbilityDefinition.cs
+++ b/Assets/_Project/Scripts/Authoring/Combat/AbilityDefinition.cs
@@ -13,6 +13,8 @@ namespace ProjectM.Authoring
public class AbilityDefinition : ScriptableObject
{
public AbilityId Id = AbilityId.Primary;
+ [Tooltip("Ability kind for the fire-dispatch. Only Projectile is wired today; the rest are the MC-6 spike.")]
+ public AbilityArchetype Archetype = AbilityArchetype.Projectile;
public string DisplayName = "Ability";
[Header("Combat")]
diff --git a/Assets/_Project/Scripts/Simulation/Combat/AbilityDatabaseBlob.cs b/Assets/_Project/Scripts/Simulation/Combat/AbilityDatabaseBlob.cs
index fb6cec2ac..64dfec962 100644
--- a/Assets/_Project/Scripts/Simulation/Combat/AbilityDatabaseBlob.cs
+++ b/Assets/_Project/Scripts/Simulation/Combat/AbilityDatabaseBlob.cs
@@ -3,10 +3,21 @@ using Unity.Entities;
namespace ProjectM.Simulation
{
+ /// Ability KIND for the AbilityFireSystem dispatch (MC-4 spike for MC-6). Backed by byte so the
+ /// baked blob stores a byte (the Burst cross-assembly enum rule); the runtime switch compares the byte value.
+ public enum AbilityArchetype : byte
+ {
+ Projectile = 0, // today's path: spawn a projectile ghost
+ Hitscan = 1, // MC-6
+ Cone = 2, // MC-6 (melee-style cone via the ability system)
+ Aoe = 3, // MC-6
+ }
+
/// One authored ability definition, baked immutable into the AbilityDatabase blob.
public struct AbilityDefBlob
{
public byte Id; // AbilityId
+ public byte Archetype; // AbilityArchetype (0 = Projectile); read at dispatch in AbilityFireSystem (MC-6 spike)
public float Damage;
public float ProjectileSpeed;
public float Range;
diff --git a/Assets/_Project/Scripts/Simulation/Combat/AbilityFireSystem.cs b/Assets/_Project/Scripts/Simulation/Combat/AbilityFireSystem.cs
index 8fb148cdb..4b1545a76 100644
--- a/Assets/_Project/Scripts/Simulation/Combat/AbilityFireSystem.cs
+++ b/Assets/_Project/Scripts/Simulation/Combat/AbilityFireSystem.cs
@@ -60,6 +60,7 @@ namespace ProjectM.Simulation
// Per-ability projectile ghost prefabs live on the AbilityDatabase singleton's companion buffer.
var dbEntity = SystemAPI.GetSingletonEntity();
var abilityPrefabs = SystemAPI.GetBuffer(dbEntity);
+ var abilityDb = SystemAPI.GetSingleton();
bool isServer = state.WorldUnmanaged.IsServer();
@@ -99,6 +100,14 @@ namespace ProjectM.Simulation
continue; // still cooling down
}
+ // MC-4 spike for MC-6: dispatch on the authored ability ARCHETYPE byte (baked in the blob, read here -- NOT
+ // folded through EffectiveAbilityStats; it is static identity, not a tunable stat). All current
+ // abilities are Projectile (0); hitscan/cone/aoe archetypes plug in at this point in MC-6.
+ ref var adb = ref abilityDb.Value.Value;
+ byte archetype = adb.TryGetAbility(abilityRef.ValueRO.Id, out var adef) ? adef.Archetype : (byte)AbilityArchetype.Projectile;
+ if (archetype != (byte)AbilityArchetype.Projectile)
+ continue;
+
// Resolve the projectile ghost prefab for this player's selected ability id.
Entity prefab = Entity.Null;
for (int i = 0; i < abilityPrefabs.Length; i++)