Boss becomes a real fight + readable-but-fair enemy threat
BossState (server-only) + BossAISystem: sole mover, seek -> telegraphed radial slam (AttackWindup) -> phase-2 speed + swarmer summon. Excluded from the EnemyAISystem Charger pass; knockback-immune at all 3 stamp sites; arena-anchored spawn; scaled Health/HitRadius/AttackRange. Grunt windup now commits in its last ~30% (whiffs out-of-range); Charger stagger roots; grunt speed 4.2->5.2; swarmer telegraph synced. SweptMove + zone-enemy spawn-stamp extracted to shared helpers. Zero new [GhostField]. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -72,7 +72,7 @@ namespace ProjectM.Simulation
|
||||
/// <summary>DR-042 C6c: Ore deposited into the shared ledger at spawn on a NEW game ONLY (a restored save keeps
|
||||
/// its persisted ledger). Bootstraps the Fabricator(30)->Charge->Turret(10) chain so a turret placed before any
|
||||
/// mining isn't a silent cold deadlock. Ore-only so the 'build a Fabricator to arm turrets' lesson survives.</summary>
|
||||
public const int StartingOre = 50;
|
||||
public const int StartingOre = 90;
|
||||
|
||||
// ---- Expedition run economy (RoomFieldSystem / RunDirectorSystem) ----
|
||||
|
||||
@@ -95,6 +95,41 @@ namespace ProjectM.Simulation
|
||||
/// polish; an idle player died in ~2 s of landing). Subsequent slots keep the normal drip cadence.</summary>
|
||||
public const uint RoomEntryGraceTicks = 100;
|
||||
|
||||
// ---- Expedition BOSS (a scaled Charger given a real kit by BossAISystem; server-only feel consts) ----
|
||||
|
||||
/// <summary>Radial SLAM AoE radius (world units): a player inside this ring at wind-up elapse eats the hit
|
||||
/// unless dashing (i-frames). Sized well above melee reach so the tell reads as a boss-scale ring.</summary>
|
||||
public const float BossSlamRadius = 5.5f;
|
||||
|
||||
/// <summary>Radial SLAM damage. Heavy but survivable given generous i-frames + respawn (readable-but-fair).</summary>
|
||||
public const float BossSlamDamage = 34f;
|
||||
|
||||
/// <summary>SLAM telegraph lead (~0.75 s @60): a fair dodge window under interp lag before the ring lands.</summary>
|
||||
public const uint BossSlamWindupTicks = 45;
|
||||
|
||||
/// <summary>Ticks between SLAMs in phase one (~4 s). Phase two multiplies this by BossPhase2SlamCooldownMult.</summary>
|
||||
public const uint BossSlamCooldownTicks = 240;
|
||||
|
||||
/// <summary>Health fraction at/below which the boss enters phase two (faster + summons adds).</summary>
|
||||
public const float BossPhase2HealthFraction = 0.5f;
|
||||
|
||||
/// <summary>Phase-two move-speed multiplier over the boss's base EnemyStats.MoveSpeed (a visible gear shift).</summary>
|
||||
public const float BossPhase2SpeedMult = 1.45f;
|
||||
|
||||
/// <summary>Phase-two SLAM cooldown multiplier (<1 = slams more often when enraged).</summary>
|
||||
public const float BossPhase2SlamCooldownMult = 0.6f;
|
||||
|
||||
/// <summary>Swarmers summoned per phase-two summon (spawned around the boss, tagged as room zone enemies).</summary>
|
||||
public const int BossSummonCount = 3;
|
||||
|
||||
/// <summary>Ticks between phase-two summons (~7 s).</summary>
|
||||
public const uint BossSummonCooldownTicks = 420;
|
||||
|
||||
/// <summary>Cap on live zone enemies the boss will summon toward — it holds fire above this so a boss room
|
||||
/// never floods past readable (also bounded by the director's MaxAlive count).</summary>
|
||||
public const int BossSummonLiveCap = 8;
|
||||
|
||||
|
||||
// ---- Inventory (per-player bag; InventoryMath / ResourceHarvestSystem / InventoryDepositSystem) ----
|
||||
|
||||
/// <summary>Max stacks a player can carry; InventoryMath rejects deposits past this and the harvest remainder spills to the global ledger.</summary>
|
||||
|
||||
Reference in New Issue
Block a user