87 lines
1.6 KiB
TypeScript
87 lines
1.6 KiB
TypeScript
|
|
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<OnitamaUIState> {
|
||
|
|
return signal<OnitamaUIState>({
|
||
|
|
selectedPiece: null,
|
||
|
|
selectedCard: null,
|
||
|
|
validMoves: [],
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function clearSelection(uiState: Signal<OnitamaUIState>): void {
|
||
|
|
uiState.value = {
|
||
|
|
selectedPiece: null,
|
||
|
|
selectedCard: null,
|
||
|
|
validMoves: [],
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function selectPiece(
|
||
|
|
uiState: Signal<OnitamaUIState>,
|
||
|
|
x: number,
|
||
|
|
y: number
|
||
|
|
): void {
|
||
|
|
uiState.value = {
|
||
|
|
...uiState.value,
|
||
|
|
selectedPiece: { x, y },
|
||
|
|
selectedCard: null,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function selectCard(
|
||
|
|
uiState: Signal<OnitamaUIState>,
|
||
|
|
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<OnitamaUIState>
|
||
|
|
): void {
|
||
|
|
uiState.value = {
|
||
|
|
...uiState.value,
|
||
|
|
selectedCard: null,
|
||
|
|
selectedPiece: null,
|
||
|
|
validMoves: [],
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function setValidMoves(
|
||
|
|
uiState: Signal<OnitamaUIState>,
|
||
|
|
moves: ValidMove[]
|
||
|
|
): void {
|
||
|
|
uiState.value = {
|
||
|
|
...uiState.value,
|
||
|
|
validMoves: moves,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|