Add knight health, boss attack patterns, chases, and music

Knight now has a hit-bar (pirates deal 1, bosses deal 3 damage) with
a new vitality upgrade. Bosses grow bigger/scarier and cycle through
melee/missile/bomb/laser attack patterns; boss HP is now exactly 3x
the local pirate's. Zones 20 and 40 replace their boss with a unique
chase (Pirate Cruiser laser dodge + fuel cell collection; Black Swarm
plasma dodge with a tap-to-escape engulf event). Pirates spawn 5x
faster and got a bandana/eyepatch redesign. Added a procedural music
engine, a visible destination galaxy in the supernova cutscene, and
expanded the Data Archive lore to trigger at zones 10/20/40/60/80/100.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D5SuZW1XGCkahPX7cHMoRP
This commit is contained in:
azykov@mail.ru
2026-09-05 16:05:43 +03:00
co-authored by Claude Sonnet 5
parent 0788f42699
commit 799d595e7c
9 changed files with 1177 additions and 58 deletions
+52 -1
View File
@@ -1,4 +1,6 @@
export type UpgradeKey = 'crystal' | 'speed' | 'damage' | 'droid';
export type UpgradeKey = 'crystal' | 'speed' | 'damage' | 'droid' | 'vitality';
export type BossType = 'melee' | 'missile' | 'bomb' | 'laser';
export interface CrystalEntity {
id: number;
@@ -56,6 +58,45 @@ export interface GoldenAsteroidEntity {
jitter: number[];
}
export interface BossProjectile {
id: number;
x: number;
y: number;
vx: number;
vy: number;
radius: number;
}
export interface BossBomb {
x: number;
y: number;
radius: number;
state: 'telegraph' | 'boom';
timer: number;
}
export type ChaseKind = 'cruiser' | 'swarm';
export interface FuelCellEntity {
id: number;
x: number;
y: number;
radius: number;
rotation: number;
spin: number;
jitter: number[];
}
export interface ChaseProjectile {
id: number;
kind: 'laser' | 'plasma';
x: number;
y: number;
vx: number;
vy: number;
radius: number;
}
export interface Particle {
x: number;
y: number;
@@ -104,4 +145,14 @@ export interface GameSnapshot {
cutsceneActive: boolean;
loreActive: boolean;
loreEntry: LoreEntry | null;
knightHp: number;
knightMaxHp: number;
musicMuted: boolean;
chaseActive: boolean;
chaseKind: ChaseKind | null;
chaseFuelCells: number;
chaseFuelRequired: number;
chaseTimeRemaining: number;
chaseEngulfed: boolean;
chaseEscapeMeter: number;
}