# ======================================================
#  「アニメ専用遠景」スクリプトver.1.3
# ======================================================
# ■更新履歴
# ver.1.3(2011/6/28)
# ・戦闘中に基準位置が「画面」でなく敵から味方へのアニメの場合、
# 遠景だけ勝手に表示されてしまう不具合を修正。
# ver.1.2(2011/3/2)
# ・【重要】効果音を選ぶ時に場所がバラバラだと感じたので、
# 　判別する音声ファイル名の先頭に「anime」を付加。
# 　既存のスクリプトを使っていた方はお手数ですが、
# 　ファイル名を「anime遠景スタート」などという風に変更して下さい。
# 　（前の仕様で既に作ったアニメの遠景設定箇所も対応する必要があります。）
# ・「コモンイベント呼び出し」機能を「強さ(S)」で指定したコモンから、
# 　スクリプト内部の設定項目で指定した物を呼び出すように固定。
# 　その代わりスクリプト内部で指定した変数に強さ(S)の数値を代入するように。
# 　つまりコモンイベントごと振り分けていたところを、
# 　コモンイベントを一つに絞り変数を利用して振り分ける仕様に変更。
# ver.1.1(2011/3/1)
# ・上級者向けおまけ「コモンイベント呼び出し」を追加。
# ・音声ファイル名の判定を「そのキーワードが含まれている」から
# 　「そのキーワードと同じ」に厳密化。
# ======================================================
# ■概要
# アニメーション表示中にスクロールできる専用の遠景を表示できます。
# 途中でスクロールする遠景や量・方向などを変更したり消去したりできます。
# 遠景の開始・終了・変更のタイミングはフレーム指定です。
# 終了指示を指定しなくてもアニメの表示が終わると遠景も自動消去されます。
# 遠景の画像は通常のマップ遠景と同じくParallaxフォルダに入れて下さい。
# （ＲＴＰの遠景もそのまま利用できます。）
# 
# ■使い方
# １：スクリプト内の「anime遠景アニメパターン設定」で遠景の設定をする。
# ２：遠景を開始したいフレームに「anime遠景スタート」という名前の無音SEを設定する。
# ３：フラッシュの「強さ(S):」設定で番号を指定する。
# （フラッシュ対象はなんでもいい。遠景スタートという名前の音声ファイルの
# 　項目に関してはフラッシュは無視される設定にしています。）
# ４：途中で遠景パターンを変えたい場合は再度２＋３を、
# 　　途中で遠景アニメを終了したい場合は、
# 　　「遠景エンド」という名前の無音SEを設定する。
# 
# ■上級者向け？おまけ
# ・上記の要領で「animeコモンイベント」という名前の音声ファイルします。
#   するとスクリプト内部のCOMMON_IDで指定したコモンイベントが呼び出されます。
#   それと同時にスクリプト内部のVARIABLES_IDで指定した変数に、
#   「強さ(S):」の部分の数値が代入されます。
#   その変数をコモンイベント内部で条件分岐に使用して、
# 　ピクチャの表示や移動を設定すれば擬似的に演出を追加できます。
# ・ただしコモンイベントは「アニメーションの長さ-1フレーム」
# 　までに終わるように収めてください。
# 　それ以上になるとイベントが実行途中で打ち切られてしまいます。
# ・また、コモンイベントは60fpsで処理しているのに対して、
# 　アニメーションは(VXのデフォルトでは)15fpsで処理されています。
# 　コモンイベント上でのウェイト60は、アニメ上での15フレームに換算されます。
# ・例えば50フレームのアニメの時間はコモンイベント上では200フレームです。
# 　アニメの1フレーム目からコモンイベントを呼び出した場合、
# 　コモンイベント上では199フレームの猶予が与えられることになります。
# 
# ■フレームレートの対比の早見表
# アニメ15fps ＝ コモンイベント上では4倍(VXデフォルト)
# アニメ20fps ＝ コモンイベント上では3倍
# アニメ30fps ＝ コモンイベント上では2倍
# 
# ■簡易まとめ
# 効果音ファイル名：anime遠景スタート
#                   anime遠景エンド
#                   animeコモンイベント
# 
# ■エイリアスしている箇所
# class Sprite_Base内
# 　animation_set_sprites(frame)     （アニメーションスプライトの設定）
# 　dispose_animation                （アニメーションの解放）
#   animation_process_timing(timing) （SE とフラッシュのタイミング処理）
# 
# 同じ箇所を再定義やエイリアスしているスクリプトとは
# 競合する可能性があります。
# 
module NukumizuAniPara
  # ■遠景アニメパターン設定
  # 「項目内容」
  # ["遠景アニメ名(Parallaxフォルダ)",1fで移動するX座標量,Y座標量]
  # Xの数値を-にすれば遠景は「左に」動きます。
  # Yの数値を-にすれば遠景は「上に」動きます。
  ANIME_PARALLAX = [[],
  ["000黒",0,0],        # 1:黒背景
  ["BlueSky",0,24],     # 2:空中を上昇
  ["BlueSky",0,-24],    # 3:空中を降下
  ["BlueSky",0,0],      # 4:空中を停止
  ["BlueSky",-16,-24],  # 5:空中を右下に降下
  ["BlueSky",-24,0],    # 6:空を左へスクロール
  ["StarlitSky",0,24],  # 7:宇宙を上昇
  ]
  # ■コモンイベント呼び出し用
  # 呼び出すコモンイベントのID
  COMMON_ID       = 1
  # コモンイベント内の分岐で使用する変数のID
  VARIABLES_ID    = 1
end
class Sprite_Base < Sprite
  #--------------------------------------------------------------------------
  # ● アニメーションスプライトの設定　■エイリアス
  #     frame : フレームデータ (RPG::Animation::Frame)
  #--------------------------------------------------------------------------
  alias animation_set_sprites_anipara animation_set_sprites
  def animation_set_sprites(frame)
    if @anime_parallax != nil
      @anime_parallax.ox -= @anime_parallax_speed_x
      @anime_parallax.oy -= @anime_parallax_speed_y
    end
    animation_set_sprites_anipara(frame)
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの解放 ■エイリアス
  #--------------------------------------------------------------------------
  alias dispose_animation_anipara dispose_animation
  def dispose_animation
    if @anime_parallax != nil
      @anime_parallax.bitmap.dispose
      @anime_parallax.dispose
      @anime_parallax = nil
    end
    @anime_interpreter = nil if @anime_interpreter
    dispose_animation_anipara  # 元の処理
  end
  #--------------------------------------------------------------------------
  # ● SE とフラッシュのタイミング処理 ■エイリアス
  #     timing : タイミングデータ (RPG::Animation::Timing)
  #--------------------------------------------------------------------------
  alias animation_process_timing_anipara animation_process_timing
  def animation_process_timing(timing)
    return if timing.se.name.include?("anime中心座標変更")
    if $scene.class == Scene_Battle
      if $scene.display_anipara == false
        animation_process_timing_anipara(timing) # 元の処理
        return
      end
    end
    if timing.se.name.include?("anime遠景スタート")
      if @anime_parallax != nil
        @anime_parallax.bitmap.dispose
      end
      result = timing.flash_color.alpha
      @anime_parallax = Plane.new(viewport)
      @anime_parallax.z = self.z + 299
      @anime_parallax_name = NukumizuAniPara::ANIME_PARALLAX[result][0]
      @anime_parallax.bitmap = Cache.parallax(@anime_parallax_name)
      @anime_parallax_speed_x = NukumizuAniPara::ANIME_PARALLAX[result][1]
      @anime_parallax_speed_y = NukumizuAniPara::ANIME_PARALLAX[result][2]
    elsif timing.se.name.include?("anime遠景エンド")
      @anime_parallax.bitmap.dispose
      @anime_parallax.dispose
      @anime_parallax = nil
    elsif timing.se.name == "animeコモンイベント"
      $game_variables[NukumizuAniPara::VARIABLES_ID] = timing.flash_color.alpha
      common_event = $data_common_events[NukumizuAniPara::COMMON_ID] 
      @anime_interpreter = Game_Interpreter.new(0) 
      @anime_interpreter.setup(common_event.list, 0)
    else
      animation_process_timing_anipara(timing) # 元の処理
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 ■エイリアス
  #--------------------------------------------------------------------------
  alias update_anipara update
  def update
    update_anipara # 元の処理
    @anime_interpreter.update if @anime_interpreter
  end
end
class Scene_Battle < Scene_Base
  attr_accessor :display_anipara
  #--------------------------------------------------------------------------
  # ● アニメーションの表示
  #     targets      : 対象者の配列
  #     animation_id : アニメーション ID (-1: 通常攻撃と同じ)
  #--------------------------------------------------------------------------
  alias anipara_display_animation display_animation
  def display_animation(targets, animation_id)
    unless @active_battler.actor?
      if targets[0].actor?
        @display_anipara = false
      end
    end
    anipara_display_animation(targets, animation_id)
    @display_anipara = nil
  end
end