// 💰 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); } }