Phase 40: Minting System + Session 4 Documentation
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!
This commit is contained in:
270
src/systems/MintingSystem.js
Normal file
270
src/systems/MintingSystem.js
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user