#◆◇◆◇◆  鏡の壁スクリプトVXA ver 1.00  ◇◆◇◆◇
#  サポート掲示板 [url]http://www2.ezbbs.net/21/minto-aaa/[/url]
#   by みんと
 
=begin
 
■ 更新履歴
 
○ ver 1.00(2010/11/28)
公開
  
■ 説明
 
鏡床スクリプトVX専用の拡張スクリプトです。
このスクリプト素材を使用する場合は、
鏡床スクリプトVXが必須となります。
 
キャラクターの「一歩上」のタイルが特定のタイルだった場合、
そのタイルにキャラクターの鏡写し映像を描写します。
 
イベントの場合は、鏡床スクリプトのものをそのまま継承します。
 
氷のダンジョン等に向いているかもしれません。
 
鏡の壁とみなされるタイルの登録には、専用のマップを別に使います。
詳しい設定方法はスクリーンショットを参照してください。
 
◆ 鏡の壁イベントの設定
 
鏡の壁とみなすイベントには、
まず移動タイプを 固定 にし、
名前に 鏡 の文字を含ませてください。
そのイベントは鏡の壁とみなされます。
(途中でそのイベントを動かしても、
鏡の壁の判定は更新されません。
あくまで絶対に動かないイベント専用の機能です)
 
導入場所の注意
エイリアスで構成されていますので、
出来るだけ下のほうに導入してください。
 
=end
 
#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
#   様々なフラグを扱うメインモジュールです。
#==============================================================================
 
module MINTO
 
  # 鏡の壁スクリプトVXAを有効化 ( true で有効 / false で無効 )
  RGSS["鏡の壁スクリプトVXA"] = true
 
  # 鏡の壁タイルとして扱う地形タグのID
  # キャラクターが立っている一歩上のレイヤー1~3の中で、
  # 1つでも該当する地形タグがあれば鏡の壁を作成します
  Mirror_Wall_ID = 3
 
  # 鏡の壁無効化タイルとして扱う地形タグのID
  # キャラクターが立っている一歩上のレイヤー1~3の中で、
  # 1つでも該当する地形タグがあれば鏡の壁を無効化します
  # 無効化タイルを使用しない場合は nil を収納してください
  Not_Mirror_Wall_ID = nil
 
 
  # 機能を一時的に無効化するスイッチ
  # このスイッチが オン の時、機能を無効化します
  Not_MirrorWall_Switch = 0
 
end
 
# 鏡の壁スクリプトVXAが有効な場合に以降の処理を実行する
if MINTO::RGSS["鏡の壁スクリプトVXA"] == true then
 
#==============================================================================
# ■ Game_Character (分割定義 1)
#------------------------------------------------------------------------------
#  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
# クラスのスーパークラスとして使用されます。
#==============================================================================
 
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :move_type                # 移動タイプ
end
#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
# イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
#==============================================================================
 
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :event                    # イベント
end
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは
# Scene_Map クラスの内部で使用されます。
#==============================================================================
 
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :mirror_wall              # 鏡の壁イベントの位置情報
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #    alias : initialize_Mirror_Wall
  #--------------------------------------------------------------------------
  alias :initialize_Mirror_Wall :initialize
  def initialize
    # 鏡の壁イベントの位置情報を定義
    @mirror_wall = Table.new($game_map.map.width, $game_map.map.height)
    # 元の処理を実行
    initialize_Mirror_Wall
    # ループ処理
    for character in @character_sprites do
      # キャラクターがイベントの場合
      if character.character.class == Game_Event then
        # キャラクターの移動タイプが固定の場合
        if character.character.move_type == 0 then
          # イベント名に 鏡 が含まれる場合
          if character.character.event.name.include?("鏡") == true then
            # 位置を取得
            x = character.character.x
            y = character.character.y
            # 位置を保存
            @mirror_wall[x, y] = 1
          end
        end
      end
    end
  end
end
#==============================================================================
# ■ Sprite_Character (分割定義 2)
#------------------------------------------------------------------------------
#  キャラクター表示用のスプライトです。
# Game_Character クラスのインスタンスを監視し、
# スプライトの状態を自動的に変化させます。
#==============================================================================
 
class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 解放
  #    alias : dispose_Mirror_Wall
  #--------------------------------------------------------------------------
  alias :dispose_Mirror_Wall :dispose
  def dispose
    # 鏡が存在する場合
    if @mirror_sprite != nil then
      # 鏡を解放
      @mirror_sprite.bitmap.dispose
      @mirror_sprite.dispose
    end
    # 元の処理を実行
    dispose_Mirror_Wall
  end
  #--------------------------------------------------------------------------
  # ● 鏡床の作成
  #    alias : mirror_tile_set_Mirror_Wall
  #--------------------------------------------------------------------------
  alias :mirror_tile_set_Mirror_Wall :mirror_tile_set
  def mirror_tile_set
    # 元の処理を実行
    mirror_tile_set_Mirror_Wall
    # 鏡を作成
    mirror_set
  end
  #--------------------------------------------------------------------------
  # ● 鏡の作成
  #--------------------------------------------------------------------------
  def mirror_set
    # 鏡用のスプライトを生成
    @mirror_sprite = self.dup
    # 座標を調節する
    @mirror_sprite.y = self.y + (self.oy / 6)
    @mirror_sprite.z = self.z
    # 色を白っぽくする
    @mirror_sprite.tone.red = 64
    @mirror_sprite.tone.green = 64
    @mirror_sprite.tone.blue = 64
    # 不透明にする
    @mirror_sprite.opacity = 0
    # 左右を反転させる
    @mirror_sprite.mirror = (self.mirror == false)
    # タイル ID が有効な値の場合
    if @tile_id >= 1 then
      # メソッドを返す
      return
    end
    # キャラクターの向きに応じて分岐
    case @character.direction
    # 下
    when 2 then
      direction = 8
    # 左
    when 4 then
      direction = 6
    # 右
    when 6 then
      direction = 4
    # 上
    when 8 then
      direction = 2
    end
    index = @character.character_index
    pattern = @character.pattern < 3 ? @character.pattern : 1
    sx = (index % 4 * 3 + pattern) * @cw
    sy = (index / 4 * 4 + (direction - 2) / 2) * @ch
    @mirror_sprite.src_rect.set(sx, sy, @cw, @ch)
  end
  #--------------------------------------------------------------------------
  # ● 鏡の壁有効判定
  #    x : X 座標
  #    y : Y 座標
  #--------------------------------------------------------------------------
  def mirror_wall_include?(x, y)
    # 目標のタイルが鏡の壁の場合
    if $game_map.terrain_tag_include?(x, y, MINTO::Mirror_Wall_ID)
      # 鏡の壁無効化タイルが有効な場合
      unless MINTO::Not_Mirror_Wall_ID.nil?
        # 鏡の壁が無効化されていない場合
        unless $game_map.terrain_tag_include?(x, y, MINTO::Not_Mirror_Wall_ID)
          # メソッドを返す
          return true
        end
      # 無効化タイルを使用していない場合
      else
        # メソッドを返す
        return true
      end
    end
    # メソッドを返す
    return false
  end
  #--------------------------------------------------------------------------
  # ● 影の更新
  #    alias : update_mirror_tile_Mirror_Wall
  #--------------------------------------------------------------------------
  alias :update_mirror_tile_Mirror_Wall :update_mirror_tile
  def update_mirror_tile
    # 元の処理を実行
    update_mirror_tile_Mirror_Wall
    # 鏡を更新
    update_mirror
  end
  #--------------------------------------------------------------------------
  # ● 鏡の更新
  #--------------------------------------------------------------------------
  def update_mirror
    # 現在の位置を取得
    x = @character.x
    y = @character.y
    @z_plus = -1
    # 元々鏡が存在しない場合
    if @mirror_sprite == nil then
      # 処理を終了
      return
    end
    # 機能が無効化されている場合
    if $game_switches[MINTO::Not_MirrorWall_Switch] == true then
      # 不可視状態にする
      @mirror_sprite.visible = false
      # メソッドを返す
      return
    end
    # マップで無い場合
    unless SceneManager.scene.is_a?(Scene_Map)
      # メソッドを返す
      return
    end
    # スプライトセットの有効判定
    effective = (SceneManager.scene.spriteset != nil)
    # スプライトセットが有効で、且つ一歩上に鏡の壁イベントが存在する場合
    if effective and SceneManager.scene.spriteset.mirror_wall[x, y-1] == 1 then
      # Y座標補正値を初期化する
      @y_plus = -48
      # 透明度を調節
      @mirror_sprite.opacity = (@mirror_sprite.opacity + 6).to_m(160)
      @z_plus = 999
      #@mirror_sprite.wave_amp = 1
      #@mirror_sprite.wave_length = 40
      #@mirror_sprite.wave_speed = 320
    # 一歩上のタイルが鏡の壁以外の場合
    elsif mirror_wall_include?(x, (y - 1)) == false then
      # 不透明にする
      @mirror_sprite.opacity = 0
      # 鏡を不可視状態にする
      @mirror_sprite.visible = false
      #@mirror_sprite.wave_amp = 0
      #@mirror_sprite.wave_length = 0
      #@mirror_sprite.wave_speed = 0
      # 処理を終了
      return
    # 一歩上のタイルが鏡の壁の場合
    else
      # Y座標補正値を初期化する
      @y_plus = -32
      # 透明度を調節
      @mirror_sprite.opacity = (@mirror_sprite.opacity + 6).to_m(160)
      #@mirror_sprite.wave_amp = 0
      #@mirror_sprite.wave_length = 0
      #@mirror_sprite.wave_speed = 0
    end
    # タイル ID が有効な値の場合
    if @tile_id >= 1 then
      # 各情報を更新する
      @mirror_sprite.src_rect = self.src_rect
      @mirror_sprite.x = self.x
      @mirror_sprite.y = self.y + (self.oy / 6) + @y_plus
      @mirror_sprite.z = self.z - 1
      @mirror_sprite.visible = self.visible
      # メソッドを返す
      return
    end
    # キャラクターの向きに応じて分岐
    case @character.direction
    # 下
    when 2 then
      direction = 8
    # 左
    when 4 then
      direction = 6
    # 右
    when 6 then
      direction = 4
    # 上
    when 8 then
      direction = 2
    end
    # 各情報を更新する
    index = @character.character_index
    pattern = @character.pattern < 3 ? @character.pattern : 1
    sx = (index % 4 * 3 + pattern) * @cw
    sy = (index / 4 * 4 + (direction - 2) / 2) * @ch
    @mirror_sprite.src_rect.set(sx, sy, @cw, @ch)
    @mirror_sprite.x = self.x
    @mirror_sprite.y = self.y + (self.oy / 6) + @y_plus
    @mirror_sprite.z = self.z + @z_plus
    @mirror_sprite.visible = self.visible
    @mirror_sprite.update
  end
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  マップ画面の処理を行うクラスです。
#==============================================================================
 
class Scene_Map
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :spriteset                  # スプライトセット
end
 
end