Phase 7 Evolution: - Add live-export subcommand to acb-evolver for dashboard JSON generation - Export programs, stats, and generation log to live.json Phase 8 Enhanced Features: - Add WASM game engine build (cmd/acb-wasm/) with JS bindings - Add in-browser sandbox page with Monaco editor (web/src/pages/sandbox.ts) - Add win probability computation (web/src/win-probability.ts) - Add replay commentary generator (web/src/commentary.ts) - Add clip maker for GIF/MP4 export (web/src/pages/clip-maker.ts) - Add rivalry detection and pages (web/src/pages/rivalries.ts) - Add replay feedback system (web/src/pages/feedback.ts) - Add evolution dashboard page (web/src/pages/evolution.ts) Phase 9 Platform Depth: - Add predictions API (cmd/acb-api/predictions.go) - Add series management API (cmd/acb-api/series.go) - Add seasons API (cmd/acb-api/seasons.go) - Add narrative generator for rivalries (cmd/acb-indexer/src/narrative.ts) Engine Updates: - Add debug field to move response schema - Add match event timeline extraction - Add replay enrichment fields Web Updates: - Update app.html navigation for new pages - Add API client methods for predictions, series, seasons - Export engine types for browser use Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
122 lines
2.1 KiB
TypeScript
122 lines
2.1 KiB
TypeScript
// Replay format types matching the Go engine
|
|
|
|
export interface Position {
|
|
row: number;
|
|
col: number;
|
|
}
|
|
|
|
export interface Config {
|
|
rows: number;
|
|
cols: number;
|
|
max_turns: number;
|
|
vision_radius2: number;
|
|
attack_radius2: number;
|
|
spawn_cost: number;
|
|
energy_interval: number;
|
|
}
|
|
|
|
export interface MatchResult {
|
|
winner: number;
|
|
reason: string;
|
|
turns: number;
|
|
scores: number[];
|
|
energy: number[];
|
|
bots_alive: number[];
|
|
}
|
|
|
|
export interface ReplayPlayer {
|
|
id: number;
|
|
name: string;
|
|
}
|
|
|
|
export interface ReplayCore {
|
|
position: Position;
|
|
owner: number;
|
|
}
|
|
|
|
export interface ReplayMap {
|
|
rows: number;
|
|
cols: number;
|
|
walls: Position[];
|
|
cores: ReplayCore[];
|
|
energy_nodes: Position[];
|
|
}
|
|
|
|
export interface ReplayBot {
|
|
id: number;
|
|
owner: number;
|
|
position: Position;
|
|
alive: boolean;
|
|
}
|
|
|
|
export interface ReplayCoreState {
|
|
position: Position;
|
|
owner: number;
|
|
active: boolean;
|
|
}
|
|
|
|
export interface GameEvent {
|
|
type: string;
|
|
turn: number;
|
|
details: unknown;
|
|
}
|
|
|
|
export interface ReplayTurn {
|
|
turn: number;
|
|
bots: ReplayBot[];
|
|
cores: ReplayCoreState[];
|
|
energy: Position[];
|
|
scores: number[];
|
|
energy_held: number[];
|
|
events?: GameEvent[];
|
|
}
|
|
|
|
export interface Replay {
|
|
format_version?: string; // semver, e.g. "1.0" — absent in pre-v1 replays
|
|
match_id: string;
|
|
config: Config;
|
|
start_time: string;
|
|
end_time: string;
|
|
result: MatchResult;
|
|
players: ReplayPlayer[];
|
|
map: ReplayMap;
|
|
turns: ReplayTurn[];
|
|
}
|
|
|
|
// Event detail types
|
|
export interface BotSpawnedDetails {
|
|
bot_id: number;
|
|
owner: number;
|
|
position: Position;
|
|
}
|
|
|
|
export interface BotDiedDetails {
|
|
bot_id: number;
|
|
owner: number;
|
|
position: Position;
|
|
}
|
|
|
|
export interface EnergyCollectedDetails {
|
|
bot_id: number;
|
|
owner: number;
|
|
position: Position;
|
|
}
|
|
|
|
export interface CoreCapturedDetails {
|
|
position: Position;
|
|
old_owner: number;
|
|
new_owner: number;
|
|
}
|
|
|
|
export interface CombatDeathDetails {
|
|
attacker_id: number;
|
|
attacker_owner: number;
|
|
defender_id: number;
|
|
defender_owner: number;
|
|
position: Position;
|
|
}
|
|
|
|
export interface CollisionDeathDetails {
|
|
bot_ids: number[];
|
|
position: Position;
|
|
}
|