Files
odinsea-elixir/priv/repo/migrations/20260215000001_create_base_tables.exs
2026-02-14 23:58:01 -07:00

421 lines
17 KiB
Elixir

defmodule Odinsea.Repo.Migrations.CreateBaseTables do
use Ecto.Migration
def up do
# ============================================================================
# CORE ACCOUNT TABLES
# ============================================================================
create table(:accounts) do
add :name, :string, size: 13, null: false
add :password, :string, size: 128, null: false, default: ""
add :salt, :string, size: 32
add :secondpassword, :string, size: 134
add :salt2, :string, size: 32
add :loggedin, :boolean, null: false, default: false
add :lastlogin, :naive_datetime
add :birthday, :date, null: false, default: "0000-01-01"
add :banned, :boolean, null: false, default: false
add :banreason, :text
add :gm, :boolean, null: false, default: false
add :email, :string, size: 255
add :macs, :string, size: 255
add :tempban, :naive_datetime, null: false, default: fragment("'0000-00-00 00:00:00'")
add :greason, :integer
add :acash, :integer, null: false, default: 0
add :mpoints, :integer, null: false, default: 0
add :gender, :integer, null: false, default: 0
add :session_ip, :string, size: 64
add :points, :integer, null: false, default: 0
add :vpoints, :integer, null: false, default: 0
add :totalvotes, :integer, null: false, default: 0
add :lastlogon, :naive_datetime
add :lastvoteip, :string, size: 64
timestamps(type: :naive_datetime, inserted_at: :createdat, updated_at: false)
end
create unique_index(:accounts, [:name])
create index(:accounts, [:id, :banned, :gm], name: :ranking1)
create index(:accounts, [:id])
create table(:character_slots) do
add :accid, :integer, null: false, default: 0
add :worldid, :integer, null: false, default: 0
add :charslots, :integer, null: false, default: 6
end
create index(:character_slots, [:accid])
create index(:character_slots, [:id])
create table(:storages) do
add :accountid, references(:accounts, on_delete: :delete_all), null: false, default: 0
add :slots, :integer, null: false, default: 0
add :meso, :integer, null: false, default: 0
end
create index(:storages, [:accountid])
create table(:iplog) do
add :accid, :integer, null: false
add :ip, :string, size: 45, null: false
add :time, :string, size: 45, null: false
end
create table(:ipbans) do
add :ip, :string, size: 40, null: false, default: ""
end
create table(:macbans) do
add :mac, :string, size: 30, null: false
end
create unique_index(:macbans, [:mac], name: :mac_2)
create table(:macfilters) do
add :filter, :string, size: 30, null: false
end
# ============================================================================
# CHARACTER TABLES
# ============================================================================
create table(:characters) do
add :accountid, :integer, null: false, default: 0
add :world, :integer, null: false, default: 0
add :name, :string, size: 13, null: false, default: ""
add :level, :integer, null: false, default: 0
add :exp, :integer, null: false, default: 0
add :str, :integer, null: false, default: 0
add :dex, :integer, null: false, default: 0
add :luk, :integer, null: false, default: 0
add :int, :integer, null: false, default: 0
add :hp, :integer, null: false, default: 0
add :mp, :integer, null: false, default: 0
add :maxhp, :integer, null: false, default: 0
add :maxmp, :integer, null: false, default: 0
add :meso, :integer, null: false, default: 0
add :hp_ap_used, :integer, null: false, default: 0
add :job, :integer, null: false, default: 0
add :skincolor, :integer, null: false, default: 0
add :gender, :integer, null: false, default: 0
add :fame, :integer, null: false, default: 0
add :hair, :integer, null: false, default: 0
add :face, :integer, null: false, default: 0
add :ap, :integer, null: false, default: 0
add :map, :integer, null: false, default: 0
add :spawnpoint, :integer, null: false, default: 0
add :gm, :integer, null: false, default: 0
add :party, :integer, null: false, default: 0
add :buddycapacity, :integer, null: false, default: 25
add :guildid, :integer, null: false, default: 0
add :guildrank, :integer, null: false, default: 5
add :alliancerank, :integer, null: false, default: 5
add :guildcontribution, :integer, null: false, default: 0
add :pets, :string, size: 13, null: false, default: "-1,-1,-1"
add :sp, :string, size: 255, null: false, default: "0,0,0,0,0,0,0,0,0,0"
add :subcategory, :integer, null: false, default: 0
add :rank, :integer, null: false, default: 1
add :rankmove, :integer, null: false, default: 0
add :jobrank, :integer, null: false, default: 1
add :jobrankmove, :integer, null: false, default: 0
add :marriageid, :integer, null: false, default: 0
add :familyid, :integer, null: false, default: 0
add :seniorid, :integer, null: false, default: 0
add :junior1, :integer, null: false, default: 0
add :junior2, :integer, null: false, default: 0
add :currentrep, :integer, null: false, default: 0
add :totalrep, :integer, null: false, default: 0
add :gachexp, :integer, null: false, default: 0
add :fatigue, :integer, null: false, default: 0
add :charm, :integer, null: false, default: 0
add :craft, :integer, null: false, default: 0
add :charisma, :integer, null: false, default: 0
add :will, :integer, null: false, default: 0
add :sense, :integer, null: false, default: 0
add :insight, :integer, null: false, default: 0
add :totalwins, :integer, null: false, default: 0
add :totallosses, :integer, null: false, default: 0
add :pvpexp, :integer, null: false, default: 0
add :pvppoints, :integer, null: false, default: 0
timestamps(type: :naive_datetime, inserted_at: :createdate, updated_at: false)
end
create index(:characters, [:accountid])
create index(:characters, [:id])
create index(:characters, [:guildid])
create index(:characters, [:familyid])
create index(:characters, [:marriageid])
create index(:characters, [:seniorid])
# ============================================================================
# INVENTORY TABLES
# ============================================================================
create table(:inventoryitems) do
add :characterid, :integer
add :accountid, :integer
add :packageid, :integer
add :itemid, :integer, null: false, default: 0
add :inventorytype, :integer, null: false, default: 0
add :position, :integer, null: false, default: 0
add :quantity, :integer, null: false, default: 0
add :owner, :string, size: 255
add :gm_log, :string, size: 255
add :uniqueid, :integer, null: false, default: -1
add :flag, :integer, null: false, default: 0
add :expiredate, :bigint, null: false, default: -1
add :type, :integer, null: false, default: 0
add :sender, :string, size: 13, null: false, default: ""
end
create index(:inventoryitems, [:inventorytype])
create index(:inventoryitems, [:accountid])
create index(:inventoryitems, [:packageid])
create index(:inventoryitems, [:characterid, :inventorytype], name: :characterid_2)
create table(:inventoryequipment) do
add :inventoryitemid, references(:inventoryitems, on_delete: :delete_all), null: false, default: 0
add :upgradeslots, :integer, null: false, default: 0
add :level, :integer, null: false, default: 0
add :str, :integer, null: false, default: 0
add :dex, :integer, null: false, default: 0
add :int, :integer, null: false, default: 0
add :luk, :integer, null: false, default: 0
add :hp, :integer, null: false, default: 0
add :mp, :integer, null: false, default: 0
add :watk, :integer, null: false, default: 0
add :matk, :integer, null: false, default: 0
add :wdef, :integer, null: false, default: 0
add :mdef, :integer, null: false, default: 0
add :acc, :integer, null: false, default: 0
add :avoid, :integer, null: false, default: 0
add :hands, :integer, null: false, default: 0
add :speed, :integer, null: false, default: 0
add :jump, :integer, null: false, default: 0
add :vicioushammer, :integer, null: false, default: 0
add :itemexp, :integer, null: false, default: 0
add :durability, :integer, null: false, default: -1
add :enhance, :integer, null: false, default: 0
add :potential1, :integer, null: false, default: 0
add :potential2, :integer, null: false, default: 0
add :potential3, :integer, null: false, default: 0
add :hpr, :integer, null: false, default: 0
add :mpr, :integer, null: false, default: 0
add :incskill, :integer, null: false, default: -1
add :charmexp, :integer, null: false, default: -1
add :pvpdamage, :integer, null: false, default: 0
end
create index(:inventoryequipment, [:inventoryitemid])
create table(:inventoryslot) do
add :characterid, :integer, unique: true
add :equip, :integer
add :use, :integer
add :setup, :integer
add :etc, :integer
add :cash, :integer
end
create unique_index(:inventoryslot, [:characterid])
create index(:inventoryslot, [:id])
create table(:inventorylog) do
add :inventoryitemid, :integer, null: false, default: 0
add :msg, :string, size: 255, null: false
end
create index(:inventorylog, [:inventoryitemid])
create table(:extendedslots) do
add :characterid, :integer, null: false, default: 0
add :itemid, :integer, null: false, default: 0
end
# ============================================================================
# SKILLS & KEYMAP TABLES
# ============================================================================
create table(:skills) do
add :skillid, :integer, null: false, default: 0
add :characterid, references(:characters, on_delete: :delete_all), null: false, default: 0
add :skilllevel, :integer, null: false, default: 0
add :masterlevel, :integer, null: false, default: 0
add :expiration, :bigint, null: false, default: -1
end
create index(:skills, [:characterid], name: :skills_ibfk_1)
create table(:skills_cooldowns) do
add :charid, :integer, null: false
add :skillid, :integer, null: false
add :length, :bigint, null: false
add :starttime, :bigint, null: false
end
create index(:skills_cooldowns, [:charid])
create table(:keymap) do
add :characterid, references(:characters, on_delete: :delete_all), null: false, default: 0
add :key, :integer, null: false, default: 0
add :type, :integer, null: false, default: 0
add :action, :integer, null: false, default: 0
end
create index(:keymap, [:characterid], name: :keymap_ibfk_1)
create table(:skillmacros) do
add :characterid, :integer, null: false, default: 0
add :position, :integer, null: false, default: 0
add :skill1, :integer, null: false, default: 0
add :skill2, :integer, null: false, default: 0
add :skill3, :integer, null: false, default: 0
add :name, :string, size: 30
add :shout, :boolean, null: false, default: false
end
create index(:skillmacros, [:characterid])
# ============================================================================
# BUDDY SYSTEM
# ============================================================================
create table(:buddies) do
add :characterid, references(:characters, on_delete: :delete_all), null: false
add :buddyid, :integer, null: false
add :pending, :boolean, null: false, default: false
add :groupname, :string, size: 16, null: false, default: "ETC"
end
create index(:buddies, [:characterid], name: :buddies_ibfk_1)
create index(:buddies, [:buddyid])
create index(:buddies, [:id])
# ============================================================================
# GUILD SYSTEM
# ============================================================================
create table(:guilds) do
add :leader, :integer, null: false, default: 0
add :gp, :integer, null: false, default: 0
add :logo, :integer
add :logocolor, :integer, null: false, default: 0
add :name, :string, size: 45, null: false
add :rank1title, :string, size: 45, null: false, default: "Master"
add :rank2title, :string, size: 45, null: false, default: "Jr. Master"
add :rank3title, :string, size: 45, null: false, default: "Member"
add :rank4title, :string, size: 45, null: false, default: "Member"
add :rank5title, :string, size: 45, null: false, default: "Member"
add :capacity, :integer, null: false, default: 10
add :logobg, :integer
add :logobgcolor, :integer, null: false, default: 0
add :notice, :string, size: 101
add :signature, :integer, null: false, default: 0
add :alliance, :integer, null: false, default: 0
end
create unique_index(:guilds, [:name])
create index(:guilds, [:id])
create index(:guilds, [:leader])
create table(:guildskills) do
add :guildid, :integer, null: false, default: 0
add :skillid, :integer, null: false, default: 0
add :level, :integer, null: false, default: 1
add :timestamp, :bigint, null: false, default: 0
add :purchaser, :string, size: 13, null: false, default: ""
end
create table(:alliances) do
add :name, :string, size: 13, null: false
add :leaderid, :integer, null: false
add :guild1, :integer, null: false
add :guild2, :integer, null: false
add :guild3, :integer, null: false, default: 0
add :guild4, :integer, null: false, default: 0
add :guild5, :integer, null: false, default: 0
add :rank1, :string, size: 13, null: false, default: "Master"
add :rank2, :string, size: 13, null: false, default: "Jr.Master"
add :rank3, :string, size: 13, null: false, default: "Member"
add :rank4, :string, size: 13, null: false, default: "Member"
add :rank5, :string, size: 13, null: false, default: "Member"
add :capacity, :integer, null: false, default: 2
add :notice, :string, size: 100, null: false, default: ""
end
create unique_index(:alliances, [:name])
create index(:alliances, [:id])
create index(:alliances, [:leaderid])
create table(:bbs_threads) do
add :postercid, :integer, null: false
add :name, :string, size: 26, null: false, default: ""
add :timestamp, :bigint, null: false
add :icon, :integer, null: false
add :startpost, :text, null: false
add :guildid, :integer, null: false
add :localthreadid, :integer, null: false
end
create table(:bbs_replies) do
add :threadid, :integer, null: false
add :postercid, :integer, null: false
add :timestamp, :bigint, null: false
add :content, :string, size: 26, null: false, default: ""
add :guildid, :integer, null: false, default: 0
end
# ============================================================================
# FAMILY SYSTEM
# ============================================================================
create table(:families) do
add :leaderid, :integer, null: false, default: 0
add :notice, :string, size: 255, null: false, default: ""
end
create index(:families, [:familyid])
create index(:families, [:leaderid])
create table(:famelog) do
add :characterid, references(:characters, on_delete: :delete_all), null: false, default: 0
add :characterid_to, :integer, null: false, default: 0
timestamps(type: :naive_datetime, inserted_at: :when, updated_at: false)
end
create index(:famelog, [:characterid])
end
def down do
# Drop in reverse order of creation to avoid foreign key constraints
drop table(:famelog)
drop table(:families)
drop table(:bbs_replies)
drop table(:bbs_threads)
drop table(:alliances)
drop table(:guildskills)
drop table(:guilds)
drop table(:buddies)
drop table(:skillmacros)
drop table(:keymap)
drop table(:skills_cooldowns)
drop table(:skills)
drop table(:extendedslots)
drop table(:inventorylog)
drop table(:inventoryslot)
drop table(:inventoryequipment)
drop table(:inventoryitems)
drop table(:characters)
drop table(:storages)
drop table(:iplog)
drop table(:ipbans)
drop table(:macbans)
drop table(:macfilters)
drop table(:character_slots)
drop table(:accounts)
end
end