Add tap-controlled incremental space-knight game

Auto-flying knight, crystal zones, pirate/boss combat, shop upgrades,
falling/golden asteroids, particle juice, droid evolution, and a
supernova prestige cutscene, per the design spec.

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 11:19:16 +03:00
co-authored by Claude Sonnet 5
parent 9f903a5094
commit cbd547944e
18 changed files with 1922 additions and 407 deletions
+99
View File
@@ -0,0 +1,99 @@
export type UpgradeKey = 'crystal' | 'speed' | 'damage' | 'droid';
export interface CrystalEntity {
id: number;
x: number;
y: number;
value: number;
radius: number;
rotation: number;
spin: number;
jitter: number[];
}
export interface EnemyEntity {
id: number;
x: number;
y: number;
hp: number;
maxHp: number;
speed: number;
radius: number;
isBoss: boolean;
state: 'chase' | 'fight';
wanderAngle: number;
jitter: number[];
hitFlash: number;
}
export interface DroidEntity {
id: number;
angleOffset: number;
cooldown: number;
laserTimer: number;
}
export interface AsteroidEntity {
id: number;
x: number;
y: number;
vx: number;
speed: number;
radius: number;
rotation: number;
spin: number;
jitter: number[];
}
export interface GoldenAsteroidEntity {
id: number;
x: number;
y: number;
vx: number;
vy: number;
radius: number;
rotation: number;
jitter: number[];
}
export interface Particle {
x: number;
y: number;
vx: number;
vy: number;
life: number;
maxLife: number;
size: number;
color: string;
}
export interface FloatingText {
x: number;
y: number;
vy: number;
life: number;
maxLife: number;
text: string;
color: string;
}
export interface GameSnapshot {
score: number;
zone: number;
crystalsInZone: number;
crystalsRequired: number;
darkMatter: number;
bossActive: boolean;
bossHp: number;
bossMaxHp: number;
pirateActive: boolean;
pirateHp: number;
pirateMaxHp: number;
levels: Record<UpgradeKey, number>;
costs: Record<UpgradeKey, number>;
canAfford: Record<UpgradeKey, boolean>;
droidCount: number;
canPrestige: boolean;
prestigeGain: number;
cutsceneActive: boolean;
}