dodatki
This commit is contained in:
163
src/systems/PerennialCropSystem.js
Normal file
163
src/systems/PerennialCropSystem.js
Normal file
@@ -0,0 +1,163 @@
|
||||
/**
|
||||
* PERENNIAL CROPS SYSTEM
|
||||
* Handles multi-season crops like Apple Trees
|
||||
*/
|
||||
class PerennialCropSystem {
|
||||
constructor(scene) {
|
||||
this.scene = scene;
|
||||
this.perennials = []; // Array of perennial objects
|
||||
|
||||
// Perennial definitions
|
||||
this.perennialData = {
|
||||
'apple_tree': {
|
||||
name: 'Apple Tree',
|
||||
growthTime: 120000, // 2 minutes to maturity
|
||||
harvestSeason: 'autumn', // Only harvest in autumn
|
||||
harvestYield: { 'apple': 5 },
|
||||
regrowthTime: 30000, // 30s to regrow apples
|
||||
texture: 'apple_tree',
|
||||
stages: ['sapling', 'young', 'mature', 'fruiting']
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Plant a perennial crop
|
||||
*/
|
||||
plant(gridX, gridY, type) {
|
||||
if (!this.perennialData[type]) {
|
||||
console.error('Unknown perennial type:', type);
|
||||
return false;
|
||||
}
|
||||
|
||||
const perennial = {
|
||||
type,
|
||||
gridX,
|
||||
gridY,
|
||||
plantedTime: Date.now(),
|
||||
stage: 0, // 0=sapling, 1=young, 2=mature, 3=fruiting
|
||||
canHarvest: false,
|
||||
sprite: null,
|
||||
healthBar: null
|
||||
};
|
||||
|
||||
this.perennials.push(perennial);
|
||||
this.createSprite(perennial);
|
||||
console.log(`🌳 Planted ${type} at ${gridX},${gridY}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
createSprite(perennial) {
|
||||
const data = this.perennialData[perennial.type];
|
||||
const screenPos = this.scene.iso.toScreen(perennial.gridX, perennial.gridY);
|
||||
|
||||
// Create tree sprite
|
||||
perennial.sprite = this.scene.add.sprite(
|
||||
screenPos.x + this.scene.terrainOffsetX,
|
||||
screenPos.y + this.scene.terrainOffsetY,
|
||||
data.texture || 'tree'
|
||||
);
|
||||
perennial.sprite.setOrigin(0.5, 1);
|
||||
perennial.sprite.setScale(0.5);
|
||||
perennial.sprite.setDepth(this.scene.iso.getDepth(perennial.gridX, perennial.gridY, this.scene.iso.LAYER_OBJECTS));
|
||||
|
||||
this.updateSprite(perennial);
|
||||
}
|
||||
|
||||
updateSprite(perennial) {
|
||||
const data = this.perennialData[perennial.type];
|
||||
|
||||
// Update tint based on stage
|
||||
if (perennial.stage === 0) {
|
||||
perennial.sprite.setTint(0x88aa88); // Light green (sapling)
|
||||
perennial.sprite.setScale(0.3);
|
||||
} else if (perennial.stage === 1) {
|
||||
perennial.sprite.setTint(0x44aa44); // Medium green (young)
|
||||
perennial.sprite.setScale(0.4);
|
||||
} else if (perennial.stage === 2) {
|
||||
perennial.sprite.clearTint(); // Normal (mature)
|
||||
perennial.sprite.setScale(0.5);
|
||||
} else if (perennial.stage === 3) {
|
||||
perennial.sprite.setTint(0xff8844); // Orange tint (fruiting)
|
||||
perennial.sprite.setScale(0.5);
|
||||
}
|
||||
}
|
||||
|
||||
update(delta, currentSeason) {
|
||||
this.perennials.forEach(perennial => {
|
||||
const data = this.perennialData[perennial.type];
|
||||
const age = Date.now() - perennial.plantedTime;
|
||||
|
||||
// Growth stages
|
||||
if (perennial.stage < 3) {
|
||||
const stageTime = data.growthTime / 3;
|
||||
const newStage = Math.min(3, Math.floor(age / stageTime));
|
||||
|
||||
if (newStage !== perennial.stage) {
|
||||
perennial.stage = newStage;
|
||||
this.updateSprite(perennial);
|
||||
|
||||
if (perennial.stage === 3) {
|
||||
console.log(`🌳 ${data.name} reached maturity!`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fruiting logic (only in correct season and when mature)
|
||||
if (perennial.stage === 3 && currentSeason === data.harvestSeason) {
|
||||
if (!perennial.canHarvest) {
|
||||
perennial.canHarvest = true;
|
||||
perennial.sprite.setTint(0xff6644); // Bright orange (ready to harvest)
|
||||
}
|
||||
} else if (perennial.canHarvest && currentSeason !== data.harvestSeason) {
|
||||
perennial.canHarvest = false;
|
||||
perennial.sprite.clearTint();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to harvest perennial
|
||||
*/
|
||||
harvest(gridX, gridY) {
|
||||
const perennial = this.perennials.find(p =>
|
||||
p.gridX === gridX && p.gridY === gridY
|
||||
);
|
||||
|
||||
if (!perennial) return null;
|
||||
|
||||
if (!perennial.canHarvest) {
|
||||
return { error: 'Not ready to harvest' };
|
||||
}
|
||||
|
||||
const data = this.perennialData[perennial.type];
|
||||
|
||||
// Reset harvest state (will regrow)
|
||||
perennial.canHarvest = false;
|
||||
perennial.sprite.setTint(0x88aa88); // Back to green
|
||||
|
||||
console.log(`🍎 Harvested ${data.name}!`);
|
||||
return data.harvestYield;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if position has perennial
|
||||
*/
|
||||
hasPerennial(gridX, gridY) {
|
||||
return this.perennials.some(p => p.gridX === gridX && p.gridY === gridY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get perennial at position
|
||||
*/
|
||||
getPerennial(gridX, gridY) {
|
||||
return this.perennials.find(p => p.gridX === gridX && p.gridY === gridY);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.perennials.forEach(p => {
|
||||
if (p.sprite) p.sprite.destroy();
|
||||
});
|
||||
this.perennials = [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user