Files

114 lines
4.4 KiB
Python

import sqlite3
import os
import time
DB_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data", "grimhold.db")
def get_connection():
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
conn = sqlite3.connect(DB_PATH, timeout=30.0)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA foreign_keys = ON;")
conn.execute("PRAGMA journal_mode = WAL;")
conn.execute("PRAGMA busy_timeout = 30000;")
conn.execute("PRAGMA synchronous = NORMAL;")
return conn
def init_db():
conn = get_connection()
with conn:
conn.executescript("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
fortress_name TEXT NOT NULL,
gold REAL NOT NULL DEFAULT 200.0,
ore REAL NOT NULL DEFAULT 100.0,
energy REAL NOT NULL DEFAULT 60.0,
rating INTEGER NOT NULL DEFAULT 1000,
camp_level INTEGER NOT NULL DEFAULT 1,
camp_upgrade_finishes_at REAL NOT NULL DEFAULT 0,
shield_until REAL NOT NULL DEFAULT 0,
max_building_slots INTEGER NOT NULL DEFAULT 8,
last_tick_at REAL NOT NULL,
created_at REAL NOT NULL
);
CREATE TABLE IF NOT EXISTS user_army (
user_id INTEGER NOT NULL,
unit_type TEXT NOT NULL,
pool_count INTEGER NOT NULL DEFAULT 0,
defense_count INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (user_id, unit_type),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS maze_tiles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
x INTEGER NOT NULL,
y INTEGER NOT NULL,
tile_type TEXT NOT NULL, -- 'rock', 'mg', 'cannon', 'ice', 'tesla'
level INTEGER NOT NULL DEFAULT 1,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_id, x, y)
);
CREATE TABLE IF NOT EXISTS machines (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
machine_type TEXT NOT NULL, -- 'drill', 'turbine', 'press'
level INTEGER NOT NULL DEFAULT 1,
upgrade_finishes_at REAL NOT NULL DEFAULT 0,
sabotaged_until REAL NOT NULL DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_id, machine_type)
);
CREATE TABLE IF NOT EXISTS sabotage_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
attacker_id INTEGER NOT NULL,
defender_id INTEGER NOT NULL,
result TEXT NOT NULL,
creeps_leaked INTEGER NOT NULL,
total_creeps INTEGER NOT NULL DEFAULT 0,
units_sent TEXT DEFAULT '',
stolen_gold REAL NOT NULL DEFAULT 0,
stolen_ore REAL NOT NULL DEFAULT 0,
stolen_energy REAL NOT NULL DEFAULT 0,
created_at REAL NOT NULL,
FOREIGN KEY (attacker_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (defender_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS dungeon_runs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
username TEXT NOT NULL,
hero_class TEXT NOT NULL,
floor_reached INTEGER NOT NULL,
hero_level INTEGER NOT NULL DEFAULT 1,
monsters_slain INTEGER NOT NULL DEFAULT 0,
gold_collected INTEGER NOT NULL DEFAULT 0,
turns_count INTEGER NOT NULL DEFAULT 0,
score INTEGER NOT NULL DEFAULT 0,
cause_of_death TEXT NOT NULL,
is_victory INTEGER NOT NULL DEFAULT 0,
created_at REAL NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS dungeon_active_runs (
user_id INTEGER PRIMARY KEY,
hero_class TEXT NOT NULL,
run_state TEXT NOT NULL,
updated_at REAL NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
""")
conn.close()
if __name__ == "__main__":
init_db()
print("Database schema updated successfully at", DB_PATH)