PHASE 40: MINTING SYSTEM COMPLETE! SMELTER SYSTEM: - Smelt gold ore gold bars - Fuel system (coal required) - Processing time (5 seconds) - Visual representation ( brown + fire outline) MINT SYSTEM: - Mint gold bars gold coins - 1 bar = 10 coins conversion - Processing time (3 seconds) - Visual representation ( gold + coin icon) PROCESSING MECHANICS: - Real-time progress tracking - Start/complete callbacks - Output to inventory system - Floating text feedback VISUAL COMPONENTS: - Smelter sprite (graphics-based) - Mint sprite (graphics-based) - Icon overlays (emoji) - Completion notifications DOCUMENTATION: - Session 4 added to DNEVNIK.md - Phase 37 + 40 summary - Technical fixes documented - Lessons learned recorded TECHNICAL DETAILS: - MintingSystem.js created - Recipe system implemented - Time-based processing - Integration with InventorySystem SESSION 4 STATS: - Duration: 4.5 hours (00:50-01:42) - Files changed: 8 - New files: 2 systems - Lines added: ~600 - Features: 2 major phases - Commits: 3 total KEY ACHIEVEMENTS: - Micro Farm fully functional - Minting economy foundation - No random coin drops anymore! - Unique crafting pipeline NEXT PRIORITIES: - Phase 38: Town Repair - Water Auto-Tiling - Weather improvements Session: 4.5h marathon session Date: 15.12.2024 (00:50-01:42) Status: READY FOR TESTING!
271 lines
7.4 KiB
JavaScript
271 lines
7.4 KiB
JavaScript
// 💰 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);
|
|
}
|
|
}
|