Files
the-last-startyper/src/types.ts
T
pastilhas 8d093f2c85 feat: add laser shooting effects and ship tracking for words mode
- Add green lasers that hit target on correct typing
- Add red lasers that miss (left/right) on incorrect typing
- Implement laser beam visual with gradient and glow effects
- Add impact burst animation at laser end point
- Ship now tracks each character in words mode
- Creates dynamic targeting system for all game modes
2025-11-04 17:57:24 +00:00

181 lines
5.8 KiB
TypeScript
Executable File

import type { RefObject } from 'react';
// ============================================================================
// Core Game Types
// ============================================================================
export type GameStatus = 'waiting' | 'started' | 'game-won' | 'game-over';
export type GamePhase = 'idle' | 'playing';
export type PlayStatus = 'started' | 'game-over' | 'game-won';
export type GameMode = 'letters' | 'words' | 'sentences' | 'paragraphs';
export const isPlaying = (status: GameStatus): status is PlayStatus =>
status === 'started' || status === 'game-over' || status === 'game-won';
export const getGamePhase = (status: GameStatus): GamePhase =>
status === 'waiting' ? 'idle' : 'playing';
// ============================================================================
// Game-Specific Types
// ============================================================================
export type PlayerPosition = { x: number }; // pixel position 0-800
export type LetterState = 'normal' | 'wrong' | 'exploding';
export type ShipState = 'normal' | 'exploding';
export type Laser = {
id: string;
startX: number; // Ship position
startY: number; // Ship Y
endX: number; // Target position (offset left/right for misses)
endY: number; // Target Y
startTime: number;
duration: number; // How long the laser is visible
hit: boolean; // True for hits (not implemented yet), false for misses
};
export type FallingLetter = {
id: string;
letter: string;
x: number; // 0-800 pixel position
y: number; // 0-600 pixel position
state: LetterState;
stateStartTime?: number; // For animation timing
// For word/sentence/paragraph modes
fullText?: string; // The complete word/sentence/paragraph
charIndex?: number; // Current character index being typed (0-based)
// For line transitions in sentences/paragraphs
lineTransition?: boolean;
lineTransitionTime?: number;
// For ship tracking in sentences
currentCharX?: number; // X position of current character to type
};
// ============================================================================
// Input & Key Tracking
// ============================================================================
export type KeyLogEntry = { key: string; timestamp: number };
export type GameOptions = {
initialGameMode?: GameMode;
};
// ============================================================================
// Manager Interfaces - Board
// ============================================================================
export type BoardManager = {
containerRef: RefObject<HTMLDivElement | null>;
renderBoard: (cols: number, rows: number) => void;
};
// ============================================================================
// Manager Interfaces - Cursor/Snake
// ============================================================================
export type CursorMode = 'normal';
export type CursorManager = {
position: () => PlayerPosition;
mode: () => CursorMode;
// VIM-style motions (required by Unified API)
moveLeft: (count?: number) => void;
moveRight: (count?: number) => void;
moveUp: (count?: number) => void;
moveDown: (count?: number) => void;
moveToStart: () => void;
moveToEnd: () => void;
moveToTop: () => void;
moveToBottom: () => void;
repeatLastMotion: () => void;
};
// TODO: Define game-specific CursorManager extension if needed
// ============================================================================
// Manager Interfaces - Score
// ============================================================================
export type ScoreManager = {
timeValue: number;
totalKeystrokes: number;
score: number;
correct: number;
missed: number;
deaths: number;
};
// ============================================================================
// Manager Interfaces - Game Status
// ============================================================================
export type GameStatusManager = {
gameStatus: GameStatus;
setGameStatus: (status: GameStatus) => void;
startGame: () => void;
quitGame: () => void;
level: number;
shipState: ShipState;
shipExplosionTime: number;
updatePlayerX: (x: number) => void;
handleTypedLetter: (letter: string) => void;
setGameLoopCallback: (callback: (deltaTime: number, letters: FallingLetter[]) => void) => void;
setGameMode: (mode: GameMode) => void;
addCorrect: () => void;
addMissed: () => void;
addDeath: () => void;
score: number;
correct: number;
missed: number;
deaths: number;
};
// ============================================================================
// Manager Interfaces - Key Tracking
// ============================================================================
export type GameKeyManager = {
keyLog: KeyLogEntry[];
clearKeyLog: () => void;
getKeyLog: () => KeyLogEntry[];
};
// ============================================================================
// Unified Game Manager - Main Interface
// ============================================================================
export type GameManager = {
// Required rendering
containerRef: RefObject<HTMLDivElement | null>;
renderBoard: () => void;
// Required managers
cursor: CursorManager;
scoreManager: ScoreManager;
// Required lifecycle
gameStatus: GameStatus;
setGameStatus: (status: GameStatus) => void;
startGame: () => void;
quitGame: () => void;
// Required key tracking
keyLog: KeyLogEntry[];
clearKeyLog: () => void;
getKeyLog: () => KeyLogEntry[];
// Game-specific
handleTypedLetter: (letter: string) => void;
changeGameMode: (mode: GameMode) => void;
};
// ============================================================================
// Hook Return Types
// ============================================================================
// Forward declarations for hook return types
// These will be imported from their respective modules