# ▽▽▽ XRXSv45. イミディエイト・ダメージ+ ▽▽▽ # # publish 2010/ 4/23 # update - 11/ 1/12a # # # ※素材セクション指定 - BaST【バトルシステムテンプレート】より上 # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV45 # # ヒットストップを有効にする?(ダメージシェイク連動) # HitStop = true # # 二刀流通常攻撃 - 武器ごとに行動する? # AttackEachWeapon = true # # 「対象」フラッシュ取得のダメージタイミング機能を有効にする? # (false にすると「対象」タイミングを無視し、 # デフォルトタイミング※↓でダメージが出るようになります) # IDMode = true # # デフォルトタイミング値 # (アニメーションの対象タイミングがない場合や、 # 設定された回数を超える場合の1ヒット間隔) # DefaultTiming = 36 # # アニメーション待機・末尾時間省略値(数値が大きいほど早く次の行動へ進む) # AnimationSufcutTiming = 4 # # 素手バトラー(エネミー)の通常攻撃アニメーションID # DefaultAttackAnimationID = 1 # # 全ての行動終了時のウェイト数(「無効化するウェイト数」以外) # ActionEndWait = 18 # # ステート継続メッセージのウェイト数(「無効化するウェイト数」以外) # CurrentStateWait = 28 # # 無効化するウェイト数 # DeWaits = [10,20,30,45] end #============================================================================== # ダメージシェイク連動ヒットストップ機能 #============================================================================== if XRXSV45::HitStop module XRXSV45_HitStop def update if @animation and @battler.battle_damageshake n = @animation_duration @animation_duration = 2 super @animation_duration = n else super end end end class Sprite_Battler < Sprite_Base include XRXSV45_HitStop end class Game_Battler attr_accessor :battle_damageshake end end #============================================================================== # 通常攻撃オブジェクトへの対応 #============================================================================== module XRXSV45_AttackAction def attack return RPG::UsableItem.new end end class Game_BattleAction include XRXSV45_AttackAction end #============================================================================== # 設定 - 同時にダメージ表示するスコープ #============================================================================== class RPG::UsableItem def damage_simultaneously? return [2,8,10,14].include?(self.scope) end end #============================================================================== # ダメージタイミング機能 #============================================================================== class Scene_Battle < Scene_Base if XRXSV45::IDMode def set_damage_timing(animation_id) animation = $data_animations[animation_id] if animation @damage_timings = [] count_total = 0 for timing in animation.timings if timing.flash_scope == 1 m = (timing.frame + 1) * 4 - count_total count_total += m @damage_timings.push(m) if m >= 0 end end m = (animation.frame_max) * 4 - count_total - XRXSV45::AnimationSufcutTiming @damage_timings.push(m) if m >= 0 end @damage_timing_targets = [] end else def set_damage_timing(animation_id) @damage_timings = [] @damage_timing_targets = [] end end def wait_for_damage_timing count = @damage_timings.shift count = XRXSV45::DefaultTiming unless count count += 1 if XRXSV45::DeWaits.include?(count) wait(count) @damage_timing_targets.clear end end #============================================================================== # エネミー通常攻撃アニメーション対応 #============================================================================== class Game_Battler def weapons return [] end def atk_animation_id return XRXSV45::DefaultAttackAnimationID end def atk_animation_id2 return 0 end end #============================================================================== # 武器無効化機能 #============================================================================== class Game_Battler def disabled_weapons @disabled_weapons = [] unless @disabled_weapons return @disabled_weapons end end class Game_Actor < Game_Battler alias xrxsv45_weapons weapons def weapons set = xrxsv45_weapons.dup for weapon in self.disabled_weapons i = set.index(weapon) if i set.delete_at(i) end end return set end end #============================================================================== # バトル演出の上書き - ダメージタイミング機能の呼び出し #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ダメージシェイクが終わるまでウェイト #-------------------------------------------------------------------------- if XRXSV45::HitStop def wait_for_damage_shake for battler in $game_party.members + $game_troop.members update_basic while battler.battle_damageshake end end else def wait_for_damage_shake end end #-------------------------------------------------------------------------- # ● 一定時間ウェイト #-------------------------------------------------------------------------- alias xrxsv45_wait wait def wait(duration, no_fast = false) xrxsv45_wait(duration, no_fast) unless XRXSV45::DeWaits.include?(duration) end #-------------------------------------------------------------------------- # ● アニメーション表示が終わるまでウェイト (無効化) #-------------------------------------------------------------------------- def wait_for_animation end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 #-------------------------------------------------------------------------- alias xrxsv45_execute_action execute_action def execute_action damage_sound_dummy_mode weapons = @active_battler.weapons each_attack = (weapons[1] and XRXSV45::AttackEachWeapon and @active_battler.action.attack?) if each_attack @active_battler.disabled_weapons.push(weapons[1]) end execute_one_action if each_attack @active_battler.disabled_weapons.clear @active_battler.disabled_weapons.push(weapons[0]) execute_one_action end @active_battler.disabled_weapons.clear damage_sound_reset end #-------------------------------------------------------------------------- # ○ 戦闘行動1回の実行 #-------------------------------------------------------------------------- def execute_one_action @damage_timings = [] xrxsv45_execute_action damage_sound_play wait_for_damage_shake wait_for_damage_timing while @damage_timings.size >= 1 wait(XRXSV45::ActionEndWait) end #-------------------------------------------------------------------------- # ● 攻撃アニメーションの表示 * #-------------------------------------------------------------------------- def display_attack_animation(targets) if @active_battler.is_a?(Game_Enemy) Sound.play_enemy_attack end aid1 = @active_battler.atk_animation_id aid2 = @active_battler.atk_animation_id2 display_normal_animation(targets, aid1, false) display_normal_animation(targets, aid2, true) end #-------------------------------------------------------------------------- # ● 通常アニメーションの表示 #-------------------------------------------------------------------------- alias xrxsv45_display_normal_animation display_normal_animation def display_normal_animation(targets, animation_id, mirror = false) xrxsv45_display_normal_animation(targets, animation_id, mirror) set_damage_timing(animation_id) @prior_line_number = @message_window.line_number end #-------------------------------------------------------------------------- # ● 行動結果の表示 * (再定義) #-------------------------------------------------------------------------- def display_action_effects(target, obj = nil) unless target.skipped obj = @active_battler.action.attack unless obj if obj.damage_simultaneously? if @damage_timing_targets.empty? or @damage_timing_targets.include?(target) display_action_effects_next end else display_action_effects_next end line_number = @message_window.line_number display_critical(target, obj) display_damage(target, obj) display_state_changes(target, obj) if line_number == @message_window.line_number display_failure(target, obj) unless target.states_active? end @prior_line_number = line_number @damage_timing_targets.push(target) end end def display_action_effects_next damage_sound_play wait_for_damage_shake wait_for_damage_timing @message_window.back_to(@prior_line_number) end #-------------------------------------------------------------------------- # ● 現在のステートの表示 * #-------------------------------------------------------------------------- def display_current_state state_text = @active_battler.most_important_state_text unless state_text.empty? text = @active_battler.name + state_text @message_window.add_instant_text(text) wait(XRXSV45::CurrentStateWait) @message_window.clear end end #-------------------------------------------------------------------------- # ダメージ音の再生 #-------------------------------------------------------------------------- def damage_sound_play for id in damage_sound_ids DummySound.play(id) end Graphics.frame_reset end def damage_sound_dummy_mode for id in damage_sound_ids DummySound.dummy!(id) end end def damage_sound_reset for id in damage_sound_ids DummySound.reset!(id) end end def damage_sound_ids return [10,12,14,15,16] end end #============================================================================== # 軽量化のためのダミーサウンド #============================================================================== class DummySound @@original_sounds = [] def self.dummy!(id) @@original_sounds[id] = $data_system.sounds[id] $data_system.sounds[id] = DummySoundSE.new end def self.reset!(id) $data_system.sounds[id] = @@original_sounds[id] end def self.play(id) if $data_system.sounds[id].played @@original_sounds[id].play $data_system.sounds[id].played = false end end end class DummySoundSE attr_accessor :played def initialize @played = false end def play @played = true end end