Files
novafarma/src/scenes/StoryScene.js
2025-12-12 13:40:51 +01:00

356 lines
11 KiB
JavaScript

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);
// 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, 'NOVAFARMA', {
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.9.0 ALPHA', {
fontSize: '14px',
color: '#6b4423',
fontFamily: 'Georgia, serif'
});
}
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...');
this.scene.start('GameScene');
}
loadGame() {
console.log('📁 Loading Game...');
// TODO: Implement save/load system
alert('Load Game - Coming Soon!');
}
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.');
}
}
}