feat(api): mirror HP onto the character each round and resume regen at combat end

This commit is contained in:
Bastian Wagner
2026-08-21 15:08:04 +02:00
parent ac1329be46
commit b070bf2b0d
2 changed files with 51 additions and 4 deletions

View File

@@ -225,7 +225,7 @@ export class CombatService {
// no-op re-lock — but locking it first here keeps both code paths
// consistent and avoids a lock-order inversion that could deadlock two
// concurrent requests against the same character. Do not reorder this.
await this.lockCharacter(characters, characterId);
const character = await this.lockCharacter(characters, characterId);
const combat = await combats.findOne({
where: { id: combatId, characterId },
@@ -253,12 +253,16 @@ export class CombatService {
combat.monsterState = result.state.monster.stats;
if (combat.status !== CombatStatus.ACTIVE) {
combat.completedAt = new Date();
this.characterVitals.resume(character, combat.playerCurrentHp);
await this.settleEncounter(
manager.getRepository(HuntEncounter),
combat.huntEncounterId,
combat.status,
);
} else {
this.characterVitals.pause(character, combat.playerCurrentHp);
}
await characters.save(character);
await combats.save(combat);
const startingSequence = await combatEvents.count({
@@ -286,7 +290,7 @@ export class CombatService {
? await this.combatRewards.grantVictoryRewards(manager, combat)
: null;
const [character, monster, events] = await Promise.all([
const [reloadedCharacter, monster, events] = await Promise.all([
this.loadCharacter(
combat.characterId,
manager.getRepository(Character),
@@ -298,7 +302,7 @@ export class CombatService {
this.loadEvents(combat.id, combatEvents),
]);
return this.toCombatDto(combat, character.name, monster, events, rewards);
return this.toCombatDto(combat, reloadedCharacter.name, monster, events, rewards);
});
}