boardgame-phaser/packages/onitama-game/src/state/ui.ts

82 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-04-08 08:50:45 +08:00
import { MutableSignal, mutableSignal } from 'boardgame-core';
2026-04-07 17:13:45 +08:00
export interface ValidMove {
card: string;
fromX: number;
fromY: number;
toX: number;
toY: number;
}
2026-04-08 08:50:45 +08:00
// 先选择牌,然后选择棋子,最后选择移动
2026-04-07 17:13:45 +08:00
export interface OnitamaUIState {
selectedPiece: { x: number; y: number } | null;
selectedCard: string | null;
validMoves: ValidMove[];
}
2026-04-08 08:50:45 +08:00
export function createOnitamaUIState(): MutableSignal<OnitamaUIState> {
return mutableSignal<OnitamaUIState>({
2026-04-07 17:13:45 +08:00
selectedPiece: null,
selectedCard: null,
validMoves: [],
});
}
2026-04-08 08:50:45 +08:00
export function clearSelection(uiState: MutableSignal<OnitamaUIState>): void {
uiState.produce(state => {
state.selectedPiece = null;
state.selectedCard = null;
state.validMoves = [];
});
2026-04-07 17:13:45 +08:00
}
export function selectPiece(
2026-04-08 08:50:45 +08:00
uiState: MutableSignal<OnitamaUIState>,
2026-04-07 17:13:45 +08:00
x: number,
y: number
): void {
2026-04-08 08:50:45 +08:00
uiState.produce(state => {
state.selectedPiece = { x, y };
});
2026-04-07 17:13:45 +08:00
}
export function selectCard(
2026-04-08 08:50:45 +08:00
uiState: MutableSignal<OnitamaUIState>,
2026-04-07 17:13:45 +08:00
card: string
): void {
2026-04-08 08:50:45 +08:00
uiState.produce(state => {
// 如果点击已选中的卡牌,取消选择
if (state.selectedCard === card) {
state.selectedPiece = null;
state.selectedCard = null;
state.validMoves = [];
} else {
// 选择新卡牌,清除棋子选择
state.selectedPiece = null;
state.selectedCard = card;
state.validMoves = [];
}
});
2026-04-07 17:13:45 +08:00
}
export function deselectCard(
2026-04-08 08:50:45 +08:00
uiState: MutableSignal<OnitamaUIState>
2026-04-07 17:13:45 +08:00
): void {
2026-04-08 08:50:45 +08:00
uiState.produce(state => {
state.selectedCard = null;
state.selectedPiece = null;
state.validMoves = [];
});
2026-04-07 17:13:45 +08:00
}
export function setValidMoves(
2026-04-08 08:50:45 +08:00
uiState: MutableSignal<OnitamaUIState>,
2026-04-07 17:13:45 +08:00
moves: ValidMove[]
): void {
2026-04-08 08:50:45 +08:00
uiState.produce(state => {
state.validMoves = moves;
});
2026-04-07 17:13:45 +08:00
}