feat(backend): Integrate Derived Stats into combat, loot, and crafting mechanics
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user