﻿#==============================================================================
# ★ ExMenu_CustomCommand
#------------------------------------------------------------------------------
# 　功能表畫面任意修改指令出現和允許使用與否。
#==============================================================================

# 功能表指令清單
# 依次指定：
# 開關 ID、指令位置、指令文字、場景名稱、無效時是否出現、無人時能否使用。
# 
# 開關 ID：
# 　是否在功能表中出現的開關編號 (不需要的話設 0)
# 指令位置：
# 　指令所要插入的位置，通常功能表的最初指令 (預設的[物品] )為1。
# 　當兩個（或以上）指令所指定的位置相同時，後指定的插在先指定的上面。
# 指令文字：
# 　請不要與其他指令重複，否則會出現判斷錯誤。
#場景名稱： 
# 　選取時調用的場景名稱。
# 無效時是否出現、無人能否使用：
# 　當指令的開關為 OFF 時，依然在功能表中出現該指令
# 　當隊伍中無人時，無效化該指令。
# 　以數字指定：(0:否 1:是) 。
# 
# 範例： 當21號開關為 ON 時，有效化「冒險日記」並配置在「狀態」與「存檔」之間。
#        選中時調用的場景叫做「Scene_Diary」。
#        無效時不出現、隊伍為 0 人時依然可以選取。
# 　　　　　　　　　=> [21, 5, "冒險日記", "Scene_Diary", 1, 0],
EXMNU_CTCMD_COMMANDS = [
  [21, 5, "大意", "Scene_Outline", 1, 0],
  [22, 2, "物品2", "Scene_Item", 0, 0],
  [23, 5, "狀態2", "Scene_Status", 0, 1],
  [24, 3, "物品3", "Scene_Item", 1, 1],
]

# 指令視窗最大行數
# 限制功能表指令數不超出這個數木目
# 指令視窗的高度依此而定，建議 7 ~ 13最適合。
EXMNU_CTCMD_ROWMAX = 10

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

class Game_Party
  alias _exmctcmd_initialize initialize
  #--------------------------------------------------------------------------
  # ○ 定義執行個體變數 (追加定義)
  #--------------------------------------------------------------------------
  attr_accessor :last_menu_index          # 調用記憶用 : 菜單
  #--------------------------------------------------------------------------
  # ○ 初始化物件 (追加定義)
  #--------------------------------------------------------------------------
  def initialize
    _exmctcmd_initialize
    @last_menu_index = 0
  end
end

class Scene_Menu
  #--------------------------------------------------------------------------
  # ☆ 追加指令可使用化判斷
  #--------------------------------------------------------------------------
  def command_inputable?(command)
    return false if command[5] == 1 and $game_party.members.size == 0
    return (command[0] == 0 or $game_switches[command[0]])
  end
  #--------------------------------------------------------------------------
  # ☆ 追加指令視覺化判斷
  #--------------------------------------------------------------------------
  def command_visible?(command)
    return command[4] == 1
  end
  #--------------------------------------------------------------------------
  # ○ 生成指令視窗 (重新定義)
  #--------------------------------------------------------------------------
  def create_command_window
    s1 = Vocab::item
    s2 = Vocab::skill
    s3 = Vocab::equip
    s4 = Vocab::status
    s5 = Vocab::save
    s6 = Vocab::game_end
    sa = [s1, s2, s3, s4, s5, s6]
    for cmd in EXMNU_CTCMD_COMMANDS
      if command_visible?(cmd) or command_inputable?(cmd)
        sa.insert cmd[1] - 1, cmd[2]
      end
    end
    @command_window = Window_Command.new(160, sa)
    @commands = {}
    for i in 0...sa.size
      @commands[sa[i]] = i
    end
    if sa.size >= EXMNU_CTCMD_ROWMAX
      @command_window.height = EXMNU_CTCMD_ROWMAX * 24 + 32
    end
    @command_window.index = @menu_index
    if $game_party.members.size == 0          # 人數為0的場合
      @command_window.draw_item(@commands[Vocab::item], false)
      @command_window.draw_item(@commands[Vocab::skill], false)
      @command_window.draw_item(@commands[Vocab::equip], false)
      @command_window.draw_item(@commands[Vocab::status], false)
    end
    if $game_system.save_disabled             # 禁止存檔的場合
      @command_window.draw_item(@commands[Vocab::save], false)
    end
    for cmd in EXMNU_CTCMD_COMMANDS
      if command_visible?(cmd) and not command_inputable?(cmd)
        @command_window.draw_item(@commands[cmd[2]], false)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 更新指令選擇 (重新定義)
  #--------------------------------------------------------------------------
  def update_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      if $game_party.members.size == 0 and 
        @command_window.index == @commands[Vocab::save]
          Sound.play_buzzer
          return
      elsif $game_system.save_disabled and 
        @command_window.index == @commands[Vocab::save]
        Sound.play_buzzer
        return
      else
        for cmd in EXMNU_CTCMD_COMMANDS
          if @command_window.index == @commands[cmd[2]] and 
            not command_inputable?(cmd)
            Sound.play_buzzer
            return
          end
        end
      end
      $game_party.last_menu_index = @command_window.index
      Sound.play_decision
      case @command_window.index
      when @commands[Vocab::item]
        $scene = Scene_Item.new
      when @commands[Vocab::skill], @commands[Vocab::equip], 
        @commands[Vocab::status]
        start_actor_selection
      when @commands[Vocab::save]
        $scene = Scene_File.new(true, false, false)
      when @commands[Vocab::game_end]
        $scene = Scene_End.new
      else
        for cmd in EXMNU_CTCMD_COMMANDS
          if @command_window.index == @commands[cmd[2]]
            eval("$scene = #{cmd[3]}.new")
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 開始角色選取 (重新定義)
  #--------------------------------------------------------------------------
  def update_actor_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_actor_selection
    elsif Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision
      case @command_window.index
      when @commands[Vocab::skill]
        $scene = Scene_Skill.new(@status_window.index)
      when @commands[Vocab::equip]
        $scene = Scene_Equip.new(@status_window.index)
      when @commands[Vocab::status]
        $scene = Scene_Status.new(@status_window.index)
      end
    end
  end
end

class Scene_Item
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new($game_party.last_menu_index)
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new($game_party.last_menu_index)
  end
end

class Scene_Equip
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new($game_party.last_menu_index)
  end
end

class Scene_Status
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new($game_party.last_menu_index)
  end
end

class Scene_File
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    if @from_title
      $scene = Scene_Title.new
    elsif @from_event
      $scene = Scene_Map.new
    else
      $scene = Scene_Menu.new($game_party.last_menu_index)
    end
  end
end

class Scene_End
  #--------------------------------------------------------------------------
  # ○ 回到原畫面 (重新定義)
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new($game_party.last_menu_index)
  end
end
