The hunt screen kept whatever roll was last in memory, so a player coming back from a fight saw every encounter as fresh. Encounters now carry their own status, which the combat module advances as fights start and end. - hunt_encounters.status replaces consumed_at, which only recorded that a fight had begun and could not distinguish a win from a loss - a lost fight hands the encounter back as AVAILABLE, so it can be retried; the unique index tying one combat to one encounter goes with it - GET /hunts/active serves the resumable hunt, which the hunt page adopts on entry rather than trusting its in-memory roll - defeated encounters are crossed out and lose their hover and attack action - a fresh page load rejoins a combat the server still holds open Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
44 lines
1.1 KiB
HTML
44 lines
1.1 KiB
HTML
<article class="encounter-card" [class.encounter-card--settled]="settled">
|
|
<div class="encounter-card__crest">
|
|
@if (iconPath(); as icon) {
|
|
<img class="encounter-card__crest-icon" [src]="icon" alt="" loading="lazy" decoding="async" />
|
|
}
|
|
</div>
|
|
|
|
<div class="encounter-card__artwork-frame">
|
|
<img
|
|
class="encounter-card__artwork"
|
|
[src]="artworkPath()"
|
|
[alt]="encounter.monster.name"
|
|
loading="lazy"
|
|
decoding="async"
|
|
/>
|
|
|
|
@if (defeated) {
|
|
<img
|
|
class="encounter-card__defeated-mark"
|
|
[src]="defeatedMark"
|
|
alt="Besiegt"
|
|
loading="lazy"
|
|
decoding="async"
|
|
/>
|
|
}
|
|
</div>
|
|
|
|
<h3 class="encounter-card__name">{{ encounter.monster.name }}</h3>
|
|
|
|
<div class="encounter-card__meta">
|
|
<span class="encounter-card__level">Stufe {{ encounter.monster.level }}</span>
|
|
<app-danger-badge class="encounter-card__danger" [rating]="encounter.dangerRating" />
|
|
</div>
|
|
|
|
<button
|
|
type="button"
|
|
class="encounter-card__attack"
|
|
[disabled]="settled"
|
|
(click)="onAttack()"
|
|
>
|
|
{{ actionLabel }}
|
|
</button>
|
|
</article>
|