feat(backend): Integrate Derived Stats into combat, loot, and crafting mechanics

This commit is contained in:
Joan
2026-02-25 10:05:14 +01:00
parent 185781d168
commit fd94387d54
10 changed files with 727 additions and 101 deletions

View File

@@ -308,6 +308,16 @@ player_statistics = Table(
)
character_perks = Table(
"character_perks",
metadata,
Column("id", Integer, primary_key=True, autoincrement=True),
Column("character_id", Integer, ForeignKey("characters.id", ondelete="CASCADE"), nullable=False),
Column("perk_id", String(50), nullable=False),
Column("acquired_at", Float, nullable=False),
UniqueConstraint("character_id", "perk_id", name="uix_character_perk")
)
# ========================================================================
# QUESTS AND TRADE TABLES
# ========================================================================
@@ -2937,3 +2947,47 @@ async def acknowledge_pvp_combat(combat_id: int, player_id: int) -> bool:
await session.commit()
return True
# ========================================================================
# CHARACTER PERKS
# ========================================================================
async def get_character_perks(character_id: int) -> list:
"""Get all perks owned by a character."""
async with DatabaseSession() as session:
stmt = select(character_perks).where(
character_perks.c.character_id == character_id
)
result = await session.execute(stmt)
return [dict(row._mapping) for row in result.fetchall()]
async def add_character_perk(character_id: int, perk_id: str) -> bool:
"""Add a perk to a character. Returns False if already owned."""
import time
async with DatabaseSession() as session:
try:
stmt = insert(character_perks).values(
character_id=character_id,
perk_id=perk_id,
acquired_at=time.time()
)
await session.execute(stmt)
await session.commit()
return True
except Exception:
return False
async def remove_character_perk(character_id: int, perk_id: str) -> bool:
"""Remove a perk from a character."""
async with DatabaseSession() as session:
stmt = delete(character_perks).where(
character_perks.c.character_id == character_id,
character_perks.c.perk_id == perk_id
)
result = await session.execute(stmt)
await session.commit()
return result.rowcount > 0