📚 DOCUMENTATION COMPLETE: AUDIO_ASSET_MANIFEST.md (61 files detailed) and VFX_IMPLEMENTATION_GUIDE.md (6 systems with code examples). Ready for asset production phase.
This commit is contained in:
331
src/systems/CityGratitudeSystem.js
Normal file
331
src/systems/CityGratitudeSystem.js
Normal file
@@ -0,0 +1,331 @@
|
||||
/**
|
||||
* CITY GRATITUDE GIFT SYSTEM
|
||||
* Population milestone rewards
|
||||
* Unique equipment and bonuses
|
||||
*/
|
||||
|
||||
export class CityGratitudeSystem {
|
||||
constructor(scene) {
|
||||
this.scene = scene;
|
||||
|
||||
// Milestone tracking
|
||||
this.milestones = new Map();
|
||||
this.claimedMilestones = new Set();
|
||||
|
||||
// City reputation
|
||||
this.reputation = 0;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.initializeMilestones();
|
||||
|
||||
// Check milestones when population changes
|
||||
this.scene.events.on('population_changed', () => this.checkMilestones());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize population milestones
|
||||
*/
|
||||
initializeMilestones() {
|
||||
this.registerMilestone({
|
||||
population: 10,
|
||||
name: 'Small Community',
|
||||
rewards: {
|
||||
items: [{ id: 'starter_hoe', name: 'Community Hoe', rarity: 'uncommon' }],
|
||||
currency: 500,
|
||||
reputation: 50
|
||||
},
|
||||
description: '10 settlers joined your farm!'
|
||||
});
|
||||
|
||||
this.registerMilestone({
|
||||
population: 25,
|
||||
name: 'Growing Village',
|
||||
rewards: {
|
||||
items: [
|
||||
{ id: 'village_axe', name: 'Village Axe', rarity: 'rare' },
|
||||
{ id: 'mayor_blessing', name: 'Mayor\'s Blessing', rarity: 'rare', type: 'buff' }
|
||||
],
|
||||
currency: 1500,
|
||||
reputation: 100,
|
||||
unlock: 'town_hall'
|
||||
},
|
||||
description: '25 settlers! The village recognizes your leadership.'
|
||||
});
|
||||
|
||||
this.registerMilestone({
|
||||
population: 50,
|
||||
name: 'Thriving Town',
|
||||
rewards: {
|
||||
items: [
|
||||
{ id: 'master_scythe', name: 'Master Scythe', rarity: 'epic' },
|
||||
{ id: 'town_armor', name: 'Town Guardian Armor', rarity: 'epic' }
|
||||
],
|
||||
currency: 5000,
|
||||
reputation: 250,
|
||||
unlock: 'advanced_workshop'
|
||||
},
|
||||
description: '50 settlers! Your town flourishes.'
|
||||
});
|
||||
|
||||
this.registerMilestone({
|
||||
population: 100,
|
||||
name: 'Major City',
|
||||
rewards: {
|
||||
items: [
|
||||
{ id: 'legendary_pickaxe', name: 'Pickaxe of Prosperity', rarity: 'legendary' },
|
||||
{ id: 'city_crown', name: 'Crown of the People', rarity: 'legendary' },
|
||||
{ id: 'citizens_gratitude', name: 'Citizens\' Eternal Gratitude', rarity: 'legendary', type: 'permanent_buff' }
|
||||
],
|
||||
currency: 15000,
|
||||
reputation: 500,
|
||||
unlock: 'city_monument'
|
||||
},
|
||||
description: '100 settlers! You\'ve built a magnificent city!'
|
||||
});
|
||||
|
||||
this.registerMilestone({
|
||||
population: 200,
|
||||
name: 'Metropolis',
|
||||
rewards: {
|
||||
items: [
|
||||
{ id: 'omega_tool_set', name: 'Omega Tool Set', rarity: 'mythic' },
|
||||
{ id: 'metropolis_throne', name: 'Throne of Dominion', rarity: 'mythic' }
|
||||
],
|
||||
currency: 50000,
|
||||
reputation: 1000,
|
||||
unlock: 'palace',
|
||||
specialBonus: 'All workers +100% efficiency'
|
||||
},
|
||||
description: '200 settlers! Your metropolis is legendary!'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a milestone
|
||||
*/
|
||||
registerMilestone(milestoneData) {
|
||||
this.milestones.set(milestoneData.population, {
|
||||
...milestoneData,
|
||||
claimed: false
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any milestones reached
|
||||
*/
|
||||
checkMilestones() {
|
||||
const currentPopulation = this.scene.gameState?.population || 0;
|
||||
|
||||
this.milestones.forEach((milestone, requiredPop) => {
|
||||
if (currentPopulation >= requiredPop && !this.claimedMilestones.has(requiredPop)) {
|
||||
this.triggerMilestone(requiredPop);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger milestone reward
|
||||
*/
|
||||
triggerMilestone(population) {
|
||||
const milestone = this.milestones.get(population);
|
||||
if (!milestone) return;
|
||||
|
||||
// Mark as claimed
|
||||
this.claimedMilestones.add(population);
|
||||
milestone.claimed = true;
|
||||
|
||||
// Grant rewards
|
||||
this.grantRewards(milestone.rewards);
|
||||
|
||||
// Special bonuses
|
||||
if (milestone.specialBonus) {
|
||||
this.applySpecialBonus(milestone.specialBonus);
|
||||
}
|
||||
|
||||
// Reputation
|
||||
this.reputation += milestone.rewards.reputation || 0;
|
||||
|
||||
// Cinematic notification
|
||||
this.scene.uiSystem?.showMilestoneNotification(
|
||||
milestone.name,
|
||||
milestone.description,
|
||||
milestone.rewards
|
||||
);
|
||||
|
||||
// VFX: Celebration
|
||||
this.scene.vfxSystem?.playEffect('city_celebration', 400, 300);
|
||||
this.scene.cameras.main.flash(2000, 255, 215, 0);
|
||||
|
||||
// SFX
|
||||
this.scene.soundSystem?.play('milestone_fanfare');
|
||||
|
||||
console.log(`🎉 MILESTONE REACHED: ${milestone.name} (${population} population)`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Grant milestone rewards
|
||||
*/
|
||||
grantRewards(rewards) {
|
||||
// Currency
|
||||
if (rewards.currency) {
|
||||
this.scene.economySystem?.addCurrency(rewards.currency);
|
||||
console.log(`+${rewards.currency} coins`);
|
||||
}
|
||||
|
||||
// Items
|
||||
if (rewards.items) {
|
||||
rewards.items.forEach(item => {
|
||||
this.scene.inventorySystem?.addItem(item.id, 1);
|
||||
console.log(`Received: ${item.name} (${item.rarity})`);
|
||||
|
||||
// Special item effects
|
||||
if (item.type === 'buff') {
|
||||
this.applyItemBuff(item);
|
||||
} else if (item.type === 'permanent_buff') {
|
||||
this.applyPermanentBuff(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Unlocks
|
||||
if (rewards.unlock) {
|
||||
this.scene.gameState.unlocks[rewards.unlock] = true;
|
||||
console.log(`Unlocked: ${rewards.unlock}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply item buff
|
||||
*/
|
||||
applyItemBuff(item) {
|
||||
switch (item.id) {
|
||||
case 'mayor_blessing':
|
||||
this.scene.gameState.buffs.mayor_blessing = {
|
||||
crop_yield: 1.25,
|
||||
building_speed: 1.25,
|
||||
duration: Infinity // Permanent
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply permanent buff
|
||||
*/
|
||||
applyPermanentBuff(item) {
|
||||
switch (item.id) {
|
||||
case 'citizens_gratitude':
|
||||
// Permanent +25% to all production
|
||||
this.scene.gameState.buffs.citizens_gratitude = {
|
||||
all_production: 1.25,
|
||||
all_efficiency: 1.25
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply special bonus
|
||||
*/
|
||||
applySpecialBonus(bonus) {
|
||||
if (bonus === 'All workers +100% efficiency') {
|
||||
this.scene.npcSettlementSystem?.settledNPCs.forEach((npc, npcId) => {
|
||||
const currentEff = this.scene.npcSettlementSystem.npcEfficiency.get(npcId) || 1.0;
|
||||
this.scene.npcSettlementSystem.npcEfficiency.set(npcId, currentEff * 2.0);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get next milestone
|
||||
*/
|
||||
getNextMilestone() {
|
||||
const currentPopulation = this.scene.gameState?.population || 0;
|
||||
|
||||
for (const [reqPop, milestone] of this.milestones.entries()) {
|
||||
if (reqPop > currentPopulation) {
|
||||
return {
|
||||
population: reqPop,
|
||||
...milestone,
|
||||
progress: Math.min(100, (currentPopulation / reqPop) * 100)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return null; // All milestones claimed
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all milestones
|
||||
*/
|
||||
getAllMilestones() {
|
||||
return Array.from(this.milestones.entries()).map(([pop, milestone]) => ({
|
||||
population: pop,
|
||||
...milestone,
|
||||
claimed: this.claimedMilestones.has(pop)
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get claimed milestones
|
||||
*/
|
||||
getClaimedMilestones() {
|
||||
return this.getAllMilestones().filter(m => m.claimed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get city reputation
|
||||
*/
|
||||
getReputation() {
|
||||
return this.reputation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get reputation tier
|
||||
*/
|
||||
getReputationTier() {
|
||||
if (this.reputation >= 1000) return 'Legendary';
|
||||
if (this.reputation >= 500) return 'Renowned';
|
||||
if (this.reputation >= 250) return 'Well-Known';
|
||||
if (this.reputation >= 100) return 'Respected';
|
||||
if (this.reputation >= 50) return 'Known';
|
||||
return 'Unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* Manual milestone trigger (for testing)
|
||||
*/
|
||||
triggerMilestoneManual(population) {
|
||||
if (!this.claimedMilestones.has(population)) {
|
||||
this.triggerMilestone(population);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save/Load
|
||||
*/
|
||||
getSaveData() {
|
||||
return {
|
||||
claimedMilestones: Array.from(this.claimedMilestones),
|
||||
reputation: this.reputation
|
||||
};
|
||||
}
|
||||
|
||||
loadSaveData(data) {
|
||||
this.claimedMilestones = new Set(data.claimedMilestones || []);
|
||||
this.reputation = data.reputation || 0;
|
||||
|
||||
// Mark milestones as claimed
|
||||
this.claimedMilestones.forEach(pop => {
|
||||
const milestone = this.milestones.get(pop);
|
||||
if (milestone) {
|
||||
milestone.claimed = true;
|
||||
// Re-apply permanent buffs
|
||||
this.grantRewards(milestone.rewards);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user