#============================================================================== # ■ Game_Battler (分割定義 3) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● スキルの効果適用 (再定義) # user : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- def skill_effect(user, skill) # クリティカルフラグをクリア self.critical = false # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、 # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合 if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1) # メソッド終了 return false end # 有効フラグをクリア effective = false # コモンイベント ID が有効の場合は有効フラグをセット effective |= skill.common_event_id > 0 # ☆ココから変更 # 第一命中判定 hit = skill.atk_f > 0 ? skill.hit * user.hit / 100 : skill.hit # ☆ココまで変更 hit_result = (rand(100) < hit) # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 # 命中の場合 if hit_result == true # 威力を計算 power = skill.power + user.atk * skill.atk_f / 100 if power > 0 power -= self.pdef * skill.pdef_f / 200 power -= self.mdef * skill.mdef_f / 200 power = [power, 0].max end # 倍率を計算 rate = 20 rate += (user.str * skill.str_f / 100) rate += (user.dex * skill.dex_f / 100) rate += (user.agi * skill.agi_f / 100) rate += (user.int * skill.int_f / 100) # 基本ダメージを計算 self.damage = power * rate / 20 # 属性修正 self.damage *= elements_correct(skill.element_set) self.damage /= 100 # ダメージの符号が正の場合 if self.damage > 0 # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / user.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100 hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 end # 命中の場合 if hit_result == true # ☆ココから変更 # 物理攻撃の場合 if skill.atk_f > 0 # ☆ココまで変更 # ステート衝撃解除 remove_states_shock # 有効フラグをセット effective = true end # HP からダメージを減算 last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # ステート変化 @state_changed = false effective |= states_plus(skill.plus_state_set) effective |= states_minus(skill.minus_state_set) # ☆ココから変更 # 威力が 0 の場合 で、 なおかつダメージが 0 の場合 if skill.power == 0 and self.damage == 0 # ☆ココまで変更 # ダメージに空文字列を設定 self.damage = "" # ステートに変化がない場合 unless @state_changed # ダメージに "Miss" を設定 self.damage = "Miss" end end # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" end # 戦闘中でない場合 unless $game_temp.in_battle # ダメージに nil を設定 self.damage = nil end # メソッド終了 return effective end end #============================================================================== # ■ Interpreter #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● 条件分岐 (再定義) #-------------------------------------------------------------------------- def command_111 # ローカル変数 result を初期化 result = false # 条件判定 case @parameters[0] when 0 # スイッチ result = ($game_switches[@parameters[1]] == (@parameters[2] == 0)) when 1 # 変数 value1 = $game_variables[@parameters[1]] if @parameters[2] == 0 value2 = @parameters[3] else value2 = $game_variables[@parameters[3]] end case @parameters[4] when 0 # と同値 result = (value1 == value2) when 1 # 以上 result = (value1 >= value2) when 2 # 以下 result = (value1 <= value2) when 3 # 超 result = (value1 > value2) when 4 # 未満 result = (value1 < value2) when 5 # 以外 result = (value1 != value2) end when 2 # セルフスイッチ if @event_id > 0 key = [$game_map.map_id, @event_id, @parameters[1]] if @parameters[2] == 0 result = ($game_self_switches[key] == true) else result = ($game_self_switches[key] != true) end end when 3 # タイマー if $game_system.timer_working sec = $game_system.timer / Graphics.frame_rate if @parameters[2] == 0 result = (sec >= @parameters[1]) else result = (sec <= @parameters[1]) end end when 4 # アクター actor = $game_actors[@parameters[1]] if actor != nil case @parameters[2] when 0 # パーティにいる result = ($game_party.actors.include?(actor)) when 1 # 名前 result = (actor.name == @parameters[3]) when 2 # スキル result = (actor.skill_learn?(@parameters[3])) when 3 # 武器 result = (actor.weapon_id == @parameters[3]) # ☆ココから変更 when 4 # 防具 result = (actor.armor1_id == @parameters[3] or actor.armor2_id == @parameters[3] or actor.armor3_id == @parameters[3] or actor.armor4_id == @parameters[3]) # ☆ココまで変更 when 5 # ステート result = (actor.state?(@parameters[3])) end end when 5 # エネミー enemy = $game_troop.enemies[@parameters[1]] if enemy != nil case @parameters[2] when 0 # 出現している result = (enemy.exist?) when 1 # ステート result = (enemy.state?(@parameters[3])) end end when 6 # キャラクター character = get_character(@parameters[1]) if character != nil result = (character.direction == @parameters[2]) end when 7 # ゴールド if @parameters[2] == 0 result = ($game_party.gold >= @parameters[1]) else result = ($game_party.gold <= @parameters[1]) end when 8 # アイテム result = ($game_party.item_number(@parameters[1]) > 0) when 9 # 武器 result = ($game_party.weapon_number(@parameters[1]) > 0) when 10 # 防具 result = ($game_party.armor_number(@parameters[1]) > 0) when 11 # ボタン result = (Input.press?(@parameters[1])) when 12 # スクリプト result = eval(@parameters[1]) end # 判定結果をハッシュに格納 @branch[@list[@index].indent] = result # 判定結果が真だった場合 if @branch[@list[@index].indent] == true # 分岐データを削除 @branch.delete(@list[@index].indent) # 継続 return true end # 条件に該当しない場合 : コマンドスキップ return command_skip end #-------------------------------------------------------------------------- # ● スクリプト (再定義) #-------------------------------------------------------------------------- def command_355 # script に 1 行目を設定 script = @list[@index].parameters[0] + "\n" # 現在のindexを保存 temp_index = @index # ループ loop do # 次のイベントコマンドがスクリプト 2 行目以降の場合 if @list[@index+1].code == 655 # script に 2 行目以降を追加 script += @list[@index+1].parameters[0] + "\n" # イベントコマンドがスクリプト 2 行目以降ではない場合 else # ループ中断 break end # インデックスを進める @index += 1 end # 評価 result = eval(script) # 戻り値が false の場合 if result == false if temp_index == @index # indexが進んでない場合、indexを進める @index += 1 end # 終了 return false end # 継続 return true end end