#============================================================================== # 「攻撃を受けてから反撃」(ACE) Ver.1.4 # 製作者:奈々(なな) # へぷたなすくろーる http://heptanas.mamagoto.com/ # # ◇使用規約 # 使用される場合はスクリプト作成者として「奈々」を明記して下さい。 # スクリプトの改変は自由に行って頂いて構いませんが # その場合も元のスクリプトの作成者として名前を載せて下さい。 # また配布前に必ず、ブログにある利用規約を確認して下さい。 # #------------------------------------------------------------------------------ # # デフォルトの「反撃」は相手の攻撃を無効にして反撃しますが # これを相手の攻撃を受けた上で行動可能なら反撃するように変更します。 # また、反撃にもアニメーションが表示されるようになります。 # # スキル・アイテムのメモ欄に # <反撃不可> <反撃可能> # と記述することで、命中タイプを無視して反撃の可否を設定できます。 # # データベースのメモ欄に # <反撃スキル n> # と記述することで、n番のスキルで反撃を行うように設定できます。 # 複数設定されている場合は、番号が最大のものが適用されます。 # なお、全体攻撃やランダム攻撃は単体攻撃になる仕様です。 # # また、反撃スキルに設定したスキルのメモ欄に # <確定反撃>  行動不能でも発動する # <先行反撃>  先に反撃してから攻撃を受ける # <従来反撃>  攻撃を無効にして反撃する # <固有文章>  反撃メッセージの代わりにスキルの使用メッセージを表示 # と記述して仕様を調整できます。 # #============================================================================== #============================================================================== # ■ RPG::BaseItem #------------------------------------------------------------------------------ #  アクター・装備・ステートなどを総括して扱うデータクラス。 #============================================================================== class RPG::BaseItem #-------------------------------------------------------------------------- # ● 反撃スキルの指定 #-------------------------------------------------------------------------- def cnt_atk_skill_id @note[/\<\s*反撃スキル\s*(\d+)\s*\>/] return $1 ? $1.to_i : 0 end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● スキル/アイテムの反撃率計算 #-------------------------------------------------------------------------- alias item_cnt_mod item_cnt def item_cnt(user, item) return 0 unless opposite?(user) # 味方には反撃しない return 0 if item.note.include?("<反撃不可>") return cnt if item.note.include?("<反撃可能>") return item_cnt_mod(user, item) end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors) # の内部で使用され、Game_Party クラス($game_party)からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 反撃のスキル ID を取得 #-------------------------------------------------------------------------- def cnt_atk_skill_id list = [] self.states.each do |state| next unless state list.push(state.cnt_atk_skill_id) end self.equips.each do |equip| next unless equip list.push(equip.cnt_atk_skill_id) end list.push(self.actor.cnt_atk_skill_id) list.push(self.class.cnt_atk_skill_id) return list.sort.reverse[0] > 0 ? list.sort.reverse[0] : attack_skill_id end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  敵キャラを扱うクラスです。このクラスは Game_Troop クラス($game_troop)の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 反撃のスキル ID を取得 #-------------------------------------------------------------------------- def cnt_atk_skill_id list = [] self.states.each do |state| next unless state list.push(state.cnt_atk_skill_id) end list.push(self.enemy.cnt_atk_skill_id) return list.sort.reverse[0] > 0 ? list.sort.reverse[0] : attack_skill_id end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 反撃の発動 #-------------------------------------------------------------------------- def invoke_counter_attack(target, item) attack_skill = $data_skills[target.cnt_atk_skill_id] #反撃前に攻撃を適用 if !attack_skill.note.include?("<先行反撃>") && !attack_skill.note.include?("<従来反撃>") apply_item_effects(apply_substitute(target, item), item) end if target.movable? || (target.alive? && attack_skill.note.include?("<確定反撃>")) #反撃メッセージを表示 if attack_skill.note.include?("<固有文章>") @log_window.display_use_item(target, attack_skill) else @log_window.display_counter(target, item) end #反撃のアニメーションを追加 show_animation_counter(target, attack_skill.animation_id) #反撃 @subject.item_apply(target, attack_skill) refresh_status @log_window.display_action_results(@subject, attack_skill) end #反撃後に攻撃を適用 if @subject.movable? && attack_skill.note.include?("<先行反撃>") apply_item_effects(apply_substitute(target, item), item) end end #-------------------------------------------------------------------------- # ● 反撃用アニメーションの表示 #-------------------------------------------------------------------------- def show_animation_counter(target, animation_id) if animation_id < 0 if target.actor? show_normal_animation([@subject], target.atk_animation_id1, false) show_normal_animation([@subject], target.atk_animation_id2, true) else Sound.play_enemy_attack abs_wait_short end else show_normal_animation([@subject], animation_id) end @log_window.wait wait_for_animation end end