﻿#==============================================================================
# 
# ▼ Yanfly Engine Ace - Learn Skill Engine v1.00
# -- Last Updated: 2012.01.08
# -- Level: Normal, Hard
# -- Requires: n/a
# 
#==============================================================================

$imported = {} if $imported.nil?
$imported["YEA-LearnSkillEngine"] = true

#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2012.01.08 - Started Script and Finished.
# 
#==============================================================================
# ▼ Introduction
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# For those who want an alternative for actors to learn skills outside of
# leveling, this script allows actors to learn skills through a learn skill
# menu. The actor can use acquired JP, EXP, or Gold to learn skills. Skills can
# also be hidden until certain requirements are met.
# 
#==============================================================================
# ▼ Instructions
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# To install this script, open up your script editor and copy/paste this script
# to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
# 
# -----------------------------------------------------------------------------
# Class Notetags - These notetags go in the class notebox in the database.
# -----------------------------------------------------------------------------
# <learn skills: x>
# <learn skills: x, x>
# Sets the class to be able to learn skills x through the Learn Skills menu.
# Insert multiple of these tags to increase the number of skills learned.
# 
# -----------------------------------------------------------------------------
# Skill Notetags - These notetags go in the skill notebox in the database.
# -----------------------------------------------------------------------------
# <learn cost: x jp>
# <learn cost: x exp>
# <learn cost: x gold>
# Sets the learn for cost the skill to require x amounts of JP, x amounts of
# exp, or x amounts of gold. Only one type of cost can be used at a time. For
# JP costs, the Yanfly Engine Ace - JP Manager script must be installed.
# 
# <learn require level: x>
# Sets the skill to require the actor's current level to be x before the skill
# will show up in the skill learning window.
# 
# <learn require skill: x>
# <learn require skill: x, x>
# Sets the skill to require learning skill x (through any means) before the
# skill becomes visible in the skill learning window. Insert multiples of these
# tags to require more skills to be learned in order for the skill to show.
# 
# <learn require switch: x>
# <learn require switch: x, x>
# Sets the skill to require switch x to be ON in order for it to show in the
# skill learning window. Insert multiple switches to to increase the number of
# switches needed to be ON before the skill is shown.
# 
# <learn require eval>
#  string
#  string
# </learn require eval>
# For the more advanced users, replace string with lines of code to check for
# whether or not the skill will be shown in skill learning window. If multiple
# lines are used, they are all considered part of the same line.
# 
#==============================================================================
# ▼ Compatibility
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
# it will run with RPG Maker VX without adjusting.
# 
# This script is compatible with Yanfly Engine Ace - JP Manager v1.00+. The
# placement of this script relative to the JP Manager script doesn't matter.
# 
#==============================================================================

module YEA
  module LEARN_SKILL
    
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # - General Settings -
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # Adjust the general settings here for your game. These adjust how the
    # command name appears, a switch to show the Learn Command
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    COMMAND_NAME = "Learn Skills"    # Name used for Learn Skill command.
    
    # This switch will hide the "Learn" command from view if the switch is OFF.
    # The "Learn" command will be shown if the switch is ON. Set this switch to
    # 0 to not use this effect and to always have the Learn command be shown.
    SHOW_SWITCH   = 0
    
    # This adjusts the order the Skill Types appear in for the command window.
    # Any Skill Types unlisted will not be shown. 
    STYPE_ORDER = [41..999, 1..40]
    
    # For those who installed Yanfly Engine - Skill Restrictions, you can
    # choose to display warmups or cooldowns inside of the menu here.
    DRAW_WARMUP   = true        # Draw warmups for skills?
    DRAW_COOLDOWN = true        # Draw cooldowns for skills?
    
    #-------------------------------------------------------------------------
    # - Default Cost -
    #-------------------------------------------------------------------------
    # This sets the default costs for all skills. If the JP script isn't
    # installed, the type will become :exp instead.
    # 
    # Cost Type       Description
    #  :jp            - Requires YEA - JP Manager.
    #  :exp           - Makes skill cost EXP.
    #  :gold          - Makes skill cost gold.
    #-------------------------------------------------------------------------
    DEFAULT_COST = 100          # Sets the default cost of a skill.
    DEFAULT_TYPE = :jp          # Sets the default cost type.
    
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # - Learn Window Settings -
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # These settings adjust the Learn Window's visual appearance. Adjust the
    # way empty text appears, EXP cost suffixes appear, Learned text appears,
    # font sizes, and cost colours here.
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    EMPTY_TEXT     = "-"        # Text if no restricts used for the skill.
    EXP_TEXT       = "EXP"      # Text used for EXP costs.
    LEARNED_TEXT   = "Learned"  # Text to indicate skill has been learned.
    LEARNED_SIZE   = 20         # Font size used for learned skill text.
    COLOUR_JP      = 24         # Text colour used for JP Cost.
    COLOUR_EXP     =  5         # Text colour used for EXP Cost.
    COLOUR_GOLD    = 21         # Text colour used for Gold Cost.
    COST_SIZE      = 20         # Font size used for skill costs.
    
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # - Cost Window Settings -
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    # When a skill is selected to be learned, the cost window appears. Adjust
    # the settings here to choose how your game's cost window looks. Change the
    # maximum number of rows, the gold icon used for gold costs, the gold text,
    # the learn skill text, the cancel text, and the cancel icon here.
    #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    MAXIMUM_ROWS      = 8               # Maximum number of rows displayed.
    GOLD_ICON         = 361             # Icon used for gold costs.
    GOLD_TEXT         = "Gold Cost"     # Text used for gold costs.
    LEARN_SKILL_TEXT  = "Learn %s?"     # Text used to learn skill.
    LEARN_CANCEL_TEXT = "Cancel"        # Text used for do not learn.
    CANCEL_ICON       = 187             # Icon used for cancel.
    
  end # LEARN_SKILL
end # YEA

#==============================================================================
# ▼ Editting anything past this point may potentially result in causing
# computer damage, incontinence, explosion of user's head, coma, death, and/or
# halitosis so edit at your own risk.
#==============================================================================

module YEA
  module LEARN_SKILL
    module_function
    #--------------------------------------------------------------------------
    # convert_integer_array
    #--------------------------------------------------------------------------
    def convert_integer_array(array)
      result = []
      array.each { |i|
        case i
        when Range; result |= i.to_a
        when Integer; result |= [i]
        end }
      return result
    end
    #--------------------------------------------------------------------------
    # converted_contants
    #--------------------------------------------------------------------------
    STYPE_ORDER = convert_integer_array(STYPE_ORDER)
  end # LEARN_SKILL
  module REGEXP
  module CLASS
    
    LEARN_SKILLS = /<(?:LEARN_SKILLS|learn skills):[ ](\d+(?:\s*,\s*\d+)*)>/i
    
  end # CLASS
  module SKILL
    
    LEARN_COST = /<(?:LEARN_COST|learn cost):[ ](.*)>/i
    LEARN_REQUIRE_LEVEL = 
      /<(?:LEARN_REQUIRE_LEVEL|learn require level):[ ](\d+)>/i
    LEARN_REQUIRE_SKILL =
      /<(?:LEARN_REQUIRE_SKILL|learn require skill):[ ](\d+(?:\s*,\s*\d+)*)>/i
    LEARN_REQUIRE_SWITCH =
      /<(?:LEARN_REQUIRE_SWITCH|learn require switch):[ ](\d+(?:\s*,\s*\d+)*)>/i
    LEARN_REQUIRE_EVAL_ON  = /<(?:LEARN_REQUIRE_EVAL|learn require eval)>/i
    LEARN_REQUIRE_EVAL_OFF = /<\/(?:LEARN_REQUIRE_EVAL|learn require eval)>/i
    
  end # SKILL
  end # REGEXP
end # YEA

#==============================================================================
# ■ Numeric
#==============================================================================

class Numeric
  
  #--------------------------------------------------------------------------
  # new method: group_digits
  #--------------------------------------------------------------------------
  unless $imported["YEA-CoreEngine"]
  def group; return self.to_s; end
  end # $imported["YEA-CoreEngine"]
    
end # Numeric

#==============================================================================
# ■ Icon
#==============================================================================

module Icon
  
  #--------------------------------------------------------------------------
  # self.cancel
  #--------------------------------------------------------------------------
  def self.cancel
    return YEA::LEARN_SKILL::CANCEL_ICON
  end
  
  #--------------------------------------------------------------------------
  # self.learn_skill_gold
  #--------------------------------------------------------------------------
  def self.learn_skill_gold
    return YEA::LEARN_SKILL::GOLD_ICON
  end
  
end # Icon

#==============================================================================
# ■ Switch
#==============================================================================

module Switch
  
  #--------------------------------------------------------------------------
  # self.show_learn_skill
  #--------------------------------------------------------------------------
  def self.show_learn_skill
    return true if YEA::LEARN_SKILL::SHOW_SWITCH <= 0
    return $game_switches[YEA::LEARN_SKILL::SHOW_SWITCH]
  end
  
end # Switch

#==============================================================================
# ■ DataManager
#==============================================================================

module DataManager
  
  #--------------------------------------------------------------------------
  # alias method: load_database
  #--------------------------------------------------------------------------
  class <<self; alias load_database_lse load_database; end
  def self.load_database
    load_database_lse
    load_notetags_lse
  end
  
  #--------------------------------------------------------------------------
  # new method: load_notetags_lse
  #--------------------------------------------------------------------------
  def self.load_notetags_lse
    groups = [$data_classes, $data_skills]
    for group in groups
      for obj in group
        next if obj.nil?
        obj.load_notetags_lse
      end
    end
  end
  
end # DataManager

#==============================================================================
# ■ RPG::Class
#==============================================================================

class RPG::Class < RPG::BaseItem
  
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :learn_skills
  
  #--------------------------------------------------------------------------
  # common cache: load_notetags_lse
  #--------------------------------------------------------------------------
  def load_notetags_lse
    @learn_skills = []
    #---
    self.note.split(/[\r\n]+/).each { |line|
      case line
      #---
      when YEA::REGEXP::CLASS::LEARN_SKILLS
        $1.scan(/\d+/).each { |num| 
        @learn_skills.push(num.to_i) if num.to_i > 0 }
      end
    } # self.note.split
    #---
  end
  
end # RPG::Class

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :learn_cost
  attr_accessor :learn_require_level
  attr_accessor :learn_require_skill
  attr_accessor :learn_require_switch
  attr_accessor :learn_require_eval
  
  #--------------------------------------------------------------------------
  # common cache: load_notetags_lse
  #--------------------------------------------------------------------------
  def load_notetags_lse
    @learn_cost = [YEA::LEARN_SKILL::DEFAULT_COST]
    @learn_cost.push(YEA::LEARN_SKILL::DEFAULT_TYPE)
    @learn_require_level = 0
    @learn_require_skill = []
    @learn_require_switch = []
    @learn_require_eval_on = false
    #---
    self.note.split(/[\r\n]+/).each { |line|
      case line
      #---
      when YEA::REGEXP::SKILL::LEARN_COST
        case $1.upcase
        when /(\d+)[ ]JP/i
          next unless $imported["YEA-JPManager"]
          @learn_cost = [$1.to_i, :jp]
        when /(\d+)[ ]EXP/i
          @learn_cost = [$1.to_i, :exp]
        when /(\d+)[ ]GOLD/i
          @learn_cost = [$1.to_i, :gold]
        end
      #---
      when YEA::REGEXP::SKILL::LEARN_REQUIRE_LEVEL
        @learn_require_level = $1.to_i
      when YEA::REGEXP::SKILL::LEARN_REQUIRE_SKILL
        $1.scan(/\d+/).each { |num| 
        @learn_require_skill.push(num.to_i) if num.to_i > 0 }
      when YEA::REGEXP::SKILL::LEARN_REQUIRE_SWITCH
        $1.scan(/\d+/).each { |num| 
        @learn_require_switch.push(num.to_i) if num.to_i > 0 }
      #---
      when YEA::REGEXP::SKILL::LEARN_REQUIRE_EVAL_ON
        @learn_require_eval_on = true
      when YEA::REGEXP::SKILL::LEARN_REQUIRE_EVAL_OFF
        @learn_require_eval_on = false
      else
        next unless @learn_require_eval_on
        @learn_require_eval = "" if @learn_require_eval.nil?
        @learn_require_eval += line.to_s
      #---
      end
    } # self.note.split
    #---
    if !$imported["YEA-JPManager"] && @learn_cost[1] == :jp
      @learn_cost[1] = :exp
    end
  end
  
end # RPG::Skill

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  
  #--------------------------------------------------------------------------
  # alias method: skills
  #--------------------------------------------------------------------------
  alias game_actor_skills_lse skills
  def skills
    btest_add_learn_skills
    game_actor_skills_lse
  end
  
  #--------------------------------------------------------------------------
  # new method: btest_add_learn_skills
  #--------------------------------------------------------------------------
  def btest_add_learn_skills
    return unless $BTEST
    for skill_id in self.class.learn_skills; learn_skill(skill_id); end
  end
  
  #--------------------------------------------------------------------------
  # new method: exp_class
  #--------------------------------------------------------------------------
  def exp_class(class_id)
    @exp[class_id] = 0 if @exp[class_id].nil?
    return @exp[class_id]
  end
  
  #--------------------------------------------------------------------------
  # lose_exp_class
  #--------------------------------------------------------------------------
  def lose_exp_class(value, class_id)
    exp = exp_class(class_id) - value
    change_exp_class(exp, class_id)
  end
  
  #--------------------------------------------------------------------------
  # change_exp_class
  #--------------------------------------------------------------------------
  def change_exp_class(exp, class_id)
    return change_exp(exp, false) if class_id == @class_id
    @exp[class_id] = [exp, 0].max
  end
  
end # Game_Actor

#==============================================================================
# ■ Window_SkillCommand
#==============================================================================

class Window_SkillCommand < Window_Command
  
  #--------------------------------------------------------------------------
  # alias method: make_command_list
  #--------------------------------------------------------------------------
  alias window_skillcommand_make_command_list_lse make_command_list
  def make_command_list
    window_skillcommand_make_command_list_lse
    return if @actor.nil?
    add_learn_skill_command unless $imported["YEA-SkillMenu"]
  end
  
  #--------------------------------------------------------------------------
  # new method: add_learn_skill_command
  #--------------------------------------------------------------------------
  def add_learn_skill_command
    return unless Switch.show_learn_skill
    name = YEA::LEARN_SKILL::COMMAND_NAME
    add_command(name, :learn_skill, true, @actor.added_skill_types[0])
  end
  
end # Window_SkillCommand

#==============================================================================
# ■ Window_LearnSkillCommand
#==============================================================================

class Window_LearnSkillCommand < Window_Command
  
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_reader   :skill_window
  
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(dx, dy)
    super(dx, dy)
    @actor = nil
  end
  
  #--------------------------------------------------------------------------
  # window_width
  #--------------------------------------------------------------------------
  def window_width; return 160; end
  
  #--------------------------------------------------------------------------
  # visible_line_number
  #--------------------------------------------------------------------------
  def visible_line_number; return 4; end
  
  #--------------------------------------------------------------------------
  # actor=
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
    select(item_max - 1) if index >= item_max
  end
  
  #--------------------------------------------------------------------------
  # make_command_list
  #--------------------------------------------------------------------------
  def make_command_list
    return if @actor.nil?
    make_unlocked_class_skill_types
    correct_unlocked_class_learned_skills
    for stype_id in YEA::LEARN_SKILL::STYPE_ORDER
      next unless include?(stype_id)
      name = $data_system.skill_types[stype_id]
      add_command(name, :skill, true, stype_id)
    end
  end
  
  #--------------------------------------------------------------------------
  # make_unlocked_class_skill_types
  #--------------------------------------------------------------------------
  def make_unlocked_class_skill_types
    return unless $imported["YEA-ClassSystem"]
    @unlocked_types = []
    unlocked_classes = @actor.unlocked_classes.clone
    unlocked_classes |= YEA::CLASS_SYSTEM::DEFAULT_UNLOCKS
    for class_id in unlocked_classes
      next if $data_classes[class_id].nil?
      for feature in $data_classes[class_id].features
        next unless feature.code == 41
        @unlocked_types.push(feature.data_id)
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # correct_unlocked_class_learned_skills
  #--------------------------------------------------------------------------
  def correct_unlocked_class_learned_skills
    return unless $imported["YEA-ClassSystem"]
    unlocked_classes = @actor.unlocked_classes.clone
    unlocked_classes |= YEA::CLASS_SYSTEM::DEFAULT_UNLOCKS
    for class_id in unlocked_classes
      @actor.learn_class_skills(class_id)
    end
  end
  
  #--------------------------------------------------------------------------
  # include?
  #--------------------------------------------------------------------------
  def include?(stype_id)
    return true if @actor.added_skill_types.include?(stype_id)
    if $imported["YEA-ClassSystem"]
      return true if @unlocked_types.include?(stype_id)
    end
    return false
  end
  
  #--------------------------------------------------------------------------
  # update
  #--------------------------------------------------------------------------
  def update
    super
    @skill_window.stype_id = current_ext if @skill_window
  end
  
  #--------------------------------------------------------------------------
  # skill_window=
  #--------------------------------------------------------------------------
  def skill_window=(skill_window)
    @skill_window = skill_window
    update
  end
  
end # Window_LearnSkillCommand

#==============================================================================
# ■ Window_LearnSkillList
#==============================================================================

class Window_LearnSkillList < Window_SkillList
  
  #--------------------------------------------------------------------------
  # col_max
  #--------------------------------------------------------------------------
  def col_max; return 1; end
  
  #--------------------------------------------------------------------------
  # select_last
  #--------------------------------------------------------------------------
  def select_last; select(0); end
  
  #--------------------------------------------------------------------------
  # actor=
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    super(actor)
    make_learn_skills_list
  end
  
  #--------------------------------------------------------------------------
  # make_learn_skills_list
  #--------------------------------------------------------------------------
  def make_learn_skills_list
    @learn_skills = []
    @skill_classes = {}
    return if @actor.nil?
    for skill_id in @actor.class.learn_skills
      next if $data_skills[skill_id].nil?
      next if @learn_skills.include?($data_skills[skill_id])
      skill = $data_skills[skill_id]
      @learn_skills.push(skill)
      @skill_classes[skill] = [] if @skill_classes[skill].nil?
      @skill_classes[skill].push(@actor.class.id)
    end
    make_unlocked_class_skills
  end
  
  #--------------------------------------------------------------------------
  # make_unlocked_class_skills
  #--------------------------------------------------------------------------
  def make_unlocked_class_skills
    return unless $imported["YEA-ClassSystem"]
    @unlocked_types = []
    unlocked_classes = @actor.unlocked_classes.clone
    unlocked_classes |= YEA::CLASS_SYSTEM::DEFAULT_UNLOCKS
    for class_id in unlocked_classes
      next if $data_classes[class_id].nil?
      for skill_id in $data_classes[class_id].learn_skills
        next if $data_skills[skill_id].nil?
        skill = $data_skills[skill_id]
        @learn_skills.push(skill) unless @learn_skills.include?(skill)
        @skill_classes[skill] = [] if @skill_classes[skill].nil?
        @skill_classes[skill] |= [class_id]
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # skill_classes
  #--------------------------------------------------------------------------
  def skill_classes(skill)
    return @skill_classes[skill]
  end
  
  #--------------------------------------------------------------------------
  # make_item_list
  #--------------------------------------------------------------------------
  def make_item_list
    return if @learn_skills.nil?
    @data = @learn_skills.select {|skill| include?(skill) }
  end
  
  #--------------------------------------------------------------------------
  # include?
  #--------------------------------------------------------------------------
  def include?(item)
    return false if item.nil?
    return false unless meet_requirements?(item)
    return item.stype_id == @stype_id
  end
  
  #--------------------------------------------------------------------------
  # meet_requirements?
  #--------------------------------------------------------------------------
  def meet_requirements?(item)
    return false if @actor.nil?
    return false unless meet_level_requirements?(item)
    return false unless meet_skill_requirements?(item)
    return false unless meet_switch_requirements?(item)
    return false unless meet_eval_requirements?(item)
    return true
  end
  
  #--------------------------------------------------------------------------
  # meet_level_requirements?
  #--------------------------------------------------------------------------
  def meet_level_requirements?(item)
    return @actor.level >= item.learn_require_level
  end
  
  #--------------------------------------------------------------------------
  # meet_skill_requirements?
  #--------------------------------------------------------------------------
  def meet_skill_requirements?(item)
    for skill_id in item.learn_require_skill
      next if $data_skills[skill_id].nil?
      return false unless @actor.skill_learn?($data_skills[skill_id])
    end
    return true
  end
  
  #--------------------------------------------------------------------------
  # meet_switch_requirements?
  #--------------------------------------------------------------------------
  def meet_switch_requirements?(item)
    for switch_id in item.learn_require_switch
      return false unless $game_switches[switch_id]
    end
    return true
  end
  
  #--------------------------------------------------------------------------
  # meet_eval_requirements?
  #--------------------------------------------------------------------------
  def meet_eval_requirements?(item)
    return true if item.learn_require_eval.nil?
    return eval(item.learn_require_eval)
  end
  
  #--------------------------------------------------------------------------
  # enable?
  #--------------------------------------------------------------------------
  def enable?(skill)
    return false if skill.nil?
    return false unless enabled_jp?(skill)
    return false unless enabled_exp?(skill)
    return false unless enabled_gold?(skill)
    return !@actor.skill_learn?(skill)
  end
  
  #--------------------------------------------------------------------------
  # enabled_jp?
  #--------------------------------------------------------------------------
  def enabled_jp?(skill)
    return true if skill.learn_cost[1] != :jp
    cost = skill.learn_cost[0]
    for class_id in @skill_classes[skill]
      return true if @actor.jp(class_id) >= cost
    end
    return false
  end
  
  #--------------------------------------------------------------------------
  # enabled_exp?
  #--------------------------------------------------------------------------
  def enabled_exp?(skill)
    return true if skill.learn_cost[1] != :exp
    cost = skill.learn_cost[0]
    for class_id in @skill_classes[skill]
      return true if @actor.exp_class(class_id) >= cost
    end
    return false
  end
  
  #--------------------------------------------------------------------------
  # enabled_gold?
  #--------------------------------------------------------------------------
  def enabled_gold?(skill)
    return true if skill.learn_cost[1] != :gold
    cost = skill.learn_cost[0]
    return $game_party.gold >= cost
  end
  
  #--------------------------------------------------------------------------
  # draw_item
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    return if skill.nil?
    rect = item_rect(index)
    rect.width = (contents.width - spacing) / 2 - 4
    draw_item_name(skill, rect.x, rect.y, enable?(skill), rect.width - 24)
    draw_skill_cost(rect, skill)
    draw_restriction_info(skill, index)
    draw_learn_cost(skill, index)
  end
  
  #--------------------------------------------------------------------------
  # skill_restriction?
  #--------------------------------------------------------------------------
  def skill_restriction?(index)
    return false
  end
  
  #--------------------------------------------------------------------------
  # draw_restriction_info
  #--------------------------------------------------------------------------
  def draw_restriction_info(skill, index)
    return unless $imported["YEA-SkillRestrictions"]
    rect = item_rect(index)
    rect.x = contents.width / 2
    rect.width /= 2
    rect.width /= 3
    rect.width -= 8
    draw_skill_warmup(skill, rect)
    rect.x += rect.width + 4
    draw_skill_cooldown(skill, rect)
  end
  
  #--------------------------------------------------------------------------
  # draw_skill_warmup
  #--------------------------------------------------------------------------
  def draw_skill_warmup(skill, rect)
    return unless YEA::LEARN_SKILL::DRAW_WARMUP
    enabled = enable?(skill)
    enabled = false if skill.warmup <= 0
    change_color(warmup_colour, enabled)
    icon = Icon.warmup
    if icon > 0
      draw_icon(icon, rect.x + rect.width-24, rect.y, enable?(skill))
      rect.width -= 24
    end
    contents.font.size = YEA::SKILL_RESTRICT::WARMUP_SIZE
    value = skill.warmup > 0 ? skill.warmup.group : empty_text
    text = sprintf(YEA::SKILL_RESTRICT::WARMUP_SUFFIX, value)
    draw_text(rect, text, 2)
    reset_font_settings
  end
  
  #--------------------------------------------------------------------------
  # draw_skill_cooldown
  #--------------------------------------------------------------------------
  def draw_skill_cooldown(skill, rect)
    return unless YEA::LEARN_SKILL::DRAW_COOLDOWN
    enabled = enable?(skill)
    enabled = false if skill.cooldown <= 0
    change_color(cooldown_colour, enabled)
    icon = Icon.cooldown
    if icon > 0
      draw_icon(icon, rect.x + rect.width-24, rect.y, enable?(skill))
      rect.width -= 24
    end
    contents.font.size = YEA::SKILL_RESTRICT::COOLDOWN_SIZE
    value = skill.cooldown > 0 ? skill.cooldown.group : empty_text
    text = sprintf(YEA::SKILL_RESTRICT::COOLDOWN_SUFFIX, value)
    draw_text(rect, text, 2)
    reset_font_settings
  end
  
  #--------------------------------------------------------------------------
  # empty_text
  #--------------------------------------------------------------------------
  def empty_text
    return YEA::LEARN_SKILL::EMPTY_TEXT
  end
  
  #--------------------------------------------------------------------------
  # draw_learn_cost
  #--------------------------------------------------------------------------
  def draw_learn_cost(skill, index)
    rect = item_rect(index)
    rect.width -= 4
    if @actor.skill_learn?(skill)
      draw_learned_skill(rect)
    else
      draw_learn_skill_cost(skill, rect)
    end
    reset_font_settings
  end
  
  #--------------------------------------------------------------------------
  # draw_learned_skill
  #--------------------------------------------------------------------------
  def draw_learned_skill(rect)
    contents.font.size = YEA::LEARN_SKILL::LEARNED_SIZE
    change_color(normal_color)
    draw_text(rect, YEA::LEARN_SKILL::LEARNED_TEXT, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_learn_skill_cost
  #--------------------------------------------------------------------------
  def draw_learn_skill_cost(skill, rect)
    case skill.learn_cost[1]
    when :jp
      return unless $imported["YEA-JPManager"]
      draw_jp_cost(skill, rect)
    when :exp
      draw_exp_cost(skill, rect)
    when :gold
      draw_gold_cost(skill, rect)
    else; return
    end
  end
  
  #--------------------------------------------------------------------------
  # draw_jp_cost
  #--------------------------------------------------------------------------
  def draw_jp_cost(skill, rect)
    enabled = enabled_jp?(skill)
    if Icon.jp > 0
      draw_icon(Icon.jp, rect.x + rect.width - 24, rect.y, enabled)
      rect.width -= 24
    end
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::jp, 2)
    rect.width -= text_size(Vocab::jp).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_JP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_exp_cost
  #--------------------------------------------------------------------------
  def draw_exp_cost(skill, rect)
    enabled = enabled_exp?(skill)
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, YEA::LEARN_SKILL::EXP_TEXT, 2)
    rect.width -= text_size(YEA::LEARN_SKILL::EXP_TEXT).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_EXP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_gold_cost
  #--------------------------------------------------------------------------
  def draw_gold_cost(skill, rect)
    enabled = enabled_jp?(skill)
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::currency_unit, 2)
    rect.width -= text_size(Vocab::currency_unit).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_GOLD), enabled)
    draw_text(rect, text, 2)
  end
  
end # Window_LearnSkillList

#==============================================================================
# ■ Window_LearnSkillCostBack
#==============================================================================

class Window_LearnSkillCostBack < Window_Base
  
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(item_window)
    dw = Graphics.width * 3 / 4
    dx = (Graphics.width - dw) / 2
    super(dx, 0, dw, fitting_height(2))
    self.openness = 0
    self.back_opacity = 255
    @front_window = nil
    @item_window = item_window
    @skill = nil
  end
  
  #--------------------------------------------------------------------------
  # reveal
  #--------------------------------------------------------------------------
  def reveal(skill, skill_classes)
    @skill = skill
    return if @skill.nil?
    case @skill.learn_cost[1]
    when :gold
      self.height = fitting_height(3)
    else
      maximum = [skill_classes.size, YEA::LEARN_SKILL::MAXIMUM_ROWS].min
      self.height = fitting_height(maximum + 2)
    end
    create_contents
    self.y = (Graphics.height - self.height) / 2
    refresh
    open
  end
  
  #--------------------------------------------------------------------------
  # refresh
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    reset_font_settings
    draw_learn_skill_text
    rect = Rect.new(0, 0, contents.width - 4, line_height)
    draw_learn_skill_cost(@skill, rect)
  end
  
  #--------------------------------------------------------------------------
  # draw_learn_skill_text
  #--------------------------------------------------------------------------
  def draw_learn_skill_text
    name = sprintf("\eI[%d]%s", @skill.icon_index, @skill.name)
    fmt = YEA::LEARN_SKILL::LEARN_SKILL_TEXT
    text = sprintf(fmt, name)
    draw_text_ex(4, 0, text)
  end
  
  #--------------------------------------------------------------------------
  # draw_learn_skill_cost
  #--------------------------------------------------------------------------
  def draw_learn_skill_cost(skill, rect)
    case skill.learn_cost[1]
    when :jp
      return unless $imported["YEA-JPManager"]
      draw_jp_cost(skill, rect)
    when :exp
      draw_exp_cost(skill, rect)
    when :gold
      draw_gold_cost(skill, rect)
    else; return
    end
  end
  
  #--------------------------------------------------------------------------
  # draw_jp_cost
  #--------------------------------------------------------------------------
  def draw_jp_cost(skill, rect)
    enabled = true
    if Icon.jp > 0
      draw_icon(Icon.jp, rect.x + rect.width - 24, rect.y, enabled)
      rect.width -= 24
    end
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::jp, 2)
    rect.width -= text_size(Vocab::jp).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_JP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_exp_cost
  #--------------------------------------------------------------------------
  def draw_exp_cost(skill, rect)
    enabled = true
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, YEA::LEARN_SKILL::EXP_TEXT, 2)
    rect.width -= text_size(YEA::LEARN_SKILL::EXP_TEXT).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_EXP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_gold_cost
  #--------------------------------------------------------------------------
  def draw_gold_cost(skill, rect)
    enabled = true
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::currency_unit, 2)
    rect.width -= text_size(Vocab::currency_unit).width
    cost = skill.learn_cost[0]
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_GOLD), enabled)
    draw_text(rect, text, 2)
  end
  
end # Window_LearnSkillCostBack

#==============================================================================
# ■ Window_LearnSkillCostFront
#==============================================================================

class Window_LearnSkillCostFront < Window_Command
  
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(item_window, cost_window)
    super((Graphics.width - window_width) / 2, 0)
    self.openness = 0
    self.opacity = 0
    @item_window = item_window
    @cost_window = cost_window
    @skill = nil
    @actor = nil
    deactivate
  end
  
  #--------------------------------------------------------------------------
  # window_width
  #--------------------------------------------------------------------------
  def window_width; return Graphics.width * 3 / 4; end
  
  #--------------------------------------------------------------------------
  # skill_class
  #--------------------------------------------------------------------------
  def skill_class
    return @skill_classes.nil? ? nil : @skill_classes[index]
  end
  
  #--------------------------------------------------------------------------
  # reveal
  #--------------------------------------------------------------------------
  def reveal(skill, skill_classes, actor)
    @skill = skill
    @skill_classes = skill_classes.clone
    @actor = actor
    return if @skill.nil?
    case @skill.learn_cost[1]
    when :gold
      self.height = fitting_height(2)
    else
      maximum = [skill_classes.size, YEA::LEARN_SKILL::MAXIMUM_ROWS].min
      self.height = fitting_height(maximum + 1)
    end
    create_contents
    self.y = @cost_window.y + line_height
    refresh
    select(0)
    open
    activate
  end
  
  #--------------------------------------------------------------------------
  # make_command_list
  #--------------------------------------------------------------------------
  def make_command_list
    return if @skill_classes.nil?
    if @skill.learn_cost[1] == :gold
      add_command("GOLD", :gold, true)
      add_command(YEA::LEARN_SKILL::LEARN_CANCEL_TEXT, :cancel, true)
      return
    end
    for class_id in @skill_classes
      name = $data_classes[class_id].name
      add_command(name, :class, enabled?(class_id), class_id)
    end
    add_command(YEA::LEARN_SKILL::LEARN_CANCEL_TEXT, :cancel, true)
  end
  
  #--------------------------------------------------------------------------
  # enabled?
  #--------------------------------------------------------------------------
  def enabled?(class_id)
    cost = @skill.learn_cost[0]
    case @skill.learn_cost[1]
    when :jp
      return @actor.jp(class_id) >= cost
    when :exp
      return @actor.exp_class(class_id) >= cost
    end
    return true
  end
  
  #--------------------------------------------------------------------------
  # draw_item
  #--------------------------------------------------------------------------
  def draw_item(index)
    reset_font_settings
    rect = item_rect(index)
    rect.x += 24
    rect.width -= 28
    return draw_cancel_text(index, rect) if @list[index][:symbol] == :cancel
    draw_class_name(index, rect) if @skill.learn_cost[1] != :gold
    draw_party_gold(rect) if @skill.learn_cost[1] == :gold
    draw_learn_skill_cost(@skill, rect, index)
  end
  
  #--------------------------------------------------------------------------
  # draw_cancel_text
  #--------------------------------------------------------------------------
  def draw_cancel_text(index, rect)
    draw_icon(Icon.cancel, rect.x, rect.y)
    text = command_name(index)
    draw_text(rect.x+24, rect.y, rect.width-24, line_height, text)
  end
  
  #--------------------------------------------------------------------------
  # draw_class_name
  #--------------------------------------------------------------------------
  def draw_class_name(index, rect)
    class_id = @list[index][:ext]
    return if $data_classes[class_id].nil?
    enabled = enabled?(class_id)
    if $imported["YEA-ClassSystem"]
      draw_icon($data_classes[class_id].icon_index, rect.x, rect.y, enabled)
    end
    rect.x += 24
    rect.width -= 24
    change_color(normal_color, enabled)
    draw_text(rect, $data_classes[class_id].name)
  end
  
  #--------------------------------------------------------------------------
  # draw_class_name
  #--------------------------------------------------------------------------
  def draw_party_gold(rect)
    enabled = true
    draw_icon(Icon.learn_skill_gold, rect.x, rect.y)
    rect.x += 24
    rect.width -= 24
    change_color(normal_color, enabled)
    draw_text(rect, YEA::LEARN_SKILL::GOLD_TEXT)
  end
  
  #--------------------------------------------------------------------------
  # draw_learn_skill_cost
  #--------------------------------------------------------------------------
  def draw_learn_skill_cost(skill, rect, index)
    case skill.learn_cost[1]
    when :jp
      return unless $imported["YEA-JPManager"]
      draw_jp_cost(skill, rect, index)
    when :exp
      draw_exp_cost(skill, rect, index)
    when :gold
      draw_gold_cost(skill, rect)
    else; return
    end
  end
  
  #--------------------------------------------------------------------------
  # draw_jp_cost
  #--------------------------------------------------------------------------
  def draw_jp_cost(skill, rect, index)
    enabled = enabled?(@list[index][:ext])
    if Icon.jp > 0
      draw_icon(Icon.jp, rect.x + rect.width - 24, rect.y, enabled)
      rect.width -= 24
    end
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::jp, 2)
    rect.width -= text_size(Vocab::jp).width
    cost = @actor.jp(@list[index][:ext])
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_JP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_exp_cost
  #--------------------------------------------------------------------------
  def draw_exp_cost(skill, rect, index)
    enabled = enabled?(@list[index][:ext])
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, YEA::LEARN_SKILL::EXP_TEXT, 2)
    rect.width -= text_size(YEA::LEARN_SKILL::EXP_TEXT).width
    cost = @actor.exp_class(@list[index][:ext])
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_EXP), enabled)
    draw_text(rect, text, 2)
  end
  
  #--------------------------------------------------------------------------
  # draw_gold_cost
  #--------------------------------------------------------------------------
  def draw_gold_cost(skill, rect)
    enabled = $game_party.gold >= skill.learn_cost[0]
    contents.font.size = YEA::LEARN_SKILL::COST_SIZE
    change_color(system_color, enabled)
    draw_text(rect, Vocab::currency_unit, 2)
    rect.width -= text_size(Vocab::currency_unit).width
    cost = $game_party.gold
    text = cost.group
    change_color(text_color(YEA::LEARN_SKILL::COLOUR_GOLD), enabled)
    draw_text(rect, text, 2)
  end
  
end # Window_LearnSkillCostFront

#==============================================================================
# ■ Scene_Skill
#==============================================================================

class Scene_Skill < Scene_ItemBase
  
  #--------------------------------------------------------------------------
  # alias method: create_command_window
  #--------------------------------------------------------------------------
  alias scene_skill_create_command_window_lse create_command_window
  def create_command_window
    scene_skill_create_command_window_lse
    @command_window.set_handler(:learn_skill, method(:command_learn_skill))
  end
  
  #--------------------------------------------------------------------------
  # new method: command_learn_skill
  #--------------------------------------------------------------------------
  def command_learn_skill
    SceneManager.call(Scene_LearnSkill)
  end
  
end # Scene_Skill

#==============================================================================
# ■ Scene_LearnSkill
#==============================================================================

class Scene_LearnSkill < Scene_Skill
  
  #--------------------------------------------------------------------------
  # start
  #--------------------------------------------------------------------------
  def start
    super
    create_cost_windows
  end
  
  #--------------------------------------------------------------------------
  # create_command_window
  #--------------------------------------------------------------------------
  def create_command_window
    wy = @help_window.height
    @command_window = Window_LearnSkillCommand.new(0, wy)
    @command_window.viewport = @viewport
    @command_window.help_window = @help_window
    @command_window.actor = @actor
    @command_window.set_handler(:skill,    method(:command_skill))
    @command_window.set_handler(:cancel,   method(:return_scene))
    @command_window.set_handler(:pagedown, method(:next_actor))
    @command_window.set_handler(:pageup,   method(:prev_actor))
  end
  
  #--------------------------------------------------------------------------
  # create_item_window
  #--------------------------------------------------------------------------
  def create_item_window
    wx = 0
    wy = @status_window.y + @status_window.height
    ww = Graphics.width
    wh = Graphics.height - wy
    @item_window = Window_LearnSkillList.new(wx, wy, ww, wh)
    @item_window.actor = @actor
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:ok,     method(:on_item_ok))
    @item_window.set_handler(:cancel, method(:on_item_cancel))
    @command_window.skill_window = @item_window
  end
  
  #--------------------------------------------------------------------------
  # create_cost_windows
  #--------------------------------------------------------------------------
  def create_cost_windows
    @cost_window = Window_LearnSkillCostBack.new(@item_window)
    @cost_front = Window_LearnSkillCostFront.new(@item_window, @cost_window)
    @cost_window.viewport = @viewport
    @cost_front.viewport = @viewport
    @cost_front.set_handler(:ok, method(:on_cost_ok))
    @cost_front.set_handler(:cancel, method(:on_cost_cancel))
  end
  
  #--------------------------------------------------------------------------
  # on_item_ok
  #--------------------------------------------------------------------------
  def on_item_ok
    skill = @item_window.item
    @cost_window.reveal(skill, @item_window.skill_classes(skill))
    @cost_front.reveal(skill, @item_window.skill_classes(skill), @actor)
  end
  
  #--------------------------------------------------------------------------
  # on_cost_ok
  #--------------------------------------------------------------------------
  def on_cost_ok
    Sound.play_use_skill
    skill = @item_window.item
    @actor.learn_skill(skill.id)
    cost = skill.learn_cost[0]
    case skill.learn_cost[1]
    when :jp
      @actor.lose_jp(cost, @cost_front.skill_class)
    when :exp
      @actor.lose_exp_class(cost, @cost_front.skill_class)
    when :gold
      $game_party.lose_gold(cost)
    end
    on_cost_cancel
    refresh_windows
  end
  
  #--------------------------------------------------------------------------
  # on_cost_cancel
  #--------------------------------------------------------------------------
  def on_cost_cancel
    @cost_front.close
    @cost_window.close
    @item_window.activate
  end
  
  #--------------------------------------------------------------------------
  # refresh_windows
  #--------------------------------------------------------------------------
  def refresh_windows
    @item_window.refresh
    @status_window.refresh
  end
  
end # Scene_LearnSkill

#==============================================================================
# 
# ▼ End of File
# 
#==============================================================================