Combat foundation complete

This commit is contained in:
2025-11-27 22:18:58 -06:00
parent dd92cf5991
commit 6d3fb63355
33 changed files with 1870 additions and 85 deletions

View File

@@ -36,7 +36,7 @@ def combat_view(session_id: str):
# Check if combat is still active
if not result.get('in_combat'):
# Combat ended - redirect to game play
return redirect(url_for('game.play', session_id=session_id))
return redirect(url_for('game.play_session', session_id=session_id))
encounter = result.get('encounter') or {}
combat_log = result.get('combat_log', [])
@@ -171,9 +171,11 @@ def combat_action(session_id: str):
# Add any effect entries
for effect in result.get('effects_applied', []):
# API may use "name" or "effect" key for the effect name
effect_name = effect.get('name') or effect.get('effect') or 'Unknown'
log_entries.append({
'actor': '',
'message': effect.get('message', f'Effect applied: {effect.get("name")}'),
'message': effect.get('message', f'Effect applied: {effect_name}'),
'type': 'system'
})
@@ -417,15 +419,25 @@ def combat_flee(session_id: str):
result = response.get('result', {})
if result.get('success'):
# Flee successful - redirect to play page
return redirect(url_for('game.play_session', session_id=session_id))
# Flee successful - use HX-Redirect for HTMX
resp = make_response(f'''
<div class="combat-log__entry combat-log__entry--system">
<span class="log-message">{result.get('message', 'You fled from combat!')}</span>
</div>
''')
resp.headers['HX-Redirect'] = url_for('game.play_session', session_id=session_id)
return resp
else:
# Flee failed - return log entry
return f'''
# Flee failed - return log entry, trigger enemy turn
resp = make_response(f'''
<div class="combat-log__entry combat-log__entry--system">
<span class="log-message">{result.get('message', 'Failed to flee!')}</span>
</div>
'''
''')
# Failed flee consumes turn, so trigger enemy turn if needed
if not result.get('next_is_player', True):
resp.headers['HX-Trigger'] = 'enemyTurn'
return resp
except APIError as e:
logger.error("flee_failed", session_id=session_id, error=str(e))
@@ -468,18 +480,19 @@ def combat_enemy_turn(session_id: str):
)
# Format enemy action for log
action_result = result.get('action_result', {})
# API returns ActionResult directly in result, not nested under action_result
log_entries = [{
'actor': action_result.get('actor_name', 'Enemy'),
'message': action_result.get('message', 'attacks'),
'actor': 'Enemy',
'message': result.get('message', 'attacks'),
'type': 'enemy',
'is_crit': action_result.get('is_critical', False)
'is_crit': False
}]
# Add damage info
damage_results = action_result.get('damage_results', [])
# Add damage info - API returns total_damage, not damage
damage_results = result.get('damage_results', [])
if damage_results:
log_entries[0]['damage'] = damage_results[0].get('damage')
log_entries[0]['damage'] = damage_results[0].get('total_damage')
log_entries[0]['is_crit'] = damage_results[0].get('is_critical', False)
# Check if it's still enemy turn (multiple enemies)
resp = make_response(render_template(