refactor: PromptDef

This commit is contained in:
2026-04-06 15:54:02 +08:00
parent fe3bef0a01
commit 6cfb3b6df8
7 changed files with 45 additions and 14 deletions
+7 -5
View File
@@ -5,7 +5,9 @@
PlayerType,
WinnerType,
WIN_LENGTH,
MAX_PIECES_PER_PLAYER, BoopGame
MAX_PIECES_PER_PLAYER,
BoopGame,
prompts
} from "./data";
import {createGameCommandRegistry} from "@/core/game";
import {moveToRegion} from "@/core/region";
@@ -186,8 +188,8 @@ async function handleCheckFullBoard(game: BoopGame, turnPlayer: PlayerType){
}
const partId = await game.prompt(
'choose <player> <row:number> <col:number>',
(player: PlayerType, row: number, col: number) => {
prompts.choose,
(player, row, col) => {
if (player !== turnPlayer) {
throw `Invalid player: ${player}. Expected ${turnPlayer}.`;
}
@@ -218,8 +220,8 @@ const checkFullBoard = registry.register({
async function handleTurn(game: BoopGame, turnPlayer: PlayerType) {
const {row, col, type} = await game.prompt(
'play <player> <row:number> <col:number> [type:string]',
(player: PlayerType, row: number, col: number, type?: PieceType) => {
prompts.play,
(player, row, col, type) => {
const pieceType = type === 'cat' ? 'cat' : 'kitten';
if (player !== turnPlayer) {
+7 -1
View File
@@ -2,7 +2,7 @@
import {createRegion, moveToRegion, Region} from "@/core/region";
import {createPartsFromTable} from "@/core/part-factory";
import {Part} from "@/core/part";
import {IGameContext} from "@/core/game";
import {createPromptDef, IGameContext} from "@/core/game";
export const BOARD_SIZE = 6;
export const MAX_PIECES_PER_PLAYER = 8;
@@ -14,6 +14,12 @@ export type WinnerType = PlayerType | 'draw' | null;
export type RegionType = 'white' | 'black' | 'board' | '';
export type BoopPartMeta = { player: PlayerType; type: PieceType };
export type BoopPart = Part<BoopPartMeta>;
export const prompts = {
play: createPromptDef<[PlayerType, number, number, PieceType?]>(
'play <player> <row:number> <col:number> [type:string]'),
choose: createPromptDef<[PlayerType, number, number]>(
'choose <player> <row:number> <col:number>')
}
export function createInitialState() {
const pieces = createPartsFromTable(