#==============================================================================
# ★ ExMap_EffectiveTile
#------------------------------------------------------------------------------
# 　プレイヤーの現在地座標のタイル ID を取得して、ダメージ床や足音などの効果を
# 実行できるようにするスクリプト素材です。
#==============================================================================

# 適用するマップ ID。
# 負荷を軽減するため、指定されたマップ以外では処理をスキップします。
# カンマ区切りで複数指定できます。(全マップに適用する場合は [])
EXMAP_EFCTL_MIDS = []

# 実行の条件となるタイル ID。
# マップレイヤー中、ここで指定したタイルが１つでも配置されていると、
# タイルに触れた際に、指定したエフェクトや効果が実行されます。
# カンマ区切りで複数指定できます。
EXMAP_EFCTL_TIDS = []

# 無効化の条件となるタイル ID。
# マップレイヤー中、ここで指定したタイルが１つでも配置されていれば、
# 発動の条件となるタイルに触れても、エフェクトや効果は実行されません。
# カンマ区切りで複数指定できます。(指定しない場合は [])
EXMAP_EFCTL_VOID_TIDS = []

# タイル ID 取得に使用する変数 ID。
# プレイヤーの現在座標のタイル ID を、マップレイヤーの下から順に代入します。
# カンマ区切りで３つ指定します。(指定しない場合は [])
# ３つとも同じ ID を指定すると、一番下のタイルが代入されます。
# 他の設定とは関係なく単独で使用できますので、イベントなどに活用してください。
EXMAP_EFCTL_VIDS = [21, 22, 23]

# 無効化ステートの識別用文字列。
# この文字列が [メモ] に含まれているステートが付加されているアクターは、
# 条件となるタイルに触れても、実行内容が無効化されます。
# 他のメンバーによってエフェクトが実行された場合も、ダメージは受けません。
# ダメージ床を防ぐスキルなどの設定に利用してください。
EXMAP_EFCTL_RESIST_SIGNATURE = "*FLOOR_RESIST"

# 実行時のダメージ量。
# ダメージ量、ダメージ量の計算方法 (0:定数 1:現在 HP の○％ 2:最大 HP の○％)
# 戦闘不能の許可 (0:許可しない 1:許可する) の順に指定してください。
# (指定しない場合は [])
EXMAP_EFCTL_DAMAGE = [5, 2, 0]

# 発動時の SE。
# SE の名前、ボリューム、ピッチの順に指定してください。(指定しない場合は [])
EXMAP_EFCTL_SE = ["Damage1", 80, 100]

# 発動時の画面のフラッシュ。
# 赤 (R)、緑 (G)、青 (B)、強さ (S)、時間 (1/60 秒) の順に指定してください。
# (指定しない場合は [])
EXMAP_EFCTL_FLASH = [255, 0, 0, 64, 4]

#------------------------------------------------------------------------------

class Game_Map
  #--------------------------------------------------------------------------
  # ☆ タイル ID の取得
  #--------------------------------------------------------------------------
  def tile_id(z = 0)
    return @map.data[$game_player.x, $game_player.y, z]
  end
  #--------------------------------------------------------------------------
  # ☆ ダメージ床の判定
  #--------------------------------------------------------------------------
  def damage_floor?
    result = false
    for i in [2, 1, 0]
      return false if EXMAP_EFCTL_VOID_TIDS.include?(tile_id(i))
      result = true if EXMAP_EFCTL_TIDS.include?(tile_id(i))
    end
    return result
  end
end

class Game_Actor
  #--------------------------------------------------------------------------
  # ☆ ダメージ床無効化判定
  #--------------------------------------------------------------------------
  def damage_floor_resist?
    for state in states
      return true if state.note.include?(EXMAP_EFCTL_RESIST_SIGNATURE)
      return true if state.id == 1 # 戦闘不能は無効と判定
    end
    return false
  end
end

class Game_Party
  #--------------------------------------------------------------------------
  # ☆ ダメージ床の効果適用
  #--------------------------------------------------------------------------
  def damage_floor_effect
    unless EXMAP_EFCTL_DAMAGE.empty?
      damage = EXMAP_EFCTL_DAMAGE[0]
      effective = false
      for actor in members
        next if actor.damage_floor_resist?
        case EXMAP_EFCTL_DAMAGE[1]
        when 0
          actor.hp -= damage
        when 1
          actor.hp -= actor.hp * damage / 100
        when 2
          actor.hp -= actor.maxhp * damage / 100
        end
        actor.hp = 1 if actor.hp == 0 and EXMAP_EFCTL_DAMAGE[2] == 0
        effective = true
      end
    else
      effective = true
    end
    if effective and not EXMAP_EFCTL_SE.empty?
      a = EXMAP_EFCTL_SE
      RPG::SE.new(a[0], a[1], a[2]).play
    end
    if effective and not EXMAP_EFCTL_FLASH.empty?
      a = EXMAP_EFCTL_FLASH
      $game_map.screen.start_flash(Color.new(a[0], a[1], a[2], a[3]), a[4])
    end
  end
end

class Game_Player
  alias _exmefct_update update
  alias _exmefct_update_nonmoving update_nonmoving
  #--------------------------------------------------------------------------
  # ○ フレーム更新 (追加定義)
  #--------------------------------------------------------------------------
  def update
    if moving? and not EXMAP_EFCTL_VIDS.empty?
      for i in [2, 1, 0]
        $game_variables[EXMAP_EFCTL_VIDS[i]] = $game_map.tile_id(i)
      end
    end
    _exmefct_update
  end
  #--------------------------------------------------------------------------
  # ○ 移動中でない場合の処理 (追加定義)
  #     last_moving : 直前に移動中だったか
  #--------------------------------------------------------------------------
  def update_nonmoving(last_moving)
    return if $game_map.interpreter.running?
    return if moving?
    # イベント起動より優先
    if last_moving
      if EXMAP_EFCTL_MIDS.empty? or EXMAP_EFCTL_MIDS.include?($game_map.map_id)
        $game_party.damage_floor_effect if $game_map.damage_floor?
      end
    end
    _exmefct_update_nonmoving(last_moving)
  end
end

#==============================================================================
# ★ デバッグ画面拡張
#------------------------------------------------------------------------------
# 　デバッグ画面に現在地の情報を追加表示します。
#==============================================================================

class Window_DebugLeft
  #--------------------------------------------------------------------------
  # ○ オブジェクト初期化 (再定義)
  #     x     : ウィンドウの X 座標
  #     y     : ウィンドウの Y 座標
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, 176, 272)
    self.index = 0
    refresh
  end
end

class Scene_Debug
  alias _exmefct_start start
  alias _exmefct_terminate terminate
  #--------------------------------------------------------------------------
  # ○ 開始処理 (追加定義)
  #--------------------------------------------------------------------------
  def start
    _exmefct_start
    @extra_window = Window_Base.new(0, 272, 176, 144)
    wlh = 24
    cw = @extra_window.width - 32
    map_id = $game_map.map_id
    tile_id = [$game_map.tile_id, $game_map.tile_id(1), $game_map.tile_id(2)]
    text1 = "マップID: #{map_id}"
    text2 = "Ｘ:#{$game_player.x} Ｙ:#{$game_player.y}"
    text3 = "タイルID:"
    text4 = "#{tile_id[0]} #{tile_id[1]} #{tile_id[2]}"
    @extra_window.contents.draw_text(4, wlh * 0, cw, wlh, text1)
    @extra_window.contents.draw_text(4, wlh * 1, cw, wlh, text2)
    @extra_window.contents.draw_text(4, wlh * 2, cw, wlh, text3)
    @extra_window.contents.draw_text(4, wlh * 3, cw, wlh, text4)
  end
  #--------------------------------------------------------------------------
  # ○ 終了処理 (追加定義)
  #--------------------------------------------------------------------------
  def terminate
    _exmefct_terminate
    @extra_window.dispose if @extra_window != nil
  end
end
