feat(sprint5): quest system + arcs + rebalance endurance/damage/xp
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 33s

Quest system:
  4 entities (quest_arcs, quests, player_quests, player_quest_arcs)
  Arc "Les Marais du Têtard" (4 quêtes narratives)
  3 quêtes standalone répétables (chasse/forge/craft)
  5 achievements liés (quests_completed + quest_arc_completed)
  Event-driven: combat/forge/craft/loot émettent quest.progress
  API: available, active, completed, accept, claim, arcs

Rebalance:
  Endurance coût combat 10→5, regen 6min→3min (20/h), repos 20→10
  Dégâts joueur +3 base (plus de combats de 13 tours au level 1)
  Défaite endurance penalty 50→25
  XP monstres réduite (25→8 Têtard, 130→50 Golem) — quêtes = source principale
This commit is contained in:
2026-03-24 16:34:37 +01:00
parent 93b34b1f7b
commit 7651f3d8aa
16 changed files with 775 additions and 6 deletions

View File

@@ -0,0 +1,38 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
Index,
} from 'typeorm';
import { Character } from '../character/entities/character.entity';
import { QuestArc } from './quest-arc.entity';
@Entity('player_quest_arcs')
@Index(['characterId', 'questArcId'], { unique: true })
export class PlayerQuestArc {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'character_id' })
@Index()
characterId: string;
@ManyToOne(() => Character)
@JoinColumn({ name: 'character_id' })
character: Character;
@Column({ name: 'quest_arc_id' })
questArcId: string;
@ManyToOne(() => QuestArc)
@JoinColumn({ name: 'quest_arc_id' })
questArc: QuestArc;
@Column({ default: false })
completed: boolean;
@Column({ name: 'completed_at', type: 'timestamp', nullable: true })
completedAt: Date | null;
}