botWebWars/frontend/src/types.ts

258 lines
5.7 KiB
TypeScript

export interface GridConfig {
min_x: number;
max_x: number;
min_y: number;
max_y: number;
grid_cells_x: number;
grid_cells_y: number;
}
export interface Obstacle {
x: number;
y: number;
type: 'mountain' | 'forest' | 'valley';
}
export interface Player {
id: string;
name: string;
color: string;
x: number;
y: number;
strength: number;
score: number;
health?: number;
max_health?: number;
piece_type?: 'knight' | 'warrior';
party_id?: string | null;
is_party_leader: boolean;
visited_locations?: { x: number; y: number }[];
created_at?: string;
}
export interface Party {
id: string;
name: string;
leader_id: string;
leader_name: string;
member_ids: string[];
total_strength: number;
created_at?: string;
}
export interface TurnInfo {
game_started?: boolean;
current_player_id: string | null;
current_player_name: string | null;
round_number: number;
turn_number: number;
turn_order: string[];
}
export interface GameConclusion {
concluded: boolean;
winning_party_id?: string | null;
winning_party_name?: string | null;
winning_leader_id?: string | null;
winning_leader_name?: string | null;
total_bots?: number;
rankings?: Player[];
}
export interface WizardNPC {
id: string;
name: string;
x: number;
y: number;
strength: number;
color: string;
dialogue?: string;
}
export interface BoardState {
config: GridConfig;
player_count: number;
players: Player[];
parties: Party[];
obstacles: Obstacle[];
wizard?: WizardNPC | null;
turn: TurnInfo;
game_started?: boolean;
conclusion?: GameConclusion | null;
}
export interface MoveCheckResult {
direction: string;
dx: number;
dy: number;
target_x: number;
target_y: number;
available: boolean;
reason?: string | null;
}
export interface AvailableMovesResponse {
player_id: string;
player_name: string;
current_x: number;
current_y: number;
is_turn: boolean;
is_party_leader: boolean;
party_id?: string | null;
party_member_count: number;
current_turn_player_id?: string | null;
moves: Record<string, MoveCheckResult>;
}
export interface BotMemoryResponse {
player_id: string;
player_name: string;
current_x: number;
current_y: number;
visited_count: number;
visited_history: { x: number; y: number }[];
has_visited_current: boolean;
}
export interface RadarTarget {
id: string;
name: string;
color: string;
x: number;
y: number;
strength: number;
distance: number;
party_id?: string | null;
party_name?: string | null;
is_ally: boolean;
is_enemy: boolean;
can_recruit: boolean;
can_battle: boolean;
}
export interface WizardRadarTarget {
id: string;
name: string;
x: number;
y: number;
distance: number;
strength: number;
can_challenge: boolean;
}
export interface BotRadarResponse {
player_id: string;
current_x: number;
current_y: number;
bot_goal: string;
targets: RadarTarget[];
nearest_target?: RadarTarget | null;
wizard?: WizardRadarTarget | null;
recommended_direction?: string | null;
recommended_action: string;
}
export interface BattleBout {
bout_number: number;
party1_roll: number;
party1_strength: number;
party1_score: number;
party2_roll: number;
party2_strength: number;
party2_score: number;
winner_name?: string | null;
}
export interface BattleResult {
bouts: BattleBout[];
party1_name: string;
party2_name: string;
party1_bouts_won: number;
party2_bouts_won: number;
party1_total_score: number;
party2_total_score: number;
winner_party_id: string;
winner_party_name: string;
winner_leader_id: string;
winner_leader_name: string;
defeated_party_id: string;
defeated_party_name: string;
killed_leader_id: string;
killed_leader_name: string;
killed_leader_new_score: number;
killed_leader_respawn_position: { x: number; y: number };
absorbed_members: string[];
new_party_size: number;
new_party_strength: number;
health_losses?: Record<string, number>;
}
export interface WizardChallengeBout {
bout_number: number;
player_roll: number;
player_strength: number;
player_score: number;
wizard_roll: number;
wizard_strength: number;
wizard_score: number;
winner: string;
}
export interface WizardChallengeResult {
challenger_id: string;
challenger_name: string;
wizard_name?: string;
party_id?: string | null;
bouts: WizardChallengeBout[];
player_bouts_won: number;
wizard_bouts_won: number;
player_won: boolean;
score_change: number;
health_change: number;
new_score: number;
new_health: number;
wizard_respawn_position: { x: number; y: number };
}
export interface PartyDefeatResult {
party_id: string;
killed_leader_id: string;
killed_leader_name: string;
killed_leader_new_score: number;
killed_leader_respawn_position: { x: number; y: number };
new_leader_id?: string | null;
new_leader_name?: string | null;
remaining_members: string[];
party_dissolved: boolean;
}
export interface MoveResponse {
success: boolean;
player: Player;
direction: string;
party_moved: boolean;
affected_players: Player[];
previous_position: { x: number; y: number };
new_position: { x: number; y: number };
party_formed_triggered: boolean;
formed_party?: Party | null;
battle_triggered: boolean;
battle_result?: BattleResult | null;
game_concluded?: GameConclusion | null;
turn: TurnInfo;
}
export interface AiStepResponse {
action_taken: string;
player_id: string;
player_name: string;
bot_goal: string;
direction?: string | null;
move_result?: MoveResponse | null;
formed_party?: Party | null;
battle_result?: BattleResult | null;
wizard_challenge_result?: WizardChallengeResult | null;
game_concluded?: GameConclusion | null;
turn: TurnInfo;
}