// --- Global Error Handler --- class ErrorHandler { static init() { window.onerror = (message, source, lineno, colno, error) => { ErrorHandler.showError(message, source, lineno, colno, error); return false; }; window.addEventListener('unhandledrejection', (event) => { // IGNORE AUDIO DECODING ERRORS (Phaser/Electron issue) const msg = event.reason ? String(event.reason) : ''; if (msg.includes('Unable to decode audio data') || msg.includes('EncodingError') || msg.includes(':0:0')) { console.warn('🔇 Ignored Critical Audio Error (Game continues):', msg); event.preventDefault(); return; } ErrorHandler.showError('Unhandled Promise Rejection', '', 0, 0, event.reason); }); console.log('🛡️ Global Error Handler Initialized'); } static showError(message, source, lineno, colno, error) { console.error('🔥 CRITICAL ERROR:', message); if (document.getElementById('error-overlay')) return; const div = document.createElement('div'); div.id = 'error-overlay'; div.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(20,0,0,0.95);color:#ffaaaa;z-index:999999;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace;padding:20px;text-align:center;'; const stack = error && error.stack ? error.stack : ''; div.innerHTML = `

☠️ OOPS! GAME CRASHED ☠️

${message}
${source}:${lineno}:${colno}

${stack}
`; document.body.appendChild(div); } } ErrorHandler.init(); // Phaser Game Configuration const config = { type: Phaser.CANVAS, // Fallback to Canvas (WebGL invisible objects issue) width: 1024, // Larger viewport for better view height: 768, // 4:3 aspect ratio parent: 'game-container', transparent: false, // FORCE OPAQUE CANVAS backgroundColor: '#2a4a2a', // Green background default pixelArt: false, // 🎨 SMOOTH FILMSKI LOOK (LINEAR filtering) antialias: true, // 🎨 SMOOTH edges (mehki prehodi) roundPixels: false, // 🎨 FLUID positioning (no kockanje) render: { pixelArt: false, // 🎨 LINEAR filtering (gladko) antialias: true, // 🎨 Smooth transitions roundPixels: false, // 🎨 Sub-pixel precision transparent: true, // Allow HTML background to show through clearBeforeRender: true, powerPreference: 'high-performance', premultipliedAlpha: true, failIfMajorPerformanceCaveat: false, // 🎨 LINEAR filtering for smooth tiles mipmapFilter: 'NEAREST', batchSize: 4096 }, physics: { default: 'arcade', arcade: { gravity: { y: 0 }, debug: false } }, scene: [ BootScene, PreloadScene, AssetTestScene, IntroScene, MainMenuScene, PrologueScene, EnhancedPrologueScene, UltimatePrologueScene, SystemsTestScene, TestVisualAudioScene, // DemoScene, // DemoSceneEnhanced, TiledTestScene, StoryScene, GameScene, UIScene, TownSquareScene ], scale: { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH }, input: { gamepad: true }, fps: { target: 60, forceSetTimeOut: false } }; // Initialize game const game = new Phaser.Game(config); // 🌦️ GLOBAL WEATHER MANAGER - Controls weather across ALL scenes import('./managers/GlobalWeatherManager.js').then(module => { const GlobalWeatherManager = module.default; game.weatherManager = new GlobalWeatherManager(game); console.log('🌦️ Global Weather Manager initialized!'); }).catch(err => { console.error('❌ Failed to load GlobalWeatherManager:', err); }); // Global game state window.gameState = { currentScene: null, debugMode: true }; // God mode disabled by default (can be enabled via console) window.godMode = false; console.log('💀 Mrtva Dolina initialized!');