Permanent
Creation

RPGツクールXP/VX用のRGSS素材です。
一部英語版対応です。 (A few materials can be used for English RPG MAKER XP/VX.)
競合率はルファーの独断と偏見なのでたまにハズレます。


#==============================================================================
# ■ SEエコー
#------------------------------------------------------------------------------
#  SE にエコーをかけます。
# (C) ルファー
# WebSite  https://tkoolerlufar.pages.dev/
#==============================================================================

=begin
  =対応RGSS
  2

  =他の素材との競合の可能性
  ... 多分しないと思います

  =使い方
  イベントコマンド [スクリプト] などで、エコーを再生したくなったら
  RPG::SE.echo = true
  という処理を実行すればエコーするようになります。
  元に戻すときは
  RPG::SE.echo = false
  を実行してください。

  =上級者向けの使い方
  RPG::SE#echo? メソッド (174行目以降) の処理を変更すれば、
  自動でエコーの再生を切り替えてくれます。
  真のときにエコーが鳴ります。
  デフォルトではクラス変数 @@_Lufar_SEe_Echo の値をそのまま返します。

  =更新履歴
  2010/03/19 同じファイル名、同じピッチ、異なるボリュームの SE を
             時間差で鳴らすときの処理を変更
  2010/03/04 RPG::SE#echo?メソッドの宣言開始行の表記が誤っているのを訂正
             ロード SE がうまく鳴らないバグを修正
  2010/03/01 公開

  =再定義しているメソッド
  RPG::SE#play (エイリアス使用)
  RPG::SE.stop (エイリアス使用)
  Scene_Base#main
  Scene_Title#open_command_window
  Scene_Title#close_command_window
  Scene_Title#command_new_game
  Scene_Map#update_basic (エイリアス使用)
  Scene_File#do_load (エイリアス使用)
  Scene_End#open_command_window
  Scene_End#close_command_window
  Scene_End#command_to_title
  Scene_Battle#update_basic (エイリアス使用)

  =新規定義しているメソッド
  RPG::SE#echo?

  =新規定義しているプロパティ
  RPG::SE.echo
=end

#----------------------------------------------------------------------------
# ◇ SoundEcho モジュール
#----------------------------------------------------------------------------
module SoundEcho
  #--------------------------------------------------------------------------
  # ○ モジュール変数
  #--------------------------------------------------------------------------
  @@playing_sounds = Array.new
  #--------------------------------------------------------------------------
  # ◇ SE クラス
  #--------------------------------------------------------------------------
  class SE
    #------------------------------------------------------------------------
    # ○ 公開インスタンス変数
    #------------------------------------------------------------------------
    attr_reader :se
    attr_reader :duration
    #------------------------------------------------------------------------
    # ● オブジェクト初期化
    #------------------------------------------------------------------------
    def initialize(se)
      @se = se.clone
      @duration = 30
    end
    #------------------------------------------------------------------------
    # ● 比較演算 (等しい)
    #------------------------------------------------------------------------
    def ==(other)
      case other
      when self.class
        return (
          @se.name               == other.se.name                    &&
          @se.volume * @duration == other.se.volume * other.duration &&
          @se.pitch              == other.se.pitch)
      when ::RPG::SE
        return (
          @se.name               == other.name   &&
          @se.volume * @duration == other.volume &&
          @se.pitch              == other.pitch)
      else
        return false
      end
    end
    #------------------------------------------------------------------------
    # ○ フレーム更新
    #------------------------------------------------------------------------
    def update
      return if @duration == 0
      if @duration % 6 == 0
        Audio.se_play(
          "Audio/SE/" + @se.name, @se.volume * @duration / 30, @se.pitch)
      end
      @duration -= 1
    end
  end
  #--------------------------------------------------------------------------
  # ○ モジュール関数
  #--------------------------------------------------------------------------
  module_function
  #--------------------------------------------------------------------------
  # ○ SE の再生
  #     se : 再生する SE
  #--------------------------------------------------------------------------
  def play(se)
    return if not se.kind_of?(RPG::SE) or se.name.empty?
    @@playing_sounds.delete(se)
    @@playing_sounds.push(SE.new(se))
  end
  #--------------------------------------------------------------------------
  # ○ SE の停止
  #--------------------------------------------------------------------------
  def stop
    Audio.se_stop
    @@playing_sounds.clear
  end
  #--------------------------------------------------------------------------
  # ○ SE エコー中判定
  #--------------------------------------------------------------------------
  def empty?
    @@playing_sounds.empty?
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新
  #--------------------------------------------------------------------------
  def update
    @@playing_sounds.each      {|se| se.update }
    @@playing_sounds.delete_if {|se| se.duration == 0 }
  end
end
#----------------------------------------------------------------------------
# ◆ RPG モジュール
#----------------------------------------------------------------------------
module RPG
  #--------------------------------------------------------------------------
  # ◆ SE クラス
  #--------------------------------------------------------------------------
  class SE < AudioFile
    #------------------------------------------------------------------------
    # ○ クラス変数
    #------------------------------------------------------------------------
    @@_Lufar_SEe_Echo = false
    #------------------------------------------------------------------------
    # ○ エコーフラグの取得
    #------------------------------------------------------------------------
    def self.echo
      @@_Lufar_SEe_Echo
    end
    #------------------------------------------------------------------------
    # ○ エコーフラグの設定
    #     flag : 設定するフラグ
    #------------------------------------------------------------------------
    def self.echo=(flag)
      @@_Lufar_SEe_Echo = flag
    end
    #------------------------------------------------------------------------
    # ○ エコー判定
    #------------------------------------------------------------------------
    def echo?
      @@_Lufar_SEe_Echo
    end
    #------------------------------------------------------------------------
    # ○ SE の再生
    #------------------------------------------------------------------------
    unless method_defined? :_Lufar_SEe_PrototypeOfPlaying
      alias _Lufar_SEe_PrototypeOfPlaying play
    end
    def play
      echo? ? SoundEcho.play(self) : _Lufar_SEe_PrototypeOfPlaying
    end
    #------------------------------------------------------------------------
    # ○ SE の停止
    #------------------------------------------------------------------------
    def self.stop
      SoundEcho.stop
    end
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Base クラス
#----------------------------------------------------------------------------
class Scene_Base
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    start                         # 開始処理
    perform_transition            # トランジション実行
    post_start                    # 開始後処理
    Input.update                  # 入力情報を更新
    while $scene.equal?(self)     # 画面が切り替わるまでループ
      SoundEcho.update           ## エコーする SE を更新
      Graphics.update             # ゲーム画面を更新
      Input.update                # 入力情報を更新
      update                      # フレーム更新
    end
    begin
      SoundEcho.update
      Graphics.update
      Graphics.frame_count -= 1
    end until SoundEcho.empty?
    pre_terminate                 # 終了前処理
    Graphics.freeze               # トランジション準備
    terminate                     # 終了処理
  end
end
#----------------------------------------------------------------------------
# ● Scene_Title クラス
#----------------------------------------------------------------------------
class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウを開く
  #--------------------------------------------------------------------------
  def open_command_window
    @command_window.open
    begin
      @command_window.update
      SoundEcho.update
      Graphics.update
    end until @command_window.openness == 255
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウを閉じる
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    begin
      @command_window.update
      SoundEcho.update
      Graphics.update
    end until @command_window.openness == 0
  end
  #--------------------------------------------------------------------------
  # ● コマンド : ニューゲーム
  #--------------------------------------------------------------------------
  def command_new_game
    confirm_player_location
    Sound.play_decision
    $game_party.setup_starting_members            # 初期パーティ
    $game_map.setup($data_system.start_map_id)    # 初期位置のマップ
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    $scene = Scene_Map.new
    RPG::BGM.fade(1500)
    close_command_window
    until SoundEcho.empty?
      SoundEcho.update
      Graphics.update
      Graphics.frame_count -= 1
    end
    Graphics.fadeout(60)
    Graphics.wait(40)
    Graphics.frame_count = 0
    RPG::BGM.stop
    $game_map.autoplay
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Map クラス
#----------------------------------------------------------------------------
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● 基本更新処理
  #--------------------------------------------------------------------------
  alias _Lufar_SEe_PrototypeOfUb update_basic
  def update_basic
    SoundEcho.update
    _Lufar_SEe_PrototypeOfUb
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_End クラス
#----------------------------------------------------------------------------
class Scene_End < Scene_Base
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウを開く
  #--------------------------------------------------------------------------
  def open_command_window
    @command_window.open
    begin
      @command_window.update
      SoundEcho.update
      Graphics.update
    end until @command_window.openness == 255
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウを閉じる
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    begin
      @command_window.update
      SoundEcho.update
      Graphics.update
    end until @command_window.openness == 0
  end
  #--------------------------------------------------------------------------
  # ● コマンド [タイトルへ] 選択時の処理
  #--------------------------------------------------------------------------
  def command_to_title
    Sound.play_decision
    RPG::BGM.fade(800)
    RPG::BGS.fade(800)
    RPG::ME.fade(800)
    $scene = Scene_Title.new
    close_command_window
    until SoundEcho.empty?
      SoundEcho.update
      Graphics.update
      Graphics.frame_count -= 1
    end
    Graphics.fadeout(60)
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Load クラス
#----------------------------------------------------------------------------
class Scene_File < Scene_Base
  #--------------------------------------------------------------------------
  # ● ロードの実行
  #--------------------------------------------------------------------------
  alias _Lufar_SEe_PrototypeOfDl do_load
  def do_load
    until SoundEcho.empty?
      SoundEcho.update
      Graphics.update
      Graphics.frame_count -= 1
    end
    _Lufar_SEe_PrototypeOfDl
  end
end
#----------------------------------------------------------------------------
# ◆ Scene_Battle クラス
#----------------------------------------------------------------------------
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 基本更新処理
  #     main : メインの update メソッドからの呼び出し
  #--------------------------------------------------------------------------
  alias _Lufar_SEe_PrototypeOfUb update_basic
  def update_basic(main = false)
    SoundEcho.update unless main
    _Lufar_SEe_PrototypeOfUb(main)
  end
end

戻る