This commit is contained in:
2025-12-08 17:31:18 +01:00
parent 30eb2d1dc8
commit 097d35da1b
7 changed files with 713 additions and 105 deletions

View File

@@ -47,8 +47,10 @@ class CollectionSystem {
color: '#FFD700'
});
if (this.scene.soundManager) {
this.scene.soundManager.playSuccess(); // Reuse success sound
if (this.scene.soundManager && typeof this.scene.soundManager.playSuccess === 'function') {
this.scene.soundManager.playSuccess();
} else if (this.scene.soundManager && typeof this.scene.soundManager.playHarvest === 'function') {
this.scene.soundManager.playHarvest(); // Fallback to harvest sound
}
}
}

View File

@@ -0,0 +1,176 @@
/**
* LOCALIZATION SYSTEM
* Multi-language support with JSON translation files
*/
class LocalizationSystem {
constructor() {
this.currentLang = 'en'; // Default language
this.translations = {};
this.supportedLanguages = ['slo', 'en', 'de', 'it', 'cn'];
// Load from localStorage
const savedLang = localStorage.getItem('novafarma_language');
if (savedLang && this.supportedLanguages.includes(savedLang)) {
this.currentLang = savedLang;
}
this.loadTranslations();
}
loadTranslations() {
// Embedded translations (inline for simplicity)
this.translations = {
'slo': {
// UI
'ui.inventory': 'Inventar',
'ui.crafting': 'Izdelovanje',
'ui.health': 'Zdravje',
'ui.hunger': 'Lakota',
'ui.oxygen': 'Kisik',
'ui.day': 'Dan',
'ui.season': 'Letni čas',
// Items
'item.wood': 'Les',
'item.stone': 'Kamen',
'item.seeds': 'Semena',
'item.wheat': 'Pšenica',
'item.corn': 'Koruza',
// Actions
'action.plant': 'Posadi',
'action.harvest': 'Požanji',
'action.craft': 'Izdelaj',
'action.build': 'Zgradi',
// Seasons
'season.spring': 'Pomlad',
'season.summer': 'Poletje',
'season.autumn': 'Jesen',
'season.winter': 'Zima',
// Messages
'msg.demo_end': 'Demo končan! Hvala za igranje.',
'msg.freezing': '❄️ Zmrzuješ!',
'msg.overheating': '🔥 Pregrevanje!'
},
'en': {
// UI
'ui.inventory': 'Inventory',
'ui.crafting': 'Crafting',
'ui.health': 'Health',
'ui.hunger': 'Hunger',
'ui.oxygen': 'Oxygen',
'ui.day': 'Day',
'ui.season': 'Season',
// Items
'item.wood': 'Wood',
'item.stone': 'Stone',
'item.seeds': 'Seeds',
'item.wheat': 'Wheat',
'item.corn': 'Corn',
// Actions
'action.plant': 'Plant',
'action.harvest': 'Harvest',
'action.craft': 'Craft',
'action.build': 'Build',
// Seasons
'season.spring': 'Spring',
'season.summer': 'Summer',
'season.autumn': 'Autumn',
'season.winter': 'Winter',
// Messages
'msg.demo_end': 'Demo Ended! Thanks for playing.',
'msg.freezing': '❄️ Freezing!',
'msg.overheating': '🔥 Overheating!'
},
'de': {
'ui.inventory': 'Inventar',
'ui.crafting': 'Handwerk',
'ui.health': 'Gesundheit',
'season.spring': 'Frühling',
'season.summer': 'Sommer',
'season.autumn': 'Herbst',
'season.winter': 'Winter'
},
'it': {
'ui.inventory': 'Inventario',
'ui.crafting': 'Artigianato',
'season.spring': 'Primavera',
'season.summer': 'Estate',
'season.autumn': 'Autunno',
'season.winter': 'Inverno'
},
'cn': {
'ui.inventory': '库存',
'ui.crafting': '制作',
'season.spring': '春天',
'season.summer': '夏天',
'season.autumn': '秋天',
'season.winter': '冬天'
}
};
}
/**
* Get translated string
* @param {string} key - Translation key (e.g. 'ui.inventory')
* @param {string} fallback - Fallback text if translation missing
*/
t(key, fallback = key) {
const lang = this.translations[this.currentLang];
if (lang && lang[key]) {
return lang[key];
}
// Fallback to English
const enLang = this.translations['en'];
if (enLang && enLang[key]) {
return enLang[key];
}
return fallback;
}
/**
* Set current language
*/
setLanguage(langCode) {
if (this.supportedLanguages.includes(langCode)) {
this.currentLang = langCode;
localStorage.setItem('novafarma_language', langCode);
console.log(`🌍 Language changed to: ${langCode}`);
return true;
}
return false;
}
getCurrentLanguage() {
return this.currentLang;
}
getSupportedLanguages() {
return this.supportedLanguages.map(code => ({
code,
name: this.getLanguageName(code)
}));
}
getLanguageName(code) {
const names = {
'slo': 'Slovenščina',
'en': 'English',
'de': 'Deutsch',
'it': 'Italiano',
'cn': '中文'
};
return names[code] || code;
}
}
// Global instance
window.LocalizationSystem = LocalizationSystem;

View File

@@ -0,0 +1,141 @@
/**
* PLAYTIME TRACKER SYSTEM
* Tracks persistent stats: playtime, deaths, harvests, etc.
*/
class PlaytimeTrackerSystem {
constructor(scene) {
this.scene = scene;
// Initialize stats
this.stats = {
playtimeSeconds: 0,
deaths: 0,
kills: 0,
harvests: 0,
plantings: 0,
distanceTraveled: 0,
moneyEarned: 0,
itemsCrafted: 0,
blocksPlaced: 0,
sessionStart: Date.now()
};
// Load from save
this.load();
// Update timer
this.updateTimer = 0;
this.saveInterval = 10000; // Save every 10 seconds
}
update(delta) {
// Increment playtime
this.stats.playtimeSeconds += delta / 1000;
// Periodic save
this.updateTimer += delta;
if (this.updateTimer >= this.saveInterval) {
this.updateTimer = 0;
this.save();
}
}
// Stat tracking methods
recordDeath() {
this.stats.deaths++;
this.save();
}
recordKill() {
this.stats.kills++;
}
recordHarvest() {
this.stats.harvests++;
}
recordPlanting() {
this.stats.plantings++;
}
recordDistance(distance) {
this.stats.distanceTraveled += distance;
}
recordMoneyEarned(amount) {
this.stats.moneyEarned += amount;
}
recordCraft() {
this.stats.itemsCrafted++;
}
recordBlockPlaced() {
this.stats.blocksPlaced++;
}
// Formatted playtime
getPlaytimeFormatted() {
const hours = Math.floor(this.stats.playtimeSeconds / 3600);
const minutes = Math.floor((this.stats.playtimeSeconds % 3600) / 60);
const seconds = Math.floor(this.stats.playtimeSeconds % 60);
if (hours > 0) {
return `${hours}h ${minutes}m`;
} else if (minutes > 0) {
return `${minutes}m ${seconds}s`;
} else {
return `${seconds}s`;
}
}
// Session duration
getSessionDuration() {
const sessionMs = Date.now() - this.stats.sessionStart;
const sessionSec = Math.floor(sessionMs / 1000);
return sessionSec;
}
// Save/Load
save() {
localStorage.setItem('novafarma_stats', JSON.stringify(this.stats));
}
load() {
const saved = localStorage.getItem('novafarma_stats');
if (saved) {
try {
const data = JSON.parse(saved);
this.stats = { ...this.stats, ...data };
this.stats.sessionStart = Date.now(); // Reset session timer
} catch (e) {
console.error('Failed to load stats:', e);
}
}
}
reset() {
this.stats = {
playtimeSeconds: 0,
deaths: 0,
kills: 0,
harvests: 0,
plantings: 0,
distanceTraveled: 0,
moneyEarned: 0,
itemsCrafted: 0,
blocksPlaced: 0,
sessionStart: Date.now()
};
this.save();
}
// Get all stats
getStats() {
return {
...this.stats,
playtimeFormatted: this.getPlaytimeFormatted(),
sessionDuration: this.getSessionDuration()
};
}
}