48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import type {
|
|
ArenaAuthoritativeSnapshot,
|
|
ArenaCombatIntent,
|
|
ArenaResult,
|
|
ArenaRole,
|
|
ArenaStageManifest,
|
|
} from "../src/game/arenaTypes";
|
|
import type { ArenaBracket, ArenaMode, ArenaRuleset } from "../src/game/arenaRules";
|
|
|
|
export interface ArenaSimulationParticipant {
|
|
actorId: string;
|
|
accountId?: string | null;
|
|
characterId?: string | null;
|
|
name: string;
|
|
team: 0 | 1;
|
|
role: ArenaRole;
|
|
isBot: boolean;
|
|
disconnected?: boolean;
|
|
rating: number;
|
|
}
|
|
|
|
export interface ArenaSimulationOptions {
|
|
id: string;
|
|
stage: ArenaStageManifest;
|
|
bracket: ArenaBracket;
|
|
mode: ArenaMode;
|
|
ruleset: ArenaRuleset;
|
|
participants: readonly ArenaSimulationParticipant[];
|
|
random?: () => number;
|
|
startedAt?: number;
|
|
onSnapshot?: (snapshot: ArenaAuthoritativeSnapshot) => void;
|
|
onResult?: (result: Omit<ArenaResult, "ratingUpdates">) => void;
|
|
}
|
|
|
|
export declare const ARENA_TICK_RATE: 20;
|
|
export declare const ARENA_SNAPSHOT_RATE: 10;
|
|
export declare const ARENA_TICK_MS: 50;
|
|
|
|
export declare class ArenaSimulation {
|
|
constructor(options: ArenaSimulationOptions);
|
|
start(): this;
|
|
resetPreparationClock(startedAt?: number): boolean;
|
|
stop(): void;
|
|
step(): void;
|
|
snapshot(): ArenaAuthoritativeSnapshot;
|
|
receiveIntent(actorId: string, intent: ArenaCombatIntent): { accepted: boolean; reason?: string };
|
|
}
|