Initial commit
This commit is contained in:
128
hsbg_ai/backend/database/models.py
Normal file
128
hsbg_ai/backend/database/models.py
Normal file
@@ -0,0 +1,128 @@
|
||||
"""Modèles SQLAlchemy - Base de données HSBG AI."""
|
||||
from datetime import datetime
|
||||
from sqlalchemy import (
|
||||
Column, Integer, String, Float, Boolean, Text,
|
||||
DateTime, JSON, ForeignKey
|
||||
)
|
||||
from sqlalchemy.orm import DeclarativeBase, relationship
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
class Hero(Base):
|
||||
__tablename__ = "heroes"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
card_id = Column(String(64), unique=True, index=True, nullable=False)
|
||||
name = Column(String(128), nullable=False)
|
||||
hero_power = Column(Text, default="")
|
||||
hp_cost = Column(Integer, default=0)
|
||||
hp_cooldown = Column(Integer, default=0)
|
||||
description = Column(Text, default="")
|
||||
strengths = Column(JSON, default=list)
|
||||
weaknesses = Column(JSON, default=list)
|
||||
synergies = Column(JSON, default=list)
|
||||
tier_rating = Column(Float, default=5.0)
|
||||
patch_added = Column(String(16), default="")
|
||||
is_active = Column(Boolean, default=True)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
|
||||
class Minion(Base):
|
||||
__tablename__ = "minions"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
card_id = Column(String(64), unique=True, index=True, nullable=False)
|
||||
name = Column(String(128), nullable=False)
|
||||
tier = Column(String(2), nullable=False, default="1")
|
||||
race = Column(JSON, default=list)
|
||||
attack = Column(Integer, default=0)
|
||||
health = Column(Integer, default=0)
|
||||
tavern_cost = Column(Integer, default=3)
|
||||
is_golden = Column(Boolean, default=False)
|
||||
has_divine = Column(Boolean, default=False)
|
||||
has_taunt = Column(Boolean, default=False)
|
||||
has_windfury = Column(Boolean, default=False)
|
||||
has_poisonous = Column(Boolean, default=False)
|
||||
has_reborn = Column(Boolean, default=False)
|
||||
battlecry = Column(Text, default="")
|
||||
deathrattle = Column(Text, default="")
|
||||
on_attack = Column(Text, default="")
|
||||
passive = Column(Text, default="")
|
||||
synergies = Column(JSON, default=list)
|
||||
keywords = Column(JSON, default=list)
|
||||
patch_added = Column(String(16), default="")
|
||||
is_active = Column(Boolean, default=True)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
|
||||
class Spell(Base):
|
||||
__tablename__ = "spells"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
card_id = Column(String(64), unique=True, index=True, nullable=False)
|
||||
name = Column(String(128), nullable=False)
|
||||
tier = Column(String(2), default="1")
|
||||
cost = Column(Integer, default=0)
|
||||
effect = Column(Text, default="")
|
||||
target = Column(String(64), default="minion")
|
||||
keywords = Column(JSON, default=list)
|
||||
is_active = Column(Boolean, default=True)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
|
||||
|
||||
class GameSession(Base):
|
||||
__tablename__ = "game_sessions"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
started_at = Column(DateTime, default=datetime.utcnow)
|
||||
ended_at = Column(DateTime, nullable=True)
|
||||
hero_id = Column(Integer, ForeignKey("heroes.id"), nullable=True)
|
||||
final_place = Column(Integer, nullable=True)
|
||||
total_turns = Column(Integer, default=0)
|
||||
is_active = Column(Boolean, default=True)
|
||||
session_meta = Column(JSON, default=dict)
|
||||
hero = relationship("Hero")
|
||||
decisions = relationship("AIDecision", back_populates="session")
|
||||
|
||||
|
||||
class AIDecision(Base):
|
||||
__tablename__ = "ai_decisions"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
session_id = Column(Integer, ForeignKey("game_sessions.id"), nullable=False)
|
||||
turn = Column(Integer, default=0)
|
||||
phase = Column(String(32), default="recruit")
|
||||
game_state = Column(JSON, default=dict)
|
||||
recommendation = Column(JSON, default=dict)
|
||||
reasoning = Column(Text, default="")
|
||||
confidence = Column(Float, default=0.5)
|
||||
was_followed = Column(Boolean, nullable=True)
|
||||
outcome_rating = Column(Integer, nullable=True)
|
||||
user_feedback = Column(Text, nullable=True)
|
||||
better_decision = Column(JSON, nullable=True)
|
||||
model_used = Column(String(64), default="heuristic")
|
||||
processing_ms = Column(Integer, default=0)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
session = relationship("GameSession", back_populates="decisions")
|
||||
|
||||
|
||||
class LearningFeedback(Base):
|
||||
__tablename__ = "learning_feedback"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
decision_id = Column(Integer, ForeignKey("ai_decisions.id"), nullable=False)
|
||||
rating = Column(String(8), default="neutral")
|
||||
better_action = Column(JSON, nullable=True)
|
||||
comment = Column(Text, nullable=True)
|
||||
trained = Column(Boolean, default=False)
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
decision = relationship("AIDecision")
|
||||
|
||||
|
||||
class Patch(Base):
|
||||
__tablename__ = "patches"
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
version = Column(String(16), unique=True, nullable=False)
|
||||
release_date = Column(DateTime)
|
||||
changes = Column(JSON, default=dict)
|
||||
notes = Column(Text, default="")
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
Reference in New Issue
Block a user