class StoryScene extends Phaser.Scene { constructor() { super({ key: 'StoryScene' }); } create() { const width = this.cameras.main.width; const height = this.cameras.main.height; // Warm background (Stardew Valley style) const bg = this.add.rectangle(0, 0, width, height, 0x2d1b00); bg.setOrigin(0); // Add subtle texture overlay const overlay = this.add.rectangle(0, 0, width, height, 0x000000, 0.3); overlay.setOrigin(0); // ๐ŸŒซ๏ธ NOIR FOG EFFECT this.createNoirFog(width, height); // ๐ŸŽต NOIR BACKGROUND MUSIC this.playNoirMusic(); // MAIN TITLE (horizontal, top center) const titleBg = this.add.rectangle(width / 2, 80, 480, 70, 0x4a3520, 0.9); titleBg.setStrokeStyle(3, 0xd4a574); const title = this.add.text(width / 2, 80, 'MRTVA DOLINA', { fontSize: '42px', fontFamily: 'Georgia, serif', color: '#f4e4c1', fontStyle: 'bold', stroke: '#2d1b00', strokeThickness: 4 }); title.setOrigin(0.5); // Subtle glow this.tweens.add({ targets: title, alpha: 0.9, yoyo: true, repeat: -1, duration: 2000, ease: 'Sine.easeInOut' }); // Subtitle const subtitle = this.add.text(width / 2, 120, '~ 2084 - Survival Farm ~', { fontSize: '14px', fontFamily: 'Georgia, serif', color: '#d4a574', fontStyle: 'italic' }); subtitle.setOrigin(0.5); // Main Menu Buttons (center) this.createMainMenu(width, height); // Accessibility icon (top-right) this.createAccessibilityIcon(width, height); // Language selector with rotating globe (bottom-right) this.createLanguageSelector(width, height); // Version info const version = this.add.text(10, height - 30, 'v0.95 ALPHA', { fontSize: '14px', color: '#6b4423', fontFamily: 'Georgia, serif' }); } createNoirFog(width, height) { // Create fog particles for noir atmosphere const graphics = this.add.graphics(); graphics.fillStyle(0x888888, 1); graphics.fillCircle(16, 16, 16); graphics.generateTexture('fog_particle', 32, 32); graphics.destroy(); // Fog particle emitter const fogParticles = this.add.particles('fog_particle'); const fogEmitter = fogParticles.createEmitter({ x: { min: -100, max: width + 100 }, y: { min: -50, max: height + 50 }, speedX: { min: -15, max: 15 }, speedY: { min: -5, max: 5 }, scale: { start: 0.2, end: 1.0 }, alpha: { start: 0, end: 0.12, ease: 'Sine.easeIn' }, lifespan: 10000, frequency: 400, quantity: 1, blendMode: 'NORMAL' }); fogEmitter.setDepth(2); // Above background, below UI // Noir vignette (dark edges) const vignette = this.add.rectangle(width / 2, height / 2, width, height, 0x000000, 0); vignette.setDepth(50); this.tweens.add({ targets: vignette, alpha: 0.35, duration: 3000, yoyo: true, repeat: -1, ease: 'Sine.easeInOut' }); } playNoirMusic() { // Play forest evening ambience (noir atmosphere) if (this.sound.get('forest_ambient')) { const music = this.sound.add('forest_ambient', { volume: 0.3, loop: true }); music.play(); console.log('๐ŸŽต Noir atmosphere music playing at 30% volume'); } else { console.warn('โš ๏ธ forest_ambient music not loaded - add to preload()'); } } createMainMenu(width, height) { const buttons = [ { label: 'โ–ถ NEW GAME', color: '#8fbc8f', action: () => this.startNewGame() }, { label: '๐Ÿ“ LOAD GAME', color: '#87ceeb', action: () => this.loadGame() }, { label: 'โš™๏ธ SETTINGS', color: '#daa520', action: () => this.showSettings() }, { label: 'โŒ EXIT', color: '#cd5c5c', action: () => this.exitGame() } ]; const startY = 170; const spacing = 58; buttons.forEach((btn, index) => { const y = startY + (index * spacing); // Wooden button background (Stardew style) const bg = this.add.rectangle(width / 2, y, 280, 48, 0x6b4423, 1); bg.setStrokeStyle(2, 0xd4a574); // Inner shadow effect const innerShadow = this.add.rectangle(width / 2, y + 2, 270, 38, 0x4a3520, 0.5); // Button text const text = this.add.text(width / 2, y, btn.label, { fontSize: '20px', fontFamily: 'Georgia, serif', color: btn.color, fontStyle: 'bold', stroke: '#2d1b00', strokeThickness: 3 }); text.setOrigin(0.5); // Make interactive bg.setInteractive({ useHandCursor: true }); bg.on('pointerover', () => { bg.setFillStyle(0x8b5a3c); text.setScale(1.05); bg.setStrokeStyle(4, 0xf4e4c1); }); bg.on('pointerout', () => { bg.setFillStyle(0x6b4423); text.setScale(1.0); bg.setStrokeStyle(3, 0xd4a574); }); bg.on('pointerdown', () => { // Press effect this.tweens.add({ targets: [bg, text, innerShadow], y: y + 3, duration: 100, yoyo: true, onComplete: btn.action }); }); }); } createAccessibilityIcon(width, height) { // Accessibility icon (top-right) - Stardew style const iconBg = this.add.circle(width - 50, 40, 26, 0x6b4423); iconBg.setStrokeStyle(2, 0xd4a574); const icon = this.add.text(width - 50, 40, 'โ™ฟ', { fontSize: '32px', color: '#8fbc8f' }); icon.setOrigin(0.5); icon.setInteractive({ useHandCursor: true }); // Gentle pulse animation this.tweens.add({ targets: [icon, iconBg], scale: 1.08, duration: 1500, yoyo: true, repeat: -1, ease: 'Sine.easeInOut' }); icon.on('pointerover', () => { icon.setScale(1.2); iconBg.setScale(1.2); iconBg.setFillStyle(0x8b5a3c); }); icon.on('pointerout', () => { icon.setScale(1.0); iconBg.setScale(1.0); iconBg.setFillStyle(0x6b4423); }); icon.on('pointerdown', () => { this.showAccessibility(); }); } createLanguageSelector(width, height) { // Initialize localization if (!window.i18n) { window.i18n = new LocalizationSystem(); } // Wooden circle background for globe (Stardew style) const globeBg = this.add.circle(width - 60, height - 60, 30, 0x6b4423); globeBg.setStrokeStyle(2, 0xd4a574); // Rotating globe button const globeBtn = this.add.text(width - 60, height - 60, '๐ŸŒ', { fontSize: '42px' }); globeBtn.setOrigin(0.5); globeBtn.setInteractive({ useHandCursor: true }); // Continuous rotation animation this.tweens.add({ targets: globeBtn, angle: 360, duration: 8000, repeat: -1, ease: 'Linear' }); let langMenuOpen = false; let langMenu = null; globeBtn.on('pointerover', () => { globeBtn.setScale(1.15); globeBg.setScale(1.15); globeBg.setFillStyle(0x8b5a3c); }); globeBtn.on('pointerout', () => { if (!langMenuOpen) { globeBtn.setScale(1.0); globeBg.setScale(1.0); globeBg.setFillStyle(0x6b4423); } }); globeBtn.on('pointerdown', () => { if (langMenuOpen) { // Close menu if (langMenu) langMenu.destroy(); langMenu = null; langMenuOpen = false; globeBtn.setScale(1.0); } else { // Open menu langMenuOpen = true; langMenu = this.createLanguageMenu(width, height, () => { langMenuOpen = false; globeBtn.setScale(1.0); if (langMenu) langMenu.destroy(); langMenu = null; }); } }); } createLanguageMenu(width, height, onClose) { const container = this.add.container(0, 0); const languages = [ { code: 'slo', flag: '๐Ÿ‡ธ๐Ÿ‡ฎ', name: 'Slovenลกฤina' }, { code: 'en', flag: '๐Ÿ‡ฌ๐Ÿ‡ง', name: 'English' }, { code: 'de', flag: '๐Ÿ‡ฉ๐Ÿ‡ช', name: 'Deutsch' }, { code: 'it', flag: '๐Ÿ‡ฎ๐Ÿ‡น', name: 'Italiano' }, { code: 'cn', flag: '๐Ÿ‡จ๐Ÿ‡ณ', name: 'ไธญๆ–‡' } ]; const menuX = width - 200; const menuY = height - 350; const menuW = 180; const menuH = 290; // Wooden panel background (Stardew style) const panel = this.add.rectangle(menuX, menuY, menuW, menuH, 0x6b4423, 0.98); panel.setStrokeStyle(4, 0xd4a574); container.add(panel); // Title const title = this.add.text(menuX, menuY - 120, 'LANGUAGE', { fontSize: '18px', fontFamily: 'Georgia, serif', color: '#f4e4c1', fontStyle: 'bold' }); title.setOrigin(0.5); container.add(title); // Language buttons languages.forEach((lang, index) => { const btnY = menuY - 90 + (index * 56); const isActive = window.i18n.getCurrentLanguage() === lang.code; const btn = this.add.text(menuX, btnY, `${lang.flag} ${lang.name}`, { fontSize: '16px', fontFamily: 'Georgia, serif', color: isActive ? '#8fbc8f' : '#f4e4c1', backgroundColor: isActive ? '#4a3520' : '#6b4423', padding: { x: 12, y: 6 } }); btn.setOrigin(0.5); btn.setInteractive({ useHandCursor: true }); btn.on('pointerover', () => { btn.setScale(1.05); if (!isActive) btn.setBackgroundColor('#8b5a3c'); }); btn.on('pointerout', () => { btn.setScale(1.0); if (!isActive) btn.setBackgroundColor('#6b4423'); }); btn.on('pointerdown', () => { window.i18n.setLanguage(lang.code); onClose(); }); container.add(btn); }); return container; } startNewGame() { console.log('๐ŸŽฎ Starting New Game...'); console.log('๐ŸŽฅ Launching ULTIMATE Prologue (100% Polished!)...'); this.scene.start('UltimatePrologueScene'); // โœ… ULTIMATE INTRO! } loadGame() { console.log('๐Ÿ“ Loading Game from LocalStorage...'); try { // Load from LocalStorage const saveKey = 'mrtva_dolina_save'; const savedData = localStorage.getItem(saveKey); if (!savedData) { console.log('โŒ No save file found'); alert('No save file found!\n\nStart a NEW GAME first to create a save.'); return; } // Parse save data const saveFile = JSON.parse(savedData); console.log('โœ… Save file loaded:', saveFile); // Display save info const info = [ '๐Ÿ“‚ SAVE FILE LOADED', '', `Age: ${saveFile.player.current_age} years old`, `Age Level: ${saveFile.player.age_level}/9`, `Memories Found: ${saveFile.progress.memories_found}/${saveFile.progress.total_memories}`, `Money: ${saveFile.economy.money} coins`, `Cannabis Seeds: ${saveFile.economy.cannabis_seeds}`, `Playtime: ${Math.floor(saveFile.playtime / 60)} minutes`, '', `Last Saved: ${new Date(saveFile.lastSaved).toLocaleString()}`, '', 'Load this save?' ].join('\n'); if (confirm(info)) { console.log('๐ŸŽฎ Starting game with loaded save...'); // Pass save data to GameScene this.scene.start('GameScene', { loadedSave: saveFile }); } } catch (error) { console.error('โŒ Failed to load save:', error); alert('Error loading save file!\n\nThe save may be corrupted.\nTry starting a new game.'); } } showSettings() { console.log('โš™๏ธ Opening Settings...'); // TODO: Settings menu alert('Settings - Use โš™๏ธ button in-game!'); } showAccessibility() { console.log('โ™ฟ Opening Accessibility Menu...'); // Create accessibility quick menu const options = [ 'โ™ฟ ACCESSIBILITY OPTIONS', '', '1. High Contrast Mode', '2. Large Text Mode', '3. Color Blind Mode', '4. Screen Reader Support', '5. Reduce Flashing (Epilepsy)', '6. One-Handed Controls', '7. Audio Cues', '', 'Full accessibility settings available in-game (ESC โ†’ Settings)', '', 'Tip: Press 1-7 to toggle these features' ]; alert(options.join('\n')); // TODO: Implement full accessibility menu // For now, just show information } exitGame() { console.log('โŒ Exiting...'); if (window.close) { window.close(); } else { alert('Close the window to exit.'); } } }