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
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:
@@ -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`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user