From 604ed653c1464a4a087c028071a2f6ab9ee0ee2c Mon Sep 17 00:00:00 2001 From: Joan Date: Sun, 19 Oct 2025 00:32:05 +0200 Subject: [PATCH] Apply visual HP bars to all combat displays - Update combat_handlers.py to show visual enemy and player HP bars - Update action_handlers.py combat encounters with progress bars - Update combat.py attack results with visual HP displays - Add UI_EXAMPLES.md with before/after comparisons - All combat displays now use format_stat_bar() for consistency --- bot/action_handlers.py | 11 +++++------ bot/combat.py | 7 ++++--- bot/combat_handlers.py | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/bot/action_handlers.py b/bot/action_handlers.py index da5597a..0379385 100644 --- a/bot/action_handlers.py +++ b/bot/action_handlers.py @@ -8,6 +8,7 @@ import random from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ContextTypes from . import database, keyboards, logic +from .utils import format_stat_bar from data.world_loader import game_world from data.items import ITEMS @@ -20,8 +21,6 @@ logger = logging.getLogger(__name__) async def get_player_status_text(telegram_id: int) -> str: """Generate player status text with location and stats.""" - from .utils import format_stat_bar - player = await database.get_player(telegram_id) if not player: return "Could not find player data." @@ -124,8 +123,8 @@ async def handle_attack_wandering(query, user_id: int, player: dict, data: list) npc_def = NPCS.get(npc_id) message = f"⚔️ You engage the {npc_def.emoji} {npc_def.name}!\n\n" message += f"{npc_def.description}\n\n" - message += f"{npc_def.emoji} Enemy HP: {combat_data['npc_hp']}/{combat_data['npc_max_hp']}\n" - message += f"❤️ Your HP: {player['hp']}/{player['max_hp']}\n\n" + message += format_stat_bar(f"{npc_def.emoji} Enemy HP", "", combat_data['npc_hp'], combat_data['npc_max_hp']) + "\n" + message += format_stat_bar("Your HP", "❤️", player['hp'], player['max_hp']) + "\n\n" message += "🎯 Your turn! What will you do?" keyboard = await keyboards.combat_keyboard(user_id) @@ -343,8 +342,8 @@ async def handle_move(query, user_id: int, player: dict, data: list): npc_def = NPCS.get(npc_id) message = f"⚠️ A {npc_def.emoji} {npc_def.name} appears!\n\n" message += f"{npc_def.description}\n\n" - message += f"{npc_def.emoji} Enemy HP: {combat_data['npc_hp']}/{combat_data['npc_max_hp']}\n" - message += f"❤️ Your HP: {player['hp']}/{player['max_hp']}\n\n" + message += format_stat_bar(f"{npc_def.emoji} Enemy HP", "", combat_data['npc_hp'], combat_data['npc_max_hp']) + "\n" + message += format_stat_bar("Your HP", "❤️", player['hp'], player['max_hp']) + "\n\n" message += "🎯 Your turn! What will you do?" keyboard = await keyboards.combat_keyboard(user_id) diff --git a/bot/combat.py b/bot/combat.py index b29261d..242abc1 100644 --- a/bot/combat.py +++ b/bot/combat.py @@ -7,6 +7,7 @@ import json import time from typing import Dict, List, Tuple, Optional from bot import database +from bot.utils import format_stat_bar from data.npcs import NPCS, STATUS_EFFECTS from data.items import ITEMS @@ -173,7 +174,7 @@ async def player_attack(player_id: int) -> Tuple[str, bool, bool]: 'player_status_effects': json.dumps(player_effects) }) - message += f"\n{npc_def.emoji} {npc_def.name}: {new_npc_hp}/{combat['npc_max_hp']} HP" + message += "\n" + format_stat_bar(f"{npc_def.emoji} {npc_def.name}", "", new_npc_hp, combat['npc_max_hp']) return (message, False, True) @@ -250,8 +251,8 @@ async def npc_attack(player_id: int) -> Tuple[str, bool]: 'npc_status_effects': json.dumps(npc_effects) }) - message += f"\n❤️ Your HP: {new_player_hp}/{player['max_hp']}" - message += f"\n{npc_def.emoji} {npc_def.name}: {combat['npc_hp']}/{combat['npc_max_hp']} HP" + message += "\n" + format_stat_bar("Your HP", "❤️", new_player_hp, player['max_hp']) + message += "\n" + format_stat_bar(f"{npc_def.emoji} {npc_def.name}", "", combat['npc_hp'], combat['npc_max_hp']) return (message, False) diff --git a/bot/combat_handlers.py b/bot/combat_handlers.py index 085dcd0..3d4fd6c 100644 --- a/bot/combat_handlers.py +++ b/bot/combat_handlers.py @@ -3,6 +3,7 @@ Combat-related action handlers. """ import logging from . import database, keyboards +from .utils import format_stat_bar from data.world_loader import game_world logger = logging.getLogger(__name__) @@ -158,8 +159,8 @@ async def handle_combat_back(query, user_id: int, player: dict): keyboard = await keyboards.combat_keyboard(user_id) message = f"⚔️ Combat with {npc_def.emoji} {npc_def.name}!\n" - message += f"{npc_def.emoji} Enemy HP: {combat_data['npc_hp']}/{combat_data['npc_max_hp']}\n" - message += f"❤️ Your HP: {player['hp']}/{player['max_hp']}\n\n" + message += format_stat_bar(f"{npc_def.emoji} Enemy HP", "", combat_data['npc_hp'], combat_data['npc_max_hp']) + "\n" + message += format_stat_bar("Your HP", "❤️", player['hp'], player['max_hp']) + "\n\n" message += "🎯 Your turn!" if combat_data['turn'] == 'player' else "⏳ Enemy's turn..." from .handlers import send_or_edit_with_image