356 lines
11 KiB
JavaScript
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.');
|
|
}
|
|
}
|
|
}
|