/** * Adaptive Tactics - Main Entry Point * Initializes and coordinates all game systems */ import { GameState } from './state.js'; import { loadAllContent } from './map_loader.js'; import { UIScreens } from './ui_screens.js'; import { UIBoard } from './ui_board.js'; import { UIPanels } from './ui_panels.js'; import { TurnManager } from './turn_manager.js'; class AdaptiveTactics { constructor() { this.state = null; this.content = null; this.screens = null; this.board = null; this.panels = null; this.turnManager = null; this.initialized = false; } async init() { if (this.initialized) return; console.log('Adaptive Tactics initializing...'); try { // Load all game content this.content = await loadAllContent(); console.log('Content loaded successfully'); console.log('Map:', this.content.map ? 'OK' : 'MISSING'); console.log('Weapons:', Object.keys(this.content.weapons).length, 'loaded'); console.log('Player units:', this.content.playerUnits.length, 'loaded'); // Initialize game state this.state = new GameState(); // Initialize UI systems this.screens = new UIScreens(this); this.board = new UIBoard(this); this.panels = new UIPanels(this); this.turnManager = new TurnManager(this); // Set up event listeners this.setupEventListeners(); // Show title screen this.screens.showScreen('title'); this.initialized = true; console.log('Adaptive Tactics initialized successfully'); } catch (error) { console.error('Failed to initialize game:', error); } } setupEventListeners() { // Title screen buttons document.getElementById('btn-start')?.addEventListener('click', () => { this.screens.showScreen('name-entry'); }); document.getElementById('btn-how-to-play')?.addEventListener('click', () => { document.getElementById('how-to-play-modal')?.classList.add('active'); }); document.getElementById('btn-close-how-to-play')?.addEventListener('click', () => { document.getElementById('how-to-play-modal')?.classList.remove('active'); }); document.getElementById('btn-credits')?.addEventListener('click', () => { document.getElementById('credits-modal')?.classList.add('active'); }); document.getElementById('btn-close-credits')?.addEventListener('click', () => { document.getElementById('credits-modal')?.classList.remove('active'); }); // Name entry document.getElementById('btn-confirm-name')?.addEventListener('click', () => { this.handleNameConfirm(); }); document.getElementById('player-name-input')?.addEventListener('keypress', (e) => { if (e.key === 'Enter') { this.handleNameConfirm(); } }); // Transition screen document.getElementById('btn-continue')?.addEventListener('click', () => { this.startBattle(); }); // Defeat screen document.getElementById('btn-try-again')?.addEventListener('click', () => { this.restartGame(); }); document.getElementById('btn-return-title')?.addEventListener('click', () => { this.returnToTitle(); }); // Action buttons document.getElementById('btn-end-turn')?.addEventListener('click', () => { this.turnManager?.endPlayerTurn(); }); } handleNameConfirm() { const input = document.getElementById('player-name-input'); const name = input?.value.trim(); if (name && name.length > 0 && name.length <= 20) { this.state.setPlayerName(name); this.startBattle(); } } startBattle() { console.log('Starting battle...'); this.state.initCycle(this.content); console.log('State initialized'); this.content.map.initTiles(); // Initialize map tiles before building grid console.log('Map tiles initialized:', this.content.map.tiles.length, 'rows'); this.screens.showScreen('battle'); console.log('Battle screen shown'); this.board.init(); console.log('Board initialized'); this.panels.init(); console.log('Panels initialized'); this.turnManager.startCycle(); console.log('Turn manager started'); } handleCycleVictory() { this.state.recordCycleWin(); this.screens.showTransition(); } handleDefeat() { this.screens.showDefeat(); } restartGame() { this.state.reset(); this.screens.showScreen('name-entry'); } returnToTitle() { this.state.reset(); this.screens.showScreen('title'); } } // Initialize game when DOM is ready const game = new AdaptiveTactics(); document.addEventListener('DOMContentLoaded', () => game.init()); export { game };