combat testing and polishing in the dev console, many bug fixes
This commit is contained in:
@@ -106,6 +106,24 @@ class DatabaseInitService:
|
||||
logger.error("Failed to initialize chat_messages table", error=str(e))
|
||||
results['chat_messages'] = False
|
||||
|
||||
# Initialize combat_encounters table
|
||||
try:
|
||||
self.init_combat_encounters_table()
|
||||
results['combat_encounters'] = True
|
||||
logger.info("Combat encounters table initialized successfully")
|
||||
except Exception as e:
|
||||
logger.error("Failed to initialize combat_encounters table", error=str(e))
|
||||
results['combat_encounters'] = False
|
||||
|
||||
# Initialize combat_rounds table
|
||||
try:
|
||||
self.init_combat_rounds_table()
|
||||
results['combat_rounds'] = True
|
||||
logger.info("Combat rounds table initialized successfully")
|
||||
except Exception as e:
|
||||
logger.error("Failed to initialize combat_rounds table", error=str(e))
|
||||
results['combat_rounds'] = False
|
||||
|
||||
success_count = sum(1 for v in results.values() if v)
|
||||
total_count = len(results)
|
||||
|
||||
@@ -746,6 +764,326 @@ class DatabaseInitService:
|
||||
code=e.code)
|
||||
raise
|
||||
|
||||
def init_combat_encounters_table(self) -> bool:
|
||||
"""
|
||||
Initialize the combat_encounters table for storing combat encounter state.
|
||||
|
||||
Table schema:
|
||||
- sessionId (string, required): Game session ID (FK to game_sessions)
|
||||
- userId (string, required): Owner user ID for authorization
|
||||
- status (string, required): Combat status (active, victory, defeat, fled)
|
||||
- roundNumber (integer, required): Current round number
|
||||
- currentTurnIndex (integer, required): Index in turn_order for current turn
|
||||
- turnOrder (string, required): JSON array of combatant IDs in initiative order
|
||||
- combatantsData (string, required): JSON array of Combatant objects (full state)
|
||||
- combatLog (string, optional): JSON array of all combat log entries
|
||||
- created_at (string, required): ISO timestamp of combat start
|
||||
- ended_at (string, optional): ISO timestamp when combat ended
|
||||
|
||||
Indexes:
|
||||
- idx_sessionId: Session-based lookups
|
||||
- idx_userId_status: User's active combats query
|
||||
- idx_status_created_at: Time-based cleanup queries
|
||||
|
||||
Returns:
|
||||
True if successful
|
||||
|
||||
Raises:
|
||||
AppwriteException: If table creation fails
|
||||
"""
|
||||
table_id = 'combat_encounters'
|
||||
|
||||
logger.info("Initializing combat_encounters table", table_id=table_id)
|
||||
|
||||
try:
|
||||
# Check if table already exists
|
||||
try:
|
||||
self.tables_db.get_table(
|
||||
database_id=self.database_id,
|
||||
table_id=table_id
|
||||
)
|
||||
logger.info("Combat encounters table already exists", table_id=table_id)
|
||||
return True
|
||||
except AppwriteException as e:
|
||||
if e.code != 404:
|
||||
raise
|
||||
logger.info("Combat encounters table does not exist, creating...")
|
||||
|
||||
# Create table
|
||||
logger.info("Creating combat_encounters table")
|
||||
table = self.tables_db.create_table(
|
||||
database_id=self.database_id,
|
||||
table_id=table_id,
|
||||
name='Combat Encounters'
|
||||
)
|
||||
logger.info("Combat encounters table created", table_id=table['$id'])
|
||||
|
||||
# Create columns
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='sessionId',
|
||||
column_type='string',
|
||||
size=255,
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='userId',
|
||||
column_type='string',
|
||||
size=255,
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='status',
|
||||
column_type='string',
|
||||
size=20,
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='roundNumber',
|
||||
column_type='integer',
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='currentTurnIndex',
|
||||
column_type='integer',
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='turnOrder',
|
||||
column_type='string',
|
||||
size=2000, # JSON array of combatant IDs
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='combatantsData',
|
||||
column_type='string',
|
||||
size=65535, # Large text field for JSON combatant array
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='combatLog',
|
||||
column_type='string',
|
||||
size=65535, # Large text field for combat log
|
||||
required=False
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='created_at',
|
||||
column_type='string',
|
||||
size=50, # ISO timestamp format
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='ended_at',
|
||||
column_type='string',
|
||||
size=50, # ISO timestamp format
|
||||
required=False
|
||||
)
|
||||
|
||||
# Wait for columns to fully propagate
|
||||
logger.info("Waiting for columns to propagate before creating indexes...")
|
||||
time.sleep(2)
|
||||
|
||||
# Create indexes
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_sessionId',
|
||||
index_type='key',
|
||||
attributes=['sessionId']
|
||||
)
|
||||
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_userId_status',
|
||||
index_type='key',
|
||||
attributes=['userId', 'status']
|
||||
)
|
||||
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_status_created_at',
|
||||
index_type='key',
|
||||
attributes=['status', 'created_at']
|
||||
)
|
||||
|
||||
logger.info("Combat encounters table initialized successfully", table_id=table_id)
|
||||
return True
|
||||
|
||||
except AppwriteException as e:
|
||||
logger.error("Failed to initialize combat_encounters table",
|
||||
table_id=table_id,
|
||||
error=str(e),
|
||||
code=e.code)
|
||||
raise
|
||||
|
||||
def init_combat_rounds_table(self) -> bool:
|
||||
"""
|
||||
Initialize the combat_rounds table for storing per-round action history.
|
||||
|
||||
Table schema:
|
||||
- encounterId (string, required): FK to combat_encounters
|
||||
- sessionId (string, required): Denormalized for efficient queries
|
||||
- roundNumber (integer, required): Round number (1-indexed)
|
||||
- actionsData (string, required): JSON array of all actions in this round
|
||||
- combatantStatesStart (string, required): JSON snapshot of combatant states at round start
|
||||
- combatantStatesEnd (string, required): JSON snapshot of combatant states at round end
|
||||
- created_at (string, required): ISO timestamp when round completed
|
||||
|
||||
Indexes:
|
||||
- idx_encounterId: Encounter-based lookups
|
||||
- idx_encounterId_roundNumber: Ordered retrieval of rounds
|
||||
- idx_sessionId: Session-based queries
|
||||
- idx_created_at: Time-based cleanup
|
||||
|
||||
Returns:
|
||||
True if successful
|
||||
|
||||
Raises:
|
||||
AppwriteException: If table creation fails
|
||||
"""
|
||||
table_id = 'combat_rounds'
|
||||
|
||||
logger.info("Initializing combat_rounds table", table_id=table_id)
|
||||
|
||||
try:
|
||||
# Check if table already exists
|
||||
try:
|
||||
self.tables_db.get_table(
|
||||
database_id=self.database_id,
|
||||
table_id=table_id
|
||||
)
|
||||
logger.info("Combat rounds table already exists", table_id=table_id)
|
||||
return True
|
||||
except AppwriteException as e:
|
||||
if e.code != 404:
|
||||
raise
|
||||
logger.info("Combat rounds table does not exist, creating...")
|
||||
|
||||
# Create table
|
||||
logger.info("Creating combat_rounds table")
|
||||
table = self.tables_db.create_table(
|
||||
database_id=self.database_id,
|
||||
table_id=table_id,
|
||||
name='Combat Rounds'
|
||||
)
|
||||
logger.info("Combat rounds table created", table_id=table['$id'])
|
||||
|
||||
# Create columns
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='encounterId',
|
||||
column_type='string',
|
||||
size=36, # UUID format: enc_xxxxxxxxxxxx
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='sessionId',
|
||||
column_type='string',
|
||||
size=255,
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='roundNumber',
|
||||
column_type='integer',
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='actionsData',
|
||||
column_type='string',
|
||||
size=65535, # JSON array of action objects
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='combatantStatesStart',
|
||||
column_type='string',
|
||||
size=65535, # JSON snapshot of combatant states
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='combatantStatesEnd',
|
||||
column_type='string',
|
||||
size=65535, # JSON snapshot of combatant states
|
||||
required=True
|
||||
)
|
||||
|
||||
self._create_column(
|
||||
table_id=table_id,
|
||||
column_id='created_at',
|
||||
column_type='string',
|
||||
size=50, # ISO timestamp format
|
||||
required=True
|
||||
)
|
||||
|
||||
# Wait for columns to fully propagate
|
||||
logger.info("Waiting for columns to propagate before creating indexes...")
|
||||
time.sleep(2)
|
||||
|
||||
# Create indexes
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_encounterId',
|
||||
index_type='key',
|
||||
attributes=['encounterId']
|
||||
)
|
||||
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_encounterId_roundNumber',
|
||||
index_type='key',
|
||||
attributes=['encounterId', 'roundNumber']
|
||||
)
|
||||
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_sessionId',
|
||||
index_type='key',
|
||||
attributes=['sessionId']
|
||||
)
|
||||
|
||||
self._create_index(
|
||||
table_id=table_id,
|
||||
index_id='idx_created_at',
|
||||
index_type='key',
|
||||
attributes=['created_at']
|
||||
)
|
||||
|
||||
logger.info("Combat rounds table initialized successfully", table_id=table_id)
|
||||
return True
|
||||
|
||||
except AppwriteException as e:
|
||||
logger.error("Failed to initialize combat_rounds table",
|
||||
table_id=table_id,
|
||||
error=str(e),
|
||||
code=e.code)
|
||||
raise
|
||||
|
||||
def _create_column(
|
||||
self,
|
||||
table_id: str,
|
||||
|
||||
Reference in New Issue
Block a user