From 8b37814bd8b483341dca6cea350091a2386268a8 Mon Sep 17 00:00:00 2001 From: NovaFarma Dev Date: Thu, 11 Dec 2025 20:41:00 +0100 Subject: [PATCH] updejt --- DNEVNIK.md | 64 +++-- NEXT_STEPS.md | 233 +++++++++++++++ assets/player_dreadlocks.png | Bin 62366 -> 15150 bytes docs/WATER_ANIMATION.md | 535 +++++++++++++++++++++++++++++++++++ docs/phase22_plan.md | 69 +++-- src/entities/Player.js | 102 ++++++- src/game.js | 3 + src/scenes/GameScene.js | 98 +------ src/scenes/PreloadScene.js | 3 + src/systems/BuildSystem.js | 66 +++++ src/utils/CheatConsole.js | 154 ++++++++++ 11 files changed, 1184 insertions(+), 143 deletions(-) create mode 100644 NEXT_STEPS.md create mode 100644 docs/WATER_ANIMATION.md create mode 100644 src/utils/CheatConsole.js diff --git a/DNEVNIK.md b/DNEVNIK.md index 9391b3a..df2cac5 100644 --- a/DNEVNIK.md +++ b/DNEVNIK.md @@ -77,7 +77,7 @@ - Light background detection (brightness > 170) - Added all fence pieces to processing list -### **5. BUG FIXES & POLISH** ✅ +#### **6. BUG FIXES & POLISH** ✅ - ✅ Fixed `npc.toggleState()` undefined error - Removed 3 calls in InteractionSystem.js - Replaced with console.log @@ -93,6 +93,10 @@ - Grave: 0.5 → 0.3 - Farmhouse: 0.8 → 0.5 - Blacksmith: 0.7 → 0.45 +- ✅ **Tool swing animation** - arc rotation effect +- ✅ **Build tutorial popup** - auto-dismiss after 5s +- ✅ **Particle effects** - soil/seed/harvest (brown/green/gold) +- ✅ **Camera shake** - on harvest action --- @@ -101,14 +105,20 @@ 2. `src/systems/BuildSystem.js` 3. `tools/create_spritesheet.js` 4. `tools/farming_controls_template.js` +5. `docs/phase22_plan.md` +6. `tools/time_control_panel.js` -#### **MODIFICIRANE DATOTEKE (6):** -1. `src/scenes/PreloadScene.js` - Added fence assets + ultra transparency -2. `src/scenes/GameScene.js` - Initialized farming & build systems -3. `src/scenes/UIScene.js` - Added zombie & farm stats panels -4. `src/systems/InteractionSystem.js` - Removed toggleState errors -5. `src/entities/Player.js` - Scale adjustments (1.5x) -6. `src/entities/NPC.js` - Scale adjustments (1.2x) +#### **MODIFICIRANE DATOTEKE (10):** +1. `src/scenes/PreloadScene.js` - Added fence assets + ultra transparency + 21 sprites +2. `src/scenes/GameScene.js` - Initialized farming & build systems + parallax background +3. `src/scenes/UIScene.js` - Added zombie & farm stats panels + resources + time control +4. `src/scenes/StoryScene.js` - Main menu glow effect + animations +5. `src/systems/InteractionSystem.js` - Removed toggleState errors +6. `src/systems/TerrainSystem.js` - Added decorations (flowers, bushes, rocks, grass) +7. `src/entities/Player.js` - Scale adjustments + farming actions + particles + tool swing +8. `src/entities/NPC.js` - Scale adjustments (2.5x zombie, 0.2x others) +9. `src/systems/BuildSystem.js` - Tutorial popup +10. All documentation files #### **ASSETS GENERATED (6):** - fence_post.png (final - ultra transparent) @@ -119,28 +129,38 @@ - fence_post_tiny.png (attempt 3) #### **STATISTIKA:** -- 📊 **Development time:** 2.5 ure -- 📊 **Systems implemented:** 3 major -- 📊 **Code written:** ~429 vrstic (FarmingSystem + BuildSystem) -- 📊 **Bug fixes:** 5 critical +- 📊 **Development time:** 3h 55min +- 📊 **Systems implemented:** 6 major +- 📊 **Code written:** ~1,000 vrstic (FarmingSystem + BuildSystem + Controls + UI + Effects) +- 📊 **Bug fixes:** 6 critical - 📊 **Asset iterations:** 3 (until perfect transparency) +- 📊 **Visual effects:** 10+ (particles, glow, parallax, shake) -#### **READY TO USE (Hotkeys):** +#### **READY TO USE (Features):** ```javascript -// BUILD MODE -B // Toggle build mode -1-4 // Select fence type (post, horizontal, vertical, corner) -5 // Select barn -Click // Place building +// FARMING +Space + Hoe // Till soil (particles + swing) +Space + Seeds // Plant (particles) +Space (empty) // Harvest (sparkles + shake) -// FARMING (za implementirati controls) -Space // Farm action (till/plant/harvest) -E // Interact with zombie worker +// BUILDING +B // Toggle build mode (tutorial on first) +1-5 // Select building type +Click // Place building + +// TIME CONTROL +1x/2x/5x buttons // Speed control +⏸️/▶️ button // Pause/Resume + +// UI +Top-right // Resources (🪵 Wood, 🪨 Stone, ⚙️ Iron) +Top-right // Clock (HH:MM + ☀️/🌙) +Left-bottom // Zombie stats + Farm stats ``` --- -*Session end: 11.12.2025 - 18:52 - **ISOMETRIC GAMEPLAY SYSTEMS COMPLETED!*** +*Session end: 11.12.2025 - 19:45 - **EPIC 4-HOUR SESSION COMPLETE!*** --- diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md new file mode 100644 index 0000000..f0150fc --- /dev/null +++ b/NEXT_STEPS.md @@ -0,0 +1,233 @@ +# 🚀 NASLEDNJI KORAKI - NOVAFARMA + +**Datum:** 11. December 2025 +**Status:** Po 4-urni coding maraton seji +**Verzija:** Phase 22 Complete + +--- + +## ✅ **KAJ JE KONČANO (Today):** + +### **CORE SYSTEMS:** +- ✅ FarmingSystem (till/plant/harvest) +- ✅ BuildSystem (5 fence types + buildings) +- ✅ Player Controls (Space key farming) +- ✅ Resources Display (Wood/Stone/Iron) +- ✅ Time Control (1x/2x/5x + pause) +- ✅ Parallax Background (clouds + birds) + +### **VISUAL EFFECTS:** +- ✅ Main Menu glow + animations +- ✅ Particle effects (soil/seed/harvest) +- ✅ Tool swing animation +- ✅ Camera shake +- ✅ Ground decorations (26% coverage) +- ✅ Ultra transparency (21 sprites) + +--- + +## 🎯 **PRIORITETE ZA NAPREJ:** + +### **JUTRI (Phase 23):** +**Estimated Time:** 2-3h + +#### **1. SOUND EFFECTS** (Priority: HIGH) +- [ ] Dig sound (till soil) +- [ ] Plant sound (seed drop) +- [ ] Harvest sound (crop collect) +- [ ] Build sound (placement) +- [ ] UI click sounds +- [ ] Ambient background music + +**Files to modify:** +- `src/utils/SoundManager.js` (already exists) +- `assets/sounds/` (new folder) + +#### **2. INVENTORY HOTBAR** (Priority: MEDIUM) +- [ ] Q/E keys for quick tool swap +- [ ] Tool durability display +- [ ] Seed count in hotbar +- [ ] Equipment preview icon + +**Files to modify:** +- `src/scenes/UIScene.js` +- `src/systems/InventorySystem.js` + +#### **3. RESOURCE GAIN ANIMATIONS** (Priority: MEDIUM) +- [ ] Floating "+5 Wood" text +- [ ] Color-coded gains (green=wood, gray=stone, silver=iron) +- [ ] Fade-up animation + +**Files to modify:** +- `src/scenes/UIScene.js` (updateResourceDisplay method) + +--- + +### **ČEZ 2-3 DNI (Phase 24):** +**Estimated Time:** 3-4h + +#### **4. ADVANCED BUILD MODE** +- [ ] Rotate building (R key) +- [ ] Confirm placement (E key) - currently click works +- [ ] Cancel (ESC key) +- [ ] Building info tooltip (hover) +- [ ] Blueprint system (unlock buildings) + +#### **5. STAMINA SYSTEM** +- [ ] Stamina bar (next to health) +- [ ] Farming costs stamina +- [ ] Auto-regenerate over time +- [ ] Food restores stamina + +#### **6. PLAYER ANIMATIONS** +- [ ] Walk animation polish +- [ ] Tool swing sprites (not just rotation) +- [ ] Idle animation variations +- [ ] Direction-based sprites (8-way) + +--- + +### **ČEZ TEDEN (Phase 25-26):** +**Estimated Time:** 5-6h + +#### **7. CROPS VARIETY** +- [ ] More crop types (potato, tomato, corn) +- [ ] Seasonal crops (only grow in certain seasons) +- [ ] Crop quality system (bronze/silver/gold) +- [ ] Watering system + +#### **8. ZOMBIE WORKER AI** +- [ ] Assign zombie to task (farm/gather/guard) +- [ ] Pathfinding to work area +- [ ] Visual task indicators +- [ ] Fatigue/rest system +- [ ] XP gain from work + +#### **9. NPC INTERACTIONS** +- [ ] Merchant NPC (buy/sell) +- [ ] Quest giver NPCs +- [ ] Dialogue system +- [ ] Gift system (build relationships) + +--- + +## 🎨 **VISUAL POLISH (Ongoing):** + +### **Later Enhancements:** +- [ ] Day/night lighting (dynamic shader) +- [ ] Weather effects (rain, snow particles) +- [ ] Shadows for all sprites +- [ ] Water reflection +- [ ] Fog effect +- [ ] Screen transitions (fade in/out) + +--- + +## 🐛 **KNOWN BUGS TO FIX:** + +### **Priority: HIGH** +- [ ] None currently! 🎉 + +### **Priority: MEDIUM** +- [ ] Bush sprite placeholder (need actual bush asset) +- [ ] Water animation not looping (timer issue from before) + +### **Priority: LOW** +- [ ] Decorations sometimes overlap (rare) +- [ ] Camera bounds could be tighter + +--- + +## 📈 **PERFORMANCE GOALS:** + +### **Current Status:** +- ✅ 60 FPS on modern PC +- ✅ No memory leaks +- ✅ Smooth animations + +### **To Implement:** +- [ ] Object pooling for particles +- [ ] Sprite culling optimization +- [ ] Chunk loading/unloading +- [ ] FPS limiter option (30/60/144) + +--- + +## 💾 **SAVE SYSTEM EXPANSION:** + +### **Phase 27 (Future):** +- [ ] Save farming progress +- [ ] Save placed buildings +- [ ] Save inventory state +- [ ] Save zombie worker tasks +- [ ] Save decorations state +- [ ] Multiple save slots (3) +- [ ] Auto-save every 5 minutes + +--- + +## 🎮 **GAMEPLAY FEATURES (Long-term):** + +### **Phase 28-30:** +- [ ] Combat system refinement +- [ ] Boss encounters +- [ ] Dungeon exploration +- [ ] Crafting system expansion +- [ ] Trading system +- [ ] Multiplayer (co-op) + +--- + +## 📱 **PLATFORM EXPANSION:** + +### **Phase 31+:** +- [ ] Mobile controls (virtual joystick) +- [ ] Touch-optimized UI +- [ ] Controller support (Xbox/PS) +- [ ] Steam Deck optimization +- [ ] Electron packaging (.exe) + +--- + +## 🏆 **MILESTONES:** + +### **Completed:** +- ✅ Phase 0: Project Setup +- ✅ Phase 1: Terrain Generation +- ✅ Phase 2: Player & NPCs +- ✅ Phase 21.5: Isometric Systems +- ✅ Phase 22: Player Controls (80%) + +### **In Progress:** +- ⏳ Phase 22: Player Controls (20% remaining) + +### **Next Up:** +- 🎯 Phase 23: Sound & Polish +- 🎯 Phase 24: Advanced Building +- 🎯 Phase 25: Gameplay Expansion + +--- + +## 📝 **NOTES:** + +**What's working GREAT:** +- Farming feels satisfying (particles + shake) +- Build mode is intuitive +- Time control is fun +- Parallax adds life + +**What needs work:** +- Sounds! (silent game feels empty) +- More crop variety +- Zombie AI needs polish + +**Technical debt:** +- Some code could be refactored (BuildSystem is getting big) +- Need to implement proper event system +- Consider state machine for player + +--- + +**READY FOR NEXT SESSION! 🚀** + +*Updated: 11.12.2025 - 19:45* diff --git a/assets/player_dreadlocks.png b/assets/player_dreadlocks.png index 56b8e31b6c069122c076ec42bce6b442174087af..7763a446ebf4b640790a4f118b62048b3c87ea71 100644 GIT binary patch literal 15150 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%0DOT45R90+l&I{cEE8+>38;74v9 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 q{xg90a5b4(O3~94eE9nH0`cVh^+0FV$5W { + // Draw cross pattern (5 pixels) + graphics.fillRect(s.x, s.y, 1, 1); // Center + graphics.fillRect(s.x - 2, s.y, 1, 1); // Left + graphics.fillRect(s.x + 2, s.y, 1, 1); // Right + graphics.fillRect(s.x, s.y - 2, 1, 1); // Top + graphics.fillRect(s.x, s.y + 2, 1, 1); // Bottom +}); +``` + +**Sparkle Animation:** +- Each sparkle moves across the tile per frame +- Uses modulo (`%`) to loop position +- Creates realistic light reflection effect + +--- + +### **Step 6: Animate Water Tiles** + +Location: `src/systems/TerrainSystem.js` - `update()` method + +```javascript +update(time, delta) { + // Update every 200ms + if (!this.lastWaterUpdate) this.lastWaterUpdate = 0; + + if (time - this.lastWaterUpdate > 200) { + this.lastWaterUpdate = time; + this.currentWaterFrame = (this.currentWaterFrame + 1) % 4; + + // Update all water tiles + for (let key in this.tiles) { + const tile = this.tiles[key]; + if (tile.type === 'WATER_DEEP') { + tile.sprite.setTexture(`water_frame_${this.currentWaterFrame}`); + } + } + } +} +``` + +**Performance Note:** Only updates texture reference, not recreating sprites! + +--- + +## 🎨 **Customization:** + +### **Change Water Color:** + +```javascript +// Original (light cyan) +const waterColor = 0x33ccff; + +// Variations: +const waterColor = 0x0099ff; // Deeper blue +const waterColor = 0x55eeff; // Bright cyan +const waterColor = 0x2266aa; // Dark ocean +const waterColor = 0x88ff88; // Toxic green (swamp) +``` + +--- + +### **Adjust Wave Speed:** + +```javascript +// Faster animation (100ms per frame) +if (time - this.lastWaterUpdate > 100) { ... } + +// Slower animation (500ms per frame) +if (time - this.lastWaterUpdate > 500) { ... } +``` + +--- + +### **Change Wave Pattern:** + +```javascript +// More waves (5 instead of 3) +for (let i = 0; i < 5; i++) { + const baseY = topY + 4 + i * 3; // Closer spacing + // ... +} + +// Bigger waves (higher amplitude) +const waveOffset = Math.sin(...) * 3.0; // Was 1.5 + +// Faster waves (higher frequency) +const waveOffset = Math.sin((relativeX + offset + i * 10) * 0.3) * 1.5; // Was 0.15 +``` + +--- + +### **More Sparkles:** + +```javascript +const sparkles = [ + { x: midX - 15 + (frame * 2) % 30, y: midY + 2 }, + { x: midX - 5 + (frame * 3) % 10, y: midY + 6 }, + { x: midX + 5 - (frame * 2) % 10, y: midY + 10 }, + { x: midX + 10 + (frame * 4) % 20, y: midY + 14 }, + { x: midX - 8 + Math.floor(frame * 1.5) % 16, y: midY + 18 } +]; +``` + +--- + +## 🐛 **Troubleshooting:** + +### **Problem: Water not animating** + +**Solution 1:** Check if `update()` is called +```javascript +// In GameScene.js update() +if (this.terrainSystem && this.terrainSystem.update) { + this.terrainSystem.update(Date.now(), delta); +} +``` + +**Solution 2:** Verify frames exist +```javascript +// In browser console: +game.textures.list +// Should show: water_frame_0, water_frame_1, water_frame_2, water_frame_3 +``` + +--- + +### **Problem: Water tiles are black/missing** + +**Solution:** Ensure `createWaterFrames()` is called before `generate()` +```javascript +constructor(scene) { + // ... + this.createWaterFrames(); // MUST come first + this.generate(); // Then generate tiles +} +``` + +--- + +### **Problem: Animation is choppy** + +**Solution:** Reduce update frequency +```javascript +// Too fast (every frame = choppy) +if (time - this.lastWaterUpdate > 16) { ... } + +// Better (200ms = smooth) +if (time - this.lastWaterUpdate > 200) { ... } +``` + +--- + +### **Problem: Water looks pixelated** + +**Solution:** Add padding (anti-aliasing) +```javascript +const P = 2; // Padding MUST be at least 2 +graphics.generateTexture(`water_frame_${frame}`, tileWidth + P * 2, tileHeight + P * 2); +``` + +--- + +## 🚀 **Advanced Techniques:** + +### **1. Shore Transitions:** + +Create special water tiles for edges: + +```javascript +createShoreWaterFrame(frame, edgeType) { + // edgeType: 'north', 'south', 'east', 'west' + const graphics = this.scene.make.graphics({ x: 0, y: 0, add: false }); + + // Draw water diamond + // ... (same as before) + + // Add sand/grass edge overlay + if (edgeType === 'north') { + graphics.fillStyle(0xddaa77); // Sand color + graphics.beginPath(); + graphics.moveTo(midX - 10, topY); + graphics.lineTo(midX + 10, topY); + graphics.lineTo(midX, topY + 5); + graphics.closePath(); + graphics.fill(); + } + + graphics.generateTexture(`water_shore_${edgeType}_${frame}`, 52, 52); + graphics.destroy(); +} +``` + +--- + +### **2. Depth Variations:** + +Different tile heights for shallow/deep water: + +```javascript +createWaterFrames() { + // Shallow water (lighter, less depth) + this.createWaterVariant('shallow', { + topColor: 0x66ddff, + sideColor: 0x33aadd, + depth: 8 + }); + + // Deep water (darker, more depth) + this.createWaterVariant('deep', { + topColor: 0x0066aa, + sideColor: 0x003366, + depth: 20 + }); +} +``` + +--- + +### **3. Particle Effects:** + +Add water droplets on click: + +```javascript +// In GameScene.js +this.input.on('pointerdown', (pointer) => { + const tile = this.terrainSystem.getTileAt(pointer.x, pointer.y); + + if (tile && tile.type === 'WATER_DEEP') { + this.createWaterSplash(pointer.x, pointer.y); + } +}); + +createWaterSplash(x, y) { + for (let i = 0; i < 10; i++) { + const particle = this.add.circle(x, y, 2, 0x66ddff); + this.tweens.add({ + targets: particle, + x: x + (Math.random() - 0.5) * 30, + y: y - Math.random() * 20, + alpha: 0, + duration: 500, + onComplete: () => particle.destroy() + }); + } +} +``` + +--- + +### **4. Reflection Effect:** + +Mirror sprites above water: + +```javascript +createReflection(sprite, gridX, gridY) { + const waterTile = this.tiles[`${gridX},${gridY}`]; + if (waterTile && waterTile.type === 'WATER_DEEP') { + const reflection = this.scene.add.sprite( + sprite.x, + sprite.y + 20, // Offset below sprite + sprite.texture.key + ); + reflection.setOrigin(0.5, 0); + reflection.setAlpha(0.3); + reflection.setFlipY(true); // Mirror vertically + reflection.setDepth(waterTile.sprite.depth - 1); + + return reflection; + } +} +``` + +--- + +## 📖 **Best Practices:** + +### **Performance:** +- ✅ Generate frames ONCE in constructor +- ✅ Use texture swapping (not sprite recreation) +- ✅ Update at 200ms intervals (not every frame) +- ✅ Use object pooling for particles +- ❌ Don't recreate graphics every update + +### **Visual Quality:** +- ✅ Use padding (P = 2) for smooth edges +- ✅ Add sparkle effects for realism +- ✅ Use isometric perspective for depth +- ✅ Vary side face colors (left darker than right) +- ❌ Don't make waves too fast (looks jittery) + +### **Code Organization:** +- ✅ Separate frame generation from animation +- ✅ Use constants for colors/sizes +- ✅ Comment complex math formulas +- ✅ Log creation success (`console.log`) +- ❌ Don't hardcode magic numbers + +--- + +## 💡 **Pro Tips:** + +1. **Debug mode:** Press F12 and type `game.textures.list` to see all frames +2. **Performance:** Monitor FPS with `game.loop.actualFps` +3. **Testing:** Change `this.currentWaterFrame` manually in console +4. **Variations:** Create multiple water types (ocean, river, swamp) +5. **Polish:** Add sound effects (water splash, waves) + +--- + +## 🎓 **Summary:** + +**What you learned:** +- ✅ How to create animated isometric tiles +- ✅ Sine wave animation technique +- ✅ Texture generation in Phaser +- ✅ Frame-based animation system +- ✅ 3D depth effect with side faces + +**Next steps:** +- Experiment with colors and speeds +- Add shore transitions +- Create particle effects +- Implement reflection system + +--- + +## 📚 **Related Files:** + +``` +c:\novafarma\src\systems\TerrainSystem.js 👈 Main implementation +c:\novafarma\docs\WATER_ANIMATION.md 👈 This file +``` + +**Reference implementation:** +Lines 237-324 in `TerrainSystem.js` + +--- + +**Happy animating! 💧🌊** + +*Last updated: 11.12.2025 - 20:12* diff --git a/docs/phase22_plan.md b/docs/phase22_plan.md index a37f28b..2117558 100644 --- a/docs/phase22_plan.md +++ b/docs/phase22_plan.md @@ -1,51 +1,48 @@ -// PHASE 22: PLAYER CONTROLS INTEGRATION -// Implementation Plan - -## 1. FARMING CONTROLS +## 1. FARMING CONTROLS ✅ COMPLETE! ### Priority: HIGH -- [ ] Detect hoe in hand (check inventory slot) -- [ ] Space/Click → till soil -- [ ] Detect seeds in hand -- [ ] Space/Click → plant seed -- [ ] Empty hand + ripe crop → harvest -- [ ] Animation feedback (swing tool) -- [ ] Sound effects (dig, plant, harvest) -- [ ] Particle effects (soil spray, seed drop) +- [x] Detect hoe in hand (check inventory slot) +- [x] Space/Click → till soil +- [x] Detect seeds in hand +- [x] Space/Click → plant seed +- [x] Empty hand + ripe crop → harvest +- [ ] Animation feedback (swing tool) - TODO +- [ ] Sound effects (dig, plant, harvest) - TODO +- [ ] Particle effects (soil spray, seed drop) - TODO -## 2. RESOURCES DISPLAY +## 2. RESOURCES DISPLAY ✅ COMPLETE! ### Priority: HIGH -- [ ] Wood counter (top-right corner) -- [ ] Stone counter (below wood) -- [ ] Iron counter (below stone) -- [ ] Animated +X effect on gain -- [ ] Expandable panel -- [ ] Icon for each resource +- [x] Wood counter (top-right corner) +- [x] Stone counter (below wood) +- [x] Iron counter (below stone) +- [ ] Animated +X effect on gain - TODO +- [x] Expandable panel +- [x] Icon for each resource (emoji icons) -## 3. DAY/NIGHT ENHANCEMENT +## 3. DAY/NIGHT ENHANCEMENT ✅ COMPLETE! ### Priority: MEDIUM -- [ ] Better time display (HH:MM format) -- [ ] Sky color transitions (blue → orange → dark) -- [ ] Dynamic lighting shader -- [ ] Speed control slider (1x/2x/5x) -- [ ] Pause button +- [x] Better time display (HH:MM format) +- [x] Sky color transitions (☀️/🌙 indicators) +- [ ] Dynamic lighting shader - TODO (advanced) +- [x] Speed control slider (1x/2x/5x) +- [x] Pause button (⏸️/▶️) -## 4. BUILD MODE UI +## 4. BUILD MODE UI ⚠️ PARTIAL ### Priority: MEDIUM -- [ ] Tutorial popup on first B press -- [ ] Building name + cost display -- [ ] Building selection panel -- [ ] Rotate building (R key) -- [ ] Confirm placement (E key) -- [ ] Cancel (ESC key) +- [ ] Tutorial popup on first B press - TODO +- [x] Building name + cost display (in build system) +- [x] Building selection panel (hotkeys 1-5) +- [ ] Rotate building (R key) - TODO +- [ ] Confirm placement (E key) - TODO (click works) +- [ ] Cancel (ESC key) - TODO -## 5. INVENTORY HOTBAR +## 5. INVENTORY HOTBAR ⏸️ NOT STARTED ### Priority: LOW - [ ] Q/E keys for quick-swap - [ ] Tool durability bar - [ ] Seed count display - [ ] Equipment preview -## 6. PLAYER FEEDBACK +## 6. PLAYER FEEDBACK ⏸️ NOT STARTED ### Priority: LOW - [ ] Action cooldown timer - [ ] Stamina system @@ -54,5 +51,5 @@ - [ ] Screen flash effects --- -**START WITH:** Farming Controls + Resources Display -**ESTIMATED TIME:** 1-2 hours +**PROGRESS:** 3/6 systems complete (50%) +**ESTIMATED TIME REMAINING:** 30-45 minutes for polish diff --git a/src/entities/Player.js b/src/entities/Player.js index 8500dae..913d9c1 100644 --- a/src/entities/Player.js +++ b/src/entities/Player.js @@ -44,6 +44,12 @@ class Player { takeDamage(amount) { if (this.isDead) return; + // GOD MODE - Invincibility + if (window.godMode) { + console.log('⚡ GOD MODE: Damage blocked!'); + return; + } + this.hp -= amount; console.log(`Player HP: ${this.hp}`); @@ -523,8 +529,11 @@ class Player { const success = this.scene.farmingSystem.tillSoil(gridX, gridY); if (success) { console.log('✅ Tilled soil!'); + // Particle effect - soil spray + this.createSoilParticles(gridX, gridY); + // Tool swing animation + this.swingTool(); // TODO: Play dig sound - // TODO: Tool swing animation } return; } @@ -536,6 +545,8 @@ class Player { if (success) { invSys.removeItem(itemType, 1); console.log('🌱 Planted seed!'); + // Particle effect - seed drop + this.createSeedParticles(gridX, gridY); // TODO: Play plant sound } return; @@ -546,10 +557,97 @@ class Player { const success = this.scene.farmingSystem.harvestCrop(gridX, gridY); if (success) { console.log('🌾 Harvested crop!'); + // Particle effect - harvest sparkle + this.createHarvestParticles(gridX, gridY); + // Camera shake + this.scene.cameras.main.shake(200, 0.003); // TODO: Play harvest sound - // TODO: Screen shake } return; } } + + swingTool() { + if (!this.handSprite || !this.handSprite.visible) return; + + // Save original position + const originalAngle = this.handSprite.angle; + const originalScale = this.handSprite.scaleX; + + // Swing animation + this.scene.tweens.add({ + targets: this.handSprite, + angle: originalAngle - 45, + scaleX: originalScale * 1.3, + scaleY: originalScale * 1.3, + duration: 100, + yoyo: true, + ease: 'Cubic.easeOut', + onComplete: () => { + this.handSprite.angle = originalAngle; + this.handSprite.scaleX = originalScale; + this.handSprite.scaleY = originalScale; + } + }); + } + + createSoilParticles(gridX, gridY) { + const screenPos = this.scene.iso.gridToScreen(gridX, gridY); + const x = screenPos.x + this.offsetX; + const y = screenPos.y + this.offsetY; + + // Brown soil particles + for (let i = 0; i < 10; i++) { + const particle = this.scene.add.circle(x, y, 3, 0x8B4513); + this.scene.tweens.add({ + targets: particle, + x: x + (Math.random() - 0.5) * 30, + y: y - Math.random() * 20, + alpha: 0, + duration: 400, + onComplete: () => particle.destroy() + }); + } + } + + createSeedParticles(gridX, gridY) { + const screenPos = this.scene.iso.gridToScreen(gridX, gridY); + const x = screenPos.x + this.offsetX; + const y = screenPos.y + this.offsetY; + + // Green seed particles + for (let i = 0; i < 5; i++) { + const particle = this.scene.add.circle(x, y - 20, 2, 0x00ff00); + this.scene.tweens.add({ + targets: particle, + y: y, + alpha: 0, + duration: 500, + ease: 'Cubic.easeIn', + onComplete: () => particle.destroy() + }); + } + } + + createHarvestParticles(gridX, gridY) { + const screenPos = this.scene.iso.gridToScreen(gridX, gridY); + const x = screenPos.x + this.offsetX; + const y = screenPos.y + this.offsetY; + + // Golden sparkle particles + for (let i = 0; i < 15; i++) { + const particle = this.scene.add.circle(x, y, 4, 0xFFD700); + this.scene.tweens.add({ + targets: particle, + x: x + (Math.random() - 0.5) * 40, + y: y - Math.random() * 40, + scaleX: 0, + scaleY: 0, + alpha: 0, + duration: 600, + ease: 'Cubic.easeOut', + onComplete: () => particle.destroy() + }); + } + } } diff --git a/src/game.js b/src/game.js index d86aed8..e31fffc 100644 --- a/src/game.js +++ b/src/game.js @@ -91,4 +91,7 @@ window.gameState = { debugMode: true }; +// God mode disabled by default (can be enabled via console) +window.godMode = false; + console.log('🎮 NovaFarma initialized!'); diff --git a/src/scenes/GameScene.js b/src/scenes/GameScene.js index 4200d0b..e58e810 100644 --- a/src/scenes/GameScene.js +++ b/src/scenes/GameScene.js @@ -169,88 +169,8 @@ class GameScene extends Phaser.Scene { console.log('👤 Initializing player...'); this.player = new Player(this, 50, 50, this.terrainOffsetX, this.terrainOffsetY); - // Dodaj 3 NPCje (Mixed) - // Dodaj 3 NPCje (Mixed) - Removed zombie - console.log('🧟 Initializing NPCs...'); - const npcTypes = ['villager', 'merchant']; - for (let i = 0; i < npcTypes.length; i++) { - const randomX = Phaser.Math.Between(40, 60); // Closer to center - const randomY = Phaser.Math.Between(40, 60); - console.log(`👤 Spawning NPC type: ${npcTypes[i]} at (${randomX}, ${randomY})`); - const npc = new NPC(this, randomX, randomY, this.terrainOffsetX, this.terrainOffsetY, npcTypes[i]); - this.npcs.push(npc); - } - - // Dodaj 10 dodatnih Zombijev! - REMOVED BY REQUEST - /* - for (let i = 0; i < 10; i++) { - const randomX = Phaser.Math.Between(10, 90); - const randomY = Phaser.Math.Between(10, 90); - const zombie = new NPC(this, randomX, randomY, this.terrainOffsetX, this.terrainOffsetY, 'zombie'); - this.npcs.push(zombie); - } - */ - - // ZOMBIE WORKER SYSTEM - console.log('🧟⚒️ Initializing Zombie Worker System...'); - this.zombieWorkerSystem = new ZombieWorkerSystem(this); - - // SPAWN STARTER ZOMBIE WORKER (8x8 Farm) - console.log('🧟 Spawning STARTER Zombie Worker...'); - const starterZombieX = 48; // Inside 8x8 farm (center is 50,50, farm is 46-54) - const starterZombieY = 48; - const starterZombie = new NPC(this, starterZombieX, starterZombieY, this.terrainOffsetX, this.terrainOffsetY, 'zombie'); - // Auto-tame the starter zombie - starterZombie.isTamed = true; // Use isTamed (not just tamed) - starterZombie.state = 'IDLE'; - if (starterZombie.showEmote) { - starterZombie.showEmote('👋'); // Friendly wave - } - this.npcs.push(starterZombie); - // Assign to farming work - if (this.zombieWorkerSystem) { - this.zombieWorkerSystem.assignWork(starterZombie, 'FARM', 5); // Farming work, 5 tile radius - } - console.log('✅ Starter zombie worker spawned and assigned to farming!'); - - // GRAVE SYSTEM - console.log('🪦 Initializing Grave System...'); - this.graveSystem = new GraveSystem(this); - - // SCOOTER REPAIR SYSTEM - console.log('🛵 Initializing Scooter Repair System...'); - this.scooterRepairSystem = new ScooterRepairSystem(this); - - // EXPANSION SYSTEM - console.log('🗺️ Initializing Expansion System...'); - this.expansionSystem = new ExpansionSystem(this); - - // BLUEPRINT SYSTEM - console.log('📜 Initializing Blueprint System...'); - this.blueprintSystem = new BlueprintSystem(this); - - // WORKSTATION SYSTEM - console.log('🏭 Initializing Workstation System...'); - this.workstationSystem = new WorkstationSystem(this); - - // ELITE ZOMBIE v City območju (1x za testiranje) - console.log('👹 Spawning ELITE ZOMBIE in City...'); - const eliteX = Phaser.Math.Between(50, 80); // City area - const eliteY = Phaser.Math.Between(50, 80); - const elite = new NPC(this, eliteX, eliteY, this.terrainOffsetX, this.terrainOffsetY, 'elite_zombie'); - this.npcs.push(elite); - - // MUTANTS (Troll & Elf) - console.log('👹 Spawning MUTANTS...'); - this.npcs.push(new NPC(this, 60, 20, this.terrainOffsetX, this.terrainOffsetY, 'troll')); // Forest - this.npcs.push(new NPC(this, 70, 70, this.terrainOffsetX, this.terrainOffsetY, 'elf')); // City - - // ANIMALS (Peaceful + Mutated) - console.log('🐄 Spawning ANIMALS...'); - this.npcs.push(new NPC(this, 22, 22, this.terrainOffsetX, this.terrainOffsetY, 'cow')); - this.npcs.push(new NPC(this, 24, 20, this.terrainOffsetX, this.terrainOffsetY, 'chicken')); - this.npcs.push(new NPC(this, 25, 23, this.terrainOffsetX, this.terrainOffsetY, 'chicken')); - this.npcs.push(new NPC(this, 62, 22, this.terrainOffsetX, this.terrainOffsetY, 'cow_mutant')); // Aggressive mutant + // ALL NPCs REMOVED - Solo farming mode + console.log('🌾 Solo farming mode - no NPCs'); // Easter Egg: Broken Scooter console.log('🛵 Spawning Scooter Easter Egg...'); @@ -614,10 +534,12 @@ class GameScene extends Phaser.Scene { } } - // NPC Update + // NPC Update - DISABLED (no NPCs) + /* for (const npc of this.npcs) { npc.update(delta); } + */ // Vehicles Update if (this.vehicles) { @@ -706,6 +628,10 @@ class GameScene extends Phaser.Scene { } spawnNightZombie() { + // DISABLED - No NPCs allowed + return; + + /* if (!this.player || this.npcs.length > 50) return; const playerPos = this.player.getPosition(); @@ -725,6 +651,7 @@ class GameScene extends Phaser.Scene { zombie.state = 'CHASE'; this.npcs.push(zombie); } + */ } showHordeWarning() { @@ -763,6 +690,10 @@ class GameScene extends Phaser.Scene { } spawnBoss() { + // DISABLED - No NPCs allowed + return; + + /* if (!this.player) return; console.log('👑 SPANWING ZOMBIE KING!'); const playerPos = this.player.getPosition(); @@ -773,6 +704,7 @@ class GameScene extends Phaser.Scene { this.npcs.push(boss); this.showHordeWarning(); this.events.emit('show-floating-text', { x: this.player.x, y: this.player.y - 100, text: "THE KING HAS ARRIVED!", color: '#AA00FF' }); + */ } saveGame() { diff --git a/src/scenes/PreloadScene.js b/src/scenes/PreloadScene.js index 40ec15f..444e965 100644 --- a/src/scenes/PreloadScene.js +++ b/src/scenes/PreloadScene.js @@ -116,6 +116,9 @@ class PreloadScene extends Phaser.Scene { this.load.image('fence_vertical', 'assets/fence_vertical.png'); this.load.image('fence_corner', 'assets/fence_corner.png'); + // Water frames are generated procedurally in TerrainSystem.createWaterFrames() + // No need to load external files + // Wait for load completion then process transparency this.load.once('complete', () => { this.processAllTransparency(); diff --git a/src/systems/BuildSystem.js b/src/systems/BuildSystem.js index a18a09f..5cfe7d5 100644 --- a/src/systems/BuildSystem.js +++ b/src/systems/BuildSystem.js @@ -78,6 +78,12 @@ class BuildSystem { this.buildMode = !this.buildMode; console.log(`Build Mode: ${this.buildMode ? 'ON' : 'OFF'}`); + // Show tutorial on first time + if (this.buildMode && !this.tutorialShown) { + this.showTutorial(); + this.tutorialShown = true; + } + // Notify UI const uiScene = this.scene.scene.get('UIScene'); if (uiScene) { @@ -223,4 +229,64 @@ class BuildSystem { const building = this.placedBuildings.find(b => b.gridX === gridX && b.gridY === gridY); return building ? building.collision : false; } + + showTutorial() { + const uiScene = this.scene.scene.get('UIScene'); + if (!uiScene) return; + + const width = this.scene.cameras.main.width; + const height = this.scene.cameras.main.height; + + // Tutorial panel + const panel = uiScene.add.container(width / 2, height / 2); + panel.setDepth(10000); + + const bg = uiScene.add.rectangle(0, 0, 500, 300, 0x1a1a2e, 0.95); + bg.setStrokeStyle(3, 0x00ff41); + panel.add(bg); + + const title = uiScene.add.text(0, -120, '🏗️ BUILD MODE', { + fontSize: '24px', + fontFamily: 'Courier New', + color: '#00ff41', + fontStyle: 'bold' + }).setOrigin(0.5); + panel.add(title); + + const instructions = [ + 'Controls:', + '1-5: Select building type', + 'Mouse: Move preview', + 'Click: Place building', + 'B: Exit build mode', + '', + 'Green = OK | Red = Blocked' + ]; + + const text = uiScene.add.text(0, 0, instructions.join('\n'), { + fontSize: '16px', + fontFamily: 'Courier New', + color: '#ffffff', + align: 'center', + lineSpacing: 8 + }).setOrigin(0.5); + panel.add(text); + + const closeBtn = uiScene.add.text(0, 120, '[Click to close]', { + fontSize: '14px', + color: '#888888' + }).setOrigin(0.5); + panel.add(closeBtn); + + // Auto-dismiss after 5 seconds + uiScene.time.delayedCall(5000, () => { + panel.destroy(); + }); + + // Click to dismiss + bg.setInteractive(); + bg.on('pointerdown', () => { + panel.destroy(); + }); + } } diff --git a/src/utils/CheatConsole.js b/src/utils/CheatConsole.js new file mode 100644 index 0000000..3cdc79d --- /dev/null +++ b/src/utils/CheatConsole.js @@ -0,0 +1,154 @@ +// CHEAT CONSOLE - NovaFarma +// Press ` (backtick) to open console + +window.cheats = { + // God Mode - Invincibility + godMode: function () { + window.godMode = !window.godMode; + const status = window.godMode ? 'ENABLED ⚡' : 'DISABLED'; + console.log(`🎮 GOD MODE: ${status}`); + + if (window.godMode) { + // Visual indicator + const gameScene = window.gameScene; + if (gameScene && gameScene.player) { + gameScene.player.sprite.setTint(0xFFD700); + } + } else { + const gameScene = window.gameScene; + if (gameScene && gameScene.player) { + gameScene.player.sprite.clearTint(); + } + } + }, + + // Infinite Resources + resources: function (amount = 9999) { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.inventorySystem) { + console.log('❌ Inventory system not found'); + return; + } + + gameScene.inventorySystem.addItem('wood', amount); + gameScene.inventorySystem.addItem('stone', amount); + gameScene.inventorySystem.addItem('iron', amount); + + console.log(`💰 Added ${amount} of each resource!`); + }, + + // Speed Boost + speed: function (multiplier = 2) { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.player) { + console.log('❌ Player not found'); + return; + } + + gameScene.player.moveSpeed = 200 * multiplier; + console.log(`🏃 Speed multiplier: ${multiplier}x`); + }, + + // Full Health + heal: function () { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.player) { + console.log('❌ Player not found'); + return; + } + + gameScene.player.hp = gameScene.player.maxHp; + console.log('❤️ Full health restored!'); + }, + + // Teleport to coordinates + teleport: function (x, y) { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.player) { + console.log('❌ Player not found'); + return; + } + + gameScene.player.gridX = x; + gameScene.player.gridY = y; + gameScene.player.sprite.setPosition( + gameScene.player.scene.iso.gridToScreen(x, y).x + gameScene.player.offsetX, + gameScene.player.scene.iso.gridToScreen(x, y).y + gameScene.player.offsetY + ); + + console.log(`📍 Teleported to (${x}, ${y})`); + }, + + // Day/Night time control + setTime: function (hour) { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.timeSystem) { + console.log('❌ Time system not found'); + return; + } + + gameScene.timeSystem.hour = hour; + console.log(`⏰ Time set to ${hour}:00`); + }, + + // Instant harvest all crops + harvestAll: function () { + const gameScene = window.gameScene; + if (!gameScene || !gameScene.farmingSystem) { + console.log('❌ Farming system not found'); + return; + } + + let count = 0; + for (let key in gameScene.farmingSystem.crops) { + const crop = gameScene.farmingSystem.crops[key]; + if (crop.stage === 'ripe') { + const [x, y] = key.split(',').map(Number); + gameScene.farmingSystem.harvestCrop(x, y); + count++; + } + } + + console.log(`🌾 Harvested ${count} crops!`); + }, + + // List all cheats + help: function () { + console.log(` +🎮 CHEAT CONSOLE - NovaFarma +============================= + +Available Commands: +------------------- +cheats.godMode() - Toggle invincibility +cheats.resources(9999) - Add resources (default: 9999) +cheats.speed(2) - Set speed multiplier (default: 2x) +cheats.heal() - Restore full health +cheats.teleport(x, y) - Teleport to coordinates +cheats.setTime(12) - Set time (0-24) +cheats.harvestAll() - Harvest all ripe crops +cheats.help() - Show this menu + +Quick Keys: +----------- +Press \` (backtick) to open console +Type: cheats.godMode() + +Example Usage: +-------------- +cheats.godMode() // Enable god mode +cheats.resources(1000) // Add 1000 of each resource +cheats.speed(5) // 5x speed boost +cheats.teleport(50, 50) // Go to center + `); + } +}; + +// Auto-show help on first load +console.log('🎮 Cheat Console Loaded! Type "cheats.help()" for commands.'); + +// Quick access +window.god = window.cheats.godMode; +window.res = window.cheats.resources; + +console.log('💡 Quick shortcuts: god() or res()');