Skip to content

[Gameplay] Fair Failure States — Desperation Strike, Death Hints & Enhanced Defeat Recap - #610

Merged
niyazmft merged 1 commit into
mainfrom
feat/fair-failure-states
Jul 13, 2026
Merged

niyazmft merged 1 commit into
mainfrom
feat/fair-failure-states

Conversation

@niyazmft

Copy link
Copy Markdown
Owner

Summary

Makes failed runs feel meaningful by adding a last-resort Desperation Strike, contextual death hints on the defeat screen, and expanded post-death stats.

Problem

Community research shows #3 complaint is unfair failure states. Players accept death if they learn something. They rage-quit if they lose to UI ambiguity or a single unrecoverable mistake.

Changes

Desperation Strike

  • When it appears: Player HP drops to ≤ 25% during player turn
  • What it does: Deals 2x damage to the nearest enemy, costs all remaining AP
  • Limitation: Single-use per run
  • UI: Red "Desperation" button appears in the action bar; hidden after use
  • Implementation: CombatRoom finds nearest alive enemy, computes damage via CombatFormula, applies via EntityLifecycle

Death Hints / Persistent Knowledge

  • config/death_hints.json: 6 contextual hints with triggers:
    Trigger Hint
    elevation_damage "Elevation affects both damage dealt and received. High ground is worth fighting for."
    cover_ignored "Cover tiles reduce incoming damage. Positioning matters as much as attacking."
    died_without_desperation "When HP drops below 25%, a Desperation Strike becomes available..."
    ap_management "AP regenerates each turn, but spending it all leaves you defenseless."
    elite_priority "Elite enemies amplify nearby foes. Consider eliminating them first."
    combo_unlock "Elemental combos multiply damage. Unlock new abilities in the Sanctum..."
  • Hint is selected based on room state (damage taken, desperation availability)
  • Shown on defeat screen with gold text and 💡 icon

Enhanced Defeat Stats

  • New tracked stat: Damage taken this room
  • Defeat modal now shows: turns survived, rooms cleared, enemies killed, damage taken

SettingsManager

  • Added get_value(category, key, fallback) convenience getter

Behavior

Situation Result
Player HP drops to 20% Red "Desperation" button appears in action bar
Player uses Desperation Strike Nearest enemy takes 2x damage; all AP consumed; button hidden for rest of run
Player dies without using desperation Defeat screen shows hint about Desperation Strike
Player takes heavy damage while on low ground Defeat screen shows hint about elevation

Technical Notes

  • Desperation damage uses existing CombatFormula.compute_damage_from_entities() for determinism
  • Button visibility is reactive to hp_changed signal on the player entity
  • Death hint selection is deterministic based on room state, not random

Testing

  • 406 tests | 0 errors | 0 failures | 76/76 suites
  • Headless editor scan: clean

Related Issues

Closes #600

…hanced defeat recap

## Summary

Makes failed runs feel meaningful by adding a last-resort Desperation Strike,
contextual death hints on the defeat screen, and expanded post-death stats.

## Changes

### Desperation Strike
- BottomConsole: Added DesperationButton (hidden by default)
- Shows when player HP drops to 25% or below during player turn
- Deals 2x damage to nearest enemy, costs all AP
- Single-use per run; button hidden after use
- CombatHUD: Wired desperation_pressed signal through to CombatRoom
- CombatRoom._on_desperation_pressed(): Finds nearest enemy, computes 2x
  damage via CombatFormula, applies damage, consumes all AP

### Death Hints / Persistent Knowledge
- config/death_hints.json: 6 contextual hints with triggers
  - elevation_damage, cover_ignored, ap_management, desperation,
    elite_priority, combo_unlock
- CombatRoom._select_death_hint(): Chooses hint based on room state
  (damage taken, whether desperation was available, etc.)
- DefeatModal._update_summary_display(): Shows hint with gold text

### Enhanced Defeat Stats
- CombatRoom now tracks _room_damage_taken via _on_player_hp_changed
- Defeat modal shows: turns, rooms, kills, damage taken
- New localization keys: HUD_SUMMARY_DAMAGE, HINT_* (6 hints)

### SettingsManager
- Added get_value(category, key, fallback) convenience getter

### Tests
- test_desperation_move.gd: 3 cases for hidden default, low-HP reveal,
  post-use hiding

## Testing

- 406 tests | 0 errors | 0 failures | 76/76 suites
- Headless editor scan: clean

Closes #600
@niyazmft
niyazmft merged commit bc66102 into main Jul 13, 2026
5 checks passed
@niyazmft
niyazmft deleted the feat/fair-failure-states branch July 13, 2026 16:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Gameplay] Implement Fair Failure States — Failed Runs Must Feel Meaningful (GAME-LOOP-2)

1 participant