#============================================================================== # ■ CAO_SP (cacao service pack) 2010.04.25 #------------------------------------------------------------------------------ # プリセットスクリプトの不都合を修正します。 #============================================================================== #------------------------------------------------------------------------------ # 【はじめに】 #------------------------------------------------------------------------------ # ■ このスクリプトは、VX_SP1 のすぐ下に導入して下さい。 # 再定義を多用していますので、他スクリプトより上に導入する必要があります。 # ■ このスクリプトに限り、転載・再配布・改変・改変物の配布を許可しています。 # 積極的に情報を広めていただければと思います。 # ■ メソッドのマークの意味は次の通りです。 # ● 新しく定義 ○ 再定義 ◎ オーバーライド (新しく追加したもの) # ■ 修正が不要なものについては、該当箇所をコメントアウトして下さい。 # 修正内容と同じ順番で項目ごとに1行空けて分けています。 # Ctrl + } で項目ごとの移動が出来ると思いますので、数えてください。 #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ # 【修正内容】 #------------------------------------------------------------------------------ # ■ アイテム・スキル・ターゲットウィンドウを開いた状態で戦闘の中断を行うと # それらのウィンドウが表示されたままになってしまう不都合を修正しました。 # ■ スキル選択画面でLRボタンの操作が重複している不都合を修正しました。 # "アクター切り替え"と"ページ送り"のうち、『アクター切り替え』を当てました。 # ■ スキル画面のビューポートの解放し忘れを修正しました。 # ■ ステートAの解除ステートにステートBが含まれていても、 # ステートB付加の成功メッセージが表示される不都合を修正しました。 # ■ アイテムでの能力アップを回復処理より先に処理するように修正しました。 # ■ 『プレイヤーの方/逆を向く』の処理で対象となるイベントとプレイヤーとの # 座標差が同値の場合に向き変更を行わない不都合を修正しました。 # ■ Plane クラスの viewport と viewport= メソッドを使用した際に # エラーが出る不都合をなんとかしました。 # ■ Viewport#disposed? を使用した際にエラーが出る不都合をなんとかしました。 # ■ Tilemap#visible で、タイルが非表示にならない不都合をなんとかしました。 # ■ 『移動ルートの設定:グラフィックの変更』でプレイヤーの歩行グラを変更すると # アクターのグラフィック変更やパーティ編成後に歩行グラが元に戻ってしまう # 不都合を修正しました。 (更新のタイミングは、先頭アクターが変更された時) # ■ イベントコマンドで戦闘不能の敵にステートを付加すると # 消滅アニメーションが再表示される不都合を修正しました。 # ■ 逃走した敵にステートが付いていると可視状態になる不都合を修正しました。 # 見えていない敵のステートのメッセージは表示しないように変更しています。 # ■ アイテムが使用可能かの判定で、ステート付加に失敗すると使用不可と # 判断されてしまう不都合を修正しました。 # (ステートの変化に失敗しても、アイテムが消費されるようになります。) #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ # 【そのほか】 #------------------------------------------------------------------------------ # ■ イベントの実行後にエンカウントを発生させたくない。 # □ エンカウントを発生させたくないイベントで次のスクリプトを実行してください。 # エンカウントが発生する場合、カウント数を1にして次の一歩で発生させます。 #~ unless $game_player.encounter_count > 0 #~ $game_player.instance_variable_set( #~ :@encounter_count, 1 #~ ) #~ end #------------------------------------------------------------------------------ class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ○ 終了処理 #-------------------------------------------------------------------------- alias _cao_sp_terminate terminate def terminate _cao_sp_terminate @target_actor_window.dispose if @target_actor_window @help_window.dispose if @help_window @skill_window.dispose if @skill_window @item_window.dispose if @item_window end end class Window_Skill < Window_Selectable #-------------------------------------------------------------------------- # ○ カーソルを 1 ページ後ろに移動 #-------------------------------------------------------------------------- def cursor_pagedown end #-------------------------------------------------------------------------- # ○ カーソルを 1 ページ前に移動 #-------------------------------------------------------------------------- def cursor_pageup end end class Scene_Skill < Scene_Base #-------------------------------------------------------------------------- # ○ 終了処理 #-------------------------------------------------------------------------- alias _cao_sp_terminate terminate def terminate _cao_sp_terminate @viewport.dispose end end class Game_Battler #-------------------------------------------------------------------------- # ○ ステート無効化判定 # state_id : ステート ID #-------------------------------------------------------------------------- def state_resist?(state_id) return state_ignore?(state_id) end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ ステート無効化判定 # state_id : ステート ID #-------------------------------------------------------------------------- def state_resist?(state_id) for armor in armors.compact return true if armor.state_set.include?(state_id) end super end end class Game_Battler #-------------------------------------------------------------------------- # ○ アイテムの効果適用 # user : アイテムの使用者 # item : アイテム #-------------------------------------------------------------------------- def item_effect(user, item) clear_action_results unless item_effective?(user, item) @skipped = true return end if rand(100) >= calc_hit(user, item) # 命中判定 @missed = true return end if rand(100) < calc_eva(user, item) # 回避判定 @evaded = true return end hp_recovery = calc_hp_recovery(user, item) # HP 回復量計算 mp_recovery = calc_mp_recovery(user, item) # MP 回復量計算 make_obj_damage_value(user, item) # ダメージ計算 item_growth_effect(user, item) # 成長効果適用 @hp_damage -= hp_recovery # HP 回復量を差し引く @mp_damage -= mp_recovery # MP 回復量を差し引く make_obj_absorb_effect(user, item) # 吸収効果計算 execute_damage(user) # ダメージ反映 if item.physical_attack and @hp_damage == 0 # 物理ノーダメージ判定 return end apply_state_changes(item) # ステート変化 end end class Game_Character #-------------------------------------------------------------------------- # ○ プレイヤーの方を向く #-------------------------------------------------------------------------- def turn_toward_player sx = distance_x_from_player sy = distance_y_from_player if sx.abs > sy.abs # 横の距離のほうが長い sx > 0 ? turn_left : turn_right else # 縦の距離のほうが長い sy > 0 ? turn_up : turn_down end end #-------------------------------------------------------------------------- # ○ プレイヤーの逆を向く #-------------------------------------------------------------------------- def turn_away_from_player sx = distance_x_from_player sy = distance_y_from_player if sx.abs > sy.abs # 横の距離のほうが長い sx > 0 ? turn_right : turn_left else # 縦の距離のほうが長い sy > 0 ? turn_down : turn_up end end end class Plane #-------------------------------------------------------------------------- # ● 別名定義 #-------------------------------------------------------------------------- alias SetViewport viewport unless $! # ビューポートの割り当て alias original_initialize initialize unless $! # オブジェクトの初期化 alias original_dispose dispose unless $! # オブジェクトの解放 #-------------------------------------------------------------------------- # ○ オブジェクトの初期化 #-------------------------------------------------------------------------- def initialize(v = nil) @viewport = v original_initialize(v) end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @viewport.dispose if @viewport original_dispose end #-------------------------------------------------------------------------- # ○ ビューポートの取得 #-------------------------------------------------------------------------- def viewport return @viewport end #-------------------------------------------------------------------------- # ● ビューポートの設定 #-------------------------------------------------------------------------- def viewport=(v) @viewport = SetViewport(v) end end class Viewport #-------------------------------------------------------------------------- # ● ビューポートの設定 #-------------------------------------------------------------------------- def disposed? begin self.visible rescue RGSSError return false end return true end end class Tilemap #-------------------------------------------------------------------------- # ● 別名定義 #-------------------------------------------------------------------------- alias original_dispose dispose unless $! # オブジェクトの解放 alias original_viewport viewport unless $! # ビューポートの取得 alias original_viewport= viewport= unless $! # ビューポートの設定 alias original_visible= visible= unless $! # 可視状態の設定 #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @hide_viewport.dispose if @hide_viewport self.original_dispose end #-------------------------------------------------------------------------- # ○ ビューポートの取得 #-------------------------------------------------------------------------- def viewport return @last_viewport unless self.visible self.original_viewport end #-------------------------------------------------------------------------- # ○ ビューポートの設定 #-------------------------------------------------------------------------- def viewport=(v) if self.visible self.original_viewport = v else @last_viewport = v end end #-------------------------------------------------------------------------- # ○ 可視状態の設定 #-------------------------------------------------------------------------- def visible=(value) @hide_viewport = Viewport.new(0, 0, 32, 32) unless @hide_viewport @last_viewport = self.original_viewport unless @last_viewport if value self.original_viewport = @last_viewport else self.original_viewport = @hide_viewport @hide_viewport.visible = false end self.original_visible = value end end class Game_Player < Game_Character #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- alias _cao_sp_initialize initialize def initialize _cao_sp_initialize @last_actor_id = 0 # アクターのID (記憶用) end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh if $game_party.members.size == 0 @character_name = "" @character_index = 0 @last_actor_id = 0 else actor = $game_party.members[0] # 先頭のアクターを取得 if @last_actor_id != actor.id @character_name = actor.character_name @character_index = actor.character_index @last_actor_id = actor.id end end end #-------------------------------------------------------------------------- # ◎ グラフィックの変更 # character_name : 新しい歩行グラフィック ファイル名 # character_index : 新しい歩行グラフィック インデックス #-------------------------------------------------------------------------- #~ def set_graphic(character_name, character_index) #~ @tile_id = 0 #~ @character_name = character_name #~ @character_index = character_index #~ if $game_party.members.size != 0 #~ actor = $game_party.members[0] # 先頭のアクターを取得 #~ actor.set_graphic(character_name, character_index, #~ actor.face_name, actor.face_index) #~ end #~ end end class Game_Interpreter #-------------------------------------------------------------------------- # ○ ステートの変更 #-------------------------------------------------------------------------- def command_313 iterate_actor_id(@params[0]) do |actor| if @params[1] == 0 live = enemy.hp > 0 actor.add_state(@params[2]) actor.perform_collapse if live else actor.remove_state(@params[2]) end end return true end #-------------------------------------------------------------------------- # ○ 敵キャラのステート変更 #-------------------------------------------------------------------------- def command_333 iterate_enemy_index(@params[0]) do |enemy| if @params[2] == 1 # 戦闘不能の変更なら enemy.immortal = false # 不死身フラグをクリア end if @params[1] == 0 live = enemy.hp > 0 enemy.add_state(@params[2]) enemy.perform_collapse if live else enemy.remove_state(@params[2]) end end return true end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ○ 現在のステートの表示 #-------------------------------------------------------------------------- alias _cao_sp_display_current_state display_current_state def display_current_state return if @active_battler.hidden _cao_sp_display_current_state end #-------------------------------------------------------------------------- # ○ ステート自然解除 #-------------------------------------------------------------------------- def remove_states_auto last_st = @active_battler.states @active_battler.remove_states_auto if @active_battler.states != last_st && !@active_battler.hidden wait(5) display_state_changes(@active_battler) wait(30) @message_window.clear end end end class Game_Battler #-------------------------------------------------------------------------- # ● ステート変化の確認 # obj : スキル、アイテム、または攻撃者 #-------------------------------------------------------------------------- def states_changed?(obj) added_states = [] removed_states = [] for state_id in obj.plus_state_set # ステート変化 (+) break if dead? # 戦闘不能? next if state_id == 1 and @immortal # 不死身? next if state_resist?(state_id) # 無効化されている? next if state?(state_id) # すでに付加されている? added_states << state_id end for state_id in obj.minus_state_set # ステート変化 (-) next unless state?(state_id) # 付加されていない? next unless state_ignore?(state_id) # 無視するべきステート removed_states << state_id end for state_id in added_states & removed_states added_states.delete(state_id) # 付加と解除の両方に記録されている removed_states.delete(state_id) # ステートがあれば両方削除する end return true unless added_states.empty? return true unless removed_states.empty? return false end #-------------------------------------------------------------------------- # ○ スキルの適用テスト # user : スキルの使用者 # skill : スキル # 使用対象が全快しているときの回復禁止などを判定する。 #-------------------------------------------------------------------------- def skill_test(user, skill) tester = self.clone tester.make_obj_damage_value(user, skill) if tester.hp_damage < 0 return true if tester.hp < tester.maxhp # HPが全快ではない end if tester.mp_damage < 0 return true if tester.mp < tester.maxmp # MPが全快ではない end return true if tester.states_changed?(item) # ステートが変化する return false end #-------------------------------------------------------------------------- # ○ アイテムの適用テスト # user : アイテムの使用者 # item : アイテム # 使用対象が全快しているときの回復禁止などを判定する。 #-------------------------------------------------------------------------- def item_test(user, item) tester = self.clone tester.make_obj_damage_value(user, item) if tester.hp_damage < 0 or tester.calc_hp_recovery(user, item) > 0 return true if tester.hp < tester.maxhp # HPが全快ではない end if tester.mp_damage < 0 or tester.calc_mp_recovery(user, item) > 0 return true if tester.mp < tester.maxmp # MPが全快ではない end return true if tester.states_changed?(item) # ステートが変化する return true if item.parameter_type > 0 # 能力値が変化する return false end end