=begin
 ■ RGDS_SP ver 0.0.1.2
 動画再生スクリプト(表示系)for VX Ace
 動画再生スクリプト(ベース)より下に配置してください。

=end




module RGDS_SP
  @@visible = false
  
  # ■ 動画設定クラス $game_system.movie_infoで使用
  class MovieInfo
    attr_reader :x
    attr_reader :y
    attr_reader :z
    attr_reader :width_max
    attr_reader :height_max
    attr_reader :origin_center
    attr_accessor :mode
    attr_accessor :refresh_flag
    def initialize
      @x = Graphics.width / 2
      @y = Graphics.height / 2
      @z = 500
      @width_max  = 0
      @height_max = 0
      @origin_center = true
      @mode = 0
      @refresh_flag = false
    end
    
    # セッター
    def x=(n)
      @x = n
      @refresh_flag = true
    end
    def y=(n)
      @y = n
      @refresh_flag = true
    end
    def z=(n)
      @z = n
      @refresh_flag = true
    end
    def width_max=(n)
      @width_max = n
      @refresh_flag = true
    end
    def width_max=(n)
      @width_max = n
      @refresh_flag = true
    end
    def origin_center=(flag)
      @origin_center = flag
      @refresh_flag = true
    end

    # ■ 表示位置、サイズを指定します。
    #- x, y: 表示座標
    #- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
    #                       : どちらかが0以下の場合拡大縮小は行われません。
    #- orogin: 表示位置基準点 false(デフォ): 動画の左上, true: 動画の中心を上記
    #-         の[x,y]にあわせます
    def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
      @x = x
      @y = y
      @width_max  = width_max
      @height_max = height_max
      @origin_center = origin
      @refresh_flag = true
    end
    
    # ■ 以降の表示位置、サイズをデフォルトに戻します。
    # 拡大縮小なし、左上にあわせて表示
    def reset_position
      @x = Graphics.width / 2
      @y = Graphics.height / 2
      @width_max  = 0
      @height_max = 0
      @origin_center = true
      @refresh_flag = true
    end
    
  end
  
  
  class MovieSprite < ::Sprite
    # 初期化
    def initialize(viewport=nil)
      super
      self.visible = false
      self.bitmap = RGDS.bitmap
      fix_position()
    end

    # 拡大縮小処理
    def change_zoom
      zoom = 1.0
      bw = self.bitmap.width
      bh = self.bitmap.height
      return if bw <= 0 or bh <= 0
      if $game_system.movie_info.width_max > 0 and $game_system.movie_info.height_max > 0
        zoom_w = $game_system.movie_info.width_max.to_f / bw.to_f
        zoom_h = $game_system.movie_info.height_max.to_f / bh.to_f
        zoom = [zoom_w, zoom_h].min
      end
      self.zoom_x = zoom
      self.zoom_y = zoom
    end

    # 表示位置変更
    def fix_position
      self.x = $game_system.movie_info.x
      self.y = $game_system.movie_info.y
      self.z = $game_system.movie_info.z
      if $game_system.movie_info.origin_center
        self.ox = self.bitmap.width / 2
        self.oy = self.bitmap.height / 2
      end
      change_zoom()
    end
    
    def update
      if (self.visible = RGDS.visible)
        if RGDS.bitmap_changed? or self.bitmap.disposed?
          self.bitmap = RGDS.bitmap
          fix_position()
          RGDS.bitmap_changed = false
          $game_system.movie_info.refresh_flag = false
        elsif $game_system.movie_info.refresh_flag
          fix_position()
          $game_system.movie_info.refresh_flag = false
        end
      end
      super
    end
  end

  module_function

  # ■ 動画をオープンします。初回は1~2秒ほどかかる場合もあります。
  def open(filename)
    RGDS.open(filename)
  end
  
  # ■ 動画を停止しクローズします。
  def close
    RGDS.close()
  end
  
  # ■ openされた動画を再生します。一時停止中なら再開します。
  # 再生が終わると自動的にクローズします。
  def run
    RGDS.run()
  end
  
  # ■ 動画を一時停止します。再開はrunで行います。
  def pause
    RGDS.pause()
  end

  # ■ 動画をオープンして自動再生します。
  #- 決定キーでスキップします。
  def start_movie(filename, option={})
    
    # スキップ検出オプション
    if option.key?(:skip_sw)
      skip_sw = option[:skip_sw].to_i
    else
      skip_sw = 0
    end
    
    # スキップ禁止モードオプション
    if option.key?(:nsm)
      nsm_mode = option[:nsm]
    else
      nsm_mode = false
    end
    
    if skip_sw > 0
      $game_switches[skip_sw] = true
    end
    scene_temp = SceneManager.scene 
    if scene_temp.is_a?(Scene_Map) or scene_temp.is_a?(Scene_Battle)
      msgv = SceneManager.scene.instance_variable_get(:@message_window)
      msgv.update
      tempv = msgv.visible
      msgv.visible = false
      # オープン
      RGDS.open(filename)
      RGDS.run()
      # 終了またはボタンが押されるまでループ
      loop do
        break if scene_temp != SceneManager.scene

        # 画面の更新
        if SceneManager.scene.is_a?(Scene_Map)
          SceneManager.scene.update_for_fade
        else
          SceneManager.scene.update_basic
        end
        
        if !RGDS.active? # 再生終了
          if skip_sw > 0
            $game_switches[skip_sw] = false
          end 
          break
        end
        unless nsm_mode
          if Input.trigger?(Input::A)# or Input.trigger?(Input::B)
            break
          end
        end
      end
      RGDS.close()
      msgv.visible = tempv
    end
  end
  

  # ■ 以降の表示位置、サイズを指定します。
  #- x, y: 表示座標
  #- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
  #                       : どちらかが0以下の場合拡大縮小は行われません。
  #- origin: 表示位置基準点 false: 動画の左上, true: 動画の中心を上記
  #-         の[x,y]にあわせます
  def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
    $game_system.movie_info.set_position(x,y,width_max,height_max,origin)
  end
  
  # ■ 以降の表示位置、サイズをデフォルトに戻します。
  # 拡大縮小なし、中央にあわせて表示
  def reset_position
    $game_system.movie_info.reset_position()
  end
  
  # 再生音量取得
  def get_volume
    return RGDS.get_volume()
  end

  # 再生音量設定
  def set_volume(volume)
    return RGDS.set_volume(volume)
  end
  
end

class Game_System
  def init_movie_info
    @movie_info = RGDS_SP::MovieInfo.new
  end
  def movie_info
    init_movie_info() if @movie_info.nil?
    return @movie_info
  end
end


class Spriteset_Map
  alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
  def initialize
    # 元の処理
    _hn_movie__initialize
    # 追加処理
    create_movie
    update_movie
  end

  alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
  def dispose
    dispose_movie
    _hn_movie__dispose
  end

  alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
  def update
    update_movie
    _hn_movie__update
  end

  # ■ シーン移行時に動画を待機モードにします。
  def create_movie
    @sp_movie = RGDS_SP::MovieSprite.new()
    @sp_movie.viewport = @viewport1
    RGDS.system_resume
  end

  # ■ シーン移行時に動画を待機モードにします。
  def dispose_movie
    RGDS.system_pause
    @sp_movie.viewport = nil
    @sp_movie.dispose
    @sp_movie = nil
  end

  def update_movie
    if RGDS.active?
      RGDS.update
    end
    @sp_movie.update unless @sp_movie.nil?
  end
end

class Spriteset_Battle
  alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
  def initialize
    # 元の処理
    _hn_movie__initialize
    # 追加処理
    create_movie
    update_movie
  end

  alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
  def dispose
    dispose_movie
    _hn_movie__dispose
  end

  alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
  def update
    update_movie
    _hn_movie__update
  end

  # ■ シーン移行時に動画を待機モードにします。
  def create_movie
    @sp_movie = RGDS_SP::MovieSprite.new()
    @sp_movie.viewport = @viewport1
    RGDS.system_resume
  end

  # ■ シーン移行時に動画を待機モードにします。
  def dispose_movie
    RGDS.system_pause
    @sp_movie.viewport = nil
    @sp_movie.dispose
    @sp_movie = nil
  end

  def update_movie
    if RGDS.active?
      RGDS.update
    end
    @sp_movie.update unless @sp_movie.nil?
  end
end