#=========================================================================== # ◆ A1 Scripts ◆ # バトルアクション(RGSS3) # # バージョン : 2.00 (2012/01/18) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・バトル中のスキル・アイテム使用時に行うアクションを設定します # ・バトル時のアニメーションを複数同時表示します #--------------------------------------------------------------------------- # 更新履歴   :2012/01/10 Ver1.00 リリース # :2012/01/10 Ver1.01 アクターのアニメーションを画面左上に表示してしまう不具合を修正 # :2012/01/18 Ver2.00 反撃・戦闘不能時に攻撃を続ける不具合を修正 # :2012/01/18 Ver2.00 位置がずれる不具合を修正 # :2012/01/18 Ver2.00 A1バトル共通スクリプト対応 #--------------------------------------------------------------------------- # 設置場所 # A1バトル共通スクリプト以下 # # 必要スクリプト # A1バトル共通スクリプト #--------------------------------------------------------------------------- # 使い方 # スキルorアイテムのメモ欄に記述します # # <アクション action,action,acton・・・> # # actionの書き方 # アニメーション:A(ID)(Damage)(Skip) # 例:A103DS → アニメーションID 103 を表示し # ダメージを与えて、アニメーションの終了を待ちません # # 例:A76D → アニメーションID 76 を表示し # ダメージを与えて、アニメーションの終了を待ちます # # 例:A124S → アニメーションID 124 を表示し # ダメージを与えず、アニメーションの終了を待ちません # # 例:A53 → アニメーションID 53 を表示し # ダメージを与えず、アニメーションの終了を待ちます # # ダメージ発生:D(times)(Skip) # 例:D3 → ダメージを3回発生させ、ログのウェイトを発生させます # 例:D1S → ダメージを1回発生させ、ログのウェイトを発生させません # # ウェイト:W(frame) # 例:W60 → 60フレーム(1秒)の間ウェイトします # #    ※アクション中にダメージを発生させると #   アクション終了後にダメージを発生させません # # アクション設定例 # 例:桜花夢幻刃 # <アクション A88S,D1S,W8,D1S,W8,D1S,W8,D1S,W30> # # この設定でアニメーション「斬撃/必殺技4」に合わせてダメージが入ります # # 例:連続アニメーション # <アクション A7D,A7D,A7D,A7D,A7D> # # この設定でアニメーション「斬撃/物理」をダメージ付きで5回連続させます #============================================================================== $imported ||= {} if $imported["A1_BattleCommonScript"] $imported["A1_BattleAction"] = true old_common_script("バトルアクション", "3.30") if common_version < 3.30 #============================================================================== # ■ RPG::UsableItem #============================================================================== class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # ○ アクション #-------------------------------------------------------------------------- def actions @actions = $a1_common.note_data_array(self.note, "アクション", "A", nil, false) if @actions == nil return nil if @actions.empty? return @actions end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ☆ ウェイト #-------------------------------------------------------------------------- alias a1_chain_animation_sb_wait wait def wait(duration) a1_chain_animation_sb_wait(duration) unless @skip_animation_wait || @skip_effect_wait end #-------------------------------------------------------------------------- # ☆ アニメーション表示が終わるまでウェイト #-------------------------------------------------------------------------- alias a1_chain_animation_sb_wait_for_animation wait_for_animation def wait_for_animation a1_chain_animation_sb_wait_for_animation unless @skip_animation_wait end #-------------------------------------------------------------------------- # ☆ エフェクト実行が終わるまでウェイト #-------------------------------------------------------------------------- alias a1_chain_animation_sb_wait_for_effect wait_for_effect def wait_for_effect a1_chain_animation_sb_wait_for_effect unless @skip_effect_wait end #-------------------------------------------------------------------------- # ☆ スキル/アイテムの使用 #-------------------------------------------------------------------------- alias a1_chain_animation_sb_use_item use_item def use_item return if @subject.hp <= 0 @skip_animation_wait = false @action_invoke = false @invoke_damage = false @log_window.wait_skip = false @action_item = @subject.current_action.item if @subject.current_action a1_chain_animation_sb_use_item end #-------------------------------------------------------------------------- # ☆ アニメーションの表示 # targets : 対象者の配列 # animation_id : アニメーション ID(-1: 通常攻撃と同じ) #-------------------------------------------------------------------------- alias a1_chain_animation_sb_show_animation show_animation def show_animation(targets, animation_id) return a1_chain_animation_sb_show_animation(targets, animation_id) unless check_action_item set_wait_collapse(targets, true) @action_item.actions.each {|action| proc_action(targets, action) } set_wait_collapse(targets, false) @action_invoke = @invoke_damage @action_item = nil end #-------------------------------------------------------------------------- # ○ アクションの存在チェック #-------------------------------------------------------------------------- def check_action_item return false unless @action_item return false unless @action_item.actions return true end #-------------------------------------------------------------------------- # ○ コラプス処理保留の設定 #-------------------------------------------------------------------------- def set_wait_collapse(targets, flag) @skip_effect_wait = true unless flag targets.each {|target| target.wait_collapse = flag; next if flag target.refresh @log_window.display_added_states(target) } @skip_effect_wait = false wait_for_effect unless flag end #-------------------------------------------------------------------------- # ○ アクションの実行 #-------------------------------------------------------------------------- def proc_action(targets, action) @skip_animation_wait = false @log_window.wait_skip = false return action_animation(targets, $1.to_i, $2) if action =~ /A([-]?\d+)(.*)/ return wait($1.to_i) if action =~ /W(\d+)/ proc_damage(targets, $1.to_i, $2) if action =~ /D(\d+)(.*)/ end #-------------------------------------------------------------------------- # ○ ダメージの実行 #-------------------------------------------------------------------------- def proc_damage(targets, num, params) @log_window.wait_skip = true if params.include?("S") @skip_animation_wait = true if params.include?("S") targets.each {|target| num.times { invoke_item(target, @action_item) } } @invoke_damage = true end #-------------------------------------------------------------------------- # ○ アクションのアニメーション #-------------------------------------------------------------------------- def action_animation(targets, animation_id, params) return if @subject.hp <= 0 @skip_animation_wait = true if params.include?("S") @log_window.wait_skip = true if params.include?("S") a1_chain_animation_sb_show_animation(targets, animation_id) targets.each {|target| invoke_item(target, @action_item) } if params.include?("D") @invoke_damage = true if params.include?("D") end #-------------------------------------------------------------------------- # ☆ スキル/アイテムの発動 #-------------------------------------------------------------------------- alias a1_chain_animation_sb_invoke_item invoke_item def invoke_item(target, item) return if @subject.hp <= 0 a1_chain_animation_sb_invoke_item(target, item) unless @action_invoke end end #============================================================================== # ■ Sprite_BattleAnimation #============================================================================== class Sprite_BattleAnimation < Sprite_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport, battler_sprite, index, use_sprite) @use_sprite = use_sprite super(viewport) self.x = battler_sprite.x self.y = battler_sprite.y self.z = battler_sprite.z + index self.ox = battler_sprite.ox self.oy = battler_sprite.oy self.src_rect = battler_sprite.src_rect end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 #-------------------------------------------------------------------------- alias a1_multi_animation_sb_initialize initialize def initialize(viewport, battler = nil) @viewport = viewport @sprite_animation = [] a1_multi_animation_sb_initialize(viewport, battler) end #-------------------------------------------------------------------------- # ○ アニメーションの開始 #-------------------------------------------------------------------------- def start_animation(animation, mirror) sprite_animation = Sprite_BattleAnimation.new(@viewport, self, @sprite_animation.size, @battler.use_sprite?) sprite_animation.start_animation(animation, mirror) @sprite_animation.push(sprite_animation) end #-------------------------------------------------------------------------- # ○ アニメーション表示中判定 #-------------------------------------------------------------------------- def battle_animation? @sprite_animation.each {|animation| return true if animation.animation? } return false end #-------------------------------------------------------------------------- # ☆ フレーム更新 #-------------------------------------------------------------------------- alias a1_multi_animation_sb_update update def update a1_multi_animation_sb_update update_animation_ex end #-------------------------------------------------------------------------- # ○ アニメーションの更新 #-------------------------------------------------------------------------- def update_animation_ex @sprite_animation.each_with_index {|animation, i| animation.update next if animation.animation? animation.dispose @sprite_animation.delete_at(i) } end end #============================================================================== # ■ Window_BattleLog #------------------------------------------------------------------------------ #  戦闘の進行を実況表示するウィンドウです。枠は表示しませんが、便宜上ウィンド # ウとして扱います。 #============================================================================== class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 #-------------------------------------------------------------------------- alias a1_chain_animation_wbl_initialize initialize def initialize @wait_skip = false a1_chain_animation_wbl_initialize end #-------------------------------------------------------------------------- # ☆ ウェイト #-------------------------------------------------------------------------- alias a1_chain_animation_wbl_wait wait def wait a1_chain_animation_wbl_wait unless @wait_skip @wait_skip = false end #-------------------------------------------------------------------------- # ○ ウェイトスキップの設定 #-------------------------------------------------------------------------- def wait_skip=(flag) @wait_skip = flag end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 #-------------------------------------------------------------------------- alias a1_battle_action_gb_initialize initialize def initialize a1_battle_action_gb_initialize @wait_collapse = false end #-------------------------------------------------------------------------- # ☆ ステートの付加 #-------------------------------------------------------------------------- alias a1_battle_action_gb_add_state add_state def add_state(state_id) return if @wait_collapse && state_id == death_state_id a1_battle_action_gb_add_state(state_id) end #-------------------------------------------------------------------------- # ○ コラプスウェイト #-------------------------------------------------------------------------- def wait_collapse=(flg) @wait_collapse = flg end end end