93 lines
3.7 KiB
Python
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())
|