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 :second_password, :string, size: 134 add :second_salt, :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