feat: zone locking — progression par arcs narratifs + arcs Égouts/Désert
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s
Zones verrouillées: marais toujours ouvert, égouts après arc Marais, désert après arc Égouts. Filtrage backend sur monstres ET boutique. Arc "Les Égouts de la Cité" (4 quêtes, lv4-7, boss Roi des Rats) Arc "Les Sables Brûlants" (3 quêtes, lv8-12, boss Sphinx) GET /api/monsters/zones — retourne les zones avec statut unlocked. Combat page: monstres groupés par zone, zones lockées avec icône cadenas. Boutique: items filtrés par zones débloquées (potions toujours visibles).
This commit is contained in:
@@ -156,6 +156,60 @@ export async function seedQuests(dataSource: DataSource) {
|
||||
}
|
||||
|
||||
console.log(`✅ 1 arc + ${QUESTS.length + STANDALONE.length} quêtes + ${QUEST_ACHIEVEMENTS.length} achievements seedés`);
|
||||
|
||||
// --- Arc 2: Les Égouts ---
|
||||
let arcEgouts = await arcRepo.findOne({ where: { name: 'Les Égouts de la Cité' } });
|
||||
if (!arcEgouts) {
|
||||
arcEgouts = await arcRepo.save(arcRepo.create({
|
||||
name: 'Les Égouts de la Cité',
|
||||
description: 'Les égouts grouillent de créatures répugnantes. Nettoyez ces tunnels oubliés.',
|
||||
zone: 'egouts',
|
||||
sortOrder: 2,
|
||||
minLevel: 4,
|
||||
}));
|
||||
|
||||
const ratId = monsterMap.get("Rat d'Égout") ?? null as string | null;
|
||||
const crocoId = monsterMap.get('Crocodile') ?? null as string | null;
|
||||
const roiId = monsterMap.get('Roi des Rats') ?? null as string | null;
|
||||
|
||||
const EGOUTS_QUESTS = [
|
||||
{ name: 'Dératisation', description: 'Les rats pullulent. Éliminez-en 5.', objectiveType: 'kill_monster', objectiveTargetId: ratId, objectiveCount: 5, rewardXp: 200, rewardGold: 80, rewardTitle: null, arcId: arcEgouts.id, arcOrder: 1, minLevel: 4, repeatable: false },
|
||||
{ name: 'Chasseur des profondeurs', description: 'Remportez 15 combats dans les égouts.', objectiveType: 'kill_any', objectiveTargetId: null as string | null, objectiveCount: 15, rewardXp: 300, rewardGold: 120, rewardTitle: null, arcId: arcEgouts.id, arcOrder: 2, minLevel: 5, repeatable: false },
|
||||
{ name: 'Le reptile', description: 'Terrassez 3 Crocodiles qui rôdent dans les canaux.', objectiveType: 'kill_monster', objectiveTargetId: crocoId, objectiveCount: 3, rewardXp: 400, rewardGold: 150, rewardTitle: null, arcId: arcEgouts.id, arcOrder: 3, minLevel: 6, repeatable: false },
|
||||
{ name: 'Le Roi des Rats', description: 'Mettez fin au règne du Roi des Rats.', objectiveType: 'kill_monster', objectiveTargetId: roiId, objectiveCount: 1, rewardXp: 800, rewardGold: 400, rewardTitle: 'Nettoyeur des Égouts', arcId: arcEgouts.id, arcOrder: 4, minLevel: 7, repeatable: false },
|
||||
];
|
||||
|
||||
for (const q of EGOUTS_QUESTS) {
|
||||
await questRepo.save(questRepo.create(q));
|
||||
}
|
||||
console.log(`✅ Arc Égouts + ${EGOUTS_QUESTS.length} quêtes seedés`);
|
||||
}
|
||||
|
||||
// --- Arc 3: Le Désert ---
|
||||
let arcDesert = await arcRepo.findOne({ where: { name: 'Les Sables Brûlants' } });
|
||||
if (!arcDesert) {
|
||||
arcDesert = await arcRepo.save(arcRepo.create({
|
||||
name: 'Les Sables Brûlants',
|
||||
description: 'Le désert cache des trésors anciens et des créatures redoutables.',
|
||||
zone: 'desert',
|
||||
sortOrder: 3,
|
||||
minLevel: 8,
|
||||
}));
|
||||
|
||||
const scorpId = monsterMap.get('Scorpion') ?? null as string | null;
|
||||
const sphinxId = monsterMap.get('Sphinx') ?? null as string | null;
|
||||
|
||||
const DESERT_QUESTS = [
|
||||
{ name: 'Piqûres mortelles', description: 'Éliminez 5 Scorpions.', objectiveType: 'kill_monster', objectiveTargetId: scorpId, objectiveCount: 5, rewardXp: 400, rewardGold: 150, rewardTitle: null, arcId: arcDesert.id, arcOrder: 1, minLevel: 8, repeatable: false },
|
||||
{ name: 'Survivant du désert', description: 'Remportez 20 combats dans le désert.', objectiveType: 'kill_any', objectiveTargetId: null as string | null, objectiveCount: 20, rewardXp: 600, rewardGold: 250, rewardTitle: null, arcId: arcDesert.id, arcOrder: 2, minLevel: 9, repeatable: false },
|
||||
{ name: 'L\'énigme du Sphinx', description: 'Terrassez le Sphinx — gardien des sables.', objectiveType: 'kill_monster', objectiveTargetId: sphinxId, objectiveCount: 1, rewardXp: 1500, rewardGold: 800, rewardTitle: 'Conquérant du Désert', arcId: arcDesert.id, arcOrder: 3, minLevel: 12, repeatable: false },
|
||||
];
|
||||
|
||||
for (const q of DESERT_QUESTS) {
|
||||
await questRepo.save(questRepo.create(q));
|
||||
}
|
||||
console.log(`✅ Arc Désert + ${DESERT_QUESTS.length} quêtes seedés`);
|
||||
}
|
||||
}
|
||||
|
||||
// Update monster XP rewards (nerf for quest-driven progression)
|
||||
|
||||
Reference in New Issue
Block a user