#============================================================================== # ■ VX-RGSS2-21 精霊システム [database] by Claimh #============================================================================== module SpiritSystem #-------------------------------------------------------------------------- # ● 汎用データ取得 #-------------------------------------------------------------------------- def self.get(data, s_id, org=1) return data[s_id] if !data[s_id].nil? return data[0] if !data[0].nil? return org end #-------------------------------------------------------------------------- # ● 汎用データ取得 #-------------------------------------------------------------------------- def self.get_a(data, a_id, s_id, org=1) return data[a_id][s_id] if !data[a_id].nil? and !data[a_id][s_id].nil? return data[a_id][0] if !data[a_id].nil? and !data[a_id][0].nil? return data[0][s_id] if !data[0].nil? and !data[0][s_id].nil? return data[0][0] if !data[0].nil? and !data[0][0].nil? return org end #-------------------------------------------------------------------------- # ● EXPリスト #-------------------------------------------------------------------------- def self.exp(s_id) up_i = get(UP_I, s_id) up_s = get(UP_S, s_id) list = [] list[0] = list[1] = 0 # EXPリスト作成 for lv in 2..MAX_LV case LVUP_PTN when 0; exp = up_i * (lv-1) when 1; exp = list[lv-1] + up_s * (lv-1) + up_i when 2; exp = list[lv-1] + up_s * (lv-1) * (lv-1) + up_i when 3; exp = get(A_EXP, s_id)[lv] end list[lv] = exp.truncate end list[MAX_LV+1] = -1 #p s_id, list return list end #============================================================================== # ■ SpiritSystem::SpiritData #------------------------------------------------------------------------------ # このクラスは $game_party.spirit[精霊ID] で参照できます。 #============================================================================== class SpiritData #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :id # 精霊ID attr_accessor :name # 名前 attr_accessor :face_name # 顔グラフィック ファイル名 attr_accessor :face_index # 顔グラフィック インデックス attr_reader :partner_id # パートナーのアクターID attr_reader :level # 精霊レベル attr_reader :exp # 経験値 attr_accessor :visible # 加入状態 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(id) @id = id @partner_id = 0 @name = SPIRIT[id][0] @face_name = SPIRIT[id][1][0] @face_index = SPIRIT[id][1][1] @level = ::SpiritSystem.get(INIT_LV, id, 1) @exp_list = ::SpiritSystem.exp(id) @exp = @exp_list[@level] @skills = [] lvup_skill_learn(1) @visible = START_V.include?(id) end #-------------------------------------------------------------------------- # ● パートナー変更 #-------------------------------------------------------------------------- def change_partner(id) @partner_id = id end #-------------------------------------------------------------------------- # ● パートナー情報取得 #-------------------------------------------------------------------------- def partner return $game_actors[@partner_id] end #-------------------------------------------------------------------------- # ● スキルオブジェクトの配列取得 #-------------------------------------------------------------------------- def skills result = [] for i in @skills result.push($data_skills[i]) end return result end #-------------------------------------------------------------------------- # ● レベル上限? #-------------------------------------------------------------------------- def level_max? return (@level >= MAX_LV) end #-------------------------------------------------------------------------- # ● EXP の文字列取得 #-------------------------------------------------------------------------- def exp_s return level_max? ? "-------" : @exp.to_s end #-------------------------------------------------------------------------- # ● 次のレベルの EXP の文字列取得 #-------------------------------------------------------------------------- def next_exp_s return level_max? ? "-------" : @exp_list[@level+1].to_s end #-------------------------------------------------------------------------- # ● 次のレベルまでの EXP の文字列取得 #-------------------------------------------------------------------------- def next_rest_exp_s return level_max? ? "-------" : (@exp_list[@level+1] - @exp).to_s end #-------------------------------------------------------------------------- # ● 経験値の変更 # exp : 新しい経験値 # show : レベルアップ表示フラグ #-------------------------------------------------------------------------- def change_exp(exp, show) last_level = @level last_skills = skills @exp = [[exp, 9999999].min, 0].max while !level_max? and @exp >= @exp_list[@level+1] level_up end while @exp < @exp_list[@level] level_down end lvup_skill_learn(last_level) if @level > last_level if show and @level > last_level display_level_up(skills - last_skills) end end #-------------------------------------------------------------------------- # ● レベルアップ #-------------------------------------------------------------------------- def level_up @level += 1 end #-------------------------------------------------------------------------- # ● レベルダウン #-------------------------------------------------------------------------- def level_down @level -= 1 end #-------------------------------------------------------------------------- # ● レベルアップメッセージの表示 # new_skills : 新しく習得したスキルの配列 #-------------------------------------------------------------------------- def display_level_up(new_skills) $game_message.new_page text = sprintf(Vocab::LevelUp, @name, Vocab::level, @level) $game_message.texts.push(text) for skill in new_skills text = sprintf(Vocab::ObtainSkill, skill.name) $game_message.texts.push(text) end end #-------------------------------------------------------------------------- # ● EXP の変更 # exp : 新しい EXP #-------------------------------------------------------------------------- def exp=(exp) change_exp(exp, false) end #-------------------------------------------------------------------------- # ● 経験値の獲得 (経験値 2 倍のオプションを考慮しない) # exp : 経験値の増加量 # show : レベルアップ表示フラグ #-------------------------------------------------------------------------- def gain_exp(exp, show) change_exp(@exp + exp, show) end #-------------------------------------------------------------------------- # ● レベルの変更 # level : 新しいレベル #-------------------------------------------------------------------------- def level=(level) change_level(level, false) end #-------------------------------------------------------------------------- # ● レベルの変更 # level : 新しいレベル # show : レベルアップ表示フラグ #-------------------------------------------------------------------------- def change_level(level, show) level = [[level, MAX_LV].min, 1].max change_exp(@exp_list[level], show) end #-------------------------------------------------------------------------- # ● スキル習得 #-------------------------------------------------------------------------- def lvup_skill_learn(old_lv=1) data = ::SpiritSystem::get(LEARN, @id, []) keys = data.keys.sort for i in old_lv..@level # スキル習得 for k in keys learn_skill(data[k]) if k == i break if k > i end end end #-------------------------------------------------------------------------- # ● スキルを覚える # skill_id : スキル ID #-------------------------------------------------------------------------- def learn_skill(skill_id) unless skill_learn?($data_skills[skill_id]) @skills.push(skill_id) @skills.sort! end end #-------------------------------------------------------------------------- # ● スキルを忘れる # skill_id : スキル ID #-------------------------------------------------------------------------- def forget_skill(skill_id) @skills.delete(skill_id) end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 # skill : スキル #-------------------------------------------------------------------------- def skill_learn?(skill) return @skills.include?(skill.id) end #-------------------------------------------------------------------------- # ● 最大HP #-------------------------------------------------------------------------- def maxhp return ::SpiritSystem.get(MHP, @id) * @level end #-------------------------------------------------------------------------- # ● 最大MP #-------------------------------------------------------------------------- def maxmp return ::SpiritSystem.get(MMP, @id) * @level end #-------------------------------------------------------------------------- # ● 攻撃力 #-------------------------------------------------------------------------- def atk return ::SpiritSystem.get(ATK, @id) * @level end #-------------------------------------------------------------------------- # ● 防御力の取得 #-------------------------------------------------------------------------- def def return ::SpiritSystem.get(DEF, @id) * @level end #-------------------------------------------------------------------------- # ● 精神力 #-------------------------------------------------------------------------- def spi return ::SpiritSystem.get(SPI, @id) * @level end #-------------------------------------------------------------------------- # ● 素早さ #-------------------------------------------------------------------------- def agi return ::SpiritSystem.get(AGI, @id) * @level end #-------------------------------------------------------------------------- # ● オプション : クリティカル頻発 #-------------------------------------------------------------------------- def critical_bonus return ::SpiritSystem.get(OPT, @id).include?(3) end #-------------------------------------------------------------------------- # ● オプション : 強力防御 #-------------------------------------------------------------------------- def super_guard return ::SpiritSystem.get(OPT, @id).include?(1) end #-------------------------------------------------------------------------- # ● オプション : 薬の知識 #-------------------------------------------------------------------------- def pharmacology return ::SpiritSystem.get(OPT, @id).include?(2) end #-------------------------------------------------------------------------- # ● オプション : ターン内先制 #-------------------------------------------------------------------------- def fast_attack return ::SpiritSystem.get(OPT, @id).include?(4) end #-------------------------------------------------------------------------- # ● オプション : 連続攻撃 #-------------------------------------------------------------------------- def dual_attack return ::SpiritSystem.get(OPT, @id).include?(5) end #-------------------------------------------------------------------------- # ● オプション : クリティカル防止 #-------------------------------------------------------------------------- def prevent_critical return ::SpiritSystem.get(OPT, @id).include?(6) end #-------------------------------------------------------------------------- # ● オプション : 消費 MP 半分 #-------------------------------------------------------------------------- def half_mp_cost return ::SpiritSystem.get(OPT, @id).include?(7) end #-------------------------------------------------------------------------- # ● オプション : 取得経験値 2 倍 #-------------------------------------------------------------------------- def double_exp_gain return ::SpiritSystem.get(OPT, @id).include?(8) end #-------------------------------------------------------------------------- # ● オプション : HP 自動回復 #-------------------------------------------------------------------------- def auto_hp_recover return ::SpiritSystem.get(OPT, @id).include?(9) end end #============================================================================== # ■ SpiritSystem::Spirit #------------------------------------------------------------------------------ # このクラスは $game_party.spirit で参照できます。 #============================================================================== class Spirit #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize reset_all end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def reset_all @list = {} end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def reset(id) return (@list[id] = SpiritData.new(id)) end #-------------------------------------------------------------------------- # ● オブジェクト参照 #-------------------------------------------------------------------------- def [](id) return (@list[id].nil? ? reset(id) : @list[id]) end #-------------------------------------------------------------------------- # ● 精霊IDs #-------------------------------------------------------------------------- def ids return SPIRIT.keys.sort end #-------------------------------------------------------------------------- # ● オブジェクトサイズ #-------------------------------------------------------------------------- def size return SPIRIT.keys.size end end #============================================================================== # ■ SpiritSystem::PartnerSpirit #------------------------------------------------------------------------------ # このクラスは $game_actors[アクターID].partner で参照できます。 #============================================================================== class Partner attr_reader :id # パートナーの精霊ID #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor_id) @actor_id = actor_id @id = 0 change_partner(START_P[actor_id].nil? ? 0 : START_P[actor_id]) @compatible = [] ids = SPIRIT.keys.sort for i in ids @compatible[i] = ::SpiritSystem.get_a(CMPT, actor_id, i) end end #-------------------------------------------------------------------------- # ● パートナー有無 #-------------------------------------------------------------------------- def disable? return (@id == 0) end #-------------------------------------------------------------------------- # ● パートナー精霊変更 #-------------------------------------------------------------------------- def change_partner(id) obj.change_partner(0) unless disable? @id = id obj.change_partner(@actor_id) unless disable? end def v_partner(id) @id = id end #-------------------------------------------------------------------------- # ● パートナー精霊参照 #-------------------------------------------------------------------------- def obj return nil if disable? return $game_party.spirit[@id] end #-------------------------------------------------------------------------- # ● 相性 #-------------------------------------------------------------------------- def compatible_i(s_id) return 0 if s_id < 1 @compatible[s_id] = ::SpiritSystem.get_a(CMPT, @actor_id, s_id) if @compatible[s_id].nil? return @compatible[s_id] end def compatible return compatible_i(@id) end def set_compatible_i(s_id, c) return if s_id < 1 @compatible[s_id] = ::SpiritSystem.get_a(CMPT, @actor_id, s_id) if @compatible[s_id].nil? @compatible[s_id] = c end def compatible=(c) set_compatible_i(@id, c) end #-------------------------------------------------------------------------- # ● 相性による能力上昇倍率 #-------------------------------------------------------------------------- P_UP = [0, 0.5, 0.8, 1, 1.2, 1.5] def powerup return P_UP[self.compatible] end #-------------------------------------------------------------------------- # ● 共通パラメータ取得 #-------------------------------------------------------------------------- def get_prm(prm) return 0 if disable? case prm when 0; return [(obj.maxhp * powerup).truncate, 9999].min when 1; return [(obj.maxmp * powerup).truncate, 9999].min when 2; return [(obj.atk * powerup).truncate, 999].min when 3; return [(obj.def * powerup).truncate, 999].min when 4; return [(obj.spi * powerup).truncate, 999].min when 5; return [(obj.agi * powerup).truncate, 999].min end return 0 end def maxhp; return get_prm(0); end def maxmp; return get_prm(1); end def atk; return get_prm(2); end def def; return get_prm(3); end def spi; return get_prm(4); end def agi; return get_prm(5); end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 #-------------------------------------------------------------------------- def skill_learn?(skill) return false if disable? return obj.skill_learn?(skill) end #-------------------------------------------------------------------------- # ● 属性補正値の取得 # element_id : 属性 ID #-------------------------------------------------------------------------- def element_rate(element_id) return 0 if disable? return (::SpiritSystem.get_a(E_RATE, @id, element_id) * powerup).truncate end #-------------------------------------------------------------------------- # ● オプション : クリティカル頻発 #-------------------------------------------------------------------------- def critical_bonus return false if disable? return obj.critical_bonus end #-------------------------------------------------------------------------- # ● オプション : 強力防御 #-------------------------------------------------------------------------- def super_guard return false if disable? return obj.super_guard end #-------------------------------------------------------------------------- # ● オプション : 薬の知識 #-------------------------------------------------------------------------- def pharmacology return false if disable? return obj.pharmacology end #-------------------------------------------------------------------------- # ● オプション : ターン内先制 #-------------------------------------------------------------------------- def fast_attack return false if disable? return obj.fast_attack end #-------------------------------------------------------------------------- # ● オプション : 連続攻撃 #-------------------------------------------------------------------------- def dual_attack return false if disable? return obj.dual_attack end #-------------------------------------------------------------------------- # ● オプション : クリティカル防止 #-------------------------------------------------------------------------- def prevent_critical return false if disable? return obj.prevent_critical end #-------------------------------------------------------------------------- # ● オプション : 消費 MP 半分 #-------------------------------------------------------------------------- def half_mp_cost return false if disable? return obj.half_mp_cost end #-------------------------------------------------------------------------- # ● オプション : 取得経験値 2 倍 #-------------------------------------------------------------------------- def double_exp_gain return false if disable? return obj.double_exp_gain end #-------------------------------------------------------------------------- # ● オプション : HP 自動回復 #-------------------------------------------------------------------------- def auto_hp_recover return false if disable? return obj.auto_hp_recover end end end ## module SpiritSystem #============================================================================== # ■ Game_Party #============================================================================== class Game_Party attr_reader :spirit # 精霊データ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias init_spirit initialize def initialize init_spirit @spirit = SpiritSystem::Spirit.new end #-------------------------------------------------------------------------- # ● 精霊 #-------------------------------------------------------------------------- def spirits list = [] for id in @spirit.ids list.push(id) if @spirit[id].visible end return list end #-------------------------------------------------------------------------- # ● 精霊加入 #-------------------------------------------------------------------------- def add_spirit(s_id) @spirit[s_id].visible = true end #-------------------------------------------------------------------------- # ● 精霊脱退 #-------------------------------------------------------------------------- def del_spirit(s_id) @spirit[s_id].visible = false end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler attr_reader :partner # パートナー精霊 #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias setup_spirit setup def setup(actor_id) @partner = SpiritSystem::Partner.new(actor_id) setup_spirit(actor_id) end #-------------------------------------------------------------------------- # ● 習得スキル #-------------------------------------------------------------------------- alias skills_spirit skills def skills list = skills_spirit.dup unless @partner.disable? for skill in @partner.obj.skills list.push(skill) unless @skills.include?(skill.id) end list.sort! do |a,b| b.id - a.id end end return list end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 # skill : スキル #-------------------------------------------------------------------------- alias skill_learn_spirit? skill_learn? def skill_learn?(skill) return true if @partner.skill_learn?(skill) return skill_learn_spirit?(skill) end #-------------------------------------------------------------------------- # ● 基本 MaxHP の取得 #-------------------------------------------------------------------------- alias base_maxhp_spirit base_maxhp def base_maxhp return [base_maxhp_spirit + @partner.maxhp, self.maxhp_limit].min end #-------------------------------------------------------------------------- # ● 基本 MaxMP の取得 #-------------------------------------------------------------------------- alias base_maxmp_spirit base_maxmp def base_maxmp return [base_maxmp_spirit + @partner.maxmp, 9999].min end #-------------------------------------------------------------------------- # ● 基本攻撃力の取得 #-------------------------------------------------------------------------- alias base_atk_spirit base_atk def base_atk return [base_atk_spirit + @partner.atk, 999].min end #-------------------------------------------------------------------------- # ● 基本防御力の取得 #-------------------------------------------------------------------------- alias base_def_spirit base_def def base_def return [base_def_spirit + @partner.def, 999].min end #-------------------------------------------------------------------------- # ● 基本精神力の取得 #-------------------------------------------------------------------------- alias base_spi_spirit base_spi def base_spi return [base_spi_spirit + @partner.spi, 999].min end #-------------------------------------------------------------------------- # ● 基本素早さの取得 #-------------------------------------------------------------------------- alias base_agi_spirit base_agi def base_agi return [base_agi_spirit + @partner.agi, 999].min end #-------------------------------------------------------------------------- # ● 属性補正値の取得 # element_id : 属性 ID #-------------------------------------------------------------------------- alias element_rate_spirit element_rate def element_rate(element_id) return (element_rate_spirit(element_id) + @partner.element_rate(element_id)) end #-------------------------------------------------------------------------- # ● クリティカル率の取得 #-------------------------------------------------------------------------- alias cri_spirit cri def cri n = cri_spirit n += 4 if @partner.critical_bonus return n end #-------------------------------------------------------------------------- # ● オプション [強力防御] の取得 #-------------------------------------------------------------------------- alias super_guard_spirit super_guard def super_guard return true if @partner.super_guard return super_guard_spirit end #-------------------------------------------------------------------------- # ● オプション [薬の知識] の取得 #-------------------------------------------------------------------------- alias pharmacology_spirit pharmacology def pharmacology return true if @partner.pharmacology return pharmacology_spirit end #-------------------------------------------------------------------------- # ● 武器オプション [ターン内先制] の取得 #-------------------------------------------------------------------------- alias fast_attack_spirit fast_attack def fast_attack return true if @partner.fast_attack return fast_attack_spirit end #-------------------------------------------------------------------------- # ● 武器オプション [連続攻撃] の取得 #-------------------------------------------------------------------------- alias dual_attack_spirit dual_attack def dual_attack return true if @partner.dual_attack return dual_attack_spirit end #-------------------------------------------------------------------------- # ● 防具オプション [クリティカル防止] の取得 #-------------------------------------------------------------------------- alias prevent_critical_spirit prevent_critical def prevent_critical return true if @partner.prevent_critical return prevent_critical_spirit end #-------------------------------------------------------------------------- # ● 防具オプション [消費 MP 半分] の取得 #-------------------------------------------------------------------------- alias half_mp_cost_spirit half_mp_cost def half_mp_cost return true if @partner.half_mp_cost return half_mp_cost_spirit end #-------------------------------------------------------------------------- # ● 防具オプション [取得経験値 2 倍] の取得 #-------------------------------------------------------------------------- alias double_exp_gain_spirit double_exp_gain def double_exp_gain return true if @partner.double_exp_gain return double_exp_gain_spirit end #-------------------------------------------------------------------------- # ● 防具オプション [HP 自動回復] の取得 #-------------------------------------------------------------------------- alias auto_hp_recover_spirit auto_hp_recover def auto_hp_recover return true if @partner.auto_hp_recover return auto_hp_recover_spirit end #-------------------------------------------------------------------------- # ● パートナー精霊変更 #-------------------------------------------------------------------------- def change_partner(id) @partner.change_partner(id) # 現在の HP と MP が最大値を超えていたら修正 @hp = [@hp, maxhp].min @mp = [@mp, maxmp].min end #-------------------------------------------------------------------------- # ● 仮想パートナー #-------------------------------------------------------------------------- def v_spirit(sprit_id, prm) tmp_id = @partner.id @partner.v_partner(sprit_id) case prm when 0; ret_prm = self.maxhp when 1; ret_prm = self.maxmp when 2; ret_prm = self.atk when 3; ret_prm = self.def when 4; ret_prm = self.spi when 5; ret_prm = self.agi else; ret_prm = 0 end @partner.v_partner(tmp_id) return ret_prm end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● レベルアップの表示 #-------------------------------------------------------------------------- alias display_level_up_spirit display_level_up def display_level_up display_level_up_spirit for actor in $game_party.existing_members next if actor.partner.disable? actor.partner.obj.gain_exp(1, true) end wait_for_message end end #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● パートナー名表示(アクター用) #-------------------------------------------------------------------------- def draw_partner_name(actor, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 80, WLH, "精霊") self.contents.font.color = normal_color name = actor.partner.disable? ? "―" : actor.partner.obj.name self.contents.draw_text(x+60, 0, 120, WLH, name) end #-------------------------------------------------------------------------- # ● パートナー名表示(精霊用) #-------------------------------------------------------------------------- def draw_partner_name2(spirit, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 120, WLH, "パートナー") self.contents.font.color = normal_color name = spirit.partner_id == 0 ? "―" : spirit.partner.name self.contents.draw_text(x + 120, y, 120, WLH, name) end #-------------------------------------------------------------------------- # ● 精霊レベル描画 #-------------------------------------------------------------------------- def draw_spirit_level(spirit, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 32, WLH, "Lv") self.contents.font.color = normal_color if spirit.level_max? self.contents.draw_text(x + 32, y, 96, WLH, "MAX") else self.contents.draw_text(x + 32, y, 24, WLH, spirit.level.to_s, 2) end end end