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

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:
2026-03-24 17:57:23 +01:00
parent 8cb5fcd5ba
commit d1609efaae
8 changed files with 222 additions and 29 deletions

View File

@@ -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)