feat: add 9-level tower evolution system with distinct tier abilities
Extend all 5 towers to 9 upgrade levels, divided into 3 visual and functional evolution tiers: - Tier 1 (L1-3, Yellow): Base stats (damage, range, rate). - Tier 2 (L4-6, Orange): First major ability evolution with pulsing orange aura. - Tier 3 (L7-9, Blue): Final devastating evolution with blue aura. Evolutions per tower: - Arrow Tower: * L4-6 (Orange): Multishot firing 2-3 arrows simultaneously at distinct targets. * L7-9 (Blue): 4-arrow multishot + Poison DoT (up to 28 dmg/s). - Cannon: * L4-6 (Orange): Incendiary shells applying Burn DoT in splash radius. * L7-9 (Blue): Flak shells hitting flying units with full splash + burn damage. - Frost Tower: * L4-6 (Orange): Permafrost - every 3rd pulse completely freezes enemies (speed = 0). * L7-9 (Blue): Shatter - frozen enemies receive +50% damage from all sources. - Tesla Tower: * L4-6 (Orange): Chain lightning applies stun on each hit. * L7-9 (Blue): Lightning Storm - every 4th shot strikes and stuns ALL enemies in range. - Laser Tower: * L4-6 (Orange): Prism refraction splitting the beam onto 2-3 secondary targets. * L7-9 (Blue): Piercing beam penetrating all enemies in a line up to 280px range. Engine & Renderer updates: - Added DoT tick handling (poison/burn) and freeze/stun status effects. - Added visual indicators for frozen enemies (ice spikes) and DoT particles. - Added 3-slot tier-colored pips on tower base plates + pulsating evolution auras. - Updated TowerPanel with 9-star tier display (★★★ yellow, ★★★ orange, ★★★ blue) and dynamic special ability descriptions. Testing & Validation: - Added `scripts/test-evolution.mts` covering all 10 evolved mechanics (all green). - Verified lockstep multiplayer determinism via `scripts/test-mp.mts`. - Verified solo campaign balance preservation via `scripts/sim.mts`. - Full TypeScript typecheck and production build passing.
This commit is contained in:
parent
ef75203db7
commit
4f8400c480
8 changed files with 518 additions and 98 deletions
|
|
@ -5,8 +5,12 @@
|
|||
* Run: npm run sim
|
||||
*/
|
||||
import { GameEngine } from '../src/game/engine.ts'
|
||||
import { TOWERS } from '../src/game/config.ts'
|
||||
import type { TowerKind } from '../src/game/types.ts'
|
||||
|
||||
/** campaign balance stays tuned for 3 levels – evolutions are endless-mode luxury */
|
||||
const SIM_MAX_LEVEL = 3
|
||||
|
||||
const eng = new GameEngine()
|
||||
eng.startGame('normal')
|
||||
|
||||
|
|
@ -122,20 +126,12 @@ function bot(): void {
|
|||
}
|
||||
|
||||
function towerCost(kind: TowerKind): number {
|
||||
const costs: Record<TowerKind, number> = { arrow: 50, cannon: 110, frost: 80, tesla: 130, laser: 160 }
|
||||
return costs[kind]
|
||||
return TOWERS[kind].cost
|
||||
}
|
||||
|
||||
function upgradeCostOf(kind: TowerKind, level: number): number | null {
|
||||
const up: Record<TowerKind, [number, number]> = {
|
||||
arrow: [60, 110],
|
||||
cannon: [100, 180],
|
||||
frost: [70, 130],
|
||||
tesla: [120, 200],
|
||||
laser: [150, 260],
|
||||
}
|
||||
if (level >= 3) return null
|
||||
return up[kind][level - 1]
|
||||
if (level >= SIM_MAX_LEVEL) return null
|
||||
return TOWERS[kind].upgradeCost[level - 1]
|
||||
}
|
||||
|
||||
let lastWave = 0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue