#=============================================================================== #【 EXクリティカル機構VX】 # アクターの通常攻撃のクリティカルの際に # さらに威力が上がる追加クリティカル判定を搭載するパーツです # (エネミーはデフォルトの判定のみ行います) # また、ダメージスキルにも # クリティカル判定、及び追加クリティカル判定を適用させることができます # # スキルクリティカルを有効にしている場合 # スキル固有のクリティカル率増加値を設定することができます # スキルのメモ帳に <加算クリティカル率:x> という記述を書き加えると # スキルクリティカルの判定時に、x%クリティカル率が増加します(アクターのみ) # スキルクリティカルを有効にしていないと動作しません # # クリティカル防止チェックが付いている場合は # クリティカル発生率が半分になります(防止されるわけではありません) #=============================================================================== module KURO #本機構専用モジュール・カスタマイズ項目============================= #=============================================================================== # 基礎クリティカル率 ## アクターが本来持つ基本のクリティカル率 ## デフォルト設定は4 CT_base = 5 # 追加基礎クリティカル率 ## 職業や武器の「クリティカル頻発」オプションのチェックで加算される値 ## デフォルト設定は4 CT_baseplus = 5 # 各クリティカル倍率 ## 設定値は百分率、本来のダメージ値を100%とする CT_rate = 175 # アクターのクリティカル倍率。各CT段階ごとにこの倍率がかかる ECT_rate = 200 # 敵キャラのクリティカル倍率。CT判定は一回のみでこの倍率 # クリティカル時表示文字列 ## 通常クリティカル及び多段クリティカルの際の表示文字です ## 上から、各クリティカルの段階ごとに一行ずつ設定(第一・第二・第三…の順) ## 多段クリティカルを使用する場合、必ず設定した多段クリティカル判定回数と ## 同じ数だけ設定してください ## 最初の行と最終の行のカッコは消さないでください ## それぞれカンマで終わらせる。最終行はカンマをつけないでください ## 多段スキルクリティカル機能も使う場合、最大数は段階数が多い方に合わせてください CT_NAME = [ "クリティカル!", "ハードクリティカル!", "エクスクリティカル!" ] CT_NAME_ENEMY = "クリティカル!" # アクターのクリティカル確率 ## 入力した数値にアクターの本来のクリティカル発生率を足したもの「%」が ## 発生確率となります(アクターの基本クリティカル発生率は「4」) ## 左から、各クリティカルの段階ごとに設定(第一・第二・第三…の順) ## 必ず設定した多段クリティカル判定回数と同じ数だけ設定してください ## それぞれカンマで区切る。最後はカンマをつけないでください ## その段階での判定が成功したときのみ、次段階のクリティカルの判定が行われます CT_prob = [30, 20 ,10] # 敵キャラのクリティカル発生確率 ## 「クリティカルあり」のオプションがチェックされているエネミーのみ ## 入力した数値(%)の確率をクリティカル率に加算します ECT_prob = 5 # 上から、クリティカル時に演奏するSE、そのボリューム、そのピッチ # SEはファイル名のみを記述してください # 何も演奏しない場合はファイル名を nil に CT_SE = "Attack2" CT_SEv = 100 CT_SEp = 50 #==スキル多段クリティカル機構設定=============================================== #=============================================================================== SCT_rate = 150 # アクターのスキルクリティカル倍率 SECT_rate = 200 # 敵キャラのスキルクリティカル倍率 SCT_prob = [20, 10, 5] # アクターのスキルクリティカル確率 SECT_prob = 5 # 敵キャラのスキルクリティカル確率 ## 設定方法はすべて、通常攻撃のものとおなじ ## こちらで独自設定していないものは、通常攻撃の方の設定を引き継ぎます S_CRITICAL_PLUS_WORD = "加算クリティカル率" # スキルクリティカル率増加設定の際、スキルのメモ欄に書く判定文字列です # 他のメモ用語と被りそうな場合等はこちらで設定してください # なお、カッコの書式 <> と、数値の書式 :n は仕様なのでこちらからは変更できません # 上から、クリティカル時に演奏するSE、そのボリューム、そのピッチ # SEはファイル名のみを記述してください # 何も演奏しない場合はファイル名を nil に WK_SE = "Ice2" WK_SEv = 90 WK_SEp = 80 end #====カスタマイズ項目ここまで=================================================== #=============================================================================== class KURO_CTsound def ctsound Audio.se_play("Audio/SE/" + KURO::CT_SE, KURO::CT_SEv,KURO::CT_SEp) end def wksound Audio.se_play("Audio/SE/" + KURO::WK_SE, KURO::WK_SEv,KURO::WK_SEp) end end #==KUROmoduleここまで=========================================================== #=============================================================================== #============================================================================== # ■ Game_Battler(再定義) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler attr_reader :excritical # 行動結果: EXクリティカルフラグ attr_reader :excritical2 # 行動結果: EXクリティカルフラグ2 #-------------------------------------------------------------------------- # ● 新規定義 スキルクリティカル用メモ内容収得 #-------------------------------------------------------------------------- def ctplus_get_skillmemo(obj) ret = 0 memo = obj.note.scan(/<#{KURO::S_CRITICAL_PLUS_WORD}:(\S+)>/) memo = memo.flatten if memo != nil and not memo.empty? ret = memo[0].to_i end return ret end #-------------------------------------------------------------------------- # ● 新規定義 両手持ち武器判定 #-------------------------------------------------------------------------- def twohand_weapon?(attacker) #return false if attacker.is_a?(Game_Enemy) # 呼びだし元で判定するので省略 return false if attacker.weapon_id < 1 return true if $data_weapons[attacker.weapon_id].two_handed return false end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias :exct_initialize :initialize def initialize exct_initialize @excritical = false @excritical2 = false end #-------------------------------------------------------------------------- # ● 通常攻撃によるダメージ計算 # attacker : 攻撃者 # 結果は @hp_damage に代入する。 #-------------------------------------------------------------------------- alias :exct_make_attack_damage_value :make_attack_damage_value def make_attack_damage_value(attacker) exct_make_attack_damage_value(attacker) @excritical = false @excritical2 = false damage = @hp_damage if damage != nil and damage.is_a?(Numeric) and damage > 0 # ダメージが正の数ならば if @critical damage /= 3 @critical = false end if attacker.is_a?(Game_Actor) #= 両手持ち武器威力補正 ============= twohand_flg = twohand_weapon?(attacker) weaponplus = 100 ctplus = 0 if twohand_flg weaponplus += 100 ctplus = attacker.cri / 2 end damage = damage * weaponplus / 100 #= 両手持ち武器威力補正ここまで ===== critical_prm = attacker.cri + ctplus critical_prm = [critical_prm * attacker.def / self.agi,50].min # クリティカル率は最大で75% critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @critical = (rand(100) < ((KURO::CT_prob[0]) + critical_prm)) # クリティカル判定 #@critical = false if prevent_critical # クリティカル防止? if @critical # クリティカル判定に成功していればクリティカル修正 damage = damage * KURO::CT_rate / 100 @critical = true critical_prm /= 2 # 多段補正でクリティカル率半減 critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @excritical = (rand(100) < ((KURO::CT_prob[1]) + critical_prm)) # EXクリティカル判定 if @excritical # EXクリティカル判定に成功していればクリティカル修正 damage = damage * KURO::CT_rate / 100 @excritical = true critical_prm /= 2 # 多段補正でクリティカル率半減 critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @excritical2 = (rand(100) < ((KURO::CT_prob[2]) + critical_prm)) # EXクリティカル判定 if @excritical2 # EXクリティカル判定に成功していればクリティカル修正 damage = damage * KURO::CT_rate / 100 @excritical2 = true end end end else # 攻撃者がエネミーの場合 critical_prm = [(KURO::ECT_prob + attacker.cri) * attacker.def / self.agi,75].min critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @critical = (rand(100) < critical_prm) # クリティカル判定 #@critical = false if prevent_critical # クリティカル防止? if @critical #クリティカル判定に成功していればクリティカル修正 damage = damage * KURO::ECT_rate / 100 @critical = true end end @hp_damage = damage end end #-------------------------------------------------------------------------- # ● スキルまたはアイテムによるダメージ計算 # user : スキルまたはアイテムの使用者 # obj : スキルまたはアイテム # 結果は @hp_damage または @mp_damage に代入する。 #-------------------------------------------------------------------------- alias :exct_make_obj_damage_value :make_obj_damage_value def make_obj_damage_value(user, obj) exct_make_obj_damage_value(user, obj) @excritical = false @excritical2 = false if obj.damage_to_mp damage = @mp_damage else damage = @hp_damage end if damage != nil and damage.is_a?(Numeric) and damage > 0 # ダメージが正の数ならば scplus = ctplus_get_skillmemo(obj) if user.is_a?(Game_Actor) critical_prm = user.cri + scplus critical_prm = [critical_prm * user.def / self.agi,75].min # クリティカル率は最大で75% critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @critical = (rand(100) < ((KURO::SCT_prob[0]) + critical_prm)) # クリティカル判定 #@critical = false if prevent_critical # クリティカル防止? if @critical # クリティカル判定に成功していればクリティカル修正 damage = damage * KURO::SCT_rate / 100 @critical = true critical_prm /= 2 critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @excritical = (rand(100) < ((KURO::SCT_prob[1]) + critical_prm)) # EXクリティカル判定 if @excritical # EXクリティカル判定に成功していればクリティカル修正 damage = damage * KURO::SCT_rate / 100 @excritical = true critical_prm /= 2 critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 @excritical2 = (rand(100) < ((KURO::SCT_prob[2]) + critical_prm)) # EXクリティカル判定 if @excritical2 # EXクリティカル判定に成功していればクリティカル修正 damage = damage * KURO::SCT_rate / 100 @excritical2 = true end end end else # 攻撃者がエネミーの場合 critical_prm = KURO::SECT_prob + user.cri + scplus critical_prm /= 2 if prevent_critical # クリティカル防止の場合、クリティカル率半減 ectprob = [critical_prm * user.def / self.agi,50].min # クリティカル率は最大で50% @critical = (rand(100) < ectprob) # クリティカル判定 #@critical = false if prevent_critical # クリティカル防止? if @critical #クリティカル判定に成功していればクリティカル修正 damage = damage * KURO::SECT_rate / 100 end end if obj.damage_to_mp @mp_damage = damage # MP にダメージ else @hp_damage = damage # HP にダメージ end end end #=============================================================================== end #============================================================================== # ■ Game_Actor(再定義) #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler def cri n = KURO::CT_base n += KURO::CT_baseplus if actor.critical_bonus for weapon in weapons.compact n += KURO::CT_baseplus if weapon.critical_bonus end return n end end #=============================================================================== #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  敵キャラを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● クリティカル率の取得 #-------------------------------------------------------------------------- def cri return enemy.has_critical ? KURO::ECT_prob : 0 end end #=============================================================================== #============================================================================== # ■ Scene_Battle(再定義) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● クリティカルヒットの表示(多段CT機構用) # target : 対象者 # obj : スキルまたはアイテム #-------------------------------------------------------------------------- def display_critical(target, obj = nil) tcplay = KURO_CTsound.new unless target.missed or target.evaded if target.critical tcplay.ctsound unless target.actor? if target.excritical2 text = KURO::CT_NAME[2] elsif target.excritical text = KURO::CT_NAME[1] else text = KURO::CT_NAME[0] end else text = KURO::CT_NAME_ENEMY end end if text != nil @message_window.add_instant_text(text) wait(20) end end end end #===============================================================================