#============================================================================== # # ■ エネミー増援スキル □Ver2.01 □製作者:月紳士 # # ・RPGツクールVX用 RGSS2スクリプト # # ●…書き換えメソッド(競合注意) ◎…メソッドのエイリアス ○…新規メソッド # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #------------------------------------------------------------------------------ # 更新履歴 # Ver2.01 記述の見直し(仕様変更無し) # Ver2.00 複数体の増援を可能に。 # Ver1.20 増援対象を設定できるように機能追加。 # Ver1.10 戦闘毎に増援分の倒した敵情報がリセットされていないミスを修正。 # Ver1.02 マニュアル修正。(スクリプトに変更はありません) # Ver1.01 コマンド取得方法を微修正(機能に変更はありません) #------------------------------------------------------------------------------ =begin このスクリプトで仲間を呼ぶエネミーを作ることができます。 大きく分けて次の二つの機能があります。  ・データベースの敵グループで「途中から出現」に設定したエネミーを   仲間を呼ぶ形で出現させる「エネミー増援スキル」を作成します。   ※「途中から出現」設定の仕方はツクールのマニュアル参照。  ・エネミーが死んだ後、「途中から出現」の状態に戻し、   同種類の別のエネミーという形で再度呼ぶことが出来るようにします。   (→増援復帰機能)   ※経験値や入手ゴールドなども倒した数に合わせて正しく入手されます。  設定の仕方  ●エネミー増援スキルの作り方    @スキルのメモ欄に     <増援スキル>     と記入してください。<>も必ず付けてください。    A効果範囲を設定してください。通常は「味方単体」で良いです。     増援として呼ぶことが可能なエネミーのうち、     ランダムに一体を呼ぶスキルとなります。     効果範囲を「味方全体」にすると、     増援可能なエネミーすべてを一度に呼び出すスキルになります。     また、「敵二体 ランダム」とすれば二体をランダムに呼ぶスキル、     「敵三体 ランダム」とすれば三体をランダムに呼ぶスキルが作れます。    A成功率をお好みに変更してください。増援の成功率に関係します。     ※ただし、「途中から出現」の仲間がいない場合など、      呼ばれる側のエネミーが存在しない場合、スキルは必ず失敗します。    B使用時メッセージを設定してください。     一行目はこの増援スキルを使った際の文章     (例:は仲間を呼んだ!)     二行目はこの増援スキルが失敗した場合の文章     (例:しかし助けはこなかった…)     として使われます。     ※増援成功時の〜が現れた!にあたる文章は      通常のエネミー登場時の文章と同じものが使われます。    C消費MP・速度補正値・アニメーション・コモンイベントも設定可能です。     お好みで設定してください。   ※その他の項目(ダメージ効果、オプション、属性、ステート変化)も    このスキルでは機能しませんので、設定しても無効となります。  ●エネミー増援スキルで出現するエネミーの作り方    ○データベースの敵グループで、呼び出したいエネミーを     「途中から出現」に設定します。    ※「途中から出現」設定の仕方はツクールのマニュアル参照。   ○エネミーが死んだ後も同じエネミーを    繰り返し出現させたい場合は、エネミーのメモ欄に    <増援復帰>    と記入してください。<>も必ず付けてください。    ※ 増援復帰を設定したエネミーは行動不能になったターン終了後に      待機状態(全快&途中から出現再設定)となります。      その為、蘇生スキル等の対象には出来ない仕様となっています。   ○逆に、「途中から出現」に設定してもエネミー増援スキルでは    そのエネミー出現させたくない場合は、エネミーのメモ欄に    <増援禁止>       と記入してください。   ○増援復帰の最大数は同種エネミーで26体(固体認識アルファベットZまで)    となっていますが、出現数をそれ以下に留めたい場合は、エネミーのメモ欄に    <最大増援数:5>    と書いてください。     5 の部分は任意の数字です。数字は半角にしてください。    ここで指定した数までしか、同種エネミーは一度の戦闘で出現しません。    (初期にすでにこれを超えるエネミーが配置されていた場合は別です)    これを超える増援エネミーは出現しなくなります。    (エネミー増援スキルが失敗します) #------------------------------------------------------------------------------  オプション・増援対象IDの設定   通常設定では増援スキルはすべての「途中から出現」の敵を対象とします。   (<増援禁止>設定の敵を除く)   スキルに設定を追加することで対象となる敵をIDで絞ることができます。 <増援スキル> とスキルのメモ欄に記入するところを <増援スキル:10> のようにしてください。: 以降の数字が指定するエネミーIDです。 指定がなされると、そのスキルで呼び出せるのは指定したIDの敵のみになります。 上記の例ですと、エネミーID 10 の敵のみを呼び出すスキルになります。 複数設定する場合は <増援スキル:10, 11> のように半角,で区切って連記します。 また、 <増援スキル:0> と 0 を指定すると、「同じIDのエネミー」という指定になります。 スキルの使い手と同じIDの敵のみを呼ぶスキルとなります。    =end #============================================================================== #============================================================================== # ■ RPG::Skill #============================================================================== class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # ○ 増援スキルの取得 #-------------------------------------------------------------------------- def reinforcement_call? return true if (/[<<]増援スキル[>>::]/) =~ @note return false end #-------------------------------------------------------------------------- # ○ 増援タイプの取得 #-------------------------------------------------------------------------- def reinforcement_call_type result = [] if (/[<<]増援スキル[::]\s*([\s\d,,]+)[>>]/) =~ @note text = $1.gsub(/\s/){""} text.split(/[,,]/).each{|type| next if type == "" result.push(type.to_i) } end return result end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  敵キャラを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ○ オプション [増援復帰] の取得 #-------------------------------------------------------------------------- def comeback? return true if (/[<<]増援復帰[>>]/) =~ enemy.note return false end #-------------------------------------------------------------------------- # ○ オプション [増援禁止] の取得 #-------------------------------------------------------------------------- def not_comeback? return true if (/[<<]増援禁止[>>]/) =~ enemy.note return false end #-------------------------------------------------------------------------- # ○ オプション [増援の限界数] の取得 #-------------------------------------------------------------------------- def comeback_count_stop if (/[<<]最大増援数[::](\d+)[>>]/) =~ enemy.note count_stop = $1.to_i - 1 end if count_stop == nil or count_stop > 25 count_stop = 25 end return count_stop end #-------------------------------------------------------------------------- # ○ 増援スキルタイプの一致判定 #-------------------------------------------------------------------------- def reinforcement_call_type_mach(skill, member) for i in skill.reinforcement_call_type case i when 0 return true if @enemy_id == member.enemy_id else return true if i == member.enemy_id end end return true if skill.reinforcement_call_type.empty? return false end end #============================================================================== # ■ Game_Troop #------------------------------------------------------------------------------ #  敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も # 行います。このクラスのインスタンスは $game_troop で参照されます。 #============================================================================== class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :names_count #-------------------------------------------------------------------------- # ◎ クリア #-------------------------------------------------------------------------- alias tig_erc_clear clear def clear tig_erc_clear @lost_enemys = [] end #-------------------------------------------------------------------------- # ○ 仲間を呼ぶ用の再登場準備 #-------------------------------------------------------------------------- def reinforcement_ready for enemy in members if enemy.dead? and enemy.comeback? enemy.hidden = true enemy.letter = '' enemy.recover_all @lost_enemys.push(enemy) end end end #-------------------------------------------------------------------------- # ◎ 経験値の合計計算 #-------------------------------------------------------------------------- alias tig_erc_exp_total exp_total def exp_total exp = tig_erc_exp_total for enemy in @lost_enemys exp += enemy.exp end return exp end #-------------------------------------------------------------------------- # ◎ お金の合計計算 #-------------------------------------------------------------------------- alias tig_erc_gold_total gold_total def gold_total gold = tig_erc_gold_total for enemy in @lost_enemys gold += enemy.gold end return gold end #-------------------------------------------------------------------------- # ◎ ドロップアイテムの配列作成 #-------------------------------------------------------------------------- alias tig_erc_make_drop_items make_drop_items def make_drop_items drop_items = tig_erc_make_drop_items for enemy in @lost_enemys for di in [enemy.drop_item1, enemy.drop_item2] next if di.kind == 0 next if rand(di.denominator) != 0 if di.kind == 1 drop_items.push($data_items[di.item_id]) elsif di.kind == 2 drop_items.push($data_weapons[di.weapon_id]) elsif di.kind == 3 drop_items.push($data_armors[di.armor_id]) end end end return drop_items end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ◎ ターン終了 #-------------------------------------------------------------------------- alias tig_erc_turn_end turn_end def turn_end $game_troop.reinforcement_ready tig_erc_turn_end end #-------------------------------------------------------------------------- # ◎ 戦闘行動の実行 : スキル #-------------------------------------------------------------------------- alias tig_erc_execute_action_skill execute_action_skill def execute_action_skill skill = @active_battler.action.skill return unless @active_battler.movable? # 行動可能か最終確認 if skill.reinforcement_call? return if @active_battler.actor? return execute_action_reinforce # 増援スキル時は別処理へ else tig_erc_execute_action_skill end end #-------------------------------------------------------------------------- # ○ 戦闘行動の実行 : スキル「増援(仲間を呼ぶ)」専用処理 #-------------------------------------------------------------------------- def execute_action_reinforce skill = @active_battler.action.skill #- スキル準備 text = @active_battler.name + skill.message1 # メッセージ1表示 @message_window.add_instant_text(text) wait(40) @active_battler.mp -= @active_battler.calc_mp_cost(skill) # コスト消費 $game_temp.common_event_id = skill.common_event_id # コモンイベント開始 #- 増援候補を作成 candidates = [] for member in $game_troop.members next unless @active_battler.reinforcement_call_type_mach(skill, member) # 増援スキルタイプが不一致なら次へ next unless member.hidden # 途中から出現でないなら次へ next if member.not_comeback? # 増援禁止なら次へ candidates.push(member) end candidates = candidates.sort_by{rand} # 処理順をシャッフル #- 増援対象を確定 called = [] if rand(100) < skill.hit # スキル成功率判定 for enemy in candidates count = called.select{|i| enemy.original_name == i.original_name}.size count += $game_troop.names_count[enemy.original_name].to_i next if count > enemy.comeback_count_stop # 出現最大数を超えたら失敗 called.push(enemy) break if skill.for_one? and called.size == 1 # 単体なら終了 break if skill.for_two? and called.size == 2 # 2体なら終了 break if skill.for_three? and called.size == 3 # 3体なら終了 end end #- 増援処理 called.sort!{|a, b| a.index <=> b.index} display_animation(called, skill.animation_id) called.each{|i| i.hidden = false } # エフェクト無しの場合用フラグ解除 $game_troop.make_unique_names display_reinforcement(called) end #-------------------------------------------------------------------------- # ○ 増援の表示(結果) # target : 対象者 # result : 結果 #-------------------------------------------------------------------------- def display_reinforcement(targets) skill = @active_battler.action.skill if targets.empty? if skill.message2.empty? text = "しかし仲間はあらわれなかった。" # 増援時の文章が未設定の場合 else text = skill.message2 # メッセージ2表示 end @message_window.add_instant_text(text) wait(60) else line_number = @message_window.line_number for target in targets text = sprintf(Vocab::Emerge, target.name) if @message_window.line_number == 4 @message_window.back_to(line_number) end @message_window.add_instant_text(text) wait(10) end wait(50) end end end