Last active
March 6, 2018 06:31
-
-
Save DICE2000/f6b452de1ae84e007f974ad0c8fc4bd7 to your computer and use it in GitHub Desktop.
RPGツクールXPのバグ修正
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# RPG Maker XP Fan Patch Script | |
# | |
# 参考:http://p-sight.net/Annex/bugs/ | |
# | |
# RPGツクールXP Ver.1.05bまでのスクリプトのバグを修正します。 | |
# Scene_Debug以下に導入してください。 | |
# | |
# ・命中率が99%以下になると一切の攻撃スキルが命中しなくなるバグ | |
# ・スキルの威力が0に設定されている場合、 | |
# ダメージを与えても「Miss」と表示されるバグ | |
# ・イベントコマンドの「条件分岐」のアクターが特定の防具を装備している場合の | |
# 処理に不備があるバグ | |
# ・イベントコマンドの「スクリプト」の一行目がfalseになるとフリーズするバグ | |
# ・イベントの自律移動の判定バグ | |
# | |
# 2018/3/6:「スクリプト」がtrueで返るときにindexを進めすぎたバグの修正 | |
# 2018/2/16:初版 | |
# | |
# 本スクリプトは NYSL Version 0.9982(http://www.kmonos.net/nysl/) に従い、 | |
# 著作者人格権を行使せず、その他の著作権に関する一切の権利を放棄します。 | |
# | |
# by NAK(22番目の素数) | |
class Game_Character | |
#-------------------------------------------------------------------------- | |
# ● 移動タイプ : 近づく | |
# イベントの自律移動の判定バグ | |
#-------------------------------------------------------------------------- | |
def move_type_toward_player | |
# プレイヤーの座標との差を求める | |
sx = @x - $game_player.x | |
sy = @y - $game_player.y | |
# 差の絶対値を求める | |
abs_sx = sx > 0 ? sx : -sx | |
abs_sy = sy > 0 ? sy : -sy | |
# 縦横あわせて 20 タイル以上離れている場合(修正) | |
if abs_sx + abs_sy >= 20 | |
# ランダム | |
move_random | |
return | |
end | |
# 乱数 0~5 で分岐 | |
case rand(6) | |
when 0..3 # プレイヤーに近づく | |
move_toward_player | |
when 4 # ランダム | |
move_random | |
when 5 # 一歩前進 | |
move_forward | |
end | |
end | |
end | |
class Game_Battler | |
#-------------------------------------------------------------------------- | |
# ● スキルの効果適用 | |
# user : スキルの使用者 (バトラー) | |
# skill : スキル | |
# ★命中率が99%以下になると一切の攻撃スキルが命中しなくなるバグの修正 | |
# ☆スキルの威力が0に設定されている場合、ダメージを与えても「Miss」と | |
# 表示されるバグの修正 | |
#-------------------------------------------------------------------------- | |
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 | |
# 威力 0 以外の物理攻撃の場合☆修正 | |
if power != 0 and 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 の場合☆修正 | |
if power == 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 | |
class Interpreter | |
#-------------------------------------------------------------------------- | |
# ● 条件分岐 | |
# イベントコマンドの「条件分岐」のアクターが特定の防具を装備している場合の | |
# 処理に不備があるバグの修正 | |
#-------------------------------------------------------------------------- | |
alias _command_111 command_111 | |
def command_111 | |
# ローカル変数 result を初期化 | |
result = false | |
if (@parameters[0] == 4) # アクター | |
actor = $game_actors[@parameters[1]] | |
if (actor != nil && @parameters[2] == 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]) | |
# 判定結果をハッシュに格納 | |
@branch[@list[@index].indent] = result | |
# 判定結果が真だった場合 | |
if @branch[@list[@index].indent] == true | |
# 分岐データを削除 | |
@branch.delete(@list[@index].indent) | |
# 継続 | |
return true | |
end | |
# 条件に該当しない場合 : コマンドスキップ | |
return command_skip | |
else | |
_command_111 | |
end | |
else | |
_command_111 | |
end | |
end | |
#-------------------------------------------------------------------------- | |
# ● スクリプト | |
# イベントコマンドの「スクリプト」の一行目がfalseになると | |
# フリーズするバグの修正 | |
#-------------------------------------------------------------------------- | |
def command_355 | |
# script に 1 行目を設定 | |
script = @list[@index].parameters[0] + "\n" | |
# インデックスを増やす(修正) | |
@index += 1 | |
# ループ | |
loop do | |
# 次のイベントコマンドがスクリプト 2 行目以降の場合(修正) | |
if @list[@index].code == 655 | |
# script に 2 行目以降を追加 | |
script += @list[@index].parameters[0] + "\n" | |
# インデックスを進める | |
@index += 1 | |
# イベントコマンドがスクリプト 2 行目以降ではない場合 | |
else | |
# ループ中断 | |
break | |
end | |
end | |
# 評価 | |
result = eval(script) | |
# 戻り値が false の場合 | |
if result == false | |
# 終了 | |
return false | |
end | |
# 戻り値がfalseでない場合、インデックスを戻す | |
@index -= 1 | |
# 継続 | |
return true | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment