#============================================================================== # ■ RGSS3 命中・会心システム改変 Ver2.01 by 星潟 #------------------------------------------------------------------------------ # 命中判定と回避判定が別にあるデフォルトシステムを変更し # 回避判定を消滅させ、命中率と回避率の差分を以て実効命中率とします。 # (命中しなかった場合、回避もしなかった判定にするようにもできます) # また、会心率・会心回避率については # 会心率と1 - 会心回避率の乗算で会心率を求める計算を変更し # 会心率から会心回避率を引いた確率で実効会心率とします。 #============================================================================== # イベントコマンドのスクリプト他、何かしらの状況で # 実効命中率や実効会心率の計算が必要になった場合に使用。 # これは常に1.00を100%とする浮動小数点数の形で数字を返す。 #------------------------------------------------------------------------------ # 実効命中率の場合 #------------------------------------------------------------------------------ # target.eff_hit(user,item) # # targetの部分には対象を指すもの、userの部分には使用者を指すもの、 # itemの部分には使用したアイテムやスキルを指すものが入る。 # # 例えばダメージ計算式で用いる場合、 # # b.eff_hit(a,$data_skills[1]) # # このようにすれば「使用者が対象にスキルID1を使用する場合の命中率」の値を返す。 # # b.eff_hit(a,$data_items[2]) # # このようにすれば「使用者が対象にアイテムID2を使用する場合の命中率」の値を返す。 #------------------------------------------------------------------------------ # 実効会心率の場合 #------------------------------------------------------------------------------ # target.eff_cri(user,item) # # targetの部分には対象を指すもの、userの部分には使用者を指すもの、 # itemの部分には使用したアイテムやスキルを指すものが入る。 # # 例えばダメージ計算式で用いる場合、 # # b.eff_cri(a,$data_skills[1]) # # このようにすれば「使用者が対象にスキルID1を使用する場合の会心率」の値を返す。 # # b.eff_cri(a,$data_items[2]) # # このようにすれば「使用者が対象にアイテムID2を使用する場合の会心率」の値を返す。 #============================================================================== module EFF_PER #命中率と回避率の計算を変更するか否か(true 変更する/false 変更しない) HE_EFF = true #HE_EFFがtrueの場合 #命中率と回避率の計算変更方式を旧型にするか新型にするかを指定(true 旧型/false 新型) #新型のものは競合しにくいように作っていますが #旧来のもので不具合がなかった場合はtrueのままでいいかもしれません HE_EFF_Type = false #HE_EFFがtrueの場合 #実効命中率の最終値が0未満なら0にするかを指定(trueで0、falseでそのままの値) HE_EFF_Zero = false #HE_EFFがtrueかつ命中しなかった場合の内部フラグを指定 #0の場合、命中しなかっただけの判定となる #1の場合、回避しただけの判定となる #2の場合、命中もしなかったし回避もした判定となる #(基本、命中失敗か回避成功のどちらかのフラグを満たしていれば命中しないが # スクリプト素材の動作上、これらの判定が重要になる場合がある) Evade_Flag = 2 #会心率と会心回避率の計算を変更するか否か(true 変更する/false 変更しない) CC_EFF = true #CC_EFFがtrueの場合 #会心率と会心回避率の計算変更方式を旧型にするか新型にするかを指定(true 旧型/false 新型) #新型のものは競合しにくいように作っていますが #旧来のもので不具合がなかった場合はtrueのままでいいかもしれません CC_EFF_Type = false #CC_EFFがtrueの場合 #実効会心率の最終値が0未満なら0にするかを指定(trueで0、falseでそのままの値) CC_EFF_Zero = false #命中タイプ:魔法や命中タイプ:必中のアイテム・スキルを #外した際にSEを演奏するか否かを指定 SE_Play = true #HE_EFFがtrueの時、命中タイプ:魔法のアイテム・スキルを外した際のSEを指定 #SE名・音量・ピッチの順 #SE名が空("")の場合は演奏しない M_SE = ["Evasion2",80,100] #HE_EFFがtrueの時、命中タイプ:必中のアイテム・スキルを外した際のSEを指定 #SE名・音量・ピッチの順 #SE名が空("")の場合は演奏しない C_SE = ["Evasion1",80,100] end class Game_Battler < Game_BattlerBase if EFF_PER::HE_EFF if EFF_PER::HE_EFF_Type #強制上書き版 #-------------------------------------------------------------------------- # 実効命中率の計算 #-------------------------------------------------------------------------- def eff_hit(user, item) r = item_hit(user, item) - item_eva(user, item) EFF_PER::HE_EFF_Zero && r < 0 ? 0 : r end #-------------------------------------------------------------------------- # スキル/アイテムの効果適用 #-------------------------------------------------------------------------- def item_apply(user, item) @result.clear @result.used = item_test(user, item) @result.missed = (@result.used && rand >= eff_hit(user, item)) if @result.missed @result.evaded = ( case EFF_PER::Evade_Flag when 0;false when 1;@result.missed = false;true else ;true end) end if @result.hit? unless item.damage.none? @result.critical = (rand < item_cri(user, item)) make_damage_value(user, item) execute_damage(user) end item.effects.each {|effect| item_effect_apply(user, item, effect) } item_user_effect(user, item) end end else #競合回避版 #-------------------------------------------------------------------------- # 実効命中率の計算 #-------------------------------------------------------------------------- def eff_hit(user, item) @efficiency_hit_flag = true r = item_hit(user, item) remove_instance_variable(:@efficiency_hit_flag) r end #-------------------------------------------------------------------------- # スキル/アイテムの効果適用 #-------------------------------------------------------------------------- alias item_apply_efficiency item_apply def item_apply(user, item) @efficiency_hit_flag = true item_apply_efficiency(user, item) remove_instance_variable(:@efficiency_hit_flag) end #-------------------------------------------------------------------------- # スキル/アイテムの命中率の計算 #-------------------------------------------------------------------------- alias item_hit_efficiency item_hit def item_hit(user, item) r = item_hit_efficiency(user, item) if @efficiency_hit_flag @efficiency_hit_flag = nil r -= item_eva(user, item) r = 0 if EFF_PER::HE_EFF_Zero && r < 0 @efficiency_hit_flag = true end r end #-------------------------------------------------------------------------- # スキル/アイテムの回避率の計算 #-------------------------------------------------------------------------- alias item_eva_efficiency item_eva def item_eva(user, item) @efficiency_hit_flag ? 0 : item_eva_efficiency(user, item) end end end if EFF_PER::CC_EFF #-------------------------------------------------------------------------- # スキル/アイテムの実効会心率の計算 #-------------------------------------------------------------------------- def eff_cri(user, item) item_cri(user, item) end if EFF_PER::CC_EFF_Type #強制上書き版 #-------------------------------------------------------------------------- # スキル/アイテムの会心率の計算 #-------------------------------------------------------------------------- def item_cri(user, item) if item.damage.critical r = user.cri - cev EFF_PER::CC_EFF_Zero && r < 0 ? 0 : r else 0 end end else #競合回避版 #-------------------------------------------------------------------------- # スキル/アイテムの会心率の計算 #-------------------------------------------------------------------------- alias item_cri_efficiency item_cri def item_cri(user, item) @efficiency_cri_flag = true r = item_cri_efficiency(user, item) remove_instance_variable(:@efficiency_cri_flag) r -= cev if item.damage.critical EFF_PER::CC_EFF_Zero && r < 0 ? 0 : r end end end end if EFF_PER::HE_EFF && !EFF_PER::HE_EFF_Type class Game_ActionResult #-------------------------------------------------------------------------- # 最終的に命中したか否かを判定 #-------------------------------------------------------------------------- alias hit_efficiency? hit? def hit? if @used && @missed @evaded = ( case EFF_PER::Evade_Flag when 0;false when 1;@missed = false;true when 2;true end) end hit_efficiency? end end end if EFF_PER::CC_EFF && !EFF_PER::CC_EFF_Type class Game_BattlerBase #-------------------------------------------------------------------------- # 追加能力値の取得 #-------------------------------------------------------------------------- alias xparam_efficiency xparam def xparam(xparam_id) return 0 if xparam_id == 3 && @efficiency_cri_flag xparam_efficiency(xparam_id) end end end if EFF_PER::SE_Play class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ミスの表示 #-------------------------------------------------------------------------- alias display_miss_efficiency display_miss def display_miss(target, item) if item && !item.physical? a = ( if item.magical? ;EFF_PER::M_SE elsif item.certain?;EFF_PER::C_SE else; [""] end) RPG::SE.new(a[0],a[1],a[2]).play if !a[0].empty? end display_miss_efficiency(target, item) end end end