- Create api/services/combat_engine.py with all shared combat logic - Rewrite combat.py from 2820 to ~600 lines (thin orchestration) - Fix buff consumption: fortify, berserker_rage, evade, foresight, iron_skin now actually work - Fix stun: PvE skills now write stun to npc_status_effects - Fix skill damage: now uses stats.attack_power consistently (includes perks) - Fix PvPCombatActionRequest: add skill_id field for proper PvP skill support - Remove dead code: PvP skill/item blocks copy-pasted into PvE endpoint - Update game_logic.npc_attack to check buff modifiers (dodge, damage reduction, etc.)
136 lines
3.3 KiB
Python
136 lines
3.3 KiB
Python
"""
|
|
Pydantic models for request/response validation.
|
|
All API request and response models are defined here.
|
|
"""
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
|
|
|
|
# ============================================================================
|
|
# Authentication Models
|
|
# ============================================================================
|
|
|
|
class UserRegister(BaseModel):
|
|
email: str
|
|
password: str
|
|
|
|
|
|
class UserLogin(BaseModel):
|
|
email: str
|
|
password: str
|
|
|
|
|
|
class ChangeEmailRequest(BaseModel):
|
|
current_password: str
|
|
new_email: str
|
|
|
|
|
|
class ChangePasswordRequest(BaseModel):
|
|
current_password: str
|
|
new_password: str
|
|
|
|
|
|
|
|
# ============================================================================
|
|
# Character Models
|
|
# ============================================================================
|
|
|
|
class CharacterCreate(BaseModel):
|
|
name: str
|
|
strength: int = 0
|
|
agility: int = 0
|
|
endurance: int = 0
|
|
intellect: int = 0
|
|
avatar_data: Optional[str] = None
|
|
|
|
|
|
class CharacterSelect(BaseModel):
|
|
character_id: int
|
|
|
|
|
|
# ============================================================================
|
|
# Game Action Models
|
|
# ============================================================================
|
|
|
|
class MoveRequest(BaseModel):
|
|
direction: str
|
|
|
|
|
|
class InteractRequest(BaseModel):
|
|
interactable_id: str
|
|
action_id: str
|
|
|
|
|
|
class UseItemRequest(BaseModel):
|
|
item_id: str
|
|
|
|
|
|
class PickupItemRequest(BaseModel):
|
|
item_id: int # dropped_item database ID
|
|
quantity: int = 1
|
|
|
|
|
|
# ============================================================================
|
|
# Combat Models
|
|
# ============================================================================
|
|
|
|
class InitiateCombatRequest(BaseModel):
|
|
enemy_id: int # wandering_enemies.id
|
|
|
|
|
|
class CombatActionRequest(BaseModel):
|
|
action: str # 'attack', 'skill', 'flee', 'use_item'
|
|
item_id: Optional[str] = None # For use_item action
|
|
skill_id: Optional[str] = None # For skill action
|
|
|
|
|
|
class PvPCombatInitiateRequest(BaseModel):
|
|
target_player_id: int
|
|
|
|
|
|
class PvPAcknowledgeRequest(BaseModel):
|
|
combat_id: int
|
|
|
|
|
|
class PvPCombatActionRequest(BaseModel):
|
|
action: str # 'attack', 'skill', 'flee', 'use_item'
|
|
item_id: Optional[str] = None # For use_item action
|
|
skill_id: Optional[str] = None # For skill action
|
|
|
|
|
|
# ============================================================================
|
|
# Equipment Models
|
|
# ============================================================================
|
|
|
|
class EquipItemRequest(BaseModel):
|
|
inventory_id: int
|
|
|
|
|
|
class UnequipItemRequest(BaseModel):
|
|
slot: str
|
|
|
|
|
|
class RepairItemRequest(BaseModel):
|
|
inventory_id: int
|
|
|
|
|
|
# ============================================================================
|
|
# Crafting Models
|
|
# ============================================================================
|
|
|
|
class CraftItemRequest(BaseModel):
|
|
item_id: str
|
|
|
|
|
|
class UncraftItemRequest(BaseModel):
|
|
inventory_id: int
|
|
|
|
|
|
# ============================================================================
|
|
# Corpse/Loot Models
|
|
# ============================================================================
|
|
|
|
class LootCorpseRequest(BaseModel):
|
|
corpse_id: str # Format: "npc_{id}" or "player_{id}"
|
|
item_index: Optional[int] = None # Specific item index to loot, or None for all
|