tmemory
Version:
A terminal-based Memory card game built with React Ink. Features multiple grid sizes, AI opponent, and high scores.
84 lines (83 loc) • 1.87 kB
TypeScript
import { GameCard, GameMode, GameScores, GameState, GridDimension, Player, Winner } from "../../types/game.js";
export interface GameContextState {
gameState: GameState;
gameMode: GameMode;
gridDimension: GridDimension;
gridSelectionMode: 'preset' | 'custom';
currentPresetIndex: number;
grid: GameCard[];
flippedIndices: number[];
matchedIndices: number[];
currentPlayer: Player;
scores: GameScores;
selectedIndex: number;
message: string;
startTime: number;
endTime: number;
winner: Winner;
shouldTrackScore: boolean;
isNewRecord: boolean;
}
export type GameAction = {
type: 'SET_GAME_STATE';
payload: GameState;
} | {
type: 'SET_GAME_MODE';
payload: GameMode;
} | {
type: 'SET_GRID_DIMENSION';
payload: GridDimension;
} | {
type: 'SET_GRID_SELECTION_MODE';
payload: 'preset' | 'custom';
} | {
type: 'SET_CURRENT_PRESET_INDEX';
payload: number;
} | {
type: 'SET_GRID';
payload: GameCard[];
} | {
type: 'SET_FLIPPED_INDICES';
payload: number[];
} | {
type: 'SET_MATCHED_INDICES';
payload: number[];
} | {
type: 'SET_CURRENT_PLAYER';
payload: Player;
} | {
type: 'SET_SCORES';
payload: GameScores;
} | {
type: 'SET_SELECTED_INDEX';
payload: number;
} | {
type: 'SET_MESSAGE';
payload: string;
} | {
type: 'SET_START_TIME';
payload: number;
} | {
type: 'SET_END_TIME';
payload: number;
} | {
type: 'START_NEW_GAME';
} | {
type: 'FLIP_CARD';
payload: number;
} | {
type: 'SWITCH_PLAYER';
} | {
type: 'SET_WINNER';
payload: Winner;
} | {
type: 'SET_SHOULD_TRACK_SCORE';
payload: boolean;
} | {
type: 'SET_IS_NEW_RECORD';
payload: boolean;
};
export interface GameContextValue {
state: GameContextState;
dispatch: React.Dispatch<GameAction>;
}