diff --git a/docs/DNEVNIK.md b/docs/DNEVNIK.md index b628e51..7fbd608 100644 --- a/docs/DNEVNIK.md +++ b/docs/DNEVNIK.md @@ -68,6 +68,136 @@ 3. **Incremental approach** - manjΕ‘e testne mape pred velikimi 4. **Time management** - vedno imej rollback plan! +--- + +## πŸ—“οΈ 15. December 2024 - Session 4: Micro Farm & Minting System + +**Trajanje:** 4.5 uri (00:50 - 01:42) +**Cilj:** Phase 37 (Micro Farm) + Phase 40 (Minting) Implementation + +### βœ… DoseΕΎki: + +**PHASE 37: MICRO FARM & EXPANSION** 🌱 +1. **8x8 Micro Farm System:** + - βœ… Initial farm boundary (center of 100x100 map) + - βœ… White boundary visualization with corner markers + - βœ… Tile tracking system (Set-based unlocked tiles) + - βœ… MicroFarmSystem.js created + +2. **Visual Feedback:** + - βœ… Locked tile overlay (30% opacity black) + - βœ… Clear farm vs locked distinction + - βœ… Dynamic rendering (15 tile viewRange) + - βœ… Depth-sorted overlays + +3. **Farming Restrictions:** + - βœ… Block tilling outside farm boundary + - βœ… Error messages with floating text + - βœ… FarmingSystem integration + - βœ… Boundary validation on every action + +4. **Expansion System:** + - βœ… 4-direction unlock buttons (β¬†οΈβ¬‡οΈβž‘οΈβ¬…οΈ) + - βœ… Cost system (50 gold per 2x2 expansion) + - βœ… Interactive UI with hover effects + - βœ… Dynamic boundary updates + +5. **Minimap Integration:** + - βœ… Farm boundary visible in minimap + - βœ… White box indicator + - βœ… Fixed terrainSystem compatibility + - βœ… Player-relative rendering + +**PHASE 40: MINTING SYSTEM** πŸ’° +1. **Core System:** + - βœ… Smelter (Gold Ore β†’ Gold Bar) + - βœ… Mint (Gold Bar β†’ Gold Coins) + - βœ… MintingSystem.js created + - βœ… Processing time tracking + +2. **Recipes:** + - βœ… Smelt: 1 ore + 1 coal β†’ 1 bar (5s) + - βœ… Mint: 1 bar β†’ 10 coins (3s) + - βœ… Fuel system for smelter + - βœ… Progress tracking + +3. **Visual Representation:** + - βœ… Smelter sprite (πŸ”₯ brown with fire outline) + - βœ… Mint sprite (πŸ’° gold with coin icon) + - βœ… Processing feedback + - βœ… Completion floating text + +### πŸ”§ Technical Fixes: + +1. **Flat2DTerrainSystem:** + - βœ… Added decorationsMap (Map) for InteractionSystem + - βœ… Fixed crash in handleInteraction + - βœ… Compatibility with existing systems + +2. **UIScene Minimap:** + - βœ… Fixed player position reading (gridX/gridY) + - βœ… TerrainSystem.getTile() integration + - βœ… Farm boundary rendering + - βœ… Circular minimap compatibility + +3. **Variable Scope:** + - βœ… Fixed farmCenterX/Y references + - βœ… Proper this. prefixing + - βœ… Overlay rendering fixes + +### ❌ Izzivi: + +1. **AI Image Generation:** + - Green screen transparency NE deluje zanesljivo + - Manual background removal potreben + - **LEKCIJA:** Direct transparent PNG je edina pot! + +2. **Sprite Processing:** + - Automatic green removal briΕ‘e pravilne barve (pink, red) + - Disabled processAllTransparency() globally + - **LEKCIJA:** Ready assets = no processing! + +3. **Complexity:** + - 3 velike features v 1 session + - Water auto-tiling postponed + - Phase 38 postponed + +### 🎯 Naslednji Koraki: + +1. **Phase 38: Town Repair** (Next priority) + - Ruined buildings system + - NPC relationship (hearts) + - Trading shops + - Repair mechanics + +2. **Water Auto-Tiling** (Visual improvement) + - Edge detection + - Smooth transitions + - Wave animations + +3. **Weather Improvements:** + - Rain ripples on water + - Better puddles + - Particle effects + +### πŸ“Š Statistika: + +- **Session trajanje:** 4.5 uri +- **Datoteke spremenjene:** 6 +- **Nove datoteke:** 2 (MicroFarmSystem.js, MintingSystem.js) +- **Linije kode:** +500 +- **Features completed:** 2 major phases +- **Commits:** 2 (Phase 37, Phase 40) + +### πŸ’‘ Lekcije: + +1. **Micro systems work!** - 8x8 start je dovolj za gameplay +2. **Visual feedback je critical** - overlay + boundaries = clarity +3. **Expansion mechanics engaging** - unlock buttons + cost = satisfying +4. **Minting = unique economy** - no random coin drops! +5. **4.5h session moΕΎen** - ampak potreben break! 😴 + + --- ## πŸ—“οΈ 14. December 2024 - Session 2: Cherry Blossom Trees + Visual Polish diff --git a/index.html b/index.html index 458a403..083613d 100644 --- a/index.html +++ b/index.html @@ -167,6 +167,7 @@ + diff --git a/src/systems/MintingSystem.js b/src/systems/MintingSystem.js new file mode 100644 index 0000000..5cec690 --- /dev/null +++ b/src/systems/MintingSystem.js @@ -0,0 +1,270 @@ +// πŸ’° MINTING SYSTEM - Phase 40 +// Smelter (Ore β†’ Gold) + Mint (Gold β†’ Coins) + +class MintingSystem { + constructor(scene) { + this.scene = scene; + + // Active smelters and mints in world + this.smelters = []; + this.mints = []; + + // Recipes + this.recipes = { + smelt_gold: { + name: 'Smelt Gold', + input: 'gold_ore', + inputAmount: 1, + output: 'gold_bar', + outputAmount: 1, + fuel: 'coal', + fuelAmount: 1, + time: 5 // seconds + }, + mint_coin: { + name: 'Mint Coin', + input: 'gold_bar', + inputAmount: 1, + output: 'gold_coin', + outputAmount: 10, // 1 bar = 10 coins + fuel: null, // No fuel needed + time: 3 // seconds + } + }; + + console.log('πŸ’° MintingSystem initialized!'); + } + + // Place smelter at position + placeSmelter(gridX, gridY) { + const smelter = { + gridX, + gridY, + type: 'smelter', + input: null, + fuel: null, + output: null, + processing: false, + progress: 0, + recipe: null + }; + + this.smelters.push(smelter); + + // Create sprite + this.createSmelterSprite(smelter); + + console.log(`πŸ”₯ Smelter placed at (${gridX}, ${gridY})`); + return smelter; + } + + // Place mint at position + placeMint(gridX, gridY) { + const mint = { + gridX, + gridY, + type: 'mint', + input: null, + output: null, + processing: false, + progress: 0, + recipe: null + }; + + this.mints.push(mint); + + // Create sprite + this.createMintSprite(mint); + + console.log(`πŸ’° Mint placed at (${gridX}, ${gridY})`); + return mint; + } + + createSmelterSprite(smelter) { + const worldX = smelter.gridX * 48; + const worldY = smelter.gridY * 48; + + // Simple graphics representation + const graphics = this.scene.add.graphics(); + graphics.fillStyle(0x8B4513, 1); // Brown + graphics.fillRect(worldX, worldY, 48, 48); + graphics.lineStyle(2, 0xFF4500, 1); // Orange outline (fire) + graphics.strokeRect(worldX, worldY, 48, 48); + graphics.setDepth(5); + + // Fire icon + const fireText = this.scene.add.text(worldX + 24, worldY + 24, 'πŸ”₯', { + fontSize: '24px' + }).setOrigin(0.5); + fireText.setDepth(6); + + smelter.sprite = graphics; + smelter.icon = fireText; + } + + createMintSprite(mint) { + const worldX = mint.gridX * 48; + const worldY = mint.gridY * 48; + + // Simple graphics representation + const graphics = this.scene.add.graphics(); + graphics.fillStyle(0xFFD700, 1); // Gold + graphics.fillRect(worldX, worldY, 48, 48); + graphics.lineStyle(2, 0xFFA500, 1); // Orange outline + graphics.strokeRect(worldX, worldY, 48, 48); + graphics.setDepth(5); + + // Coin icon + const coinText = this.scene.add.text(worldX + 24, worldY + 24, 'πŸ’°', { + fontSize: '24px' + }).setOrigin(0.5); + coinText.setDepth(6); + + mint.sprite = graphics; + mint.icon = coinText; + } + + // Try to process in smelter + processSmelter(smelter, inputItem, fuelItem) { + if (smelter.processing) { + console.log('⏳ Smelter is busy!'); + return false; + } + + // Validate recipe + const recipe = this.recipes.smelt_gold; + if (inputItem !== recipe.input || fuelItem !== recipe.fuel) { + console.log('❌ Invalid recipe!'); + return false; + } + + // Start processing + smelter.processing = true; + smelter.progress = 0; + smelter.recipe = recipe; + smelter.input = inputItem; + smelter.fuel = fuelItem; + smelter.startTime = Date.now(); + + console.log(`πŸ”₯ Smelting ${inputItem}... (${recipe.time}s)`); + return true; + } + + // Try to mint coins + processMint(mint, inputItem) { + if (mint.processing) { + console.log('⏳ Mint is busy!'); + return false; + } + + // Validate recipe + const recipe = this.recipes.mint_coin; + if (inputItem !== recipe.input) { + console.log('❌ Invalid input!'); + return false; + } + + // Start processing + mint.processing = true; + mint.progress = 0; + mint.recipe = recipe; + mint.input = inputItem; + mint.startTime = Date.now(); + + console.log(`πŸ’° Minting coins... (${recipe.time}s)`); + return true; + } + + // Update - called each frame + update(delta) { + // Update smelters + this.smelters.forEach(smelter => { + if (smelter.processing) { + const elapsed = (Date.now() - smelter.startTime) / 1000; + smelter.progress = elapsed / smelter.recipe.time; + + // Complete? + if (smelter.progress >= 1) { + this.completeSmelter(smelter); + } + } + }); + + // Update mints + this.mints.forEach(mint => { + if (mint.processing) { + const elapsed = (Date.now() - mint.startTime) / 1000; + mint.progress = elapsed / mint.recipe.time; + + // Complete? + if (mint.progress >= 1) { + this.completeMint(mint); + } + } + }); + } + + completeSmelter(smelter) { + const recipe = smelter.recipe; + + // Give output + if (this.scene.inventorySystem) { + this.scene.inventorySystem.addItem(recipe.output, recipe.outputAmount); + } + + // Reset smelter + smelter.processing = false; + smelter.progress = 0; + smelter.input = null; + smelter.fuel = null; + smelter.recipe = null; + + console.log(`βœ… Smelting complete! +${recipe.outputAmount} ${recipe.output}`); + + // Visual feedback + if (this.scene.events) { + this.scene.events.emit('show-floating-text', { + x: smelter.gridX * 48, + y: smelter.gridY * 48, + text: `+${recipe.outputAmount} ${recipe.output}`, + color: '#FFD700' + }); + } + } + + completeMint(mint) { + const recipe = mint.recipe; + + // Give coins (add to gold directly!) + if (this.scene.inventorySystem) { + this.scene.inventorySystem.gold += recipe.outputAmount; + } + + // Reset mint + mint.processing = false; + mint.progress = 0; + mint.input = null; + mint.recipe = null; + + console.log(`βœ… Minting complete! +${recipe.outputAmount} gold`); + + // Visual feedback + if (this.scene.events) { + this.scene.events.emit('show-floating-text', { + x: mint.gridX * 48, + y: mint.gridY * 48, + text: `+${recipe.outputAmount}g`, + color: '#FFD700' + }); + } + } + + // Get smelter/mint at position + getSmelterAt(gridX, gridY) { + return this.smelters.find(s => s.gridX === gridX && s.gridY === gridY); + } + + getMintAt(gridX, gridY) { + return this.mints.find(m => m.gridX === gridX && m.gridY === gridY); + } +}