import { signal, type Signal } from '@preact/signals'; export interface ValidMove { card: string; fromX: number; fromY: number; toX: number; toY: number; } export interface OnitamaUIState { selectedPiece: { x: number; y: number } | null; selectedCard: string | null; validMoves: ValidMove[]; } export function createOnitamaUIState(): Signal { return signal({ selectedPiece: null, selectedCard: null, validMoves: [], }); } export function clearSelection(uiState: Signal): void { uiState.value = { selectedPiece: null, selectedCard: null, validMoves: [], }; } export function selectPiece( uiState: Signal, x: number, y: number ): void { uiState.value = { ...uiState.value, selectedPiece: { x, y }, selectedCard: null, }; } export function selectCard( uiState: Signal, card: string ): void { // 如果点击已选中的卡牌,取消选择 if (uiState.value.selectedCard === card) { uiState.value = { selectedPiece: null, selectedCard: null, validMoves: [], }; } else { // 选择新卡牌,清除棋子选择 uiState.value = { selectedPiece: null, selectedCard: card, validMoves: [], }; } } export function deselectCard( uiState: Signal ): void { uiState.value = { ...uiState.value, selectedCard: null, selectedPiece: null, validMoves: [], }; } export function setValidMoves( uiState: Signal, moves: ValidMove[] ): void { uiState.value = { ...uiState.value, validMoves: moves, }; }