667 lines
20 KiB
PHP
667 lines
20 KiB
PHP
<?php
|
|
|
|
/*
|
|
This script is used to create the database and the tables for said database.
|
|
php create.php <database>
|
|
*/
|
|
|
|
require_once __DIR__ . '/../../color.php';
|
|
|
|
const AUTH = 'auth.db';
|
|
const LIVE = 'live.db';
|
|
const FIGHTS = 'fights.db';
|
|
const BPS = 'blueprints.db';
|
|
|
|
/**
|
|
* Echo a string with a newline.
|
|
*/
|
|
function eln($string)
|
|
{
|
|
echo $string . PHP_EOL;
|
|
}
|
|
|
|
// pick the database to create
|
|
if (!isset($argv[1])) {
|
|
eln(red('Missing database name.'));
|
|
eln(blue('Usage: ') . 'php create.php auth.db|live.db|fight.db|blueprints.db [-d]');
|
|
exit(1);
|
|
}
|
|
|
|
// make sure it's a valid database
|
|
if (!in_array($argv[1], [AUTH, LIVE, FIGHTS, BPS, 'reset'])) {
|
|
eln(red('Invalid database: ') . $argv[1]);
|
|
exit(1);
|
|
}
|
|
|
|
$database = $argv[1];
|
|
// whether the -d flag is set
|
|
$drop = isset($argv[2]) && $argv[2] === '-d';
|
|
|
|
/*
|
|
================================================================================
|
|
Databases
|
|
================================================================================
|
|
*/
|
|
|
|
/*
|
|
The Auth database is used to store user information - not player info, but user info.
|
|
Usernames, passwords, email, session tokens, etc.
|
|
*/
|
|
if ($database === AUTH || $database === 'reset') {
|
|
if ($drop || $database === 'reset') {
|
|
unlink(__DIR__ . '/../' . AUTH);
|
|
eln(red('Dropped database: ') . 'auth.db');
|
|
}
|
|
$db = new SQLite3(__DIR__ . '/../' . AUTH);
|
|
|
|
// Users table
|
|
$db->exec('DROP TABLE IF EXISTS users');
|
|
$r = $db->exec('CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT NOT NULL UNIQUE,
|
|
email TEXT NOT NULL UNIQUE,
|
|
password TEXT NOT NULL,
|
|
auth INT NOT NULL DEFAULT 0,
|
|
char_id INTEGER NOT NULL DEFAULT 0,
|
|
char_slots INTEGER NOT NULL DEFAULT 300,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
last_login DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
|
|
created_or_error($r, 'users');
|
|
|
|
// Sessions table
|
|
$db->exec('DROP TABLE IF EXISTS sessions');
|
|
$r = $db->exec('CREATE TABLE sessions (
|
|
user_id INTEGER NOT NULL,
|
|
token TEXT NOT NULL UNIQUE,
|
|
expires INTEGER NOT NULL
|
|
)');
|
|
$db->exec('CREATE INDEX idx_sessions_user_id ON sessions (user_id)');
|
|
|
|
created_or_error($r, 'sessions');
|
|
|
|
// Verification tokens
|
|
$db->exec('DROP TABLE IF EXISTS tokens');
|
|
$r = $db->exec('CREATE TABLE tokens (
|
|
user_id INTEGER NOT NULL,
|
|
token TEXT NOT NULL UNIQUE,
|
|
created INTEGER NOT NULL
|
|
)');
|
|
$db->exec('CREATE INDEX idx_tokens_user_id ON tokens (user_id)');
|
|
|
|
created_or_error($r, 'tokens');
|
|
|
|
eln(green('Created database: ') . 'auth.db');
|
|
|
|
if ($database !== 'reset') exit(0);
|
|
}
|
|
|
|
/*
|
|
The Fights database is used to store information about fights.
|
|
A fight is a battle between two characters; players or NPCs.
|
|
*/
|
|
if ($database === FIGHTS || $database === 'reset') {
|
|
if ($drop || $database === 'reset') {
|
|
unlink(__DIR__ . '/../' . FIGHTS);
|
|
eln(red('Dropped database: ') . 'fights.db');
|
|
}
|
|
$db = new SQLite3(__DIR__ . '/../' . FIGHTS);
|
|
|
|
// PvE fights
|
|
$db->exec('DROP TABLE IF EXISTS pve');
|
|
$r = $db->exec('CREATE TABLE pve (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
char_id INTEGER NOT NULL,
|
|
char_hp INTEGER NOT NULL,
|
|
char_max_hp INTEGER NOT NULL,
|
|
char_mp INTEGER NOT NULL,
|
|
char_max_mp INTEGER NOT NULL,
|
|
char_power INTEGER NOT NULL,
|
|
char_accuracy INTEGER NOT NULL,
|
|
char_penetration INTEGER NOT NULL DEFAULT 0,
|
|
char_focus INTEGER NOT NULL DEFAULT 0,
|
|
char_toughness INTEGER NOT NULL,
|
|
char_armor INTEGER NOT NULL,
|
|
char_resist INTEGER NOT NULL,
|
|
char_crit INTEGER NOT NULL,
|
|
char_precision INTEGER NOT NULL,
|
|
char_ferocity INTEGER NOT NULL,
|
|
mob_id INTEGER NOT NULL,
|
|
mob_level INTEGER NOT NULL,
|
|
mob_rank INTEGER NOT NULL,
|
|
mob_hp INTEGER NOT NULL,
|
|
mob_max_hp INTEGER NOT NULL,
|
|
mob_mp INTEGER NOT NULL,
|
|
mob_max_mp INTEGER NOT NULL,
|
|
mob_power INTEGER NOT NULL,
|
|
mob_toughness INTEGER NOT NULL,
|
|
mob_armor INTEGER NOT NULL,
|
|
mob_precision INTEGER NOT NULL,
|
|
mob_penetration INTEGER NOT NULL DEFAULT 0,
|
|
mob_focus INTEGER NOT NULL DEFAULT 0,
|
|
mob_crit INTEGER NOT NULL,
|
|
mob_ferocity INTEGER NOT NULL,
|
|
mob_vitality INTEGER NOT NULL,
|
|
first_turn INTEGER NOT NULL,
|
|
turn INTEGER NOT NULL default 1,
|
|
winner INTEGER NOT NULL default 0,
|
|
flee INTEGER NOT NULL default 1,
|
|
escaped INTEGER NOT NULL default 0,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// create an index for char_id
|
|
$db->exec('CREATE INDEX idx_pve_char_id ON pve (char_id)');
|
|
|
|
created_or_error($r, 'pve');
|
|
|
|
// PvP fights
|
|
$db->exec('DROP TABLE IF EXISTS pvp');
|
|
$r = $db->exec('CREATE TABLE pvp (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
char1_id INTEGER NOT NULL,
|
|
char1_hp INTEGER NOT NULL,
|
|
char1_max_hp INTEGER NOT NULL,
|
|
char1_mp INTEGER NOT NULL,
|
|
char1_max_mp INTEGER NOT NULL,
|
|
char1_power INTEGER NOT NULL,
|
|
char1_accuracy INTEGER NOT NULL,
|
|
char1_penetration INTEGER NOT NULL DEFAULT 0,
|
|
char1_focus INTEGER NOT NULL DEFAULT 0,
|
|
char1_toughness INTEGER NOT NULL,
|
|
char1_armor INTEGER NOT NULL,
|
|
char1_resist INTEGER NOT NULL,
|
|
char1_crit INTEGER NOT NULL,
|
|
char1_precision INTEGER NOT NULL,
|
|
char1_ferocity INTEGER NOT NULL,
|
|
char2_id INTEGER NOT NULL,
|
|
char2_hp INTEGER NOT NULL,
|
|
char2_max_hp INTEGER NOT NULL,
|
|
char2_mp INTEGER NOT NULL,
|
|
char2_max_mp INTEGER NOT NULL,
|
|
char2_power INTEGER NOT NULL,
|
|
char2_accuracy INTEGER NOT NULL,
|
|
char2_penetration INTEGER NOT NULL DEFAULT 0,
|
|
char2_focus INTEGER NOT NULL DEFAULT 0,
|
|
char2_toughness INTEGER NOT NULL,
|
|
char2_armor INTEGER NOT NULL,
|
|
char2_resist INTEGER NOT NULL,
|
|
char2_crit INTEGER NOT NULL,
|
|
char2_precision INTEGER NOT NULL,
|
|
char2_ferocity INTEGER NOT NULL,
|
|
first_turn INTEGER NOT NULL,
|
|
turn INTEGER NOT NULL default 1,
|
|
winner INTEGER NOT NULL default 0,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for char1_id
|
|
$db->exec('CREATE INDEX idx_pvp_char1_id ON pvp (char1_id)');
|
|
// Create an index for char2_id
|
|
$db->exec('CREATE INDEX idx_pvp_char2_id ON pvp (char2_id)');
|
|
|
|
created_or_error($r, 'pvp');
|
|
|
|
// PvE fight logs
|
|
$db->exec('DROP TABLE IF EXISTS pve_logs');
|
|
$r = $db->exec('CREATE TABLE pve_logs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
fight_id INTEGER NOT NULL,
|
|
info TEXT NOT NULL
|
|
)');
|
|
// Create an index for fight_id
|
|
$db->exec('CREATE INDEX idx_pve_logs_fight_id ON pve_logs (fight_id)');
|
|
|
|
created_or_error($r, 'pve_logs');
|
|
|
|
// PvP fight logs
|
|
$db->exec('DROP TABLE IF EXISTS pvp_logs');
|
|
$r = $db->exec('CREATE TABLE pvp_logs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
fight_id INTEGER NOT NULL,
|
|
info TEXT NOT NULL
|
|
)');
|
|
// Create an index for fight_id
|
|
$db->exec('CREATE INDEX idx_pvp_logs_fight_id ON pvp_logs (fight_id)');
|
|
|
|
created_or_error($r, 'pvp_logs');
|
|
|
|
eln(green('Created database: ') . 'fights.db');
|
|
|
|
if ($database !== 'reset') exit(0);
|
|
}
|
|
|
|
/*
|
|
The Blueprints database is used to store information about items, weapons, armor, etc.
|
|
*/
|
|
if ($database === BPS || $database === 'reset') {
|
|
if ($drop || $database === 'reset') {
|
|
unlink(__DIR__ . '/../' . BPS);
|
|
eln(red('Dropped database: ') . 'blueprints.db');
|
|
}
|
|
|
|
$db = new SQLite3(__DIR__ . '/../' . BPS);
|
|
|
|
// Items
|
|
$db->exec('DROP TABLE IF EXISTS items');
|
|
$r = $db->exec('CREATE TABLE items (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type INTEGER NOT NULL DEFAULT 0,
|
|
subtype INTEGER NOT NULL DEFAULT 0,
|
|
slot INTEGER NOT NULL DEFAULT 0,
|
|
rarity INTEGER NOT NULL DEFAULT 0,
|
|
value INTEGER NOT NULL DEFAULT 0,
|
|
consumable INTEGER NOT NULL DEFAULT 0,
|
|
duration INTEGER NOT NULL DEFAULT 0,
|
|
durability INTEGER NOT NULL DEFAULT 0,
|
|
power INTEGER NOT NULL DEFAULT 0,
|
|
accuracy INTEGER NOT NULL DEFAULT 0,
|
|
penetration INTEGER NOT NULL DEFAULT 0,
|
|
focus INTEGER NOT NULL DEFAULT 0,
|
|
toughness INTEGER NOT NULL DEFAULT 0,
|
|
armor INTEGER NOT NULL DEFAULT 0,
|
|
resist INTEGER NOT NULL DEFAULT 0,
|
|
crit INTEGER NOT NULL DEFAULT 0,
|
|
precision INTEGER NOT NULL DEFAULT 0,
|
|
ferocity INTEGER NOT NULL DEFAULT 0,
|
|
luck INTEGER NOT NULL DEFAULT 0,
|
|
reqs TEXT NOT NULL DEFAULT "",
|
|
traits TEXT NOT NULL DEFAULT "",
|
|
lore TEXT NOT NULL DEFAULT "",
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
|
|
created_or_error($r, 'items');
|
|
|
|
// Mobs
|
|
$db->exec('DROP TABLE IF EXISTS mobs');
|
|
$r = $db->exec('CREATE TABLE mobs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
rank INTEGER NOT NULL,
|
|
level INTEGER NOT NULL,
|
|
hp INTEGER NOT NULL,
|
|
max_hp INTEGER NOT NULL,
|
|
mp INTEGER NOT NULL,
|
|
max_mp INTEGER NOT NULL,
|
|
power INTEGER NOT NULL,
|
|
toughness INTEGER NOT NULL,
|
|
armor INTEGER NOT NULL,
|
|
precision INTEGER NOT NULL,
|
|
crit INTEGER NOT NULL,
|
|
ferocity INTEGER NOT NULL,
|
|
vitality INTEGER NOT NULL,
|
|
xp INTEGER NOT NULL,
|
|
silver INTEGER NOT NULL,
|
|
loot TEXT NOT NULL,
|
|
lore TEXT NOT NULL,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
|
|
created_or_error($r, 'mobs');
|
|
|
|
eln(green('Created database: ') . 'blueprints.db');
|
|
|
|
if ($database !== 'reset') exit(0);
|
|
}
|
|
|
|
/*
|
|
The Live database is used to store information about players, NPCs, guilds, etc.
|
|
*/
|
|
if ($database === LIVE || $database === 'reset') {
|
|
if ($drop || $database === 'reset') {
|
|
unlink(__DIR__ . '/../' . LIVE);
|
|
eln(red('Dropped database: ') . 'live.db');
|
|
}
|
|
|
|
$db = new SQLite3(__DIR__ . '/../' . LIVE);
|
|
|
|
// Blog posts
|
|
$db->exec('DROP TABLE IF EXISTS blog');
|
|
$r = $db->exec('CREATE TABLE blog (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
author_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
content TEXT NOT NULL,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for author_id
|
|
$db->exec('CREATE INDEX idx_blog_author_id ON blog (author_id)');
|
|
// Create an index for the slug
|
|
$db->exec('CREATE INDEX idx_blog_slug ON blog (slug)');
|
|
|
|
created_or_error($r, 'blog');
|
|
|
|
// Characters
|
|
$db->exec('DROP TABLE IF EXISTS characters');
|
|
$r = $db->exec('CREATE TABLE characters (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
name TEXT NOT NULL UNIQUE,
|
|
title_id INTEGER NOT NULL DEFAULT 0,
|
|
level INTEGER NOT NULL DEFAULT 1,
|
|
xp INTEGER NOT NULL DEFAULT 0,
|
|
xp_to_level INTEGER NOT NULL DEFAULT 100,
|
|
current_hp INTEGER NOT NULL DEFAULT 20,
|
|
max_hp INTEGER NOT NULL DEFAULT 20,
|
|
current_mp INTEGER NOT NULL DEFAULT 10,
|
|
max_mp INTEGER NOT NULL DEFAULT 10,
|
|
current_tp INTEGER NOT NULL DEFAULT 1,
|
|
max_tp INTEGER NOT NULL DEFAULT 1,
|
|
power INTEGER NOT NULL DEFAULT 0,
|
|
accuracy INTEGER NOT NULL DEFAULT 0,
|
|
penetration INTEGER NOT NULL DEFAULT 0,
|
|
focus INTEGER NOT NULL DEFAULT 0,
|
|
toughness INTEGER NOT NULL DEFAULT 0,
|
|
armor INTEGER NOT NULL DEFAULT 0,
|
|
resist INTEGER NOT NULL DEFAULT 0,
|
|
precision INTEGER NOT NULL DEFAULT 0,
|
|
ferocity INTEGER NOT NULL DEFAULT 0,
|
|
luck INTEGER NOT NULL DEFAULT 0,
|
|
inv_slots INTEGER NOT NULL DEFAULT 10,
|
|
attrib_points INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for user_id
|
|
$db->exec('CREATE INDEX idx_characters_user_id ON characters (user_id)');
|
|
|
|
created_or_error($r, 'characters');
|
|
|
|
// Player gear
|
|
$db->exec('DROP TABLE IF EXISTS char_gear');
|
|
$r = $db->exec('CREATE TABLE char_gear (
|
|
char_id INTEGER NOT NULL,
|
|
head INTEGER NOT NULL DEFAULT 0,
|
|
chest INTEGER NOT NULL DEFAULT 0,
|
|
boots INTEGER NOT NULL DEFAULT 0,
|
|
hands INTEGER NOT NULL DEFAULT 0,
|
|
main_hand INTEGER NOT NULL DEFAULT 0,
|
|
off_hand INTEGER NOT NULL DEFAULT 0,
|
|
rune INTEGER NOT NULL DEFAULT 0,
|
|
ring INTEGER NOT NULL DEFAULT 0,
|
|
amulet INTEGER NOT NULL DEFAULT 0,
|
|
power INTEGER NOT NULL DEFAULT 0,
|
|
accuracy INTEGER NOT NULL DEFAULT 0,
|
|
penetration INTEGER NOT NULL DEFAULT 0,
|
|
focus INTEGER NOT NULL DEFAULT 0,
|
|
toughness INTEGER NOT NULL DEFAULT 0,
|
|
armor INTEGER NOT NULL DEFAULT 0,
|
|
resist INTEGER NOT NULL DEFAULT 0,
|
|
crit INTEGER NOT NULL DEFAULT 0,
|
|
precision INTEGER NOT NULL DEFAULT 0,
|
|
ferocity INTEGER NOT NULL DEFAULT 0,
|
|
luck INTEGER NOT NULL DEFAULT 0,
|
|
max_hp INTEGER NOT NULL DEFAULT 0,
|
|
max_mp INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_char_gear_char_id ON char_gear (char_id)');
|
|
|
|
created_or_error($r, 'char_gear');
|
|
|
|
// Player inventory
|
|
$db->exec('DROP TABLE IF EXISTS char_inventory');
|
|
$r = $db->exec('CREATE TABLE char_inventory (
|
|
char_id INTEGER NOT NULL,
|
|
item_id INTEGER NOT NULL
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_inventory_char_id ON char_inventory (char_id)');
|
|
|
|
created_or_error($r, 'char_inventory');
|
|
|
|
// Player wallet
|
|
$db->exec('DROP TABLE IF EXISTS wallets');
|
|
$r = $db->exec('CREATE TABLE wallets (
|
|
user_id INTEGER NOT NULL,
|
|
silver INTEGER NOT NULL DEFAULT 10,
|
|
stargem INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for user_id
|
|
$db->exec('CREATE INDEX idx_wallets_user_id ON wallets (user_id)');
|
|
|
|
created_or_error($r, 'wallets');
|
|
|
|
// Player bank
|
|
$db->exec('DROP TABLE IF EXISTS char_bank');
|
|
$r = $db->exec('CREATE TABLE char_bank (
|
|
char_id INTEGER NOT NULL,
|
|
slots INTEGER NOT NULL DEFAULT 5,
|
|
silver INTEGER NOT NULL DEFAULT 0,
|
|
tier INTEGER NOT NULL DEFAULT 0,
|
|
can_collect INTEGER NOT NULL DEFAULT 1,
|
|
last_collected DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_bank_char_id ON char_bank (char_id)');
|
|
|
|
created_or_error($r, 'char_bank');
|
|
|
|
// Banked items
|
|
$db->exec('DROP TABLE IF EXISTS char_banked_items');
|
|
$r = $db->exec('CREATE TABLE char_banked_items (
|
|
char_id INTEGER NOT NULL,
|
|
item_id INTEGER NOT NULL
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_banked_items_char_id ON char_banked_items (char_id)');
|
|
// Create an index for item_id
|
|
$db->exec('CREATE INDEX idx_banked_items_item_id ON char_banked_items (item_id)');
|
|
|
|
created_or_error($r, 'char_banked_items');
|
|
|
|
// Towns
|
|
$db->exec('DROP TABLE IF EXISTS towns');
|
|
$r = $db->exec('CREATE TABLE towns (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
x INTEGER NOT NULL,
|
|
y INTEGER NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
lore TEXT NOT NULL,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for the x, y location
|
|
$db->exec('CREATE INDEX idx_towns_location ON towns (x, y)');
|
|
|
|
created_or_error($r, 'towns');
|
|
|
|
// Shops
|
|
$db->exec('DROP TABLE IF EXISTS shops');
|
|
$r = $db->exec('CREATE TABLE shops (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
lore TEXT NOT NULL,
|
|
x INTEGER NOT NULL,
|
|
y INTEGER NOT NULL,
|
|
items TEXT NOT NULL,
|
|
gear TEXT NOT NULL,
|
|
materials TEXT NOT NULL,
|
|
buy_modifier INTEGER NOT NULL DEFAULT 100,
|
|
sell_modifier INTEGER NOT NULL DEFAULT 100,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for the x, y location
|
|
$db->exec('CREATE INDEX idx_shops_location ON shops (x, y)');
|
|
|
|
created_or_error($r, 'shops');
|
|
|
|
// Inns
|
|
$db->exec('DROP TABLE IF EXISTS inns');
|
|
$r = $db->exec('CREATE TABLE inns (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
lore TEXT NOT NULL,
|
|
x INTEGER NOT NULL,
|
|
y INTEGER NOT NULL,
|
|
cost INTEGER NOT NULL,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for the x, y location
|
|
$db->exec('CREATE INDEX idx_inns_location ON inns (x, y)');
|
|
|
|
created_or_error($r, 'inns');
|
|
|
|
// Guilds
|
|
$db->exec('DROP TABLE IF EXISTS guilds');
|
|
$r = $db->exec('CREATE TABLE guilds (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
lore TEXT NOT NULL DEFAULT "",
|
|
leader_id INTEGER NOT NULL,
|
|
silver INTEGER NOT NULL DEFAULT 0,
|
|
rep INTEGER NOT NULL DEFAULT 0,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for leader_id
|
|
$db->exec('CREATE INDEX idx_guilds_leader_id ON guilds (leader_id)');
|
|
|
|
created_or_error($r, 'guilds');
|
|
|
|
// Guild ranks
|
|
$db->exec('DROP TABLE IF EXISTS guild_ranks');
|
|
$r = $db->exec('CREATE TABLE guild_ranks (
|
|
guild_id INTEGER NOT NULL,
|
|
rank INTEGER NOT NULL,
|
|
name TEXT NOT NULL,
|
|
permissions TEXT NOT NULL
|
|
)');
|
|
// Create an index for guild_id
|
|
$db->exec('CREATE INDEX idx_guild_ranks_guild_id ON guild_ranks (guild_id)');
|
|
|
|
created_or_error($r, 'guild_ranks');
|
|
|
|
// Guild members
|
|
$db->exec('DROP TABLE IF EXISTS guild_members');
|
|
$r = $db->exec('CREATE TABLE guild_members (
|
|
guild_id INTEGER NOT NULL,
|
|
char_id INTEGER NOT NULL,
|
|
rank INTEGER NOT NULL,
|
|
rep INTEGER NOT NULL DEFAULT 0,
|
|
donated INTEGER NOT NULL DEFAULT 0,
|
|
joined DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for guild_id
|
|
$db->exec('CREATE INDEX idx_guild_members_guild_id ON guild_members (guild_id)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_guild_members_char_id ON guild_members (char_id)');
|
|
|
|
created_or_error($r, 'guild_members');
|
|
|
|
// NPCs
|
|
$db->exec('DROP TABLE IF EXISTS npcs');
|
|
$r = $db->exec('CREATE TABLE npcs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type INTEGER NOT NULL,
|
|
lore TEXT NOT NULL,
|
|
conversation TEXT NOT NULL,
|
|
x INTEGER NOT NULL,
|
|
y INTEGER NOT NULL,
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
// Create an index for the x, y location
|
|
$db->exec('CREATE INDEX idx_npcs_location ON npcs (x, y)');
|
|
|
|
created_or_error($r, 'npcs');
|
|
|
|
// Town reputation
|
|
$db->exec('DROP TABLE IF EXISTS char_town_rep');
|
|
$r = $db->exec('CREATE TABLE char_town_rep (
|
|
char_id INTEGER NOT NULL,
|
|
town_id INTEGER NOT NULL,
|
|
rep INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_char_town_rep_char_id ON char_town_rep (char_id)');
|
|
|
|
created_or_error($r, 'char_town_rep');
|
|
|
|
// Items
|
|
$db->exec('DROP TABLE IF EXISTS items');
|
|
$r = $db->exec('CREATE TABLE items (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL DEFAULT 0,
|
|
rarity INTEGER NOT NULL DEFAULT 0,
|
|
forged INTEGER NOT NULL DEFAULT 0,
|
|
quality INTEGER NOT NULL DEFAULT 0,
|
|
value INTEGER NOT NULL DEFAULT 0,
|
|
consumable INTEGER NOT NULL DEFAULT 0,
|
|
duration INTEGER NOT NULL DEFAULT 0,
|
|
durability INTEGER NOT NULL DEFAULT 0,
|
|
max_durability INTEGER NOT NULL DEFAULT 0,
|
|
power INTEGER NOT NULL DEFAULT 0,
|
|
accuracy INTEGER NOT NULL DEFAULT 0,
|
|
penetration INTEGER NOT NULL DEFAULT 0,
|
|
focus INTEGER NOT NULL DEFAULT 0,
|
|
toughness INTEGER NOT NULL DEFAULT 0,
|
|
armor INTEGER NOT NULL DEFAULT 0,
|
|
resist INTEGER NOT NULL DEFAULT 0,
|
|
crit INTEGER NOT NULL DEFAULT 0,
|
|
precision INTEGER NOT NULL DEFAULT 0,
|
|
ferocity INTEGER NOT NULL DEFAULT 0,
|
|
luck INTEGER NOT NULL DEFAULT 0,
|
|
reqs TEXT NOT NULL DEFAULT "",
|
|
traits TEXT NOT NULL DEFAULT "",
|
|
lore TEXT NOT NULL DEFAULT "",
|
|
created DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)');
|
|
|
|
created_or_error($r, 'items');
|
|
|
|
// Player traits
|
|
$db->exec('DROP TABLE IF EXISTS char_traits');
|
|
$r = $db->exec('CREATE TABLE char_traits (
|
|
char_id INTEGER NOT NULL,
|
|
trait_id INTEGER NOT NULL,
|
|
value INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_char_traits_char_id ON char_traits (char_id)');
|
|
|
|
created_or_error($r, 'char_traits');
|
|
|
|
// Character location
|
|
$db->exec('DROP TABLE IF EXISTS char_locations');
|
|
$r = $db->exec('CREATE TABLE char_locations (
|
|
char_id INTEGER NOT NULL,
|
|
x INTEGER NOT NULL,
|
|
y INTEGER NOT NULL,
|
|
currently INTEGER NOT NULL DEFAULT 0
|
|
)');
|
|
// Create an index for char_id
|
|
$db->exec('CREATE INDEX idx_char_locations_char_id ON char_locations (char_id)');
|
|
// Create an index for x, y location
|
|
$db->exec('CREATE INDEX idx_char_locations_location ON char_locations (x, y)');
|
|
|
|
created_or_error($r, 'char_locations');
|
|
|
|
eln(green('Created database: ') . 'live.db');
|
|
|
|
if ($database !== 'reset') exit(0);
|
|
}
|
|
|
|
function created_or_error($result, $table)
|
|
{
|
|
if ($result === false) {
|
|
eln(red('Failed to create table: ') . $table);
|
|
exit(1);
|
|
}
|
|
eln(yellow('Created table: ') . $table);
|
|
}
|