#============================================================================== # ■ XP-RGSS-66 精霊システム [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 :battler_name # バトラーグラフィック attr_accessor :battler_hue # バトラーグラフィック attr_reader :partner_id # パートナーのアクターID attr_reader :level # 精霊レベル attr_reader :exp # 経験値 attr_reader :skills # 習得スキル attr_accessor :visible # 加入状態 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(id) @id = id @partner_id = 0 @name = SPIRIT[id][0] @battler_name = SPIRIT[id][1][0] @battler_hue = 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 graphic return RPG::Cache.battler(@battler_name, @battler_hue) end #-------------------------------------------------------------------------- # ● パートナー変更 #-------------------------------------------------------------------------- def change_partner(id) @partner_id = id end #-------------------------------------------------------------------------- # ● パートナー情報取得 #-------------------------------------------------------------------------- def partner return $game_actors[@partner_id] 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 の変更 # exp : 新しい EXP #-------------------------------------------------------------------------- def exp=(exp) @exp = [[exp, 9999999].min, 0].max org_level = @level while !level_max? and @exp >= @exp_list[@level+1] @level += 1 # レベルアップ end while @exp < @exp_list[@level] # レベルダウン @level -= 1 end lvup_skill_learn(org_level) if org_level != level end #-------------------------------------------------------------------------- # ● レベルの変更 # level : 新しいレベル #-------------------------------------------------------------------------- def level=(level) level = [[level, MAX_LV].min, 1].max # 上下限チェック self.exp = @exp_list[level] # EXP を変更 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) if skill_id > 0 and not skill_learn?(skill_id) @skills.push(skill_id) @skills.sort! end end #-------------------------------------------------------------------------- # ● スキルを忘れる # skill_id : スキル ID #-------------------------------------------------------------------------- def forget_skill(skill_id) @skills.delete(skill_id) end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 # skill_id : スキル ID #-------------------------------------------------------------------------- def skill_learn?(skill_id) return @skills.include?(skill_id) end #-------------------------------------------------------------------------- # ● 最大HP #-------------------------------------------------------------------------- def maxhp return ::SpiritSystem.get(MHP, @id) * @level end #-------------------------------------------------------------------------- # ● 最大SP #-------------------------------------------------------------------------- def maxsp return ::SpiritSystem.get(MSP, @id) * @level end #-------------------------------------------------------------------------- # ● 腕力 #-------------------------------------------------------------------------- def str return ::SpiritSystem.get(STR, @id) * @level end #-------------------------------------------------------------------------- # ● 器用さ #-------------------------------------------------------------------------- def dex return ::SpiritSystem.get(DEX, @id) * @level end #-------------------------------------------------------------------------- # ● 素早さ #-------------------------------------------------------------------------- def agi return ::SpiritSystem.get(AGI, @id) * @level end #-------------------------------------------------------------------------- # ● 魔力 #-------------------------------------------------------------------------- def int return ::SpiritSystem.get(INT, @id) * @level 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.maxsp * powerup).truncate, 9999].min when 2; return [(obj.str * powerup).truncate, 999].min when 3; return [(obj.dex * powerup).truncate, 999].min when 4; return [(obj.agi * powerup).truncate, 999].min when 5; return [(obj.int * powerup).truncate, 999].min end return 0 end def maxhp; return get_prm(0); end def maxsp; return get_prm(1); end def str; return get_prm(2); end def dex; return get_prm(3); end def agi; return get_prm(4); end def int; return get_prm(5); end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 #-------------------------------------------------------------------------- def skill_learn?(skill_id) return false if disable? return obj.skill_learn?(skill_id) 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 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_id in @partner.obj.skills list.push(skill_id) unless list.include?(skill_id) end list.sort! end return list end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 # skill_id : スキル ID #-------------------------------------------------------------------------- alias skill_learn_spirit? skill_learn? def skill_learn?(skill_id) return true if @partner.skill_learn?(skill_id) return skill_learn_spirit?(skill_id) end #-------------------------------------------------------------------------- # ● 基本 MaxHP の取得 #-------------------------------------------------------------------------- alias base_maxhp_spirit base_maxhp def base_maxhp return [base_maxhp_spirit + @partner.maxhp, 9999].min end #-------------------------------------------------------------------------- # ● 基本 MaxSP の取得 #-------------------------------------------------------------------------- alias base_maxsp_spirit base_maxsp def base_maxsp return [base_maxsp_spirit + @partner.maxsp, 9999].min end #-------------------------------------------------------------------------- # ● 基本腕力の取得 #-------------------------------------------------------------------------- alias base_str_spirit base_str def base_str return [base_str_spirit + @partner.str, 999].min end #-------------------------------------------------------------------------- # ● 基本器用さの取得 #-------------------------------------------------------------------------- alias base_dex_spirit base_dex def base_dex return [base_dex_spirit + @partner.dex, 999].min end #-------------------------------------------------------------------------- # ● 基本素早さの取得 #-------------------------------------------------------------------------- alias base_agi_spirit base_agi def base_agi return [base_agi_spirit + @partner.agi, 999].min end #-------------------------------------------------------------------------- # ● 基本魔力の取得 #-------------------------------------------------------------------------- alias base_int_spirit base_int def base_int return [base_int_spirit + @partner.int, 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 #-------------------------------------------------------------------------- # ● パートナー精霊変更 #-------------------------------------------------------------------------- def change_partner(id) @partner.change_partner(id) # 現在の HP と SP が最大値を超えていたら修正 @hp = [@hp, maxhp].min @sp = [@sp, maxsp].min end #-------------------------------------------------------------------------- # ● 仮想パートナー #-------------------------------------------------------------------------- def v_spirit(sprit_id, prm) tmp_id = @partner.id @partner.v_partner(sprit_id) case prm when 0; ret_prm = maxhp when 1; ret_prm = maxsp when 2; ret_prm = str when 3; ret_prm = dex when 4; ret_prm = agi when 5; ret_prm = int else; ret_prm = 0 end @partner.v_partner(tmp_id) return ret_prm end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias start_phase5_spirit start_phase5 def start_phase5 start_phase5_spirit for actor in $game_party.actors next if actor.cant_get_exp? or actor.partner.disable? last_lv = actor.partner.obj.level actor.partner.obj.exp += 1 @status_window.level_up(actor.index) if last_lv < actor.partner.obj.level end 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, 32, "精霊") self.contents.font.color = normal_color name = actor.partner.disable? ? "―" : actor.partner.obj.name self.contents.draw_text(x+60, 0, 120, 32, name) end #-------------------------------------------------------------------------- # ● パートナー名表示(精霊用) #-------------------------------------------------------------------------- def draw_partner_name2(spirit, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 120, 32, "パートナー") self.contents.font.color = normal_color name = spirit.partner_id == 0 ? "―" : spirit.partner.name self.contents.draw_text(x + 120, y, 120, 32, name) end #-------------------------------------------------------------------------- # ● 精霊レベル描画 #-------------------------------------------------------------------------- def draw_spirit_level(spirit, x, y) self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, "Lv") self.contents.font.color = normal_color if spirit.level_max? self.contents.draw_text(x + 32, y, 96, 32, "MAX") else self.contents.draw_text(x + 32, y, 24, 32, spirit.level.to_s, 2) end end end