FEATURE: Starter Chest System - seed-based random loot for new game (guaranteed + rare items)

This commit is contained in:
2025-12-11 13:04:38 +01:00
parent ecd9fc6731
commit 92c88d5c2d
2 changed files with 129 additions and 0 deletions

View File

@@ -0,0 +1,128 @@
/**
* Starter Chest System
* Generates seed-based random loot for new game
*/
class StarterChestSystem {
constructor(scene) {
this.scene = scene;
}
/**
* Generate seed-based random loot table
* @param {number} seed - Game seed (e.g., Date.now())
* @returns {Array} List of items {type, amount}
*/
generateLoot(seed = Date.now()) {
// Simple seeded random generator (LCG)
let rng = seed;
const random = () => {
rng = (rng * 9301 + 49297) % 233280;
return rng / 233280;
};
const lootTable = [];
// GUARANTEED ITEMS (always spawn)
lootTable.push({ type: 'wheat_seed', amount: 10 + Math.floor(random() * 10) }); // 10-20 seeds
lootTable.push({ type: 'wood', amount: 5 + Math.floor(random() * 10) }); // 5-15 wood
// RANDOM ITEMS (50% chance each)
if (random() > 0.5) {
lootTable.push({ type: 'stone', amount: 3 + Math.floor(random() * 5) }); // 3-8 stone
}
if (random() > 0.5) {
lootTable.push({ type: 'bone', amount: 2 + Math.floor(random() * 4) }); // 2-6 bones
}
if (random() > 0.7) {
lootTable.push({ type: 'bread', amount: 1 + Math.floor(random() * 3) }); // 1-4 bread (food)
}
// RARE ITEMS (10% chance each)
if (random() > 0.9) {
lootTable.push({ type: 'iron', amount: 1 + Math.floor(random() * 2) }); // 1-3 iron
}
if (random() > 0.9) {
lootTable.push({ type: 'gold_coin', amount: 10 + Math.floor(random() * 20) }); // 10-30 gold
}
// ULTRA RARE (1% chance)
if (random() > 0.99) {
lootTable.push({ type: 'diamond', amount: 1 }); // 1 diamond!
}
console.log('🎁 Starter Chest Loot Generated:', lootTable);
return lootTable;
}
/**
* Place starter chest at farm location
* @param {number} x - Grid X position
* @param {number} y - Grid Y position
* @param {number} seed - Game seed
*/
placeStarterChest(x, y, seed) {
// Generate loot
const lootItems = this.generateLoot(seed);
// Place chest structure (if TerrainSystem supports it)
if (this.scene.terrainSystem && this.scene.terrainSystem.placeStructure) {
// Check if placeStructure method exists
try {
this.scene.terrainSystem.placeStructure(x, y, 'chest');
console.log(`🎁 Starter Chest placed at (${x}, ${y})`);
} catch (e) {
console.warn('⚠️ placeStructure not available, chest not placed:', e);
}
}
// Store loot data globally for later retrieval
if (!window.gameState) window.gameState = {};
window.gameState.starterChestLoot = lootItems;
window.gameState.starterChestPosition = { x, y };
return lootItems;
}
/**
* Open chest and add items to player inventory
* @param {Object} player - Player object with inventory
*/
openChest(player) {
if (!window.gameState || !window.gameState.starterChestLoot) {
console.warn('⚠️ No starter chest loot found!');
return;
}
const loot = window.gameState.starterChestLoot;
// Add items to player inventory
loot.forEach(item => {
if (player.inventory && player.inventory.addItem) {
player.inventory.addItem(item.type, item.amount);
console.log(` Added ${item.amount}x ${item.type} to inventory`);
} else {
console.warn('⚠️ Player inventory not available');
}
});
// Show notification
if (this.scene.events) {
this.scene.events.emit('showFloatingText', {
x: window.gameState.starterChestPosition.x,
y: window.gameState.starterChestPosition.y,
text: '🎁 Starter Chest Opened!',
color: '#ffaa00'
});
}
// Clear loot (chest is now empty)
window.gameState.starterChestLoot = null;
console.log('✅ Starter Chest opened and emptied');
}
}
// Export for global use
if (typeof module !== 'undefined' && module.exports) {
module.exports = StarterChestSystem;
}