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