#============================================================================== # 新規パラメータ追加 ver1.21 #------------------------------------------------------------------------------ #[特徴] # 新たにパラメータを追加します。 # #[設定方法] # 下記の設定項目を参照してください。 # #[本スクリプトは] # Kamesoft様の『パラメータ振り分け』を参考にしています。 # URL :http://ytomy.sakura.ne.jp/ # 著作者:TOMY様 # # 作成:ぶちょー # URL :http://nyannyannyan.bake-neko.net/ # 著作:リードミーとかに私の名前の載せたりするのは任意で。 #============================================================================== #============================================================================== # バージョンアップ情報 # ver1.21 アクター・職業のメモ欄の記述にも対応するように # ver1.20 パッシブスキルの効果を追加 # スキルのメモ欄に記述することで、習得している間は能力値が上昇します # 転職時、パラメータの増加量が初期化されていたのを修正 # %増加の設定が正しく反映されていなかったのを修正 # %増加を加算か乗算か選択できるように # ver1.13 職業ごとにも初期値と成長値を設定できるように # ver1.12 能力上昇効果のアイテムが使用できなかったのを修正 # ver1.11 特殊能力値の計算を一部修正 # ver1.10 新規パラメータが能力値に反映されていなかったのを修正 # 反映される能力値を追加 # ver1.01 能力値の描画に誤りがあったのを修正 # ver1.00 公開 #============================================================================== #============================================================================== # 設定項目 #============================================================================== module Kazari module AddNewParameter # 新規パラメータの設定 # { :key => :key_name, # :name => "パラメータ名", # :limit => [1, 99], # [下限, 上限] # :mhp => 1, # 1 当たりの最大HP増加量 # :mmp => 1, # 最大MP # :atk => 1, # 攻撃力 # :def => 1, # 防御力 # :mat => 1, # 魔法力 # :mdf => 1, # 魔法防御 # :agi => 1, # 敏捷性 # :luk => 1, # 運 # :hit => 0.01, # 命中率 # :eva => 0.01, # 回避率 # :cri => 0.01, # 会心率 # :cev => 0.01, # 会心回避率 # :mev => 0.01, # 魔法回避率 # :mrf => 0.01, # 魔法反射率 # :cnt => 0.01, # 反撃率 # :hrg => 0.01, # HP再生率 # :mrg => 0.01, # MP再生率 # :trg => 0.01, # TP再生率 # :tgr => 0.01, # 狙われ率 # :grd => 0.01, # 防御効果率 # :rec => 0.01, # 回復効果率 # :pha => 0.01, # 薬の知識 # :mcr => -0.01, # MP消費率( - で軽減) # :tcr => 0.01, # TPチャージ率 # :pdr => -0.01, # 物理ダメージ率 # :mdr => -0.01, # 魔法ダメージ率 # :fdr => -0.01, # 床ダメージ率 # :exr => 0.01, # 経験獲得率 # }, # :key は他と被らないように設定してください。 # NG: :atk, :def, :hit 等 APARAMS = [ { :key => :str, :name => "筋力", :limit => [0, 99], :mhp => 10, :atk => 10, }, { :key => :vit, :name => "体力", :limit => [0, 99], :mhp => 50, :def => 10, }, { :key => :int, :name => "知力", :limit => [0, 99], :mmp => 10, :mat => 10, }, { :key => :mnd, :name => "精神", :limit => [0, 99], :mmp => 50, :mdf => 10, :mcr => -0.01, }, { :key => :dex, :name => "器用", :limit => [0, 99], :atk => 1, :mat => 1, :agi => 10, :hit => 0.01, }, ] # アクター毎の初期値・成長値の設定 # パラメータは 【初期値 + 成長値 × レベル】 となります。 ACTOR_PARAMETER = [ { :id => 1, # アクターID:1 :str => [10, 0.0], # [初期値, 成長値] :vit => [10, 0.0], :int => [10, 0.0], :mnd => [10, 0.0], :dex => [10, 0.0], }, { :id => 2, :str => [ 8, 0.0], :vit => [10, 0.0], # 設定しなかった INT は、下限値の 1 から成長しない。 :mnd => [ 3, 0.0], :dex => [ 5, 0.0], }, { :id => 3, :str => [ 5, 0.0], :vit => [10, 0.0], :int => [ 5, 0.0], :mnd => [10, 0.0], :dex => [ 5, 0.0], }, ] # 職業毎の初期値・成長値の設定 CLASS_PARAMETER = [ { :id => 1, # 職業ID:1 :str => [0, 0.1], # [初期値, 成長値] :vit => [0, 0.1], :int => [0, 0.0], # レベルアップで成長しない。 :mnd => [0, 0.1], :dex => [0, 0.1], }, { :id => 2, :str => [0, 0.1], :vit => [0, 0.1], # 設定しなかった INT は、下限値から成長しない。 :mnd => [0, 0.05], :dex => [0, 0.08], }, { :id => 3, :str => [0, 0.08], :vit => [0, 0.1], :int => [0, 0.08], :mnd => [0, 0.1], :dex => [0, 0.08], }, ] # %増加の計算方法 # 0 : 加算 (例) 20%増加 + 20%増加 = 40%増加 # 120% + 120% = 140% # 1 : 乗算 (例) 20%増加 x 20%増加 = 44%増加 # 120% x 120% = 144% CALC_RATE = 0 # # 《アクター/職業/武器/防具/スキル/ステートの設定方法》 # メモ欄に <パラメータ名増加:数値> #  例)<筋力増加:10> ; 10増加 # <体力増加:10%> ; 10%増加 # # 《アクター/職業に関して》 #  この2つは、上記で設定したパラメータとメモ欄に記述したパラメータの #  両方が反映されます。 # # 《アイテム》 # メモ欄に <パラメータ名増加:数値> で、使用することで基礎値が永久増加。 # 例)<知力増加:1> # # 《エネミーの設定》 # メモ欄に <パラメータ名:数値> で、設定。設定しなかったパラメータは下限値。 # 例)<筋力:30> <器用:10> # end end # # 《パラメータの使い方》 # スキルのダメージ計算式で使用するには以下で設定する必要があります。 #  設定すると a.key で参照可能。 # 例)a.str b.vit a.int b.mnd a.dex # class Game_BattlerBase def str ; aparam(:str) ; end def vit ; aparam(:vit) ; end def int ; aparam(:int) ; end def mnd ; aparam(:mnd) ; end def dex ; aparam(:dex) ; end end # # 《ステータス画面などでの描画方法》 # draw_new_parameters(actor, x, y) と書くことで追加したパラメータを描画できます。 # #============================================================================== # ここまで #============================================================================== $kzr_imported = {} if $kzr_imported == nil $kzr_imported["AddNewParameter"] = true #============================================================================== # ■ Kazari::AddNewParameter #============================================================================== module Kazari::AddNewParameter PARAMS = [:mhp, :mmp, :atk, :def, :mat, :mdf, :agi, :luk, :hit, :eva, :cri, :cev, :mev, :mrf, :cnt, :hrg, :mrg, :trg, :tgr, :grd, :rec, :pha, :mcr, :tcr, :pdr, :mdr, :fdr, :exr] GainInfo = Struct.new(:key, :name, :limit, :params) ParamInfo = Struct.new(:value) ActorInfo = Struct.new(:actor_id, :params) ClassInfo = Struct.new(:class_id, :params) GrowInfo = Struct.new(:init, :grow) ANAMES = {} ALIMITS = {} #-------------------------------------------------------------------------- # ● パラメータ増加量を構造体化 #-------------------------------------------------------------------------- def self.create_gain_param_structs(target) result = [] target.each {|v| ANAMES[v[:key]] = v[:name] ALIMITS[v[:key]] = v[:limit] info = GainInfo.new info.key = v[:key] info.name = v[:name] info.limit = v[:limit] info.params = {} PARAMS.each {|param| next unless v.has_key?(param) pinfo = ParamInfo.new pinfo.value = v[param] info.params[param] = pinfo } result << info } return result end GAIN_PARAMS = create_gain_param_structs(APARAMS) #-------------------------------------------------------------------------- # ● アクターのパラメータ成長値を構造体化 #-------------------------------------------------------------------------- def self.create_actor_param_structs(target) result = [] load_data("Data/Actors.rvdata2").size.times do |i| info = ActorInfo.new info.actor_id = i info.params = {} GAIN_PARAMS.each {|param| ginfo = GrowInfo.new ginfo.init = param[:limit][0] ginfo.grow = 0 info.params[param[:key]] = ginfo } result << info end target.each {|v| info = ActorInfo.new info.actor_id = v[:id] info.params = {} GAIN_PARAMS.each {|param| ginfo = GrowInfo.new if v.has_key?(param[:key]) ginfo.init = v[param[:key]][0] ginfo.grow = v[param[:key]][1] else ginfo.init = param[:limit][0] ginfo.grow = 0 end info.params[param[:key]] = ginfo } result[v[:id]] = info } return result end ACTOR_PARAMS = create_actor_param_structs(ACTOR_PARAMETER) #-------------------------------------------------------------------------- # ● 職業のパラメータ成長値を構造体化 #-------------------------------------------------------------------------- def self.create_class_param_structs(target) result = [] load_data("Data/Classes.rvdata2").size.times do |i| info = ClassInfo.new info.class_id = i info.params = {} GAIN_PARAMS.each {|param| ginfo = GrowInfo.new ginfo.init = param[:limit][0] ginfo.grow = 0 info.params[param[:key]] = ginfo } result << info end target.each {|v| info = ClassInfo.new info.class_id = v[:id] info.params = {} GAIN_PARAMS.each {|param| ginfo = GrowInfo.new if v.has_key?(param[:key]) ginfo.init = v[param[:key]][0] ginfo.grow = v[param[:key]][1] else ginfo.init = param[:limit][0] ginfo.grow = 0 end info.params[param[:key]] = ginfo } result[v[:id]] = info } return result end CLASS_PARAMS = create_actor_param_structs(CLASS_PARAMETER) end #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window include Kazari::AddNewParameter #-------------------------------------------------------------------------- # ● 新規能力値の描画 #-------------------------------------------------------------------------- def draw_new_parameters(actor, x, y) GAIN_PARAMS.each_with_index {|param, i| draw_actor_aparam(actor, x, y + line_height * i, param[:key]) } end #-------------------------------------------------------------------------- # ● 新規能力値の描画 #-------------------------------------------------------------------------- def draw_actor_aparam(actor, x, y, key) change_color(system_color) draw_text(x, y, 120, line_height, ANAMES[key]) change_color(normal_color) draw_text(x + 120, y, 36, line_height, actor.aparam(key), 2) end end #============================================================================== # ■ Game_BattlerBase #============================================================================== class Game_BattlerBase include Kazari::AddNewParameter #-------------------------------------------------------------------------- # ● 能力値に加算する値をクリア #-------------------------------------------------------------------------- alias kzr_add_new_param_clear_param_plus clear_param_plus def clear_param_plus kzr_add_new_param_clear_param_plus @aparam_plus ||= {} @ps_aparam_plus ||= {} @ps_aparam_rate ||= {} GAIN_PARAMS.each {|param| @aparam_plus[param[:key]] ||= 0 @ps_aparam_plus[param[:key]] ||= 0 @ps_aparam_rate[param[:key]] ||= 1.0 } end #-------------------------------------------------------------------------- # ● 特徴を保持する全オブジェクトの配列取得 #-------------------------------------------------------------------------- def add_new_param_feature_objects states end #-------------------------------------------------------------------------- # ● 通常能力値の加算値取得 #-------------------------------------------------------------------------- alias kzr_add_new_param_param_plus param_plus def param_plus(param_id) value = kzr_add_new_param_param_plus(param_id) key = [:mhp, :mmp, :atk, :def, :mat, :mdf, :agi, :luk][param_id] value + APARAMS.inject(0) {|r, a| r += a[key] ? a[key] * aparam(a[:key]) : 0 } end #-------------------------------------------------------------------------- # ● 追加能力値の取得 #-------------------------------------------------------------------------- alias kzr_add_new_param_xparam xparam def xparam(xparam_id) value = kzr_add_new_param_xparam(xparam_id) key = [:hit, :eva, :cri, :cev, :mev, :mrf, :cnt, :hrg, :mrg, :trg][xparam_id] APARAMS.inject(value) {|r, a| r += a[key] ? a[key] * aparam(a[:key]) : 0.0 } end #-------------------------------------------------------------------------- # ● 特殊能力値の取得 #-------------------------------------------------------------------------- alias kzr_add_new_param_sparam sparam def sparam(sparam_id) value = kzr_add_new_param_sparam(sparam_id) key = [:tgr, :grd, :rec, :pha, :mcr, :tcr, :pdr, :mdr, :fdr, :exr][sparam_id] [APARAMS.inject(value) {|r, a| r += a[key] ? a[key] * aparam(a[:key]) : 0.0 }, 0.0].max end #-------------------------------------------------------------------------- # ● 新規能力値の取得 #-------------------------------------------------------------------------- def aparam(key) value = (aparam_base(key) + aparam_plus(key)) * aparam_rate(key) [[value, ALIMITS[key][1]].min, ALIMITS[key][0]].max.to_i end #-------------------------------------------------------------------------- # ● 新規能力値の基礎値 #-------------------------------------------------------------------------- def aparam_base(key) return 0 end #-------------------------------------------------------------------------- # ● 新規能力値の加算値取得 #-------------------------------------------------------------------------- def aparam_plus(key) @aparam_plus[key] + @ps_aparam_plus[key] + states.inject(0) {|r, obj| r += obj.aparam_plus[key] } end #-------------------------------------------------------------------------- # ● 新規能力値の変化率取得 #-------------------------------------------------------------------------- def aparam_rate(key) if CALC_RATE == 0 add_new_param_feature_objects.inject(@ps_aparam_rate[key]) {|r, obj| r += obj.aparam_rate[key] - 1.0 } else add_new_param_feature_objects.inject(@ps_aparam_rate[key]) {|r, obj| r *= obj.aparam_rate[key] } end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● スキル/アイテムに有効な使用効果が一つでもあるかを判定 #-------------------------------------------------------------------------- alias kzr_add_new_param_item_has_any_valid_effects? item_has_any_valid_effects? def item_has_any_valid_effects?(user, item) return true if kzr_add_new_param_item_has_any_valid_effects?(user, item) return item.aparam_plus.any? {|w| w[1] != 0 && !self.aparam_max?(w[0]) } end #-------------------------------------------------------------------------- # ● スキル/アイテムの使用者側への効果 #-------------------------------------------------------------------------- alias kzr_add_new_param_item_user_effect item_user_effect def item_user_effect(user, item) kzr_add_new_param_item_user_effect(user, item) if item.aparam_plus.any? {|w| w[1] != 0 } item.aparam_plus.each {|param| @aparam_plus[param[0]] += param[1] } @result.success = true end end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler include Kazari::AddNewParameter #-------------------------------------------------------------------------- # ● 特徴を保持する全オブジェクトの配列取得 #-------------------------------------------------------------------------- def add_new_param_feature_objects super + [actor] + [self.class] + equips.compact end #-------------------------------------------------------------------------- # ● 新規能力値の基礎値 #-------------------------------------------------------------------------- def aparam_base(key) param = ACTOR_PARAMS[@actor_id][:params][key][0] param += ACTOR_PARAMS[@actor_id][:params][key][1] * @level param += CLASS_PARAMS[@class_id][:params][key][0] param += CLASS_PARAMS[@class_id][:params][key][1] * @level param.to_i end #-------------------------------------------------------------------------- # ● 新規能力値の加算値取得 #-------------------------------------------------------------------------- def aparam_plus(key) objects = [actor] + [self.class] + equips.compact objects.inject(super) {|r, item| r += item.aparam_plus[key] } end #-------------------------------------------------------------------------- # ● スキルを覚える #-------------------------------------------------------------------------- alias kzr_add_new_param_learn_skill learn_skill def learn_skill(skill_id) skill = $data_skills[skill_id] unless skill_learn?(skill) GAIN_PARAMS.each {|param| @ps_aparam_plus[param[:key]] += skill.aparam_plus[param[:key]] if CALC_RATE == 0 @ps_aparam_rate[param[:key]] += skill.aparam_rate[param[:key]] - 1.0 else @ps_aparam_rate[param[:key]] *= skill.aparam_rate[param[:key]] end } end kzr_add_new_param_learn_skill(skill_id) end #-------------------------------------------------------------------------- # ● スキルを忘れる #-------------------------------------------------------------------------- alias kzr_add_new_param_forget_skill forget_skill def forget_skill(skill_id) skill = $data_skills[skill_id] if skill_learn?(skill) GAIN_PARAMS.each {|param| @ps_aparam_plus[param[:key]] -= skill.aparam_plus[param[:key]] if CALC_RATE == 0 @ps_aparam_rate[param[:key]] -= skill.aparam_rate[param[:key]] - 1.0 else @ps_aparam_rate[param[:key]] /= skill.aparam_rate[param[:key]] end } end kzr_add_new_param_forget_skill(skill_id) end #-------------------------------------------------------------------------- # ● 新規能力値が最大か判定 #-------------------------------------------------------------------------- def aparam_max?(key) param = aparam_base(key) + @aparam_plus[key] + @ps_aparam_plus[key] param *= @ps_aparam_rate[key] return param > ALIMITS[key][1] end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 新規能力値の基礎値 #-------------------------------------------------------------------------- def aparam_base(key) enemy.aparam_base[key] end end #============================================================================== # ■ RPG #============================================================================== module RPG class BaseItem def aparam_plus return @aparam_plus if @aparam_plus != nil @aparam_plus = {} Kazari::AddNewParameter::GAIN_PARAMS.each {|param| key = param[:key] @aparam_plus[key] = get_param_plus(Kazari::AddNewParameter::ANAMES[key]) } return @aparam_plus end def aparam_rate return @aparam_rate if @aparam_rate != nil @aparam_rate = {} Kazari::AddNewParameter::GAIN_PARAMS.each {|param| key = param[:key] @aparam_rate[key] = get_param_rate(Kazari::AddNewParameter::ANAMES[key]) } return @aparam_rate end def get_param_plus(name) note.each_line {|line| case line when /<#{name}増加:([-])?(\d+)([%])?>/i return $2.to_i * ($1 ? -1 : 1) unless $3 end } return 0 end def get_param_rate(name) note.each_line {|line| case line when /<#{name}増加:([-])?(\d+)([%])?>/i return (100 + ($2.to_i * ($1 ? -1 : 1))) / 100.0 if $3 end } return 1.0 end end class Enemy def aparam_base return @aparam_base if @aparam_base != nil @aparam_base = {} Kazari::AddNewParameter::GAIN_PARAMS.each {|param| key = param[:key] @aparam_base[key] = get_param_base(key, Kazari::AddNewParameter::ANAMES[key]) } return @aparam_base end def get_param_base(key, name) note.each_line {|line| case line when /<#{name}:((\d+))/i ; return $1.to_i end } return Kazari::AddNewParameter::ALIMITS[key][0] end end end