From 92c88d5c2dc6fb2a02c8eea0f599316c7d9e0974 Mon Sep 17 00:00:00 2001 From: NovaFarma Dev Date: Thu, 11 Dec 2025 13:04:38 +0100 Subject: [PATCH] FEATURE: Starter Chest System - seed-based random loot for new game (guaranteed + rare items) --- index.html | 1 + src/systems/StarterChestSystem.js | 128 ++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/systems/StarterChestSystem.js diff --git a/index.html b/index.html index 8923f22..1705159 100644 --- a/index.html +++ b/index.html @@ -105,6 +105,7 @@ + diff --git a/src/systems/StarterChestSystem.js b/src/systems/StarterChestSystem.js new file mode 100644 index 0000000..6d3337c --- /dev/null +++ b/src/systems/StarterChestSystem.js @@ -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; +}