WIP: Current state before PVP combat investigation

This commit is contained in:
Joan
2026-02-03 12:19:28 +01:00
parent 7f42fd6b7f
commit 0b0a23f500
36 changed files with 2423 additions and 1472 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, get_locale_string
from ..services.helpers import calculate_distance, calculate_stamina_cost, calculate_player_capacity, get_locale_string, get_game_message
from .. import database as db
from ..items import ItemsManager
from .. import game_logic
@@ -757,7 +757,7 @@ async def move(
if cooldown_remaining > 0:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"You must wait {int(cooldown_remaining)} seconds before moving again."
detail=get_game_message('move_cooldown', locale, seconds=int(cooldown_remaining))
)
# Extract locale from Accept-Language header
@@ -870,7 +870,7 @@ async def move(
response["encounter"] = {
"triggered": True,
"enemy_id": enemy_id,
"message": f"⚠️ An enemy ambushes you upon arrival!",
"message": get_game_message('enemy_ambush', locale),
"combat": combat_data
}
@@ -881,7 +881,7 @@ async def move(
{
"type": "location_update",
"data": {
"message": f"{player['name']} left the area",
"message": get_game_message('player_left', locale, player_name=player['name']),
"action": "player_left",
"player_id": current_user['id'],
"player_name": player['name']
@@ -897,7 +897,7 @@ async def move(
{
"type": "location_update",
"data": {
"message": f"{player['name']} arrived",
"message": get_game_message('player_arrived', locale, player_name=player['name']),
"action": "player_arrived",
"player_id": current_user['id'],
"player_name": player['name'],
@@ -930,8 +930,11 @@ async def move(
@router.post("/api/game/inspect")
async def inspect(current_user: dict = Depends(get_current_user)):
async def inspect(request: Request, current_user: dict = Depends(get_current_user)):
"""Inspect the current area"""
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
location_id = current_user['location_id']
location = LOCATIONS.get(location_id)
@@ -947,7 +950,8 @@ async def inspect(current_user: dict = Depends(get_current_user)):
message = await game_logic.inspect_area(
current_user['id'],
location,
{} # interactables_data - not needed with new structure
{}, # interactables_data - not needed with new structure
locale
)
return {
@@ -971,7 +975,7 @@ async def interact(
if combat:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Cannot interact with objects while in combat"
detail=get_game_message('interact_in_combat', locale)
)
location_id = current_user['location_id']
@@ -988,7 +992,8 @@ async def interact(
interact_req.interactable_id,
interact_req.action_id,
location,
ITEMS_MANAGER
ITEMS_MANAGER,
locale
)
if not result['success']:
@@ -1052,6 +1057,7 @@ async def interact(
@router.post("/api/game/use_item")
async def use_item(
use_req: UseItemRequest,
request: Request,
current_user: dict = Depends(get_current_user)
):
"""Use an item from inventory"""
@@ -1064,10 +1070,14 @@ async def use_item(
combat = await db.get_active_combat(current_user['id'])
in_combat = combat is not None
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
result = await game_logic.use_item(
current_user['id'],
use_req.item_id,
ITEMS_MANAGER
ITEMS_MANAGER,
locale
)
if not result['success']:
@@ -1087,10 +1097,10 @@ async def use_item(
npc_damage = int(npc_damage * 1.5)
new_player_hp = max(0, player['hp'] - npc_damage)
combat_message = f"\n{npc_def.name} attacks for {npc_damage} damage!"
combat_message = get_game_message('combat_enemy_attack', locale, name=npc_def.name, damage=npc_damage)
if new_player_hp <= 0:
combat_message += "\nYou have been defeated!"
combat_message += get_game_message('combat_defeated', locale)
await db.update_player(current_user['id'], hp=0, is_dead=True)
await db.end_combat(current_user['id'])
result['combat_over'] = True
@@ -1149,7 +1159,7 @@ async def use_item(
message={
"type": "location_update",
"data": {
"message": f"{player['name']} was defeated in combat",
"message": get_game_message('player_defeated_broadcast', locale, player_name=player['name']),
"action": "player_died",
"player_id": player['id'],
"corpse": corpse_data # Send full corpse data
@@ -1194,7 +1204,8 @@ async def pickup(
pickup_req.item_id,
current_user['location_id'],
pickup_req.quantity,
ITEMS_MANAGER
ITEMS_MANAGER,
locale
)
if not result['success']:
@@ -1214,7 +1225,7 @@ async def pickup(
{
"type": "location_update",
"data": {
"message": f"{player['name']} picked up {quantity}x {item_name}",
"message": f"{player['name']} {get_game_message('picked_up', locale).lower()} {quantity}x {item_name}",
"action": "item_picked_up"
},
"timestamp": datetime.utcnow().isoformat()
@@ -1336,6 +1347,7 @@ async def get_inventory(current_user: dict = Depends(get_current_user)):
@router.post("/api/game/item/drop")
async def drop_item(
drop_req: dict,
request: Request,
current_user: dict = Depends(get_current_user)
):
"""Drop an item from inventory"""
@@ -1343,6 +1355,9 @@ async def drop_item(
item_id = drop_req.get('item_id') # This is the item_id string like "energy_bar"
quantity = drop_req.get('quantity', 1)
# Extract locale from Accept-Language header
locale = request.headers.get('Accept-Language', 'en')
# Get player to know their location
player = await db.get_player_by_id(player_id)
if not player:
@@ -1400,7 +1415,7 @@ async def drop_item(
message={
"type": "location_update",
"data": {
"message": f"{player['name']} dropped {item_def.emoji} {item_def.name} x{quantity}",
"message": get_game_message('dropped_item_success', locale, emoji=item_def.emoji, name=get_locale_string(item_def.name, locale), qty=quantity).replace('You', player['name']).replace('Has tirado', f"{player['name']} ha tirado"),
"action": "item_dropped"
},
"timestamp": datetime.utcnow().isoformat()
@@ -1410,5 +1425,5 @@ async def drop_item(
return {
"success": True,
"message": f"Dropped {item_def.emoji} {get_locale_string(item_def.name)} x{quantity}"
"message": get_game_message('dropped_item_success', locale, emoji=item_def.emoji, name=get_locale_string(item_def.name, locale), qty=quantity)
}