feat: quest page restructurée — combat/métiers/dailies/arcs séparés
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s

Frontend: 4 sections distinctes sur la page quêtes:
  - Quêtes actives (3 slots combat uniquement)
  - Quêtes de combat (stagger: max 3 affichées, "+N après celles-ci")
  - 🔨 Métiers (forge/craft — hors pool, toujours disponibles)
  - 🔄 Dailies (répétables en fond)

Backend: craft/forge quests ne comptent plus dans le MAX_ACTIVE_QUESTS.
This commit is contained in:
2026-03-24 19:11:29 +01:00
parent d77666c4cf
commit dd2a025c74
2 changed files with 52 additions and 19 deletions

View File

@@ -92,17 +92,20 @@ export class QuestService {
throw new BadRequestException(`Niveau ${quest.minLevel} requis`);
}
// Check active quest count (repeatable quests don't count toward the limit)
if (!quest.repeatable) {
const activeNonRepeatable = await this.playerQuestRepo
// Check active quest count
// Repeatable + craft/forge quests don't count toward the 3-slot limit
const isCraftQuest = ['forge_item', 'craft_item'].includes(quest.objectiveType);
if (!quest.repeatable && !isCraftQuest) {
const activeCombat = await this.playerQuestRepo
.createQueryBuilder('pq')
.innerJoin('pq.quest', 'q')
.where('pq.character_id = :characterId', { characterId })
.andWhere('pq.status = :status', { status: 'active' })
.andWhere('q.repeatable = false')
.andWhere('q.objective_type NOT IN (:...types)', { types: ['forge_item', 'craft_item'] })
.getCount();
if (activeNonRepeatable >= MAX_ACTIVE_QUESTS) {
throw new BadRequestException(`Maximum ${MAX_ACTIVE_QUESTS} quêtes actives (hors répétables)`);
if (activeCombat >= MAX_ACTIVE_QUESTS) {
throw new BadRequestException(`Maximum ${MAX_ACTIVE_QUESTS} quêtes de combat actives`);
}
}