Files
novafarma/backup_faza11_extracted/backup_faza11_2025-12-11/IMPLEMENTATION_ROADMAP.md
2025-12-11 11:34:23 +01:00

31 KiB

🗺️ IMPLEMENTATION ROADMAP

Novafarma - Detailed Feature Implementation Plans

Date: 10.12.2025
Status: Planning Phase


📋 Priority Matrix

Priority Features (Total: 27) Estimated Time
🔴 High 8 features ~4 weeks
🟡 Medium 12 features ~8 weeks
🟢 Low 7 features ~6 weeks
TOTAL 27 features ~18 weeks

🔴 HIGH PRIORITY FEATURES

1. 💡 Light System - Dynamic Lighting

Priority: 🔴 High
Complexity: Medium
Time Estimate: 3-4 days

Technical Implementation:

// src/systems/LightingSystem.js
class LightingSystem {
    constructor(scene) {
        this.scene = scene;
        this.lights = []; // { x, y, radius, intensity, color }
        this.globalLight = 1.0; // 0.0 = night, 1.0 = day
        
        // Light overlay
        this.lightTexture = scene.textures.createCanvas('lightmap', 
            scene.cameras.main.width, 
            scene.cameras.main.height
        );
    }

    update(delta) {
        // Update global light based on time
        const timeSystem = this.scene.weatherSystem;
        if (timeSystem) {
            const hour = timeSystem.currentHour;
            // Dawn: 6-8, Day: 8-18, Dusk: 18-20, Night: 20-6
            if (hour >= 6 && hour < 8) {
                this.globalLight = (hour - 6) / 2; // 0 → 1
            } else if (hour >= 8 && hour < 18) {
                this.globalLight = 1.0; // Full daylight
            } else if (hour >= 18 && hour < 20) {
                this.globalLight = 1.0 - ((hour - 18) / 2); // 1 → 0
            } else {
                this.globalLight = 0.2; // Dark night
            }
        }

        this.renderLightmap();
    }

    addLight(x, y, radius, intensity, color = 0xffaa00) {
        const light = { x, y, radius, intensity, color, active: true };
        this.lights.push(light);
        return light;
    }

    renderLightmap() {
        const ctx = this.lightTexture.context;
        ctx.clearRect(0, 0, this.lightTexture.width, this.lightTexture.height);

        // Global darkness overlay
        const darkness = 1.0 - this.globalLight;
        ctx.fillStyle = `rgba(0, 0, 20, ${darkness * 0.7})`;
        ctx.fillRect(0, 0, this.lightTexture.width, this.lightTexture.height);

        // Render point lights
        this.lights.forEach(light => {
            if (!light.active) return;

            const gradient = ctx.createRadialGradient(
                light.x, light.y, 0,
                light.x, light.y, light.radius
            );

            const r = (light.color >> 16) & 0xff;
            const g = (light.color >> 8) & 0xff;
            const b = light.color & 0xff;

            gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${light.intensity})`);
            gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');

            ctx.globalCompositeOperation = 'lighter';
            ctx.fillStyle = gradient;
            ctx.fillRect(
                light.x - light.radius, 
                light.y - light.radius,
                light.radius * 2, 
                light.radius * 2
            );
        });

        this.lightTexture.refresh();
    }
}

Light Sources:

  • Torches: 80px radius, orange (0xffaa00), intensity 0.8
  • Campfire: 120px radius, orange-red (0xff6600), intensity 0.9
  • Player lantern: 60px radius, yellow (0xffff00), intensity 0.6
  • Moon: Global soft light, 0.2 intensity during night
  • Lightning: Flash effect, white, random intensity

Performance Optimizations:

  • Only render lights within camera viewport
  • Use pooling for light objects
  • Canvas rendering, not WebGL shaders (for compatibility)
  • Max 50 active lights at a time

2. 🌾 Crop Growth Animations

Priority: 🔴 High
Complexity: Low
Time Estimate: 2 days

Implementation:

// src/systems/FarmingSystem.js - Enhanced
plantCrop(gridX, gridY, cropType) {
    // ... existing code ...
    
    crop.stage = 0; // 0 = seed, 1-3 = growing, 4 = ripe
    crop.stageDuration = [5000, 7000, 7000, 8000]; // ms per stage
    crop.stageTimer = 0;
    
    // Create animated sprite
    const key = `crop_${cropType}_stage_${crop.stage}`;
    crop.sprite = this.scene.add.sprite(x, y, key);
    crop.sprite.setOrigin(0.5, 1);
    
    return crop;
}

updateCrop(crop, delta) {
    if (crop.stage >= 4) return; // Fully grown
    
    crop.stageTimer += delta;
    
    if (crop.stageTimer >= crop.stageDuration[crop.stage]) {
        crop.stageTimer = 0;
        crop.stage += 1;
        
        // Update sprite texture
        const newKey = `crop_${crop.type}_stage_${crop.stage}`;
        crop.sprite.setTexture(newKey);
        
        // Growth animation
        this.scene.tweens.add({
            targets: crop.sprite,
            scaleX: 1.2,
            scaleY: 1.2,
            yoyo: true,
            duration: 200,
            ease: 'Sine.easeInOut'
        });
        
        // Particles
        if (this.scene.particleEffects) {
            this.scene.particleEffects.createGrowthSparkles(
                crop.sprite.x, 
                crop.sprite.y
            );
        }
    }
}

Assets Needed:

crops/wheat_stage_0.png  (seed)
crops/wheat_stage_1.png  (sprout)
crops/wheat_stage_2.png  (growing)
crops/wheat_stage_3.png  (mature)
crops/wheat_stage_4.png  (ripe - golden)

3. 🎯 Skill Tree System

Priority: 🔴 High
Complexity: High
Time Estimate: 5-6 days

System Design:

// src/systems/SkillTreeSystem.js
class SkillTreeSystem {
    constructor(scene) {
        this.scene = scene;
        this.skills = this.defineSkills();
        this.unlockedSkills = [];
        this.skillPoints = 0;
    }

    defineSkills() {
        return {
            // FARMING BRANCH
            farming_1: {
                id: 'farming_1',
                name: 'Green Thumb',
                desc: '+20% crop growth speed',
                cost: 1,
                branch: 'farming',
                tier: 1,
                requires: [],
                effect: { cropGrowthSpeed: 1.2 }
            },
            farming_2: {
                id: 'farming_2',
                name: 'Harvest Master',
                desc: '+1 extra crop yield',
                cost: 2,
                branch: 'farming',
                tier: 2,
                requires: ['farming_1'],
                effect: { harvestBonus: 1 }
            },
            farming_3: {
                id: 'farming_3',
                name: 'Mega Harvest',
                desc: '10% chance for double harvest',
                cost: 3,
                branch: 'farming',
                tier: 3,
                requires: ['farming_2'],
                effect: { doubleHarvestChance: 0.1 }
            },

            // COMBAT BRANCH
            combat_1: {
                id: 'combat_1',
                name: 'Warrior',
                desc: '+10 max HP',
                cost: 1,
                branch: 'combat',
                tier: 1,
                requires: [],
                effect: { maxHpBonus: 10 }
            },
            combat_2: {
                id: 'combat_2',
                name: 'Berserker',
                desc: '+5 attack damage',
                cost: 2,
                branch: 'combat',
                tier: 2,
                requires: ['combat_1'],
                effect: { attackDamageBonus: 5 }
            },
            combat_3: {
                id: 'combat_3',
                name: 'Lifesteal',
                desc: 'Heal 20% of damage dealt',
                cost: 3,
                branch: 'combat',
                tier: 3,
                requires: ['combat_2'],
                effect: { lifesteal: 0.2 }
            },

            // CRAFTING BRANCH
            crafting_1: {
                id: 'crafting_1',
                name: 'Efficient Crafter',
                desc: '-10% material cost',
                cost: 1,
                branch: 'crafting',
                tier: 1,
                requires: [],
                effect: { materialCostReduction: 0.1 }
            },
            crafting_2: {
                id: 'crafting_2',
                name: 'Speed Crafter',
                desc: 'Instant crafting',
                cost: 2,
                branch: 'crafting',
                tier: 2,
                requires: ['crafting_1'],
                effect: { instantCraft: true }
            },
            crafting_3: {
                id: 'crafting_3',
                name: 'Master Craftsman',
                desc: '20% chance for 2x output',
                cost: 3,
                branch: 'crafting',
                tier: 3,
                requires: ['crafting_2'],
                effect: { doubleCraftChance: 0.2 }
            },

            // SURVIVAL BRANCH
            survival_1: {
                id: 'survival_1',
                name: 'Endurance',
                desc: '+50 max energy',
                cost: 1,
                branch: 'survival',
                tier: 1,
                requires: [],
                effect: { maxEnergyBonus: 50 }
            },
            survival_2: {
                id: 'survival_2',
                name: 'Natural Resistance',
                desc: '-50% temperature damage',
                cost: 2,
                branch: 'survival',
                tier: 2,
                requires: ['survival_1'],
                effect: { tempDamageReduction: 0.5 }
            },
            survival_3: {
                id: 'survival_3',
                name: 'Survivor',
                desc: 'Regenerate 1 HP/second',
                cost: 3,
                branch: 'survival',
                tier: 3,
                requires: ['survival_2'],
                effect: { hpRegenPerSecond: 1 }
            }
        };
    }

    unlockSkill(skillId) {
        const skill = this.skills[skillId];
        if (!skill) return false;

        // Check requirements
        if (!this.canUnlock(skillId)) {
            console.log(`Cannot unlock ${skillId}: requirements not met`);
            return false;
        }

        // Check skill points
        if (this.skillPoints < skill.cost) {
            console.log(`Cannot unlock ${skillId}: not enough skill points`);
            return false;
        }

        // Unlock
        this.unlockedSkills.push(skillId);
        this.skillPoints -= skill.cost;

        // Apply effect
        this.applySkillEffect(skill);

        console.log(`✅ Unlocked skill: ${skill.name}`);
        return true;
    }

    canUnlock(skillId) {
        const skill = this.skills[skillId];
        
        // Check if already unlocked
        if (this.unlockedSkills.includes(skillId)) return false;

        // Check prerequisites
        for (const reqId of skill.requires) {
            if (!this.unlockedSkills.includes(reqId)) {
                return false;
            }
        }

        return true;
    }

    applySkillEffect(skill) {
        const player = this.scene.player;
        const effect = skill.effect;

        // Apply bonuses
        if (effect.maxHpBonus) player.maxHp += effect.maxHpBonus;
        if (effect.maxEnergyBonus) player.maxEnergy += effect.maxEnergyBonus;
        if (effect.attackDamageBonus) player.attackDamage += effect.attackDamageBonus;

        // Store multipliers for systems to use
        if (effect.cropGrowthSpeed) {
            if (!this.scene.farmingSystem.growthSpeedMultiplier) {
                this.scene.farmingSystem.growthSpeedMultiplier = 1.0;
            }
            this.scene.farmingSystem.growthSpeedMultiplier *= effect.cropGrowthSpeed;
        }

        // Visual feedback
        if (this.scene.visualEffectsSystem) {
            this.scene.visualEffectsSystem.showFloatingText(
                player.sprite.x,
                player.sprite.y - 60,
                `SKILL UNLOCKED: ${skill.name}!`,
                '#00ff00',
                { fontSize: '24px', duration: 2000 }
            );
        }
    }

    addSkillPoint() {
        this.skillPoints += 1;
        console.log(`🎯 Skill Point earned! Total: ${this.skillPoints}`);
    }
}

UI Implementation:

  • Open with K key (already exists in UIScene)
  • Tree layout: 4 branches radiating from center
  • Visual connections between skills
  • Locked/unlocked states
  • Preview tooltips

4. 🔨 Crafting Tiers - Tool Progression

Priority: 🔴 High
Complexity: Medium
Time Estimate: 3 days

Tier System:

// src/core/inventory_crafting.js - EXPANDED

export const TOOL_TIERS = {
    WOOD: {
        tier: 1,
        durability: 50,
        efficiency: 1.0,
        damage: 5,
        color: 0x8B4513
    },
    STONE: {
        tier: 2,
        durability: 100,
        efficiency: 1.2,
        damage: 10,
        color: 0x808080
    },
    BRONZE: {
        tier: 3,
        durability: 200,
        efficiency: 1.5,
        damage: 15,
        color: 0xCD7F32
    },
    IRON: {
        tier: 4,
        durability: 400,
        efficiency: 2.0,
        damage: 25,
        color: 0xC0C0C0
    },
    STEEL: {
        tier: 5,
        durability: 800,
        efficiency: 3.0,
        damage: 40,
        color: 0x4682B4
    },
    DIAMOND: {
        tier: 6,
        durability: 1600,
        efficiency: 5.0,
        damage: 60,
        color: 0x00FFFF
    }
};

// Enhanced Recipes
export const CRAFTING_RECIPES = [
    // TIER 1 - WOOD
    { 
        id: 'wood_axe', 
        name: 'Wooden Axe',
        req: { wood: 5 },
        output: 1,
        tier: 'WOOD',
        type: 'tool'
    },

    // TIER 2 - STONE (existing)
    { 
        id: 'stone_axe', 
        name: 'Stone Axe',
        req: { wood: 3, stone: 3 },
        output: 1,
        tier: 'STONE',
        type: 'tool'
    },

    // TIER 3 - BRONZE
    { 
        id: 'bronze_axe', 
        name: 'Bronze Axe',
        req: { wood: 2, bronze_bar: 3 },
        output: 1,
        tier: 'BRONZE',
        type: 'tool',
        desc: '+50% efficiency, 200 durability'
    },
    { 
        id: 'bronze_bar', 
        name: 'Bronze Bar',
        req: { copper_ore: 3, tin_ore: 1 },
        output: 1,
        type: 'material',
        desc: 'Smelt in furnace'
    },

    // TIER 4 - IRON
    { 
        id: 'iron_axe', 
        name: 'Iron Axe',
        req: { wood: 2, iron_bar: 4 },
        output: 1,
        tier: 'IRON',
        type: 'tool',
        desc: '+100% efficiency, 400 durability'
    },

    // TIER 5 - STEEL
    { 
        id: 'steel_axe', 
        name: 'Steel Axe',
        req: { wood: 1, steel_bar: 5 },
        output: 1,
        tier: 'STEEL',
        type: 'tool',
        desc: '+200% efficiency, 800 durability'
    },
    { 
        id: 'steel_bar', 
        name: 'Steel Bar',
        req: { iron_bar: 2, coal: 1 },
        output: 1,
        type: 'material',
        desc: 'High-tier alloy'
    },

    // TIER 6 - DIAMOND
    { 
        id: 'diamond_pickaxe', 
        name: 'Diamond Pickaxe',
        req: { steel_bar: 2, diamond: 3 },
        output: 1,
        tier: 'DIAMOND',
        type: 'tool',
        desc: '+400% efficiency, 1600 durability, mines all ores'
    }
    
    // ... (add similar for pickaxe, hoe, sword, etc.)
];

Durability System:

// Each tool has durability
tool.durability = TOOL_TIERS[tool.tier].durability;
tool.currentDurability = tool.durability;

// On use
function useTool(tool) {
    tool.currentDurability -= 1;
    
    if (tool.currentDurability <= 0) {
        // Tool broke!
        console.log(`💥 ${tool.name} broke!`);
        removeFromInventory(inventorySystem, tool.type, 1);
        
        // Visual effect
        playToolBreakAnimation();
    }
    
    // Update UI with durability bar
    updateToolDurabilityUI(tool);
}

5. 🌧️ Weather Particle Improvements

Priority: 🔴 High
Complexity: Medium
Time Estimate: 2-3 days

Enhanced Weather Effects:

// src/systems/WeatherSystem.js - Enhanced Particles

createRainParticles() {
    const emitter = this.scene.add.particles(0, 0, 'particle_white', {
        x: { min: -100, max: this.scene.cameras.main.width + 100 },
        y: -50,
        lifespan: 2000,
        speedY: { min: 400, max: 600 },
        speedX: { min: -50, max: 50 },
        scale: { start: 0.3, end: 0.1 },
        alpha: { start: 0.6, end: 0 },
        tint: 0x4488ff,
        frequency: 10, // Spawn every 10ms
        quantity: 3
    });

    emitter.setScrollFactor(0);
    emitter.setDepth(300000); // Above everything
    
    return emitter;
}

createSnowParticles() {
    const emitter = this.scene.add.particles(0, 0, 'particle_white', {
        x: { min: -100, max: this.scene.cameras.main.width + 100 },
        y: -50,
        lifespan: { min: 3000, max: 5000 },
        speedY: { min: 50, max: 100 },
        speedX: { min: -30, max: 30 },
        scale: { start: 0.5, end: 0.2 },
        alpha: { start: 0.8, end: 0.3 },
        rotate: { start: 0, end: 360 },
        tint: 0xffffff,
        frequency: 50,
        quantity: 2,
        gravityY: 20 // Gentle fall
    });

    emitter.setScrollFactor(0);
    emitter.setDepth(300000);
    
    return emitter;
}

createThunderstorm() {
    // Heavy rain + lightning flashes
    this.rainEmitter.setFrequency(5); // Intense rain!
    
    // Lightning timer
    this.lightningTimer = this.scene.time.addEvent({
        delay: Phaser.Math.Between(3000, 8000),
        callback: () => {
            this.flashLightning();
        },
        loop: true
    });
}

flashLightning() {
    // Screen flash
    this.scene.cameras.main.flash(100, 255, 255, 255);
    
    // Sound
    if (this.scene.soundManager) {
        this.scene.soundManager.playThunder();
    }
    
    // Temporary brightness (for lighting system)
    if (this.scene.lightingSystem) {
        this.scene.lightingSystem.globalLight = 1.0;
        this.scene.time.delayedCall(100, () => {
            this.scene.lightingSystem.globalLight = 0.3; // Back to storm darkness
        });
    }
}

6. 🚜 Farming Automation - Sprinklers

Priority: 🔴 High
Complexity: Medium
Time Estimate: 3 days

Sprinkler System:

// src/systems/AutomationSystem.js
class AutomationSystem {
    constructor(scene) {
        this.scene = scene;
        this.sprinklers = [];
        this.harvesters = [];
    }

    placeSprinkler(gridX, gridY) {
        const sprinkler = {
            gridX,
            gridY,
            range: 3, // 3x3 grid
            waterTimer: 0,
            waterInterval: 5000, // Water every 5 seconds
            active: true
        };

        // Create sprite
        const screenPos = this.scene.player.iso.toScreen(gridX, gridY);
        sprinkler.sprite = this.scene.add.sprite(
            screenPos.x + this.scene.player.offsetX,
            screenPos.y + this.scene.player.offsetY,
            'sprinkler'
        );
        sprinkler.sprite.setOrigin(0.5, 1);

        this.sprinklers.push(sprinkler);
        return sprinkler;
    }

    update(delta) {
        // Update sprinklers
        this.sprinklers.forEach(sprinkler => {
            if (!sprinkler.active) return;

            sprinkler.waterTimer += delta;

            if (sprinkler.waterTimer >= sprinkler.waterInterval) {
                sprinkler.waterTimer = 0;
                this.waterCropsInRange(sprinkler);
            }
        });
    }

    waterCropsInRange(sprinkler) {
        const farmingSystem = this.scene.farmingSystem;
        if (!farmingSystem) return;

        // Water animation
        this.playWaterAnimation(sprinkler);

        // Find crops in range
        for (let dx = -sprinkler.range; dx <= sprinkler.range; dx++) {
            for (let dy = -sprinkler.range; dy <= sprinkler.range; dy++) {
                const cropX = sprinkler.gridX + dx;
                const cropY = sprinkler.gridY + dy;

                const crop = farmingSystem.getCropAt(cropX, cropY);
                if (crop && crop.stage < 4) {
                    // Speed up growth by 20%
                    crop.stageTimer += 1000; // +1 second progress
                }
            }
        }
    }

    playWaterAnimation(sprinkler) {
        // Blue particle spray
        const emitter = this.scene.add.particles(
            sprinkler.sprite.x,
            sprinkler.sprite.y - 20,
            'particle_white',
            {
                lifespan: 500,
                speed: { min: 50, max: 100 },
                angle: { min: -120, max: -60 },
                scale: { start: 0.3, end: 0 },
                tint: 0x44aaff,
                quantity: 10,
                frequency: -1 // One-shot
            }
        );

        emitter.explode();
        
        this.scene.time.delayedCall(500, () => emitter.destroy());
    }
}

Sprinkler Recipe:

{ 
    id: 'sprinkler', 
    name: 'Sprinkler',
    req: { iron_bar: 5, pipe: 3, water_tank: 1 },
    output: 1,
    type: 'automation',
    desc: 'Automatically waters 3x3 crops every 5 seconds'
}

7. 🎣 Fishing System

Priority: 🔴 High
Complexity: Medium
Time Estimate: 3-4 days

Implementation:

// src/systems/FishingSystem.js
class FishingSystem {
    constructor(scene) {
        this.scene = scene;
        this.isFishing = false;
        this.fishingMinigameActive = false;
        this.currentFish = null;

        // Fish types
        this.fishTypes = [
            { id: 'bass', name: 'Bass', rarity: 0.4, value: 10, difficulty: 1 },
            { id: 'salmon', name: 'Salmon', rarity: 0.3, value: 25, difficulty: 2 },
            { id: 'tuna', name: 'Tuna', rarity: 0.15, value: 50, difficulty: 3 },
            { id: 'goldfish', name: 'Goldfish', rarity: 0.1, value: 100, difficulty: 4 },
            { id: 'legendary_fish', name: 'Legendary Fish', rarity: 0.05, value: 500, difficulty: 5 }
        ];
    }

    startFishing(gridX, gridY) {
        // Check if near water
        const tile = this.scene.terrainSystem.tiles[gridY][gridX];
        if (tile.type !== 'water') {
            console.log('⚠️ Not near water!');
            return false;
        }

        // Check if has fishing rod
        if (!this.scene.inventorySystem.hasItem('fishing_rod', 1)) {
            console.log('⚠️ Need fishing rod!');
            return false;
        }

        this.isFishing = true;
        this.castLine(gridX, gridY);
        
        return true;
    }

    castLine(gridX, gridY) {
        console.log('🎣 Casting line...');

        // Visual: throw line
        const screenPos = this.scene.player.iso.toScreen(gridX, gridY);
        const bobber = this.scene.add.sprite(
            screenPos.x + this.scene.player.offsetX,
            screenPos.y + this.scene.player.offsetY,
            'fishing_bobber'
        );
        
        // Animate line cast
        const playerPos = this.scene.player.getScreenPosition();
        bobber.setPosition(playerPos.x, playerPos.y);
        
        this.scene.tweens.add({
            targets: bobber,
            x: screenPos.x + this.scene.player.offsetX,
            y: screenPos.y + this.scene.player.offsetY - 10,
            duration: 500,
            ease: 'Quad.easeOut',
            onComplete: () => {
                // Wait for bite
                this.waitForBite(bobber);
            }
        });

        this.bobber = bobber;
    }

    waitForBite(bobber) {
        // Random wait time (2-8 seconds)
        const waitTime = 2000 + Math.random() * 6000;

        this.biteTimer = this.scene.time.delayedCall(waitTime, () => {
            // Fish bit!
            this.onFishBite(bobber);
        });
    }

    onFishBite(bobber) {
        console.log('🐟 Fish bite!');

        // Visual: bobber shake
        this.scene.tweens.add({
            targets: bobber,
            y: bobber.y - 20,
            yoyo: true,
            duration: 100,
            repeat: 3
        });

        // Sound
        if (this.scene.soundManager && this.scene.soundManager.playFishBite) {
            this.scene.soundManager.playFishBite();
        }

        // UI prompt: "Press SPACE to reel!"
        const uiScene = this.scene.scene.get('UIScene');
        if (uiScene && uiScene.showFishingPrompt) {
            uiScene.showFishingPrompt(() => this.startMinigame());
        }

        // Auto-start minigame after 2 seconds if no input
        this.scene.time.delayedCall(2000, () => {
            if (this.isFishing) {
                this.startMinigame();
            }
        });
    }

    startMinigame() {
        // Select random fish (weighted by rarity)
        this.currentFish = this.selectFish();
        
        console.log(`🎣 Fishing minigame started! Fish: ${this.currentFish.name}`);

        // Simple QTE (Quick Time Event)
        // Show moving bar, player must press SPACE when bar is in green zone
        
        const uiScene = this.scene.scene.get('UIScene');
        if (uiScene && uiScene.showFishingMinigame) {
            uiScene.showFishingMinigame(this.currentFish, (success) => {
                if (success) {
                    this.catchFish(this.currentFish);
                } else {
                    this.fishEscaped();
                }
                this.endFishing();
            });
        }
    }

    selectFish() {
        // Weighted random selection
        const roll = Math.random();
        let cumulative = 0;

        for (const fish of this.fishTypes) {
            cumulative += fish.rarity;
            if (roll < cumulative) {
                return fish;
            }
        }

        return this.fishTypes[0]; // Fallback
    }

    catchFish(fish) {
        console.log(`✅ Caught ${fish.name}!`);

        // Add to inventory
        this.scene.inventorySystem.addItem(fish.id, 1);

        // XP
        if (this.scene.player && this.scene.player.addExperience) {
            this.scene.player.addExperience(fish.value);
        }

        // Visual effect
        if (this.scene.visualEffectsSystem) {
            this.scene.visualEffectsSystem.showFloatingText(
                this.bobber.x,
                this.bobber.y,
                `Caught ${fish.name}! +${fish.value} XP`,
                '#00ff00'
            );
        }
    }

    fishEscaped() {
        console.log('❌ Fish escaped!');

        if (this.scene.visualEffectsSystem) {
            this.scene.visualEffectsSystem.showFloatingText(
                this.bobber.x,
                this.bobber.y,
                'Fish Escaped!',
                '#ff0000'
            );
        }
    }

    endFishing() {
        this.isFishing = false;
        
        if (this.bobber) {
            this.bobber.destroy();
            this.bobber = null;
        }

        if (this.biteTimer) {
            this.biteTimer.remove();
        }
    }
}

Fishing Rod Recipe:

{ 
    id: 'fishing_rod', 
    name: 'Fishing Rod',
    req: { wood: 3, string: 2 },
    output: 1,
    type: 'tool',
    desc: 'Catch fish from water tiles'
}

8. 👤 Shadow System

Priority: 🔴 High
Complexity: Low
Time Estimate: 1-2 days

Implementation:

// src/systems/ShadowSystem.js
class ShadowSystem {
    constructor(scene) {
        this.scene = scene;
        this.shadows = new Map(); // entity → shadow sprite
    }

    createShadow(entity) {
        // Create ellipse shadow
        const shadow = this.scene.add.ellipse(
            entity.sprite.x,
            entity.sprite.y,
            entity.sprite.width * 0.8, // width
            entity.sprite.width * 0.4,  // height (oval)
            0x000000,
            0.3 // alpha
        );

        shadow.setOrigin(0.5, 0.5);
        shadow.setDepth(entity.sprite.depth - 1); // Below entity

        this.shadows.set(entity, shadow);
        return shadow;
    }

    update() {
        this.shadows.forEach((shadow, entity) => {
            if (!entity.sprite || !entity.sprite.active) {
                shadow.destroy();
                this.shadows.delete(entity);
                return;
            }

            // Update position
            shadow.setPosition(
                entity.sprite.x,
                entity.sprite.y + 5 // Slight offset below feet
            );

            // Update depth
            shadow.setDepth(entity.sprite.depth - 1);

            // Dynamic shadow based on time of day
            if (this.scene.lightingSystem) {
                const sunIntensity = this.scene.lightingSystem.globalLight;
                shadow.setAlpha(sunIntensity * 0.4); // Darker shadows during day
            }
        });
    }

    removeShadow(entity) {
        const shadow = this.shadows.get(entity);
        if (shadow) {
            shadow.destroy();
            this.shadows.delete(entity);
        }
    }
}

🟡 MEDIUM PRIORITY FEATURES

9. 🍳 Cooking System

Priority: 🟡 Medium
Complexity: Medium
Time Estimate: 3-4 days

Recipes:

// Cooking recipes
{ id: 'bread', req: { wheat: 3 }, result: 'bread', hp: +20 },
{ id: 'stew', req: { potato: 2, carrot: 2, beef: 1 }, result: 'stew', hp: +50 },
{ id: 'fish_soup', req: { bass: 2, salt: 1 }, result: 'fish_soup', hp: +30 },
{ id: 'cake', req: { wheat: 3, milk: 2, egg: 1, sugar: 2 }, result: 'cake', hp: +60 }

Cooking Station:

{ 
    id: 'cooking_pot', 
    name: 'Cooking Pot',
    req: { iron_bar: 5 },
    output: 1,
    type: 'building',
    desc: 'Cook food for HP restoration'
}

10. 🐮 Animal Breeding

Priority: 🟡 Medium
Complexity: High
Time Estimate: 5-6 days

See DLC_ROADMAP.md for full breeding system design


11. ⛏️ Mining Dungeons

Priority: 🟡 Medium
Complexity: High
Time Estimate: 6-8 days

Procedural Cave Generation:

// Use Perlin Noise for cave systems
// - Vertical descent
// - Ores, gems, enemies
// - Boss rooms
// - Loot chests

12. 🌫️ Fog of War

Priority: 🟡 Medium
Complexity: Medium
Time Estimate: 3 days

Implementation:

// src/systems/FogOfWarSystem.js
// - Track explored tiles
// - Render darkness overlay on unexplored areas
// - Gradually reveal as player moves

13-20: Additional Medium Priority

  • Weather transitions
  • Boss raids
  • Icon polish (higher res)
  • UI transitions
  • Build animations
  • Controller support improvements
  • Performance profiler
  • Debug console

🟢 LOW PRIORITY FEATURES

21-27: Future Enhancements

  • Co-op mode
  • Trading post
  • Leaderboards
  • Mod support
  • Replay system
  • Platform ports (Linux, Mac)
  • Auto-update system

📅 SUGGESTED TIMELINE

Month 1: Visual Polish (Weeks 1-4)

  • Week 1: Light System + Shadow System
  • Week 2: Crop Animations + Weather Particles
  • Week 3: UI Transitions + Icon Polish
  • Week 4: Building Animations + Testing

Month 2: Core Gameplay (Weeks 5-8)

  • Week 5: Skill Tree System
  • Week 6: Crafting Tiers
  • Week 7: Farming Automation (Sprinklers)
  • Week 8: Fishing System

Month 3: Advanced Features (Weeks 9-12)

  • Week 9: Cooking System
  • Week 10: Fog of War
  • Week 11: Animal Breeding
  • Week 12: Polish + Bug Fixes

Month 4+: Expansion (Weeks 13+)

  • Mining Dungeons
  • Boss Raids
  • Multiplayer
  • Platform Ports

Total Estimated Development Time: ~18 weeks (4.5 months)

Status: ROADMAP COMPLETE - Ready for phased implementation