defmodule Odinsea.Database.Schema.Character do @moduledoc """ Ecto schema for the characters table. Represents a player character in the game. """ use Ecto.Schema import Ecto.Changeset @primary_key {:id, :id, autogenerate: true} @timestamps_opts [inserted_at: :createdate, updated_at: false] schema "characters" do field :accountid, :integer field :world, :integer, default: 0 field :name, :string field :level, :integer, default: 1 field :exp, :integer, default: 0 field :str, :integer, default: 4 field :dex, :integer, default: 4 field :luk, :integer, default: 4 field :int, :integer, default: 4 field :hp, :integer, default: 50 field :mp, :integer, default: 5 field :maxhp, :integer, default: 50 field :maxmp, :integer, default: 5 field :meso, :integer, default: 0 field :hp_ap_used, :integer, default: 0, source: :hpApUsed field :job, :integer, default: 0 field :skincolor, :integer, default: 0 field :gender, :integer, default: 0 field :fame, :integer, default: 0 field :hair, :integer, default: 0 field :face, :integer, default: 0 field :ap, :integer, default: 0 field :map, :integer, default: 100000000 field :spawnpoint, :integer, default: 0 field :gm, :integer, default: 0 field :party, :integer, default: 0 field :buddy_capacity, :integer, default: 25, source: :buddyCapacity field :createdate, :naive_datetime field :guildid, :integer, default: 0 field :guildrank, :integer, default: 5 field :alliance_rank, :integer, default: 5, source: :allianceRank field :guild_contribution, :integer, default: 0, source: :guildContribution field :pets, :string, default: "-1,-1,-1" field :sp, :string, default: "0,0,0,0,0,0,0,0,0,0" field :subcategory, :integer, default: 0 field :rank, :integer, default: 1 field :rank_move, :integer, default: 0, source: :rankMove field :job_rank, :integer, default: 1, source: :jobRank field :job_rank_move, :integer, default: 0, source: :jobRankMove field :marriage_id, :integer, default: 0, source: :marriageId field :familyid, :integer, default: 0 field :seniorid, :integer, default: 0 field :junior1, :integer, default: 0 field :junior2, :integer, default: 0 field :currentrep, :integer, default: 0 field :totalrep, :integer, default: 0 field :gachexp, :integer, default: 0 field :fatigue, :integer, default: 0 field :charm, :integer, default: 0 field :craft, :integer, default: 0 field :charisma, :integer, default: 0 field :will, :integer, default: 0 field :sense, :integer, default: 0 field :insight, :integer, default: 0 field :total_wins, :integer, default: 0, source: :totalWins field :total_losses, :integer, default: 0, source: :totalLosses field :pvp_exp, :integer, default: 0, source: :pvpExp field :pvp_points, :integer, default: 0, source: :pvpPoints belongs_to :account, Odinsea.Database.Schema.Account, foreign_key: :accountid, references: :id, define_field: false end @doc """ Changeset for character creation. """ def creation_changeset(character, attrs) do character |> cast(attrs, [ :accountid, :world, :name, :job, :gender, :skincolor, :hair, :face, :str, :dex, :luk, :int, :hp, :mp, :maxhp, :maxmp, :ap, :map, :spawnpoint ]) |> validate_required([:accountid, :world, :name, :job, :gender]) |> validate_length(:name, min: 3, max: 13) |> validate_format(:name, ~r/^[a-zA-Z]+$/, message: "only letters allowed") |> unique_constraint(:name) end @doc """ Changeset for character stat updates. """ def stat_changeset(character, attrs) do character |> cast(attrs, [:level, :exp, :str, :dex, :luk, :int, :hp, :mp, :maxhp, :maxmp, :ap, :meso, :fame]) end @doc """ Changeset for character position updates. """ def position_changeset(character, attrs) do character |> cast(attrs, [:map, :spawnpoint]) end @doc """ Changeset for guild/party updates. """ def social_changeset(character, attrs) do character |> cast(attrs, [:party, :guildid, :guildrank, :familyid]) end end