Pre-combat-rewrite: Backup current state before comprehensive combat frontend rewrite

This commit is contained in:
Joan
2026-01-09 11:07:37 +01:00
parent dc438ae4c1
commit 2875e72b20
29 changed files with 1827 additions and 332 deletions

View File

@@ -12,7 +12,7 @@ import logging
from ..core.security import get_current_user, security, verify_internal_key
from ..services.models import *
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity, get_locale_string, create_combat_message
from .. import database as db
from ..items import ItemsManager
from .. import game_logic
@@ -147,7 +147,7 @@ async def initiate_combat(
await manager.send_personal_message(current_user['id'], {
"type": "combat_started",
"data": {
"message": f"Combat started with {npc_def.name}!",
"message": create_combat_message("combat_start", npc_name=npc_def.name),
"combat": {
"npc_id": enemy.npc_id,
"npc_name": npc_def.name,
@@ -167,7 +167,7 @@ async def initiate_combat(
message={
"type": "location_update",
"data": {
"message": f"{player['name']} entered combat with {npc_def.name}",
"message": f"{player['name']} entered combat with {get_locale_string(npc_def.name)}",
"action": "combat_started",
"player_id": player['id']
},
@@ -178,7 +178,7 @@ async def initiate_combat(
return {
"success": True,
"message": f"Combat started with {npc_def.name}!",
"message": create_combat_message("combat_start", npc_name=npc_def.name),
"combat": {
"npc_id": enemy.npc_id,
"npc_name": npc_def.name,
@@ -304,7 +304,7 @@ async def combat_action(
if new_npc_hp <= 0:
# NPC defeated
result_message += f"{npc_def.name} has been defeated!"
result_message += create_combat_message("victory", npc_name=npc_def.name)
combat_over = True
player_won = True
@@ -435,7 +435,7 @@ async def combat_action(
# Failed to flee, NPC attacks
npc_damage = random.randint(npc_def.damage_min, npc_def.damage_max)
new_player_hp = max(0, player['hp'] - npc_damage)
result_message = f"Failed to flee! {npc_def.name} attacks for {npc_damage} damage!"
result_message = create_combat_message("flee_fail", npc_name=npc_def.name, damage=npc_damage)
if new_player_hp <= 0:
result_message += "\nYou have been defeated!"

View File

@@ -12,7 +12,7 @@ import logging
from ..core.security import get_current_user, security, verify_internal_key
from ..services.models import *
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity, calculate_crafting_stamina_cost
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity, calculate_crafting_stamina_cost, get_locale_string
from .. import database as db
from ..items import ItemsManager
from .. import game_logic
@@ -156,7 +156,7 @@ async def get_craftable_items(current_user: dict = Depends(get_current_user)):
})
# Sort: craftable items first, then by tier, then by name
craftable_items.sort(key=lambda x: (not x['can_craft'], x['tier'], x['name']))
craftable_items.sort(key=lambda x: (not x['can_craft'], x['tier'], get_locale_string(x['name'])))
return {'craftable_items': craftable_items}

View File

@@ -2,7 +2,7 @@
Game Routes router.
Auto-generated from main.py migration.
"""
from fastapi import APIRouter, HTTPException, Depends, status
from fastapi import APIRouter, HTTPException, Depends, status, Request
from fastapi.security import HTTPAuthorizationCredentials
from typing import Optional, Dict, Any
from datetime import datetime
@@ -391,8 +391,11 @@ async def spend_stat_point(
@router.get("/api/game/location")
async def get_current_location(current_user: dict = Depends(get_current_user)):
async def get_current_location(request: Request, current_user: dict = Depends(get_current_user)):
"""Get current location information"""
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
location_id = current_user['location_id']
location = LOCATIONS.get(location_id)
@@ -682,7 +685,7 @@ async def get_current_location(current_user: dict = Depends(get_current_user)):
corpses_data.append({
"id": f"npc_{corpse['id']}",
"type": "npc",
"name": f"{npc_def.name if npc_def else corpse['npc_id']} Corpse",
"name": f"{get_locale_string(npc_def.name, locale) if npc_def else corpse['npc_id']} Corpse",
"emoji": "💀",
"loot_count": len(loot),
"timestamp": corpse['death_timestamp']
@@ -719,6 +722,7 @@ async def get_current_location(current_user: dict = Depends(get_current_user)):
@router.post("/api/game/move")
async def move(
move_req: MoveRequest,
request: Request,
current_user: dict = Depends(get_current_user)
):
"""Move player in a direction"""
@@ -756,10 +760,14 @@ async def move(
detail=f"You must wait {int(cooldown_remaining)} seconds before moving again."
)
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
success, message, new_location_id, stamina_cost, distance = await game_logic.move_player(
current_user['id'],
move_req.direction,
LOCATIONS
LOCATIONS,
locale
)
if not success:
@@ -951,9 +959,13 @@ async def inspect(current_user: dict = Depends(get_current_user)):
@router.post("/api/game/interact")
async def interact(
interact_req: InteractRequest,
request: Request,
current_user: dict = Depends(get_current_user)
):
"""Interact with an object"""
"""Interact with an object in the game world"""
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
# Check if player is in combat
combat = await db.get_active_combat(current_user['id'])
if combat:
@@ -1026,7 +1038,7 @@ async def interact(
"instance_id": interact_req.interactable_id,
"action_id": interact_req.action_id,
"cooldown_remaining": cooldown_remaining,
"message": f"{current_user['name']} used {action_display} on {interactable_name}"
"message": f"{current_user['name']} used {get_locale_string(action_display, locale)} on {get_locale_string(interactable_name, locale)}"
},
"timestamp": datetime.utcnow().isoformat()
}
@@ -1035,6 +1047,8 @@ async def interact(
return result
@router.post("/api/game/use_item")
async def use_item(
use_req: UseItemRequest,
@@ -1159,15 +1173,19 @@ async def use_item(
@router.post("/api/game/pickup")
async def pickup(
pickup_req: PickupItemRequest,
request: Request,
current_user: dict = Depends(get_current_user)
):
"""Pick up an item from the ground"""
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
# Get item details for broadcast BEFORE picking it up (it will be removed from DB)
# pickup_req.item_id is the dropped_item database ID, not the item_id string
dropped_item = await db.get_dropped_item(pickup_req.item_id)
if dropped_item:
item_def = ITEMS_MANAGER.get_item(dropped_item['item_id'])
item_name = item_def.name if item_def else dropped_item['item_id']
item_name = get_locale_string(item_def.name, locale) if item_def else dropped_item['item_id']
else:
item_name = "item"
@@ -1392,5 +1410,5 @@ async def drop_item(
return {
"success": True,
"message": f"Dropped {item_def.emoji} {item_def.name} x{quantity}"
"message": f"Dropped {item_def.emoji} {get_locale_string(item_def.name)} x{quantity}"
}

View File

@@ -12,7 +12,7 @@ import logging
from ..core.security import get_current_user, security, verify_internal_key
from ..services.models import *
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity, get_locale_string
from .. import database as db
from ..items import ItemsManager
from .. import game_logic
@@ -310,13 +310,13 @@ async def loot_corpse(
message_parts = []
for item in looted_items:
item_def = ITEMS_MANAGER.get_item(item['item_id'])
item_name = item_def.name if item_def else item['item_id']
item_name = get_locale_string(item_def.name) if item_def else item['item_id']
message_parts.append(f"{item_def.emoji if item_def else ''} {item_name} x{item['quantity']}")
dropped_parts = []
for item in dropped_items:
item_def = ITEMS_MANAGER.get_item(item['item_id'])
item_name = item_def.name if item_def else item['item_id']
item_name = get_locale_string(item_def.name) if item_def else item['item_id']
dropped_parts.append(f"{item.get('emoji', '📦')} {item_name} x{item['quantity']}")
message = ""
@@ -438,13 +438,13 @@ async def loot_corpse(
message_parts = []
for item in looted_items:
item_def = ITEMS_MANAGER.get_item(item['item_id'])
item_name = item_def.name if item_def else item['item_id']
item_name = get_locale_string(item_def.name) if item_def else item['item_id']
message_parts.append(f"{item_def.emoji if item_def else ''} {item_name} x{item['quantity']}")
dropped_parts = []
for item in dropped_items:
item_def = ITEMS_MANAGER.get_item(item['item_id'])
item_name = item_def.name if item_def else item['item_id']
item_name = get_locale_string(item_def.name) if item_def else item['item_id']
dropped_parts.append(f"{item.get('emoji', '📦')} {item_name} x{item['quantity']}")
message = ""