refactor: prompt def udpate

This commit is contained in:
2026-04-06 16:20:52 +08:00
parent bf20e53c6b
commit 20f722818d
7 changed files with 34 additions and 36 deletions
+6 -15
View File
@@ -7,7 +7,7 @@
WinnerType,
WIN_LENGTH,
MAX_PIECES_PER_PLAYER,
BoopGame,
BoopGame, prompts,
} from "./data";
import {createGameCommandRegistry, Command, moveToRegion} from "boardgame-core";
import {
@@ -184,8 +184,8 @@ async function handleCheckFullBoard(game: BoopGame, turnPlayer: PlayerType){
}
const partId = await game.prompt(
'play <player> <row:number> <col:number> [type:string]',
(player: PlayerType, row: number, col: number, type?: PieceType) => {
prompts.graduate,
(player, row, col) => {
if (player !== turnPlayer) {
throw `无效的玩家: ${player},期望的是 ${turnPlayer}`;
}
@@ -213,8 +213,8 @@ const checkFullBoard = registry.register('check-full-board', handleCheckFullBoar
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) {
@@ -246,13 +246,4 @@ async function handleTurn(game: BoopGame, turnPlayer: PlayerType) {
await handleCheckFullBoard(game, turnPlayer);
return { winner: null };
}
const turn = registry.register('turn <player>', handleTurn);
export const prompts = {
play: (player: PlayerType, row: number, col: number, type?: PieceType) => {
if (type) {
return `play ${player} ${row} ${col} ${type}`;
}
return `play ${player} ${row} ${col}`;
},
};
const turn = registry.register('turn <player>', handleTurn);
+5 -1
View File
@@ -1,5 +1,5 @@
import parts from './parts.csv';
import {createRegion, moveToRegion, Region} from "boardgame-core";
import {createRegion, moveToRegion, Region, createPromptDef} from "boardgame-core";
import {createPartsFromTable} from "boardgame-core";
import {Part} from "boardgame-core";
import {IGameContext} from "boardgame-core";
@@ -14,6 +14,10 @@ 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]'),
graduate: createPromptDef<[PlayerType, number, number]>('graduate <player> <row:number> <col:number>'),
}
export function createInitialState() {
const pieces = createPartsFromTable(
+2 -4
View File
@@ -73,8 +73,7 @@ export class GameScene extends GameHostScene<BoopState> {
private handleCellClick(row: number, col: number): void {
const selectedType = this.pieceTypeSelector.getSelectedType();
const cmd = prompts.play(this.state.currentPlayer, row, col, selectedType);
const error = this.gameHost.onInput(cmd);
const error = this.gameHost.tryAnswerPrompt(prompts.play, this.state.currentPlayer, row, col, selectedType);
if (error) {
this.errorOverlay.show(error);
}
@@ -82,8 +81,7 @@ export class GameScene extends GameHostScene<BoopState> {
private handlePieceClick(row: number, col: number): void {
// 棋盘满时,点击棋子触发升级
const cmd = prompts.play(this.state.currentPlayer, row, col);
const error = this.gameHost.onInput(cmd);
const error = this.gameHost.tryAnswerPrompt(prompts.graduate, this.state.currentPlayer, row, col);
if (error) {
this.errorOverlay.show(error);
}