﻿#==============================================================================
# ★ Teleport                                               特別感謝 Yoji Ojima
#------------------------------------------------------------------------------
# 　製作傳送道具或是技能的腳本。
#==============================================================================

# 瞬間傳送的識別文字。
# 將這段文字寫在作為傳送道具或技能的「備註」之中。
# [效果範圍] 設為 [無]、[使用場合] 設為 [功能表中] 。
EXSKL_TELEPORT_SIGNATURE = "*TELEPORT"

# 允許瞬間傳送的開關 ID。
# 當此號的開關為 ON 時，則可以使用傳送物品/技能
# 可以在事件內開啟或關閉此功能。
EXSKL_TELEPORT_PERMISSION_SID = 1

# 瞬間移動列表。
# 開關 ID、場所名稱、地圖 ID、X 座標、Y 座標、傳送後角色面向 (對應四方鍵)
# 依照上面的順序填入
# 當對應的開關為 ON 時，就能夠選擇該場所來瞬間移動。
EXSKL_TELEPORT_PLACES =
[
  [11, "草原", 1, 8, 6, 2],
  [12, "雪崖", 2, 8, 6, 4],
  [13, "異空間", 3, 8, 6, 8],
]
# 開關, 場所名稱, 地圖ID, X 座標, Y 座標, 面向

# 傳送時的 SE。
# 依次指定 SE 的名稱、音量、音調。(不指定時留 [])
EXSKL_TELEPORT_SE = ["Teleport", 80, 100]

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

class Game_Actor
  alias _exstlp_skill_can_use? skill_can_use?
  #--------------------------------------------------------------------------
  # ● 可用技能判斷 (追加定義)
  #     skill : 技能
  #--------------------------------------------------------------------------
  def skill_can_use?(skill)
    return false unless skill.is_a?(RPG::Skill)
    if skill.note.include?(EXSKL_TELEPORT_SIGNATURE)
      return false unless $game_party.teleport_can_use?
      return false if $game_player.in_vehicle?
    end
    return _exstlp_skill_can_use?(skill)
  end
end

class Game_Party
  alias _exstlp_item_can_use? item_can_use?
  #--------------------------------------------------------------------------
  # ● 可用物品判斷 (追加定義)
  #     item : 物品
  #--------------------------------------------------------------------------
  def item_can_use?(item)
    return false unless item.is_a?(RPG::Item)
    return false if item_number(item) == 0
    if item.note.include?(EXSKL_TELEPORT_SIGNATURE)
      return false unless teleport_can_use?
      return false if $game_player.in_vehicle?
    end
    return _exstlp_item_can_use?(item)
  end
  #--------------------------------------------------------------------------
  # ☆ 可用「瞬間移動」判定
  #--------------------------------------------------------------------------
  def teleport_can_use?
    return false if EXSKL_TELEPORT_PLACES.empty?
    return false unless $game_switches[EXSKL_TELEPORT_PERMISSION_SID]
    for place in EXSKL_TELEPORT_PLACES
      return true if $game_switches[place[0]]
    end
    return false
  end
end

#==============================================================================
# ★ Window_Teleport
#------------------------------------------------------------------------------
# 　顯示可以移動的場所清單。
#==============================================================================

class Window_Teleport < Window_Selectable
  #--------------------------------------------------------------------------
  # ☆ 初始化對象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 272, 416)
    refresh
  end
  #--------------------------------------------------------------------------
  # ☆ 獲取項目
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ☆ 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @data = []
    for place in EXSKL_TELEPORT_PLACES
      if $game_switches[place[0]]
        @data.push(place)
      end
    end
    @item_max = [@data.size, 1].max
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 描繪項目
  #     index : 專案索引
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    self.contents.clear_rect(rect)
    place = @data[index]
    if place != nil
      self.contents.draw_text(rect, place[1])
    end
  end
end

class Scene_Item
  alias _exstlp_start start
  alias _exstlp_terminate terminate
  alias _exstlp_update update
  alias _exstlp_determine_item determine_item
  #--------------------------------------------------------------------------
  # ○ 開始處理 (追加定義)
  #--------------------------------------------------------------------------
  def start
    _exstlp_start
    @teleport_window = Window_Teleport.new
    hide_teleport_window
  end
  #--------------------------------------------------------------------------
  # ○ 結束處理 (追加定義)
  #--------------------------------------------------------------------------
  def terminate
    _exstlp_terminate
    @teleport_window.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 更新畫面 (追加定義)
  #--------------------------------------------------------------------------
  def update
    teleport_active = @teleport_window.active
    _exstlp_update
    @teleport_window.update
    if teleport_active
      update_teleport_selection
    end
  end
  #--------------------------------------------------------------------------
  # ○ 確認物品 (追加定義)
  #--------------------------------------------------------------------------
  def determine_item
    if @item.note.include?(EXSKL_TELEPORT_SIGNATURE)
      show_teleport_window(@item_window.index % 2 == 0)
    else
      _exstlp_determine_item
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 顯示瞬間傳送視窗
  #     right : 靠右對齊標籤（為false時則靠左）
  #--------------------------------------------------------------------------
  def show_teleport_window(right)
    @item_window.active = false
    width_remain = 544 - @teleport_window.width
    @teleport_window.x = right ? width_remain : 0
    @teleport_window.visible = true
    @teleport_window.active = true
    @teleport_window.index = 0
    if right
      @viewport.rect.set(0, 0, width_remain, 416)
      @viewport.ox = 0
    else
      @viewport.rect.set(@teleport_window.width, 0, width_remain, 416)
      @viewport.ox = @teleport_window.width
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 隱藏瞬間傳送視窗
  #--------------------------------------------------------------------------
  def hide_teleport_window
    @item_window.active = true
    @teleport_window.visible = false
    @teleport_window.active = false
    @viewport.rect.set(0, 0, 544, 416)
    @viewport.ox = 0
  end
  #--------------------------------------------------------------------------
  # ☆ 更新瞬間傳送選取
  #--------------------------------------------------------------------------
  def update_teleport_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      hide_teleport_window
    elsif Input.trigger?(Input::C)
      determine_teleport
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 確認瞬間傳送
  #--------------------------------------------------------------------------
  def determine_teleport
    place = @teleport_window.item
    if place == nil
      Sound.play_buzzer
    else
      se = EXSKL_TELEPORT_SE
      RPG::SE.new(se[0], se[1], se[2]).play unless se.empty?
      $game_party.last_item_id = @item.id
      $game_party.consume_item(@item)
      $game_player.reserve_transfer(place[2], place[3], place[4], place[5])
      $scene = Scene_Map.new
    end
  end
end

class Scene_Skill
  alias _exstlp_start start
  alias _exstlp_terminate terminate
  alias _exstlp_update update
  alias _exstlp_determine_skill determine_skill
  #--------------------------------------------------------------------------
  # ○ 開始處理 (追加定義)
  #--------------------------------------------------------------------------
  def start
    _exstlp_start
    @teleport_window = Window_Teleport.new
    hide_teleport_window
  end
  #--------------------------------------------------------------------------
  # ○ 結束處理 (追加定義)
  #--------------------------------------------------------------------------
  def terminate
    _exstlp_terminate
    @teleport_window.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 更新畫面 (追加定義)
  #--------------------------------------------------------------------------
  def update
    teleport_active = @teleport_window.active
    _exstlp_update
    @teleport_window.update
    if teleport_active
      update_teleport_selection
    end
  end
  #--------------------------------------------------------------------------
  # ○ 確認技能 (追加定義)
  #--------------------------------------------------------------------------
  def determine_skill
    if @skill.note.include?(EXSKL_TELEPORT_SIGNATURE)
      show_teleport_window(@skill_window.index % 2 == 0)
    else
      _exstlp_determine_skill
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 顯示瞬間傳送視窗
  #     right : 靠右對齊標籤（為false時則靠左）
  #--------------------------------------------------------------------------
  def show_teleport_window(right)
    @skill_window.active = false
    width_remain = 544 - @teleport_window.width
    @teleport_window.x = right ? width_remain : 0
    @teleport_window.visible = true
    @teleport_window.active = true
    @teleport_window.index = 0
    if right
      @viewport.rect.set(0, 0, width_remain, 416)
      @viewport.ox = 0
    else
      @viewport.rect.set(@teleport_window.width, 0, width_remain, 416)
      @viewport.ox = @teleport_window.width
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 隱藏瞬間傳送視窗
  #--------------------------------------------------------------------------
  def hide_teleport_window
    @skill_window.active = true
    @teleport_window.visible = false
    @teleport_window.active = false
    @viewport.rect.set(0, 0, 544, 416)
    @viewport.ox = 0
  end
  #--------------------------------------------------------------------------
  # ☆ 更新瞬間傳送選取
  #--------------------------------------------------------------------------
  def update_teleport_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      hide_teleport_window
    elsif Input.trigger?(Input::C)
      determine_teleport
    end
  end
  #--------------------------------------------------------------------------
  # ☆ 確認瞬間傳送
  #--------------------------------------------------------------------------
  def determine_teleport
    place = @teleport_window.item
    if place == nil
      Sound.play_buzzer
    else
      se = EXSKL_TELEPORT_SE
      RPG::SE.new(se[0], se[1], se[2]).play unless se.empty?
      @actor.last_skill_id = @skill.id
      @actor.mp -= @actor.calc_mp_cost(@skill)
      $game_player.reserve_transfer(place[2], place[3], place[4], place[5])
      $scene = Scene_Map.new
    end
  end
end
