What a mess
This commit is contained in:
92
migrations/migrate_equipment_system.py
Normal file
92
migrations/migrate_equipment_system.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
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())
|
||||
Reference in New Issue
Block a user