Files
echoes-of-the-ash/migrations/migrate_equipment_system.py
2025-11-07 15:27:13 +01:00

93 lines
3.7 KiB
Python

"""
Migration script for equipment system
Adds equipment slots, encumbrance stat, and item durability/tier system
"""
import asyncio
import sys
sys.path.insert(0, '/app')
from api import database as db
async def migrate():
"""Add equipment system to database"""
await db.init_db()
try:
async with db.DatabaseSession() as session:
print("🔄 Starting equipment system migration...")
# 1. Add encumbrance to players table
print("📊 Adding encumbrance stat to players...")
await session.execute(db.text("""
ALTER TABLE players
ADD COLUMN IF NOT EXISTS encumbrance INTEGER DEFAULT 0;
"""))
# 2. Create equipment_slots table
print("🎽 Creating equipment_slots table...")
await session.execute(db.text("""
CREATE TABLE IF NOT EXISTS equipment_slots (
player_id INTEGER REFERENCES players(id) ON DELETE CASCADE,
slot_type VARCHAR(20) NOT NULL,
item_id INTEGER REFERENCES inventory(id) ON DELETE SET NULL,
PRIMARY KEY (player_id, slot_type),
CONSTRAINT valid_slot_type CHECK (slot_type IN (
'head', 'torso', 'legs', 'feet', 'weapon', 'offhand', 'backpack'
))
);
"""))
# 3. Add durability and tier columns to inventory
print("🔧 Adding durability and tier to inventory...")
await session.execute(db.text("""
ALTER TABLE inventory
ADD COLUMN IF NOT EXISTS durability INTEGER,
ADD COLUMN IF NOT EXISTS max_durability INTEGER,
ADD COLUMN IF NOT EXISTS tier INTEGER DEFAULT 1,
ADD COLUMN IF NOT EXISTS unique_stats JSONB;
"""))
# 4. Add is_equipped flag if not exists (should exist, but just in case)
print("📌 Ensuring is_equipped column exists...")
await session.execute(db.text("""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='inventory' AND column_name='is_equipped'
) THEN
ALTER TABLE inventory ADD COLUMN is_equipped BOOLEAN DEFAULT FALSE;
END IF;
END $$;
"""))
await session.commit()
# 5. Initialize equipment slots for all existing players
print("👤 Initializing equipment slots for existing players...")
result = await session.execute(db.text("SELECT id FROM players"))
players = result.fetchall()
slots = ['head', 'torso', 'legs', 'feet', 'weapon', 'offhand', 'backpack']
for player in players:
player_id = player[0]
for slot in slots:
await session.execute(db.text("""
INSERT INTO equipment_slots (player_id, slot_type, item_id)
VALUES (:player_id, :slot_type, NULL)
ON CONFLICT (player_id, slot_type) DO NOTHING
"""), {"player_id": player_id, "slot_type": slot})
await session.commit()
print(f"✅ Initialized equipment slots for {len(players)} players")
print("✅ Equipment system migration completed successfully!")
except Exception as e:
print(f"❌ Error during migration: {e}")
raise
if __name__ == "__main__":
asyncio.run(migrate())