feat: Combat tour par tour — Phases A-D complètes

TurnManager stateless avec sessions en mémoire (TTL 10min).
SpellSystem : 15 sorts (5 par voie du Dao), mana, cooldowns, buffs/debuffs.
CompanionAI : Mira (heal/support) et Vell (tank/dps) — IA contextuelle.
Monster AI : 3 profils (agressif, défensif, chaotique).

Nouvelles entités : Spell, PlayerSpell, PlayerDaoPath.
Character +mana. Monster +aiProfile +isBoss.
Migration : 1743004800000-TurnCombatSystem.

Frontend : TurnCombatPage (select/combat/result), sélecteur compagnon,
barres HP/MP, log scrollable, sous-menu sorts avec cooldowns.

Endpoints : 8 routes sous /combat/turn/ (start, action, session, spells,
unlocked, unlock, dao, dao/choose).

Combat simple (POST /combat/start) et grind ×5/×10 inchangés.
This commit is contained in:
2026-03-25 00:58:47 +01:00
parent 4beb1b2ed9
commit 9d50adf523
21 changed files with 2904 additions and 5 deletions

View File

@@ -0,0 +1,35 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
CreateDateColumn,
Unique,
} from 'typeorm';
import { Character } from '../../character/entities/character.entity';
import { Spell } from './spell.entity';
@Entity('player_spells')
@Unique(['characterId', 'spellId'])
export class PlayerSpell {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'character_id' })
characterId: string;
@ManyToOne(() => Character)
@JoinColumn({ name: 'character_id' })
character: Character;
@Column({ name: 'spell_id' })
spellId: string;
@ManyToOne(() => Spell)
@JoinColumn({ name: 'spell_id' })
spell: Spell;
@CreateDateColumn({ name: 'unlocked_at' })
unlockedAt: Date;
}