From 177d05e942c720966379cf7accb687393ba6057d Mon Sep 17 00:00:00 2001 From: David Kotnik Date: Mon, 27 Apr 2026 00:00:53 +0200 Subject: [PATCH] feat(v0.97): Weather system, Master Clock save/load, Lang fix, Golden Statue 200d achievement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## ๐ŸŒง๏ธ WEATHER SYSTEM - DayNightSystem: weather changes every morning at 06:00 - 30% chance of rain, calculated 1 day ahead - Procedural rain visuals tied to actual weather state - Radio [E] near tent shows tomorrow's forecast (Dark-Chibi Noir UI) ## ๐Ÿ’ง WATER & FARMING - WaterSystem: Rain Catcher capacity increased to 50L - Auto-fill to 50L on rain days - Auto-water all soilSlots on rain, auto-dry on sunny days ## ๐ŸŒ LOCALIZATION FIX - Language button now switches instantly (no scene.restart() crash) - All menu text (subtitle, tagline, settings) translates live - localization.json: added menu_subtitle, menu_tagline, settings_info, settings_close for all 5 langs - Settings button now opens real pop-up menu ## ๐Ÿ† GOLDEN STATUE (200 DAYS) - _showAchievement() + _spawnGoldenStatue() methods - Statue uses correct 2.5D physics: setOrigin(0.5,1.0), setDepth(y), collider - _statueSpawned flag prevents duplicate spawns - Post-load check: statue appears if save file has day >= 200 ## ๐Ÿ—“๏ธ MASTER CLOCK - DayNightSystem: saveState()/loadState() via localStorage (key: nova_farma_time_save) - Saves: day, year, hour, minute, todayWeather, tomorrowWeather - Auto-save every in-game minute + on midnight + on sleep - Year system: year increments every 120 days (Aging System hook) - yearChanged event wired to UIScene + GrassScene ## ๐Ÿ“Š HUD UPGRADE - UIScene: yearText element (LETO 1) below dayText - dayText uses i18n key, turns orange at day 190+ (pre-statue warning) - gameState.year added Build: v0.97 ALPHA - Master Clock Edition --- .../dokumentacija/GAME_BIBLE_FINAL_2026.md | 13 ++ ...R_DNEVNIK_KOMPLETNA_ZGODOVINA_2025_2026.md | 45 +++++ .../ZGODBA_IMPLEMENTACIJA_2026_03_03.md | 7 +- .../public/assets/localization.json | 30 +++- .../src/scenes/GrassScene_Clean.js | 159 +++++++++++++++++- nova farma TRAE/src/scenes/MenuScene.js | 79 ++++++++- nova farma TRAE/src/scenes/UIScene.js | 111 ++++++++++-- nova farma TRAE/src/systems/DayNightSystem.js | 87 ++++++++-- nova farma TRAE/src/systems/WaterSystem.js | 8 +- 9 files changed, 487 insertions(+), 52 deletions(-) diff --git a/nova farma TRAE/dokumentacija/GAME_BIBLE_FINAL_2026.md b/nova farma TRAE/dokumentacija/GAME_BIBLE_FINAL_2026.md index b3618311c..311d6fdcb 100644 --- a/nova farma TRAE/dokumentacija/GAME_BIBLE_FINAL_2026.md +++ b/nova farma TRAE/dokumentacija/GAME_BIBLE_FINAL_2026.md @@ -5902,3 +5902,16 @@ V tej seji smo se osredotoฤili na popravilo in izboljลกanje `GameScene.js`, pre - **Goal:** Build the 8x8 Safe Zone foundation first. - **Removed:** Duplicate documentation and obsolete backup files. +## **UPDATE 26.4.2026: DEMO MEHANIKE & DOSTOPNOST** +- **Sistemi:** + - Avtomatski "Zero-State" Tloris za 8x8 kmetijo (fiksna postavitev ล otora, Ognja in Lovilca ob zagonu). + - Pametna "Anti-Cheat" kamera z miลกkino drsnico (Zoom) in Lookahead zamikom. + - Day/Night cikel (20 minut na dan, temen Noir filter ponoฤi, moฤnejลกi zombiji in Pass Out kazen ob 02:00). + - Globalna veฤjeziฤna lokalizacija (SL, EN, DE, IT, CN) v `localization.json` z avtomatsko zaznavo. +- **Dostopnost (AccessibilityManager):** + - Vgrajen 7-gumbovni UI z 2 stolpcema. + - Vizualna opozorila (Deaf Mode) - utripanje zaslona. + - Senzorni & ADHD Mode - skrivanje UI in umiritev kamere. + - Enoroฤni naฤin (One-Handed) - point & click sledenje samo z miลกko. + - Vidne Prilagoditve - poveฤana pisava, Visok Kontrast in Barvna slepota (Protanopia filtri). +- **Status:** Temeljne Demo Faza 1 mehanike so zdruลพene in stabilne, UI pripravljen! diff --git a/nova farma TRAE/dokumentacija/MASTER_DNEVNIK_KOMPLETNA_ZGODOVINA_2025_2026.md b/nova farma TRAE/dokumentacija/MASTER_DNEVNIK_KOMPLETNA_ZGODOVINA_2025_2026.md index e14c5c4cb..5024061d5 100644 --- a/nova farma TRAE/dokumentacija/MASTER_DNEVNIK_KOMPLETNA_ZGODOVINA_2025_2026.md +++ b/nova farma TRAE/dokumentacija/MASTER_DNEVNIK_KOMPLETNA_ZGODOVINA_2025_2026.md @@ -1487,3 +1487,48 @@ Ali kot bi rekel Gronk, med vape puff-om: **Status:** Session uspeลกno zakljuฤen, vsi asseti commitani. --- + +## ๐Ÿ“… 26. April 2026 - IMPLEMENTACIJA CORE MEHANIK & DOSTOPNOSTI ZA DEMO + +**Datum:** 26.4.2026 +**Trajanje:** Masiven All-in-One update +**Fokus:** Izboljลกava kamere, Day/Night cikel, Avtomatska kmetija, Lokalizacija in Polni UI Dostopnosti + +### Delo Opravljeno + +**1. Vizualna Globina in Arhitektura (Y-Sorting) ๐Ÿ—๏ธ** +- Popravljena sidriลกฤa (anchors) za Kaia in vse zgradbe na (0.5, 1.0). +- Vklopljena dinamiฤna globina (Y-sorting) za pravilen 2.5D render (Kai hodi PRED in ZA objekti). + +**2. Pripravljena 8x8 "Zero-State" Kmetija ๐Ÿ•๏ธ** +- Implementiran fiksni setup kmetije ob zagonu igre (ลกotor zgoraj levo, lovilec deลพevnice zgoraj desno, ogenj in skrinja v sredini). +- Pripravljena polja za sajenje pred ลกotorom in generiran "Fog of War" okoli baze. + +**3. Pametna "Anti-Cheat" Kamera ๐ŸŽฅ** +- Onemogoฤen free-roam (prosto premikanje s tipkovnico) za kamero. +- Dodan Scroll-Wheel Zoom (0.5x - 2.5x). +- Implementiran **Lookahead Offset**: kamera se gladko zamakne naprej v smeri igralฤevega gibanja in vida. + +**4. Sistem Dan/Noฤ s Kaznimi (Day/Night Cycle) ๐ŸŒ™** +- In-game dan nastavljen na toฤno 20 realnih minut. +- Uveden temno moder "Dark-Chibi Noir" noฤni filter na zaslonu. +- Ponoฤi zombiji postanejo 2x moฤnejลกi in hitrejลกi + sproลพi se noฤni spawn Rakunov. +- **Pass Out kazen**: ฤŒe igralec ne gre spati do 02:00, Kai omedli (izguba denarja in energije, respawn ob 06:00). + +**5. Globalni Sistem Jezikov (Localization) ๐ŸŒ** +- Ustvarjen `localization.json` s 5 jeziki (SL, EN, DE, IT, CN). +- Podpora za UTF-8 "Noto Sans" pisave (vkljuฤno s kitajskimi pismenkami). +- Zaznavanje sistemskega jezika in gumb za roฤno izbiro v Meniju, ki se shrani v `localStorage`. + +**6. Popoln Meni za Dostopnost (AccessibilityManager) โ™ฟ๐Ÿง ** +- Implementiran celoten vmesnik in sistem z nastavitvami v 2 stolpcih (7 gumbov). +- **Deaf Mode**: Rdeฤi robovi ob zombijih, vijoliฤen zaslon pri Twin Bond, glitch efekt pri Flashbacku. +- **Autism Friendly**: Izklop tresenja kamere in mehkejลกi vizualni filtri. +- **ADHD/Zen Mode**: Skrivanje nepotrebnega HUD-a in osredotoฤen velik indikator cilja (npr. "ZALIJ Pล ENICO"). +- **Enoroฤni naฤin (One-Handed)**: Igranje samo z miลกko (Kai sledi kurzorju ob drลพanju levega klika). +- **Vizualne nastavitve**: Poveฤana pisava (x1.25), Visok kontrast (CSS) in filtri za barvno slepoto (Protanopia CSS). + +**7. Profesionalni UI ๐ŸŽ–๏ธ** +- Dodan "Trial Version" badge v zgornjem kotu in logika za takojลกen odklep Faze 1 ob prehodu na "Full Game". + +**Status:** Vsi temeljni sistemi za igralni Demo so sedaj stabilni in povezani med seboj! diff --git a/nova farma TRAE/dokumentacija/ZGODBA_IMPLEMENTACIJA_2026_03_03.md b/nova farma TRAE/dokumentacija/ZGODBA_IMPLEMENTACIJA_2026_03_03.md index 2a0f9c7d3..b3a815922 100644 --- a/nova farma TRAE/dokumentacija/ZGODBA_IMPLEMENTACIJA_2026_03_03.md +++ b/nova farma TRAE/dokumentacija/ZGODBA_IMPLEMENTACIJA_2026_03_03.md @@ -389,6 +389,11 @@ AKT 2-4 (Faza 1+): โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 0% (prihodnost) --- -*Posodobljeno: 2026-03-03 ob 13:19* +## ๐Ÿ“… UPDATE 26. April 2026 (23:25) - ZGODBA IN DOSTOPNOST +- **Twin Bond Signali:** Narejen `twinBondPulse` globalni event v `TwinBondSystem.js`. Sedaj obleลพijo podlago za komunikacijo! ฤŒe je vklopljen 'Deaf Mode', cel HUD zavibrira in se pobarva z *vijoliฤnim sijajem*. Progress 5% -> **20%**. +- **Flashback Memories:** Sprogramiran 'flashbackPulse' event v `AccessibilityManager.js`. Ob proลพenju se zgodi grozljiv 'Screen Glitch' (bel screen in hud Camera Shake 300ms), ki vizualno odliฤno ponazarja izgubo spomina (Amnezija). Progress 5% -> **15%**. +- **Pritisk ฤŒasa (Survival Lore):** Aktivirali in kalibrirali 20-minutni real-time Day/Night cikel ter 'Pass Out' kazen ob 2:00 zjutraj. Igralec konฤno zaฤuti napetost noฤi in hudih zombijev, ki je osrฤje Kaijeve situacije. + +*Posodobljeno: 2026-04-26 ob 23:26* *Za dialoge: `DEMO_FAZA1_NAPISI_DIALOGI.md`* *Za full lore: `ZGODBA_CELOTNA.md`* diff --git a/nova farma TRAE/public/assets/localization.json b/nova farma TRAE/public/assets/localization.json index 097dfb328..509fd27bf 100644 --- a/nova farma TRAE/public/assets/localization.json +++ b/nova farma TRAE/public/assets/localization.json @@ -16,7 +16,11 @@ "day": "DAN", "map": "MAPA", "crafting": "CRAFTING", - "adhd_goal": "โฌ‡๏ธ TVOJ TRENUTNI CILJ: ZALIJ Pล ENICO! โฌ‡๏ธ" + "adhd_goal": "โฌ‡๏ธ TVOJ TRENUTNI CILJ: ZALIJ Pล ENICO! โฌ‡๏ธ", + "menu_subtitle": "KRVAVA ลฝETEV", + "menu_tagline": "\"Preลพivi. Najdi jo. Ne pozabi.\"", + "settings_info": "Nastavitve dostopnosti se nahajajo\nv sami igri (Meni gumb zgoraj desno).\n\nTukaj lahko preklapljaลก samo Jezik.", + "settings_close": "ZAPRI" }, "en": { "menu_play": "PLAY", @@ -35,7 +39,11 @@ "day": "DAY", "map": "MAP", "crafting": "CRAFTING", - "adhd_goal": "โฌ‡๏ธ YOUR CURRENT GOAL: WATER THE WHEAT! โฌ‡๏ธ" + "adhd_goal": "โฌ‡๏ธ YOUR CURRENT GOAL: WATER THE WHEAT! โฌ‡๏ธ", + "menu_subtitle": "BLOOD HARVEST", + "menu_tagline": "\"Survive. Find her. Don't forget.\"", + "settings_info": "Accessibility settings are located\ninside the game (Menu button top right).\n\nHere you can only change Language.", + "settings_close": "CLOSE" }, "de": { "menu_play": "SPIELEN", @@ -54,7 +62,11 @@ "day": "TAG", "map": "KARTE", "crafting": "HERSTELLUNG", - "adhd_goal": "โฌ‡๏ธ DEIN AKTUELLES ZIEL: WEIZEN GIESSEN! โฌ‡๏ธ" + "adhd_goal": "โฌ‡๏ธ DEIN AKTUELLES ZIEL: WEIZEN GIESSEN! โฌ‡๏ธ", + "menu_subtitle": "BLUTERNTE", + "menu_tagline": "\"รœberlebe. Finde sie. Vergiss nicht.\"", + "settings_info": "Barrierefreiheitseinstellungen befinden sich\nim Spiel (Menรผ-Taste oben rechts).\n\nHier kรถnnen Sie nur die Sprache รคndern.", + "settings_close": "SCHLIESSEN" }, "it": { "menu_play": "GIOCA", @@ -73,7 +85,11 @@ "day": "GIORNO", "map": "MAPPA", "crafting": "CREAZIONE", - "adhd_goal": "โฌ‡๏ธ IL TUO OBIETTIVO ATTUALE: ANNAFFIA IL GRANO! โฌ‡๏ธ" + "adhd_goal": "โฌ‡๏ธ IL TUO OBIETTIVO ATTUALE: ANNAFFIA IL GRANO! โฌ‡๏ธ", + "menu_subtitle": "RACCOLTO DI SANGUE", + "menu_tagline": "\"Sopravvivi. Trovala. Non dimenticare.\"", + "settings_info": "Le impostazioni di accessibilitร  si trovano\nall'interno del gioco (tasto Menu in alto a destra).\n\nQui puoi cambiare solo la Lingua.", + "settings_close": "CHIUDI" }, "cn": { "menu_play": "ๅผ€ๅง‹ๆธธๆˆ", @@ -92,6 +108,10 @@ "day": "ๅคฉ", "map": "ๅœฐๅ›พ", "crafting": "ๅˆถไฝœ", - "adhd_goal": "โฌ‡๏ธ ไฝ ๅฝ“ๅ‰็š„็›ฎๆ ‡๏ผš็ป™ๅฐ้บฆๆต‡ๆฐด๏ผ โฌ‡๏ธ" + "adhd_goal": "โฌ‡๏ธ ไฝ ๅฝ“ๅ‰็š„็›ฎๆ ‡๏ผšๆต‡็Œๅฐ้บฆ๏ผ โฌ‡๏ธ", + "menu_subtitle": "่ก€่…ฅๆ”ถ่Žท", + "menu_tagline": "\"็”Ÿๅญ˜ใ€‚ๆ‰พๅˆฐๅฅนใ€‚ๅˆซๅฟ˜ไบ†ใ€‚\"", + "settings_info": "ๆ— ้šœ็ข่ฎพ็ฝฎไฝไบŽ\nๆธธๆˆๅ†…้ƒจ๏ผˆๅณไธŠ่ง’่œๅ•ๆŒ‰้’ฎ๏ผ‰ใ€‚\n\nๅœจ่ฟ™้‡Œไฝ ๅช่ƒฝๆ›ดๆ”น่ฏญ่จ€ใ€‚", + "settings_close": "ๅ…ณ้—ญ" } } diff --git a/nova farma TRAE/src/scenes/GrassScene_Clean.js b/nova farma TRAE/src/scenes/GrassScene_Clean.js index c1975871c..901a12911 100644 --- a/nova farma TRAE/src/scenes/GrassScene_Clean.js +++ b/nova farma TRAE/src/scenes/GrassScene_Clean.js @@ -128,6 +128,7 @@ export default class GrassSceneClean extends Phaser.Scene { }); this.load.image('rain_catcher', 'DEMO_FAZA1/Structures/rain_catcher.png'); this.load.image('foundation_concrete', 'DEMO_FAZA1/Structures/foundation_concrete.png'); + this.load.image('golden_statue', 'DEMO_FAZA1/Structures/golden_statue.png'); // 8. Weather System this.load.image('rain_drops', 'DEMO_FAZA1/Environment/rain_drops.png'); @@ -1180,7 +1181,8 @@ export default class GrassSceneClean extends Phaser.Scene { up: Phaser.Input.Keyboard.KeyCodes.W, down: Phaser.Input.Keyboard.KeyCodes.S, left: Phaser.Input.Keyboard.KeyCodes.A, - right: Phaser.Input.Keyboard.KeyCodes.D + right: Phaser.Input.Keyboard.KeyCodes.D, + interact: Phaser.Input.Keyboard.KeyCodes.E }); @@ -1343,6 +1345,7 @@ export default class GrassSceneClean extends Phaser.Scene { this.rainScreenW = SCREEN_W; this.rainScreenH = SCREEN_H; + this.isRaining = false; console.log('๐ŸŒง๏ธ Rain system initialized (procedural canvas drops)!'); @@ -1418,17 +1421,66 @@ export default class GrassSceneClean extends Phaser.Scene { // === EVENT WIRE-UP === - // Dan se je spremenil โ†’ farma tick + // Dan se je spremenil โ†’ farma tick + Master Clock this.events.on('dayChanged', ({ day }) => { if (this.farmingSystem) this.farmingSystem.onNewDay(day); console.log(`๐Ÿ“… Dan ${day} priลกel!`); + + // ๐Ÿ† ULTIMATIVNA NAGRADA: natanko 200 dni preลพivetja + if (day === 200 && !this._statueSpawned) { + this._statueSpawned = true; + this._showAchievement('Trmasti Preลพiveli'); + this._spawnGoldenStatue(); + } }); - // Deลพ โ†’ Rain Catcher zbira - this.events.on('rainDay', ({ day }) => { - if (this.waterSystem) this.waterSystem.onRain(); - this.triggerRainfall(); // Vizualni deลพ - console.log(`๐ŸŒง๏ธ Deลพen dan ${day}`); + // ๐ŸŽŠ NOVO LETO โ€” trigger za prihodnji Aging System + this.events.on('yearChanged', ({ year, day }) => { + console.log(`๐ŸŽ‰ GrassScene: Novo Leto ${year} (dan ${day}) - Aging System trigger!`); + // V prihodnosti: this.agingSystem.onNewYear(year); + }); + + // Preveri ob nalaganju igre: Morda je save z dnevom >= 200 + this.time.delayedCall(500, () => { + const dns = this.dayNightSystem; + if (dns && dns.getDay() >= 200 && !this._statueSpawned) { + this._statueSpawned = true; + // Achievement samo ob toฤno 200, ne ob naฤinu po 200 + if (dns.getDay() === 200) this._showAchievement('Trmasti Preลพiveli'); + this._spawnGoldenStatue(); + } + }); + + + // Deลพ โ†’ Rain Catcher zbira in avtomatsko zalije kmetijo + this.events.on('weatherChanged', (weather) => { + if (weather === 'rain') { + this.isRaining = true; + if (this.waterSystem) this.waterSystem.onRain(); + this.triggerRainfall(); // Vizualni deลพ na tleh + + // Avtomatsko zalij vse posajene rastline! + if (this.farmingSystem && this.farmingSystem.soilSlots) { + this.farmingSystem.soilSlots.forEach(slot => { + slot.isWatered = true; + slot.tint = 0x666633; // Temnejลกa barva mokre zemlje + }); + } + + console.log(`๐ŸŒง๏ธ Vreme: DEลฝ - Kmetija avtomatsko zalita!`); + } else { + this.isRaining = false; + + // Vse se posuลกi + if (this.farmingSystem && this.farmingSystem.soilSlots) { + this.farmingSystem.soilSlots.forEach(slot => { + slot.isWatered = false; + slot.clearTint(); + }); + } + + console.log(`โ˜€๏ธ Vreme: SONCE - Kmetija se je posuลกila.`); + } }); // Jutro โ†’ Rast trave/dreves @@ -1978,6 +2030,83 @@ export default class GrassSceneClean extends Phaser.Scene { // --- AUTO-TILING SYSTEM (REMOVED) --- /* Removed for cleanup */ + _showAchievement(title) { + const cx = this.cameras.main.centerX; + const cy = this.cameras.main.centerY; + + const bg = this.add.rectangle(cx, cy - 200, 600, 100, 0xffd700, 0.9) + .setStrokeStyle(4, 0xffffff) + .setDepth(9999) + .setScrollFactor(0); + + const txt = this.add.text(cx, cy - 200, `๐Ÿ† ACHIEVEMENT UNLOCKED ๐Ÿ†\n${title}`, { + fontFamily: 'Arial Black', + fontSize: '28px', + color: '#000000', + align: 'center', + stroke: '#ffffff', + strokeThickness: 2 + }).setOrigin(0.5).setDepth(10000).setScrollFactor(0); + + // Animacija + bg.setScale(0); + txt.setScale(0); + + this.tweens.add({ + targets: [bg, txt], + scale: 1, + duration: 600, + ease: 'Back.out', + onComplete: () => { + this.time.delayedCall(5000, () => { + this.tweens.add({ + targets: [bg, txt], + y: '-=50', + alpha: 0, + duration: 500, + onComplete: () => { + bg.destroy(); + txt.destroy(); + } + }); + }); + } + }); + } + + _spawnGoldenStatue() { + // Kip se pojavi zraven ลกotora + let spawnX = this.sotor ? this.sotor.x + 160 : 1500; + let spawnY = this.sotor ? this.sotor.y + 40 : 1500; + + const statue = this.physics.add.image(spawnX, spawnY, 'golden_statue'); + statue.setOrigin(0.5, 1.0); // Pravilno sidriลกฤe na dno + statue.setDepth(statue.y); // Dinamiฤna globina Y-sorting + statue.setScale(1.2); // Malo veฤje, da je impresivno + + statue.body.setSize(100, 40); + statue.body.setOffset(statue.width/2 - 50, statue.height - 40); + statue.body.setImmovable(true); + + // Trk s Kaiem + if (this.kai) { + this.physics.add.collider(this.kai, statue); + } + + // Bleลกฤanje (Pulse glow) + this.tweens.add({ + targets: statue, + scaleX: 1.25, + scaleY: 1.25, + duration: 1200, + yoyo: true, + repeat: -1, + ease: 'Sine.easeInOut' + }); + + console.log("โœจ Zlati Kip za 200 dni postavljen!"); + } + update(time, delta) { if (this.kai && this.kai.active) { // --- LOOKAHEAD CAMERA OFFSET (Gledanje naprej) --- @@ -2102,7 +2231,7 @@ export default class GrassSceneClean extends Phaser.Scene { this.kai.setDepth(this.kai.y); // === RAIN UPDATE: Draw procedural raindrops each frame === - if (this.rainGraphics && this.rainDrops) { + if (this.rainGraphics && this.rainDrops && this.isRaining) { const dt = delta / 1000; // seconds this.rainGraphics.clear(); @@ -2131,6 +2260,20 @@ export default class GrassSceneClean extends Phaser.Scene { ); this.rainGraphics.strokePath(); } + } else if (this.rainGraphics) { + this.rainGraphics.clear(); + } + + // === RADIO INTERACTION === + if (Phaser.Input.Keyboard.JustDown(this.keys.interact)) { + if (this.sotor) { + const distToTent = Phaser.Math.Distance.Between(this.kai.x, this.kai.y, this.sotor.x, this.sotor.y); + if (distToTent < 150) { + // Odpri radio UI + const tomorrowWeather = this.dayNightSystem ? this.dayNightSystem.getTomorrowWeather() : 'sun'; + this.scene.get('UIScene').showRadioForecast(tomorrowWeather); + } + } } // === WATER SYSTEM UPDATE === diff --git a/nova farma TRAE/src/scenes/MenuScene.js b/nova farma TRAE/src/scenes/MenuScene.js index d8c29a815..944da079d 100644 --- a/nova farma TRAE/src/scenes/MenuScene.js +++ b/nova farma TRAE/src/scenes/MenuScene.js @@ -119,7 +119,7 @@ export default class MenuScene extends Phaser.Scene { // NASLOV IGRE // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ // Subtitle zgoraj - this.add.text(W * 0.32, H * 0.12, 'KRVAVA ลฝETEV', { + this.subtitleText = this.add.text(W * 0.32, H * 0.12, this.i18n.t('menu_subtitle'), { fontFamily: '"Georgia", serif', fontSize: '28px', color: '#cc6666', @@ -151,7 +151,7 @@ export default class MenuScene extends Phaser.Scene { }); // Tagline pod naslovom - this.add.text(W * 0.32, H * 0.41, '"Preลพivi. Najdi jo. Ne pozabi."', { + this.taglineText = this.add.text(W * 0.32, H * 0.41, this.i18n.t('menu_tagline'), { fontFamily: '"Georgia", serif', fontStyle: 'italic', fontSize: '22px', @@ -175,7 +175,7 @@ export default class MenuScene extends Phaser.Scene { const buttons = [ { label: 'โ–ถ ' + this.i18n.t('menu_play'), id: 'play', color: '#44ffcc', hColor: '#ffffff' }, { label: 'โš™ ' + this.i18n.t('menu_options'), id: 'settings', color: '#aabbcc', hColor: '#ffffff' }, - { label: '๐ŸŒ ' + this.i18n.t('lang_btn'), id: 'lang', color: '#ccddaa', hColor: '#ffffff' }, + { label: '๐ŸŒ ' + this.i18n.t('lang_btn') + ` (${this.i18n.currentLang.toUpperCase()})`, id: 'lang', color: '#ccddaa', hColor: '#ffffff' }, { label: 'โœ• ' + this.i18n.t('menu_exit'), id: 'quit', color: '#cc6666', hColor: '#ff8888' }, ]; @@ -290,17 +290,30 @@ export default class MenuScene extends Phaser.Scene { }); } else if (id === 'settings') { - // TODO: SettingsScene - this._showToast('Nastavitve kmalu! ๐Ÿ”ง'); + // Prikaลพi nastavitve UI + this._showSettingsMenu(); } else if (id === 'lang') { - // Cycle language + // Hitro zamenjaj jezik const langs = this.i18n.supportedLangs; let idx = langs.indexOf(this.i18n.currentLang); idx = (idx + 1) % langs.length; this.i18n.setLanguage(langs[idx]); - // Restart scene to apply new language - this.scene.restart(); + + // Takoj posodobi tekste gumbov (brez scene restarta, ker je hitreje in bolj stabilno) + this._btns[0].txt.setText('โ–ถ ' + this.i18n.t('menu_play')); + this._btns[1].txt.setText('โš™ ' + this.i18n.t('menu_options')); + this._btns[2].txt.setText('๐ŸŒ ' + this.i18n.t('lang_btn') + ` (${this.i18n.currentLang.toUpperCase()})`); + this._btns[3].txt.setText('โœ• ' + this.i18n.t('menu_exit')); + + // Posodobi naslovne tekste + if (this.subtitleText) this.subtitleText.setText(this.i18n.t('menu_subtitle')); + if (this.taglineText) this.taglineText.setText(this.i18n.t('menu_tagline')); + + // ฤŒe je odprt meni z nastavitvami, posodobi tudi tisto + if (this.settingsTitle) this.settingsTitle.setText('โš™ ' + this.i18n.t('menu_options')); + if (this.settingsInfo) this.settingsInfo.setText(this.i18n.t('settings_info')); + if (this.settingsCloseTxt) this.settingsCloseTxt.setText(this.i18n.t('settings_close')); } else if (id === 'quit') { // Electron quit @@ -344,6 +357,56 @@ export default class MenuScene extends Phaser.Scene { }); } + _showSettingsMenu() { + if (this.settingsContainer) return; + + const W = this.cameras.main.width; + const H = this.cameras.main.height; + + this.settingsContainer = this.add.container(W / 2, H / 2).setDepth(9000); + + // Temno ozadje in rob + const bg = this.add.rectangle(0, 0, 550, 320, 0x111111, 0.95).setStrokeStyle(4, 0x44ffcc); + + this.settingsTitle = this.add.text(0, -110, 'โš™ ' + this.i18n.t('menu_options'), { + fontFamily: this.i18n.fontFamily, fontSize: '32px', color: '#44ffcc' + }).setOrigin(0.5); + + this.settingsInfo = this.add.text(0, -30, this.i18n.t('settings_info'), { + fontFamily: this.i18n.fontFamily, fontSize: '20px', color: '#aaaaaa', align: 'center' + }).setOrigin(0.5); + + // Gumb Zapri + const closeBtnBg = this.add.rectangle(0, 90, 200, 50, 0xcc6666, 1).setInteractive({ useHandCursor: true }); + this.settingsCloseTxt = this.add.text(0, 90, this.i18n.t('settings_close'), { + fontFamily: this.i18n.fontFamily, fontSize: '22px', color: '#ffffff', stroke: '#000000', strokeThickness: 4 + }).setOrigin(0.5); + + closeBtnBg.on('pointerdown', () => { + this.tweens.add({ + targets: this.settingsContainer, + scale: 0, + duration: 250, + ease: 'Back.in', + onComplete: () => { + this.settingsContainer.destroy(); + this.settingsContainer = null; + } + }); + }); + + this.settingsContainer.add([bg, this.settingsTitle, this.settingsInfo, closeBtnBg, this.settingsCloseTxt]); + + // Pop-up animacija + this.settingsContainer.setScale(0); + this.tweens.add({ + targets: this.settingsContainer, + scale: 1, + duration: 350, + ease: 'Back.out' + }); + } + // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ // UPDATE // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ diff --git a/nova farma TRAE/src/scenes/UIScene.js b/nova farma TRAE/src/scenes/UIScene.js index 0d15e2877..0552d7d52 100644 --- a/nova farma TRAE/src/scenes/UIScene.js +++ b/nova farma TRAE/src/scenes/UIScene.js @@ -28,6 +28,7 @@ export default class UIScene extends Phaser.Scene { energy: 100, maxEnergy: 100, day: 1, + year: 1, // ๐Ÿ—“๏ธ Generacijski sistem โ€” leto se obrne vsakih 120 dni hour: 6, minute: 0, weather: 'rain', // 'sun', 'rain', 'storm', 'cloud' @@ -189,15 +190,24 @@ export default class UIScene extends Phaser.Scene { strokeThickness: 4, }).setOrigin(0.5, 0.5).setDepth(1005); - // Dan label (pod uro) - this.dayText = this.add.text(W - PAD - 135, PAD + 10, this.i18n.t('day') + ' 1', { - fontFamily: this.i18n.fontFamily, - fontSize: '18px', + // Dan + Leto (zgoraj desno, pod uro) + this.dayText = this.add.text(W - PAD - 62, PAD + 105, this.i18n.t('day') + ' 1', { + fontFamily: 'Arial Black', + fontSize: '20px', color: '#ffdd44', stroke: '#000000', strokeThickness: 4, }).setOrigin(0.5, 0).setDepth(1005); + // Leto (pod dnem) + this.yearText = this.add.text(W - PAD - 62, PAD + 133, 'LETO 1', { + fontFamily: 'Arial Black', + fontSize: '14px', + color: '#aaddff', + stroke: '#000000', + strokeThickness: 3, + }).setOrigin(0.5, 0).setDepth(1005); + // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ // BOTTOM CENTER โ€” Hotbar (7 slotov) // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -483,12 +493,19 @@ export default class UIScene extends Phaser.Scene { // โ”€โ”€ Time update iz DayNightSystem โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ this.events.on('timeChanged', (data) => { - if (this.timeText) { - this.timeText.setText(data.timeStr || '06:00'); - } - if (this.dayText) { - this.dayText.setText(`DAN ${data.day}`); - } + if (data.day !== undefined) this.gameState.day = data.day; + if (data.year !== undefined) this.gameState.year = data.year; + if (data.hour !== undefined) this.gameState.hour = data.hour; + if (data.minute !== undefined) this.gameState.minute = data.minute; + this._updateTimeDisplay(); + }); + + // โ”€โ”€ Year update (Generacijski Aging trigger) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + this.events.on('yearChanged', (data) => { + this.gameState.year = data.year; + this._updateTimeDisplay(); + // Tukaj v prihodnosti sproลพi Aging System! + console.log(`๐ŸŽˆ UIScene: Novo leto ${data.year} - Aging System trigger ready!`); }); // โ”€โ”€ Water update iz WaterSystem โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -585,17 +602,28 @@ export default class UIScene extends Phaser.Scene { } } - /** Posodobi uro + dan display */ + /** Posodobi uro + dan + leto display */ _updateTimeDisplay() { - const { day, hour, minute } = this.gameState; + const { day, year, hour, minute } = this.gameState; const hStr = String(hour).padStart(2, '0'); const mStr = String(minute).padStart(2, '0'); this.timeText.setText(`${hStr}:${mStr}`); - this.dayText.setText(`DAN ${day}`); - // Ura barva: rdeฤa ponoฤi, rumena podnevi + // Dan s i18n kljuฤem + const dayLabel = this.i18n ? this.i18n.t('day') : 'DAN'; + this.dayText.setText(`${dayLabel} ${day}`); + + // Leto label + if (this.yearText) { + this.yearText.setText(`LETO ${year || 1}`); + } + + // Ura barva: modra ponoฤi, rdeฤa podnevi const isNight = hour >= 21 || hour < 5; this.timeText.setColor(isNight ? '#8899ff' : '#ff3333'); + + // DAN se obarva rumeno, LETO svetlo modro + this.dayText.setColor(day >= 190 ? '#ff8800' : '#ffdd44'); // Oranลพno bliลพe kipu } /** Toggle Inventory popup */ @@ -767,6 +795,61 @@ export default class UIScene extends Phaser.Scene { } } + showRadioForecast(weather) { + if (this.radioContainer) return; + + const W = this.cameras.main.width; + const H = this.cameras.main.height; + + // Dark-Chibi Noir stil: ฤrna ลกkatla, debel rob + this.radioContainer = this.add.container(W / 2, H / 2).setDepth(8000); + + const bg = this.add.rectangle(0, 0, 450, 220, 0x0a0a0d, 0.95) + .setStrokeStyle(6, 0x222222); + + let forecastText = weather === 'rain' ? 'DEลฝ ๐ŸŒง๏ธ' : 'SONฤŒNO โ˜€๏ธ'; + let color = weather === 'rain' ? '#55aaff' : '#ffdd44'; + + const title = this.add.text(0, -60, '๐Ÿ“ป RADIO', { + fontFamily: this.i18n.fontFamily, fontSize: '28px', color: '#aaaaaa', fontStyle: 'bold' + }).setOrigin(0.5); + + const info = this.add.text(0, 0, `Napoved za jutri:\n${forecastText}`, { + fontFamily: this.i18n.fontFamily, fontSize: '36px', color: color, align: 'center', stroke: '#000000', strokeThickness: 8 + }).setOrigin(0.5); + + const closeHint = this.add.text(0, 80, '[ Klikni za zaprtje ]', { + fontFamily: this.i18n.fontFamily, fontSize: '18px', color: '#666666' + }).setOrigin(0.5); + + this.radioContainer.add([bg, title, info, closeHint]); + + // Vstopna animacija + this.radioContainer.setScale(0); + this.tweens.add({ + targets: this.radioContainer, + scale: 1, + duration: 400, + ease: 'Back.out' + }); + + // Zapri na klik obmoฤja ekrana + const blocker = this.add.zone(W/2, H/2, W, H).setInteractive().setDepth(7999); + blocker.on('pointerdown', () => { + this.tweens.add({ + targets: this.radioContainer, + scale: 0, + duration: 300, + ease: 'Back.in', + onComplete: () => { + this.radioContainer.destroy(); + this.radioContainer = null; + blocker.destroy(); + } + }); + }); + } + update(time, delta) { if (this.accManager) { this.accManager.update(time, delta); diff --git a/nova farma TRAE/src/systems/DayNightSystem.js b/nova farma TRAE/src/systems/DayNightSystem.js index 2d1f89c1b..661fa5474 100644 --- a/nova farma TRAE/src/systems/DayNightSystem.js +++ b/nova farma TRAE/src/systems/DayNightSystem.js @@ -31,11 +31,19 @@ export default class DayNightSystem { constructor(scene, options = {}) { this.scene = scene; - // ฤŒas + // ฤŒas in Master Clock this.day = 1; + this.year = 1; this.hour = 6; // Zaฤne ob 6:00 this.minute = 0; + // Vreme + this.todayWeather = 'sun'; + this.tomorrowWeather = Math.random() < 0.3 ? 'rain' : 'sun'; + + // Poskusi naloลพiti stanje iz prejลกnje seje (Trajno shranjevanje) + this.loadState(); + // Hitrost: 1.2 igra minut = 1 real sekunda (24 ur v igri = 1200 real sekund = 20 minut) this.gameMinutesPerRealSecond = options.speed || 1.2; @@ -131,10 +139,14 @@ export default class DayNightSystem { // Emit UI update vsako minuto this.scene.events.emit('timeChanged', { day: this.day, + year: this.year, hour: this.hour, minute: this.minute, timeStr: this._timeStr(), }); + + // Avtomatsko trajno shranjevanje ure in dneva vsako in-game minuto + this.saveState(); } // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -149,9 +161,18 @@ export default class DayNightSystem { // Posebni uri: if (this.hour === 6) { - // Jutro! - this.scene.events.emit('morningArrived', { day: this.day }); - console.log(`๐ŸŒ… Jutro! Dan ${this.day}, 06:00`); + // Jutro - Menjava vremena! + this.todayWeather = this.tomorrowWeather; + this.tomorrowWeather = Math.random() < 0.3 ? 'rain' : 'sun'; + + // Posodobimo globalno stanje, ฤe obstaja + if (this.scene.gameState) { + this.scene.gameState.weather = this.todayWeather; + } + + this.scene.events.emit('morningArrived', { day: this.day, weather: this.todayWeather }); + this.scene.events.emit('weatherChanged', this.todayWeather); + console.log(`๐ŸŒ… Jutro! Dan ${this.day}, 06:00. Danaลกnje vreme: ${this.todayWeather}, Jutri: ${this.tomorrowWeather}`); } if (this.hour === 20) { // Veฤer @@ -166,19 +187,24 @@ export default class DayNightSystem { } // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - // HOOK โ€” Polnoฤ โ†’ Nov dan + // HOOK โ€” Polnoฤ โ†’ Nov dan in Leto // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ _onMidnight() { this.day++; console.log(`๐ŸŒ™ Polnoฤ โ†’ Dan ${this.day}!`); + // Generacijski sistem (Staranje): Leto se obrne vsakih 120 dni + if (this.day % 120 === 1 && this.day > 1) { + this.year++; + console.log(`๐ŸŽ‰ SREฤŒNO NOVO LETO! Leto ${this.year} se je zaฤelo!`); + this.scene.events.emit('yearChanged', { year: this.year, day: this.day }); + } + + // Shranimo takoj na polnoฤ + this.saveState(); + // โ”€โ”€ Farming tick โ”€โ”€ this.scene.events.emit('dayChanged', { day: this.day }); - - // โ”€โ”€ Rain check (30% chance) โ”€โ”€ - if (Math.random() < 0.3) { - this.scene.events.emit('rainDay', { day: this.day }); - } } // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -213,7 +239,7 @@ export default class DayNightSystem { this.minute = 0; // Emit morning events - this.scene.events.emit('morningArrived', { day: this.day }); + this.scene.events.emit('morningArrived', { day: this.day, weather: this.todayWeather }); this.scene.events.emit('timeChanged', { day: this.day, hour: 6, minute: 0, timeStr: '06:00' }); @@ -270,7 +296,7 @@ export default class DayNightSystem { } // Emit morning events - this.scene.events.emit('morningArrived', { day: this.day }); + this.scene.events.emit('morningArrived', { day: this.day, weather: this.todayWeather }); this.scene.events.emit('timeChanged', { day: this.day, hour: 6, minute: 0, timeStr: '06:00' }); @@ -482,15 +508,52 @@ export default class DayNightSystem { // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ getTimeStr() { return this._timeStr(); } getDay() { return this.day; } + getYear() { return this.year; } getHour() { return this.hour; } isNight() { return this.hour >= 22 || this.hour < 6; } isDay() { return this.hour >= 6 && this.hour < 20; } + getTomorrowWeather() { return this.tomorrowWeather; } + getTodayWeather() { return this.todayWeather; } /** Nastavi ฤas (za debug/testing) */ setTime(hour, minute = 0) { this.hour = hour; this.minute = minute; console.log(`โฐ ฤŒas nastavljen: ${this._timeStr()}`); + this.saveState(); + } + + // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + // TRAJNO SHRANJEVANJE (LOCALSTORAGE) + // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + saveState() { + const state = { + day: this.day, + year: this.year, + hour: this.hour, + minute: this.minute, + todayWeather: this.todayWeather, + tomorrowWeather: this.tomorrowWeather + }; + localStorage.setItem('nova_farma_time_save', JSON.stringify(state)); + } + + loadState() { + const saved = localStorage.getItem('nova_farma_time_save'); + if (saved) { + try { + const data = JSON.parse(saved); + this.day = data.day || 1; + this.year = data.year || 1; + this.hour = data.hour !== undefined ? data.hour : 6; + this.minute = data.minute || 0; + this.todayWeather = data.todayWeather || 'sun'; + this.tomorrowWeather = data.tomorrowWeather || 'sun'; + console.log(`๐Ÿ’พ ฤŒas uspeลกno naloลพen! Dan: ${this.day}, Leto: ${this.year}, Ura: ${this._timeStr()}`); + } catch (e) { + console.warn("โš ๏ธ Napaka pri branju ฤasa iz LocalStorage", e); + } + } } destroy() { diff --git a/nova farma TRAE/src/systems/WaterSystem.js b/nova farma TRAE/src/systems/WaterSystem.js index 620ce56cc..94fdba1bb 100644 --- a/nova farma TRAE/src/systems/WaterSystem.js +++ b/nova farma TRAE/src/systems/WaterSystem.js @@ -83,7 +83,7 @@ export default class WaterSystem { sprite, label, current: 0, - max: 20, + max: 50, }; this.rainCatchers.push(rc); @@ -187,15 +187,15 @@ export default class WaterSystem { onRain() { let total = 0; for (const rc of this.rainCatchers) { - const collected = Math.min(this.rainCollectRate, rc.max - rc.current); - rc.current += collected; + const collected = rc.max - rc.current; // Napolni do 50L + rc.current = rc.max; total += collected; this._updateLabel(rc); // Ripple animacija na RC this._rainRipple(rc.x, rc.y - 40); } if (total > 0) { - console.log(`๐ŸŒง๏ธ Deลพ zbral ${total}L v Rain Catcher-jih`); + console.log(`๐ŸŒง๏ธ Deลพ napolnil Lovilec deลพevnice na polno (50L)!`); } this.scene.events.emit('waterChanged', { can: this.canCurrent,