【VX/RGSS2改造】ディフェンダー時個別効果音

okuyamj
記事: 10
登録日時: 2017年10月25日(水) 11:55

【VX/RGSS2改造】ディフェンダー時個別効果音

投稿記事by okuyamj » 2017年11月04日(土) 09:55

こんにちは、毎度お騒がせしております。
今回は、Space not far様のRGSS2素材「ディフェンダーVer1.02」において、現状ではディフェンダー発生時に通常の被害ダメージSEしかならないのですが、“発動した時にキャラごとに違う効果音を鳴らしたい”のです。
なんとか改変できる方はいらっしゃられませんでしょうか?
よろしくお願い申し上げます。

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【VX/RGSS2改造】ディフェンダー時個別効果音

投稿記事by faida » 2017年11月08日(水) 03:36

こんばんは。

まず、「通常の被ダメージSE」を鳴らす処理を探しましょう。
スクリプトエディタのSoundにはデータベース上で設定したSEを鳴らす処理が詰め込まれています。
ここを見ると、以下のコードが見つかります。

コード: 全て選択

  # 味方ダメージ
  def self.play_actor_damage
    $data_system.sounds[12].play
  end
どうやら「play_actor_damage」という処理が味方の被ダメージSEを鳴らす処理のようですね。
「play_actor_damage」で全体検索すると、2つ候補が見つかります。
「Sound」は今見ているところなので、「Scene_Battle」の方を見ましょう。

コード: 全て選択

  def display_hp_damage(target, obj = nil)
    if target.hp_damage == 0                # ノーダメージ
      (中略)
    elsif target.absorbed                   # 吸収
      (中略)
    elsif target.hp_damage > 0              # ダメージ
      if target.actor?
        text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
        Sound.play_actor_damage # ここ
        $game_troop.screen.start_shake(5, 5, 10)
      else
        (中略)
      end
    else                                    # 回復
      (中略)
    end
    (中略)
  end
ここに味方の被ダメージSEを鳴らす処理がありました。
つまり、ここに「ディフェンダーが発動した時、別のSEを鳴らす」処理を組み込めばいいわけです。

じゃあその「ディフェンダーが発動した時」はどう判別すればいいか探しましょう。
「ディフェンダー Ver1.02」の設定項目の直後を見ると、
「attr_reader :defender # 行動結果: ディフェンダーフラグ」というのが見つかります。
これが「ディフェンダーが発動した時」のフラグのようです。

以上を踏まえて、前回説明した時のように改造してみましょう。

コード: 全て選択

  def display_hp_damage(target, obj = nil)
    (中略)
    elsif target.hp_damage > 0              # ダメージ
      if target.actor?
        text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
        if target.defender
          case target.id
          when 1
            Audio.se_play("Audio/SE/アクター1ディフェンダー", 80, 100)
          when 2
            Audio.se_play("Audio/SE/アクター2ディフェンダー", 80, 100)
          when 3
            Audio.se_play("Audio/SE/アクター3ディフェンダー", 80, 100)
          end
        else
          Sound.play_actor_damage
        end
        $game_troop.screen.start_shake(5, 5, 10)
      else
        (中略)
      end
    (中略)
  end

ただし、ここに入れると「攻撃をガードした!」のメッセージが表示されて、
それから被ダメージ表示とともにSEが鳴る、というちょっと間抜けな感じになってしまいます。
そうではなくて、ディフェンダーSE→被ダメージSE と鳴らしたい場合は、先ほどの改造ではなく、
「ディフェンダー Ver1.02」内にあるScene_Battleの記述を改造します。

コード: 全て選択

if SNF::DEFENDER_DISPLAY
  class Scene_Battle < Scene_Base
    #--------------------------------------------------------------------------
    # ● クリティカルヒットの表示
    #     target : 対象者
    #     obj    : スキルまたはアイテム
    #--------------------------------------------------------------------------
    alias snf_defender_display_critical display_critical
    def display_critical(target, obj = nil)
      snf_defender_display_critical(target, obj)
      # 間借り
      if target.defender
        if target.actor?
          text = SNF::DEFENDER_WORD
          case target.id
          when 1
            Audio.se_play("Audio/SE/アクター1ディフェンダー", 80, 100)
          when 2
            Audio.se_play("Audio/SE/アクター2ディフェンダー", 80, 100)
          when 3
            Audio.se_play("Audio/SE/アクター3ディフェンダー", 80, 100)
          end
        else
          text = ""
        end
        @message_window.add_instant_text(text)
        wait(20)
      end
    end
  end
end
何か不明点等ございましたら遠慮なくどうぞ。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
okuyamj
記事: 10
登録日時: 2017年10月25日(水) 11:55

Re: 【VX/RGSS2改造】ディフェンダー時個別効果音

投稿記事by okuyamj » 2017年11月11日(土) 08:47

faida様、前回のダメージアクター個別処理でもお世話になりました。
私のような初心者にもわかりやすく、ことの一から説明して頂けるので、大変勉強になっております!
最後に記述していただいたコードでディフェンダー成功時の個別SE再生には成功したのですが、これを仮に「成功時のSEをいくつかの候補からランダムにひとつだけ再生する」といった場合の記述はどのようになるでしょうか?
あるいは不可能でしょうか?
ご解説頂けると嬉しく思います。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【VX/RGSS2改造】ディフェンダー時個別効果音

投稿記事by faida » 2017年11月11日(土) 11:18

ランダム要素を入れるなら

コード: 全て選択

  alias snf_defender_display_critical display_critical
  def display_critical(target, obj = nil)
    snf_defender_display_critical(target, obj)
        (中略)
        case target.id
        when 1
          case rand(3)
          when 0
            Audio.se_play("Audio/SE/アクター1ディフェンダー1", 80, 100)
          when 1
            Audio.se_play("Audio/SE/アクター1ディフェンダー2", 80, 100)
          when 2
            Audio.se_play("Audio/SE/アクター1ディフェンダー3", 80, 100)
          end
        when 2
        (中略)
        end
        (中略)
    end
  end
このように、「rand(n)」で乱数を取得できるので、これを使います。
rand(n)は「0~(n-1)までの乱数を取得」なので、rand(3)だと出てくる数字は「0,1,2」になります。

※でも多くの素材屋さんがやるように、これに関してはもう少しスマートな方法があります。
内容が少し進歩的なので分かりづらいかもしれませんが、それでもよろしければ下記をご覧ください。

まず、多くの素材屋さんで採用されている「設定項目」を作ります。

コード: 全て選択

ACTOR_DEFENDER_SE = []
# ACTOR_DEFENDER_SE[id] = ["SE1", "SE2", ...]
ACTOR_DEFENDER_SE[1] = ["アクター1ディフェンダー1", "アクター1ディフェンダー2","アクター1ディフェンダー3"]
ACTOR_DEFENDER_SE[2] = ["アクター2ディフェンダー1", "アクター2ディフェンダー2","アクター3ディフェンダー3"]
ACTOR_DEFENDER_SE[3] = ["アクター3ディフェンダー1", "アクター3ディフェンダー2","アクター3ディフェンダー3"]
これをスクリプトの上部に貼り付けて、IDやSEを増やして、「設定項目」が完成です。
[]は「配列」といって、モノを複数管理するのに役立ちます。

次に、この配列からランダムにモノを引き出す処理を作ります。

コード: 全て選択

if SNF::DEFENDER_DISPLAY
  class Scene_Battle < Scene_Base
    #--------------------------------------------------------------------------
    # ● クリティカルヒットの表示
    #     target : 対象者
    #     obj    : スキルまたはアイテム
    #--------------------------------------------------------------------------
    alias snf_defender_display_critical display_critical
    def display_critical(target, obj = nil)
      snf_defender_display_critical(target, obj)
      # 間借り
      if target.defender
        if target.actor?
          text = SNF::DEFENDER_WORD
          id = target.id # ここアクターのID
          array = ACTOR_DEFENDER_SE[id] # ここ配列
          if array # ここ設定項目にIDがあるかどうか
            name = array[rand(array.size)] # ここSEの名前
            Audio.se_play("Audio/SE/"+name, 80, 100) if name # ここSE鳴らす
          end
        else
          text = ""
        end
        @message_window.add_instant_text(text)
        wait(20)
      end
    end
  end
end
「array.size」というのは配列の中身の数です。例だと3つ入っているので「3」となります。
つまり「rand(array.size)」なら「0,1,2のどれか」ですね。先ほどと同じです。
で、設定項目にIDがあればその中からSEをランダムに再生します。

何か不明点等ございましたら遠慮なくどうぞ。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
okuyamj
記事: 10
登録日時: 2017年10月25日(水) 11:55

Re: 【VX/RGSS2改造】ディフェンダー時個別効果音

投稿記事by okuyamj » 2017年11月12日(日) 09:47

なるほど、上記のものは乱数で条件分岐と言うことですね。先だってご解説いただいた被害ダメージボイスも、これの応用でいくつか用意できそうですね。
不慣れもなもので丸一日かかってしまいましたが、両方とも実用レベルで正常に稼働しました!
faida様一度ならず二度までもご助力くださりありがとうございます。
確かに、二番目の項目設定式の方が仰られる通りスマートですね。

“VX / Ace:スクリプト素材のリクエスト” へ戻る