RMVXA

BM타이틀 스크립트 질문입니다.

by 밥_짓는_남자 posted May 13, 2015
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

http://bmscripts.weebly.com/actor-titles.html#.VVLB-WdWGUk 에 올라온 확장 메뉴로 '타이틀'이라는 항목이 생깁니다.


칭호를 변경해주는줄 알았는데... 그냥 타이틀만 달리네요.



여기서 입력되는 '타이틀' 이름을 액터의 칭호(닉네임)에 넣고 싶은데

어떻게 하면 가능할까요...?


조금 아래 내려가면 있는 제가 빨간색으로 색칠한 주석 부분만 잘 만지면 될 거 같은데 말이죠...


#==============================================================================
# ** Titles for VXACE, by Blackmorning
#==============================================================================
#  Blackmorning
#  Version 1.06
#  released 01/29/2014
#  updated 04/08/2015
#==============================================================================
# Based on Titles System from RPG Maker VX by Blackmorning
#
# * compatible with YEA status menu
# add [  :titles,  "Titles"], to list in COMMANDS in YEA status menu script
#
# * compatible with YEA menu engine
# add :titles to COMMANDS in YEA menu engine script
#
#===============================================================================
# Instructions
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# To install this script, open up your script editor and copy/paste this script
# to an open slot below BM - Base but above ? Main. Remember to save.
#
# -----------------------------------------------------------------------------
# Actor Notetags - These notetags go in the actors notebox in the database.
# -----------------------------------------------------------------------------
# <unlocked titles: x>
# <unlocked titles: x, x>
# This will set the default titles as unlocked for the actor. This does not
# override the default titles unlocked in the module, but instead, adds on
# to the number of unlocked titles.

# <init title: x>
# This will set the initial title for the actor.
# -----------------------------------------------------------------------------
# Message Window codes - These go inside of your message window.
# \nti[x]    - Writes out title x's name.
# \ati[x]    - Write name of the title for actor x.
# -----------------------------------------------------------------------------
# Script Calls - These commands are used with script calls.
# -----------------------------------------------------------------------------
#
# * Add title to actor
#     add_titles(x, y)
# This allows actor x to unlock title y, making it available for switching in
# and out in the Titles scene.
#
# * remove title from actor
#     remove_titles(x, y)
# This causes actor x to remove title y from being able to switch to and from.
# If the actor is currently title y, the actor's title will default to 0 and the
# title will be removed.
#
# * change title from actor
#     change_titles(x, y)
# This causes actor x to change to title y.
#
# * check if title in list and assigns it to a switch
#     check_titles(actor_id, title_id, switch)
#   example:
#     check_titles(4, 2, 5)
#   checks if actor 4 has title 2 and puts answer in switch 5
#   -can be used without switch_id
#
# * check actor title size and assigns it to a variable
#     actor_title_list_size(actor_id, variable_id)
#   example:
#     actor_title_list_size(4, 10)
#   checks title list size for actor 4 and puts answer in variable 10
#
# * assigns current title_id to variable
#     actor_title_is?(actor_id, variable_id)
#==============================================================================
module BM
module TITLES_SYSTEM
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # Titles Customization
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  CUSTOM_TITLES = {
  # format:
  # title_id => ["Title name", "Description", costume name, costume Index],
    1 => ["Normal",""],
    2 => ["Nobleman","Those of noble birth"],
    3 => ["","."],
    4 => ["Crusader","Willing to take on any brave endevour"],
    5 => ["Clumsy Fool","Keep out of the way!"],
    6 => ["Juggler","What goes up, does not fall to the ground."],
    7 => ["Bashful","Don't talk about me like that, I'm going red."],
    8 => ["Tipsy","What wash in thish drink?  Whoops!"],
    9 => ["Wolf","Hungry like a wolf", "Animal",6],
  # Add more titles as you like     
 
  }# don't remove 
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # Level Up Bonus
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # titles can add (or subtract) from stats during level up
  TITLE_PARAM_GROWTH_CHANGE = true 
  PARAM_GROWTH = { # do not remove
  #title_id    Hp  Mp Atk Def  Mat  Mdf   Agi   Luk]
         2 => [ 40,  0,  0,  5,  0,   0,   0,    0],
         3 => [ 0,  20,  0,  0,  0,   5,   0,    0],
         4 => [50,  0,  0,  0,  0,   0,   0,    0],
         5 => [10,  0,  0,  0,  0,   0,   0,    0],
         6 => [ 0,  30,  0,  0,  0,   2,   0,    0],
         7 => [ 60,  0,  0,  2,  0,   0,   0,    0],
  # Add more titles as you like               
        
  }# do not remove 
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # Base Stat Bonus
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # titles can change base stats 
  TITLE_PARAM_BASE_CHANGE = true
  # change base stat change to :percent or :static
  # :percent (ie. 20 is a 20% increase)
  # :static (ie. 20 is +20)
  TITLE_PARAM_BASE = :percent
  PARAM_BASE = { # do not remove
  #title_id    Hp  Mp Atk Def  Mat  Mdf   Agi   Luk]
         2 => [20,  0,  0,  50,  0,   0,   0,    0],
         3 => [ 0,  20,  0,  0,  0,   50,   0,    0],
         4 => [50,  0,  0,  0,  0,   0,   0,    0],
         5 => [10,  0,  0,  0,  0,   0,   0,    0],
         6 => [ 0,  30,  0,  0,  0,   20,   0,    0],
         7 => [ 60,  0,  0,  20,  0,   0,   0,    0],
  # Add more titles as you like               
        
  }# do not remove
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # - Switch Settings -
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # These are the switches that govern whether or not certain menu items will
  # appear and/or will be enabled. By binding them to a Switch, you can just
  # set the Switch ON/OFF to show/hide or enable/disable a menu command. If
  # you do not wish to use this feature, set these commands to 0.
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  STATUS_COMMANDS ={ # for YEA Status Menu
  # :command => [EnableSwitch, ShowSwitch, Handler Method, Window Draw],
    :titles    => [ 0,  0, :command_titles, :draw_titles],
  } # DO NOT REMOVE
  MENU_COMMANDS ={ # For main menu
  # :command => ["Display Name", EnableSwitch, ShowSwitch, Handler Method],
    :titles   => [  "칭호",            3,          3, :command_titles],
  } # DO NOT REMOVE
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # Titles Window Options
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  CURRENT_TITLE_COLOUR = 17
  PARAM_FONT_SIZE = 20
  # This array sets the order of how classes are ordered in the class listing
  # window. Any class ID's unlisted will not be shown.
  TITLE_ORDER = [1..20]
  DEFAULT_UNLOCKS = [1, 5]   # Titles unlocked by default.
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # - Titles Scene Commands -
  #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  # These settings adjust how the titles scene appears. Here, you can adjust
  # the command list and the order at which items appear. These are mostly
  # visual settings. Adjust them as you see fit.
  COMMANDS =[ # The order at which the menu items are shown.
    # [ :command,   "Display"],
      [ :primary,   "Titles"],
    # [ :custom1,   "Custom1"],
    # [ :custom2,   "Custom2"],
    ] # Do not remove this.
  # For those who use scripts to that may produce unique effects for the
  # titles menu, use this hash to manage the custom commands for the Titles
  # Command Window. You can disable certain commands or prevent them from
  # appearing by using switches. If you don't wish to bind them to a switch,
  # set the proper switch to 0 for it to have no impact.
  #--------------------------------------------------------------------------
  CUSTOM_TITLES_COMMANDS ={
  # :command => [EnableSwitch, ShowSwitch, Handler Method,
    :custom1 => [           0,          0, :command_name1],
    :custom2 => [           0,          0, :command_name2],
  } # Do not remove this.  
  end
end
#===============================================================================
# Editting anything past this point may potentially result in causing computer
# damage, incontinence, explosion of user's head, coma, death, and/or halitosis.
# Therefore, edit at your own risk.
#==============================================================================
# ** module BM
#==============================================================================
module BM
  def self.required(name, req, version, type = nil)
    if !$imported[:bm_base]
      msg = "The script '%s' requires the script\n"
      msg += "'BM - Base' v%s or higher above it to work properly\n"
      msg += "Go to bmscripts.weebly.com to download this script."
      msgbox(sprintf(msg, self.script_name(name), version))
      exit
    else
      self.required_script(name, req, version, type)
    end
  end
  #--------------------------------------------------------------------------
  # * script_name
  #   Get the script name base on the imported value
  #--------------------------------------------------------------------------
  def self.script_name(name, ext = "BM")
    name = name.to_s.gsub("_", " ").upcase.split
    name.collect! {|char| char == ext ? "#{char} -" : char.capitalize }
    name.join(" ")
  end
end
$imported ||= {}
$imported[:bm_titles] = 1.06
BM.required(:bm_titles, :bm_base, 1.00, :above)
#==========================================================================
# ** Game Interpreter
#==========================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # * new method: add title
  #--------------------------------------------------------------------------
  def add_titles(actor_id, title_id)
    $game_actors[actor_id].unlock_title(title_id)
  end
  #--------------------------------------------------------------------------
  # * new method: remove title
  #--------------------------------------------------------------------------
  def remove_titles(actor_id, title_id)
    $game_actors[actor_id].remove_title(title_id)
  end
  #--------------------------------------------------------------------------
  # * new method: change title
  #--------------------------------------------------------------------------
  def change_titles(actor_id, title_id)
    $game_actors[actor_id].change_title(title_id)
  end
  #--------------------------------------------------------------------------
  # * new method: actor title is?
  #--------------------------------------------------------------------------
  def actor_title_is?(actor_id, variable_id = 0)
    titles_id = $game_actors[actor_id].title_id
    $game_variables[variable_id] = titles_id if variable_id > 0
    return titles_id
  end
  #--------------------------------------------------------------------------
  # * new method: check titles
  #--------------------------------------------------------------------------
  def check_titles(actor_id, title_id, switch_id = nil)
    in_list = $game_actors[actor_id].unlocked_titles.include?(title_id)
    $game_switches[switch_id] = in_list if switch_id > 0
    return in_list
  end
  #--------------------------------------------------------------------------
  # * new method: title list size
  #--------------------------------------------------------------------------
  def actor_title_list_size(actor, variable_id = 0)
    title_list = $game_actors[actor].unlocked_titles
    $game_variables[variable_id] = title_list.size if variable_id > 0
    return title_list
  end
end
#==========================================================================
# ** BM::TITLES_SYSTEM
#==========================================================================
module BM::TITLES_SYSTEM
  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
  #--------------------------------------------------------------------------
  DEFAULT_UNLOCKS = convert_integer_array(DEFAULT_UNLOCKS)
  TITLE_ORDER = convert_integer_array(TITLE_ORDER)
end
#==============================================================================
module BM
  module REGEXP
  module ACTOR   
    UNLOCKED_TITLES =
      /<(?:UNLOCKED_TITLES|unlocked titles):[ ]*(\d+(?:\s*,\s*\d+)*)>/i   
    INIT_TITLE =
      /<(?:INIT_TITLE|init title):[ ](\d+)>/i  
  end # ACTOR
  end # REGEXP
end # YEA
#==============================================================================
# ** Switch
#==============================================================================
module Switch 
  #--------------------------------------------------------------------------
  # self.titles_show
  #--------------------------------------------------------------------------
  def self.titles_show
    return true if BM::TITLES_SYSTEM::MENU_COMMANDS[:titles][2] <= 0
    return $game_switches[BM::TITLES_SYSTEM::MENU_COMMANDS[:titles][2]]
  end
  #--------------------------------------------------------------------------
  # self.titles_enable
  #--------------------------------------------------------------------------
  def self.titles_enable
    return true if BM::TITLES_SYSTEM::MENU_COMMANDS[:titles][1] <= 0
    return $game_switches[BM::TITLES_SYSTEM::MENU_COMMANDS[:titles][1]]
  end   
end # Switch
#==============================================================================
# ** Vocab
#==============================================================================
module Vocab
  def self.titles_name(id)
    return "" unless BM::TITLES_SYSTEM::CUSTOM_TITLES.include?(id)
    return BM::TITLES_SYSTEM::CUSTOM_TITLES[id][0]
  end
end
#==============================================================================
# ** DataManager
#==============================================================================
module DataManager 
  #--------------------------------------------------------------------------
  # alias method: load_database
  #--------------------------------------------------------------------------
  class <<self; alias :bm_titles_ld :load_database; end
  def self.load_database
    bm_titles_ld
    load_notetags_bm_titles
  end 
  #--------------------------------------------------------------------------
  # new method: load_notetags_bm_titles
  #--------------------------------------------------------------------------
  def self.load_notetags_bm_titles
    groups = [$data_actors]
    for group in groups
      for obj in group
        next if obj.nil?
        obj.load_notetags_bm_titles
      end
    end
  end 
end # DataManager
#==============================================================================
# ** RPG::Actor
#==============================================================================
class RPG::Actor < RPG::BaseItem 
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :unlocked_titles 
  attr_accessor :init_title
  #--------------------------------------------------------------------------
  # common cache: load_notetags_bm_titles
  #--------------------------------------------------------------------------
  def load_notetags_bm_titles
    @unlocked_titles = []
    @init_title = 1
    #---
    self.note.split(/[\r\n]+/).each { |line|
      case line
      #---
      when BM::REGEXP::ACTOR::UNLOCKED_TITLES
        $1.scan(/\d+/).each { |num|
        @unlocked_titles.push(num.to_i) if num.to_i > 0 }
      when BM::REGEXP::ACTOR::INIT_TITLE
        @init_title = $1.to_i
      #---
      end
    } # self.note.split
    #---
  end 
end # RPG::Actor
#==============================================================================
# ** Game_Temp
#==============================================================================
class Game_Temp 
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :scene_titles_index
  attr_accessor :scene_titles_oy 
end # Game_Temp
#==============================================================================
# ** Game_BattlerBase
#==============================================================================
class Game_BattlerBase 
  #--------------------------------------------------------------------------
  # public instance variables
  #--------------------------------------------------------------------------
  attr_accessor :temp_flag
  #--------------------------------------------------------------------------
  # * new method: title_param_bonus_growth
  #--------------------------------------------------------------------------
  def title_param_bonus_growth(param_id)
    n = 0.0
    return n unless BM::TITLES_SYSTEM::TITLE_PARAM_GROWTH_CHANGE && BM::TITLES_SYSTEM::PARAM_GROWTH.include?(@title_id)
    if actor?
      n += BM::TITLES_SYSTEM::PARAM_GROWTH[@title_id][param_id]
    end
    return n
  end 
  #--------------------------------------------------------------------------
  # * new method: title_param_bonus_base
  #--------------------------------------------------------------------------
  def title_param_bonus_base(param_id)
    n = 0.0
    return n unless BM::TITLES_SYSTEM::TITLE_PARAM_BASE_CHANGE && BM::TITLES_SYSTEM::PARAM_BASE.include?(@title_id)
    if actor?
      n += BM::TITLES_SYSTEM::PARAM_BASE[@title_id][param_id]
    end
    return n
  end 
end # Game_BattlerBase
#===============================================================================
# Game_actor
#===============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :title_id                     # Title id
  #--------------------------------------------------------------------------
  # * alias: setup
  #--------------------------------------------------------------------------
  alias :bm_titles_setup :setup
  def setup(actor_id)
    bm_titles_setup(actor_id)
    init_unlocked_titles
  end
  #--------------------------------------------------------------------------
  # new method: init_unlocked_titles
  #--------------------------------------------------------------------------
  def init_unlocked_titles
    @title_id = actor.init_title
    @unlocked_titles = actor.unlocked_titles.clone
    @unlocked_titles.push(@title_id) if !@unlocked_titles.include?(@title_id)
    @unlocked_titles.sort!
    @init_titles_graphics_name = @character_name
    @init_titles_graphics_index = @character_index
    change_title_graphic(@title_id)
  end
  #--------------------------------------------------------------------------
  # new method: unlocked_titles
  #--------------------------------------------------------------------------
  def unlocked_titles
    init_unlocked_titles if @unlocked_titles.nil?
    return @unlocked_titles
  end
  #--------------------------------------------------------------------------
  # new method: unlock_title
  #--------------------------------------------------------------------------
  def unlock_title(title_id)
    init_unlocked_titles if @unlocked_titles.nil?
    return unless BM::TITLES_SYSTEM::CUSTOM_TITLES.include?(title_id)
    return if @unlocked_titles.include?(title_id)
    @unlocked_titles.push(title_id)
  end
  #--------------------------------------------------------------------------
  # new method: remove_title
  #--------------------------------------------------------------------------
  def remove_title(title_id)
    init_unlocked_titles if @unlocked_titles.nil?
    if title_id == @title_id
      @title_id = 0
    end
    @unlocked_titles.delete(title_id)
    refresh
  end
  #--------------------------------------------------------------------------
  # new method: change_title
  #--------------------------------------------------------------------------
  def change_title(title_id)
    return unless BM::TITLES_SYSTEM::CUSTOM_TITLES.include?(title_id)
    @title_id = title_id
    change_title_graphic(title_id)
    unlock_title(title_id)
  end
  #--------------------------------------------------------------------------
  def change_title_graphic(title_id)
    character_name = @init_titles_graphics_name
    character_index = @init_titles_graphics_index
    unless BM::TITLES_SYSTEM::CUSTOM_TITLES[title_id][2].nil?
      character_name = BM::TITLES_SYSTEM::CUSTOM_TITLES[title_id][2]
      character_index = BM::TITLES_SYSTEM::CUSTOM_TITLES[title_id][3]
    end
    set_graphic(character_name, character_index, @face_name, @face_index)
    refresh
  end
  #--------------------------------------------------------------------------
  # * alias: param_base
  #--------------------------------------------------------------------------
  alias :bm_title_pb :param_base
  def param_base(param_id)
    result = bm_title_pb(param_id)
    if BM::TITLES_SYSTEM::TITLE_PARAM_BASE == :percent
      result += result * title_param_bonus_base(param_id)/100
    elsif BM::TITLES_SYSTEM::TITLE_PARAM_BASE == :static
      result += title_param_bonus_base(param_id)
    end   
    return result.to_i
  end
  #---------------------------------------------------------------------------
  # alias: level_up
  #---------------------------------------------------------------------------
  alias :bm_title_lup :level_up
  def level_up
    last_level = @level
    bm_title_lup
    apply_title_param_bonus_growth if last_level != @level 
  end
  #--------------------------------------------------------------------------
  # new method: apply_title_param_bonus_growth
  #--------------------------------------------------------------------------
  def apply_title_param_bonus_growth(rate = 1)
    for i in 0...8 do @param_plus[i] += title_param_bonus_growth(i) * rate end
  end
end
#==============================================================================
# ** Window_Base
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # * Alias: convert_escape_characters
  #--------------------------------------------------------------------------
  alias :bm_titles_cec :convert_escape_characters
  def convert_escape_characters(text)
    result = bm_titles_cec(text)
    result = convert_bm_titles_characters(result)   
    return result
  end
  #--------------------------------------------------------------------------
  def convert_bm_titles_characters(result)
    result.gsub!(/\eNTI\[(\d+)\]/i)  { Vocab.titles_name($1.to_i) rescue "" }   
    result.gsub!(/\eATI\[([-+]?\d+)\]/i) {  escape_actor_titles_name($1.to_i) }
    return result
  end
  #--------------------------------------------------------------------------
  # new method: escape_actor_titles_name
  #--------------------------------------------------------------------------
  def escape_actor_titles_name(actor_id)
    actor_id = $game_party.members[actor_id.abs].id if actor_id <= 0
    actor = $game_actors[actor_id]
    return "" if actor.nil?
    return Vocab.titles_name(actor.title_id)
  end
  #--------------------------------------------------------------------------
  def titles_desc(title_id)
    return "" unless BM::TITLES_SYSTEM::CUSTOM_TITLES.include?(title_id)
    desc = BM::TITLES_SYSTEM::CUSTOM_TITLES[title_id][1]
    return (desc == nil) ? "" : desc
  end
  #--------------------------------------------------------------------------
  # new method: draw_actor_title
  #--------------------------------------------------------------------------
  def draw_actor_title(actor, x, y, width = 112)
    change_color(normal_color)
    text = Vocab.titles_name(actor.title_id)
    draw_text(x, y, width, line_height, text)
  end 
end # Window_Base
#==============================================================================
# ** Window_StatusItem
#==============================================================================
class Window_StatusItem < Window_Base
  def draw_titles
    data = []
    for title_id in BM::TITLES_SYSTEM::TITLE_ORDER
      next if !BM::TITLES_SYSTEM::CUSTOM_TITLES.include?(title_id)
      next unless @actor.unlocked_titles.include?(title_id) or
        BM::TITLES_SYSTEM::DEFAULT_UNLOCKS.include?(title_id)
      data.push(title_id)
    end
    dx = 0; dy = 0; title_index = 0
    for id in data
      item = data[title_index]
      reset_font_settings
      if item == @actor.title_id
        change_color(text_color(BM::TITLES_SYSTEM::CURRENT_TITLE_COLOUR))
      else
        change_color(normal_color)
      end
      text = Vocab.titles_name(item)
      draw_text(24, dy, contents.width-24, line_height, text)
      title_index += 1
      dy += line_height
      break if dy + line_height > contents.height
    end
    dw = Graphics.width * 2 / 5 - 24
    dx = contents.width - dw; dy = 0
    param_id = 0
    8.times do
      colour = Color.new(0, 0, 0, translucent_alpha/2)
      rect = Rect.new(dx+1, dy+1, dw - 2, line_height - 2)
      contents.fill_rect(rect, colour)
      contents.font.size = BM::TITLES_SYSTEM::PARAM_FONT_SIZE
      change_color(system_color)
      draw_text(dx+4, dy, dw, line_height, Vocab::param(param_id))
      change_color(normal_color)
      dwa = (Graphics.width * 2 / 5 - 2) / 2
      draw_text(dx, dy, dwa, line_height, @actor.param(param_id).group, 2)
      reset_font_settings
      change_color(system_color)
      draw_text(dx + dwa, dy, 22, line_height, "?", 1)
      param_id += 1
      dy += line_height
      break if dy + line_height > contents.height
    end
  end
end
#==============================================================================
# ** Window_TitleParam
#==============================================================================
class Window_TitleParam < Window_Base 
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(dx, dy)
    super(dx, dy, window_width, Graphics.height - dy)
    @actor = nil
    @temp_actor = nil
    refresh
  end 
  #--------------------------------------------------------------------------
  # window_width
  #--------------------------------------------------------------------------
  def window_width; return Graphics.width * 2 / 5; end
  #--------------------------------------------------------------------------
  # actor=
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end 
  #--------------------------------------------------------------------------
  # refresh
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    i = 0
    8.times do
      draw_item(0, line_height * i, i)
      i += 1
      dy = line_height * i
      break if dy + line_height > contents.height
    end
  end 
  #--------------------------------------------------------------------------
  # set_temp_actor
  #--------------------------------------------------------------------------
  def set_temp_actor(temp_actor)
    return if @temp_actor == temp_actor
    @temp_actor = temp_actor
    refresh
  end 
  #--------------------------------------------------------------------------
  # draw_item
  #--------------------------------------------------------------------------
  def draw_item(dx, dy, param_id)
    draw_background_colour(dx, dy)
    draw_param_name(dx + 4, dy, param_id)
    draw_current_param(dx + 4, dy, param_id) if @actor
    drx = (contents.width + 22) / 2
    draw_right_arrow(drx, dy)
    draw_new_param(drx + 22, dy, param_id) if @temp_actor
    reset_font_settings
  end 
  #--------------------------------------------------------------------------
  # draw_background_colour
  #--------------------------------------------------------------------------
  def draw_background_colour(dx, dy)
    colour = Color.new(0, 0, 0, translucent_alpha/2)
    rect = Rect.new(dx+1, dy+1, contents.width - 2, line_height - 2)
    contents.fill_rect(rect, colour)
  end 
  #--------------------------------------------------------------------------
  # draw_param_name
  #--------------------------------------------------------------------------
  def draw_param_name(dx, dy, param_id)
    contents.font.size = BM::TITLES_SYSTEM::PARAM_FONT_SIZE
    change_color(system_color)
    draw_text(dx, dy, contents.width, line_height, Vocab::param(param_id))
  end 
  #--------------------------------------------------------------------------
  # draw_current_param
  #--------------------------------------------------------------------------
  def draw_current_param(dx, dy, param_id)
    change_color(normal_color)
    dw = (contents.width + 22) / 2
    draw_text(0, dy, dw, line_height, @actor.param(param_id).group, 2)
    reset_font_settings
  end 
  #--------------------------------------------------------------------------
  # draw_right_arrow
  #--------------------------------------------------------------------------
  def draw_right_arrow(x, y)
    change_color(system_color)
    draw_text(x, y, 22, line_height, "?", 1)
  end 
  #--------------------------------------------------------------------------
  # draw_new_param
  #--------------------------------------------------------------------------
  def draw_new_param(dx, dy, param_id)
    contents.font.size = BM::TITLES_SYSTEM::PARAM_FONT_SIZE
    new_value = @temp_actor.param(param_id)
    change = new_value - @actor.param(param_id)
    change_color(param_change_color(change))
    w = contents.text_size(new_value).width
    draw_icon(Icon.param_compare(change), contents.width-w-12, dy) if $imported[:bm_icon]   
    draw_text(0, dy, contents.width-4, line_height, new_value.group, 2)
    reset_font_settings
  end 
end
#==============================================================================
# ¦ Window_TitleList
#==============================================================================
class Window_TitleList < Window_Selectable 
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(dx, dy)
    dw = Graphics.width - (Graphics.width * 2 / 5)
    dh = Graphics.height - dy
    super(dx, dy, dw, dh)
    @actor = nil
    @command_window = nil
    @status_window
    @data = []
  end 
  #--------------------------------------------------------------------------
  # actor=
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    @last_item = nil
    refresh
    self.oy = 0
  end 
  #--------------------------------------------------------------------------
  # command_window=
  #--------------------------------------------------------------------------
  def command_window=(command_window)
    @command_window = command_window
  end 
  #--------------------------------------------------------------------------
  # status_window=
  #--------------------------------------------------------------------------
  def status_window=(status_window)
    @status_window = status_window
  end 
  #--------------------------------------------------------------------------
  # item_max
  #--------------------------------------------------------------------------
  def item_max; return @data ? @data.size : 1; end 
  #--------------------------------------------------------------------------
  # item
  #--------------------------------------------------------------------------
  def item; return @data && index >= 0 ? @data[index] : nil; end 
  #--------------------------------------------------------------------------
  # current_item_enabled?
  #--------------------------------------------------------------------------
  def current_item_enabled?; return enable?(@data[index]); end 
  #--------------------------------------------------------------------------
  # include?
  #--------------------------------------------------------------------------
  def include?(item)
    return true if BM::TITLES_SYSTEM::DEFAULT_UNLOCKS.include?(item)
    return @actor.unlocked_titles.include?(item)
  end 
  #--------------------------------------------------------------------------
  # enable?
  #--------------------------------------------------------------------------
  def enable?(item)
    return false if item == @actor.title_id
    return true
  end 
  #--------------------------------------------------------------------------
  # make_item_list
  #--------------------------------------------------------------------------
  def make_item_list
    @data = []
    for title_id in BM::TITLES_SYSTEM::TITLE_ORDER
      next if BM::TITLES_SYSTEM::CUSTOM_TITLES[title_id].nil?
      item = title_id
      @data.push(item) if include?(item)
    end
  end 
  #--------------------------------------------------------------------------
  # select_last
  #--------------------------------------------------------------------------
  def select_last
    case @command_window.current_symbol
    when :primary
      select(@data.index(@actor.title_id))
    else
      select(0)
    end
  end 
  #--------------------------------------------------------------------------
  # draw_item
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    return if item.nil?
    rect = item_rect(index)
    rect.width -= 4
    reset_font_settings
    set_item_colour(item)
    draw_titles_name(item, rect)
  end 
  #--------------------------------------------------------------------------
  # set_item_colour
  #--------------------------------------------------------------------------
  def set_item_colour(item)
    if item == @actor.title_id
      change_color(text_color(BM::TITLES_SYSTEM::CURRENT_TITLE_COLOUR))
    else
      change_color(normal_color, enable?(item))
    end
  end
  #--------------------------------------------------------------------------
  # draw_titles_name
  #--------------------------------------------------------------------------
  def draw_titles_name(item, rect)
    text = Vocab.titles_name(item)
    draw_text(24, rect.y, rect.width-24, line_height, text)
  end
  #--------------------------------------------------------------------------
  # update_help
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(Vocab.titles_name(item) ? titles_desc(item) : "")
    return if @actor.nil?
    return if @status_window.nil?
    update_param_window
  end 
  #--------------------------------------------------------------------------
  # update_param_window
  #--------------------------------------------------------------------------
  def update_param_window
    return if @last_item == item
    @last_item = item
    title_id = item.nil? ? @actor.title_id : item
    temp_actor = Marshal.load(Marshal.dump(@actor))
    temp_actor.temp_flag = true
    case @command_window.current_symbol
    when :primary
      temp_actor.change_title(title_id)
    end
    @status_window.set_temp_actor(temp_actor)
  end 
  #--------------------------------------------------------------------------
  # update_titles
  #--------------------------------------------------------------------------
  def update_titles
    @last_item = nil
    update_help
    refresh
    activate
  end 
  #--------------------------------------------------------------------------
  # refresh
  #--------------------------------------------------------------------------
  def refresh
    make_item_list
    create_contents
    draw_all_items
  end 
end
#==============================================================================
# ¦ Window_MenuCommand
#==============================================================================
class Window_MenuCommand < Window_Command 
  #--------------------------------------------------------------------------
  # alias method: add_formation_command
  #--------------------------------------------------------------------------
  alias :bm_titles_aoc :add_original_commands
  def add_original_commands
    add_titles_command unless $imported["YEA-AceMenuEngine"]
    bm_titles_aoc
  end 
  #--------------------------------------------------------------------------
  # new method: add_titles_command
  #--------------------------------------------------------------------------
  def add_titles_command
    return unless Switch.titles_show
    text = BM::TITLES_SYSTEM::MENU_COMMANDS[:titles][0]
    add_command(text, :titles, Switch.titles_enable)
  end 
end # Window_MenuCommand
#==============================================================================
# ¦ Window_TitlesCommand
#==============================================================================
class Window_TitlesCommand < Window_Command 
  #--------------------------------------------------------------------------
  # initialize
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y)
    @actor = nil
  end 
  #--------------------------------------------------------------------------
  # ? ?????????
  #--------------------------------------------------------------------------
  def window_width; return 160; end 
  #--------------------------------------------------------------------------
  # actor=
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end 
  #--------------------------------------------------------------------------
  # item_window=
  #--------------------------------------------------------------------------
  def item_window=(window)
    @item_window = window
  end 
  #--------------------------------------------------------------------------
  # visible_line_number
  #--------------------------------------------------------------------------
  def visible_line_number; return 4; end 
  #--------------------------------------------------------------------------
  # make_command_list
  #--------------------------------------------------------------------------
  def make_command_list
    return if @actor.nil?
    for command in BM::TITLES_SYSTEM::COMMANDS
      case command[0]
      when :primary
        add_command(command[1], command[0])
      else
        process_custom_command(command)
      end
    end
    if !$game_temp.scene_titles_index.nil?
      select($game_temp.scene_titles_index)
      self.oy = $game_temp.scene_titles_oy
    end
    $game_temp.scene_titles_index = nil
    $game_temp.scene_titles_oy = nil
  end 
  #--------------------------------------------------------------------------
  # process_ok
  #--------------------------------------------------------------------------
  def process_ok
    $game_temp.scene_titles_index = index
    $game_temp.scene_titles_oy = self.oy
    super
  end 
  #--------------------------------------------------------------------------
  # process_custom_command
  #--------------------------------------------------------------------------
  def process_custom_command(command)
    return unless BM_TITLES_SYSTEM::CUSTOM_TITLES_COMMANDS.include?(command[0])
    show =  BM_TITLES_SYSTEM::CUSTOM_TITLES_COMMANDS[command[0]][1]
    continue = show <= 0 ? true : $game_switches[show]
    return unless continue
    text = command[1]
    switch =  BM_TITLES_SYSTEM::CUSTOM_TITLES_COMMANDS[command[0]][0]
    enabled = switch <= 0 ? true : $game_switches[switch]
    add_command(text, command[0], enabled)
  end
  #--------------------------------------------------------------------------
  # update
  #--------------------------------------------------------------------------
  def update
    super
    update_visible_windows
  end 
  #--------------------------------------------------------------------------
  # update_visible_windows
  #--------------------------------------------------------------------------
  def update_visible_windows
    return if @current_index == current_symbol
    @current_index = current_symbol
    @item_window.refresh unless @item_window.nil?
  end  
end
#==============================================================================
# ** Scene_Menu
#==============================================================================
class Scene_Menu < Scene_MenuBase 
  #--------------------------------------------------------------------------
  # alias method: create_command_window
  #--------------------------------------------------------------------------
  alias :bm_titles_ccw :create_command_window
  def create_command_window
    bm_titles_ccw
    @command_window.set_handler(:titles, method(:command_personal))
  end 
  #--------------------------------------------------------------------------
  # alias method: on_personal_ok
  #--------------------------------------------------------------------------
  alias :bm_titles_opk :on_personal_ok
  def on_personal_ok
    case @command_window.current_symbol
    when :titles
      command_titles
    else
      bm_titles_opk
    end
  end
  #--------------------------------------------------------------------------
  # new method: command_titles
  #--------------------------------------------------------------------------
  def command_titles
    SceneManager.call(Scene_Titles)
  end 
end # Scene_Menu
#==============================================================================
# ** Scene_Titles
#==============================================================================
class Scene_Titles < Scene_MenuBase 
  #--------------------------------------------------------------------------
  # start
  #--------------------------------------------------------------------------
  def start
    super
    create_help_window
    create_command_window
    create_status_window
    create_param_window
    create_item_window
    relocate_windows
  end 
  #--------------------------------------------------------------------------
  # create_command_window
  #--------------------------------------------------------------------------
  def create_command_window
    wy = @help_window.height
    @command_window = Window_TitlesCommand.new(0, wy)
    @command_window.viewport = @viewport
    @command_window.help_window = @help_window
    @command_window.actor = @actor
    @command_window.set_handler(:cancel,   method(:return_scene))
    @command_window.set_handler(:primary,  method(:command_title_change))
    process_custom_class_commands
    return if $game_party.in_battle
    @command_window.set_handler(:pagedown, method(:next_actor))
    @command_window.set_handler(:pageup,   method(:prev_actor))
  end
  #--------------------------------------------------------------------------
  # process_custom_class_commands
  #--------------------------------------------------------------------------
  def process_custom_class_commands
    for command in BM::TITLES_SYSTEM::COMMANDS
      next unless BM::TITLES_SYSTEM::CUSTOM_TITLES_COMMANDS.include?(command[0])
      called_method = BM::TITLES_SYSTEM::CUSTOM_TITLES_COMMANDS[command[0]][2]
      @command_window.set_handler(command[0], method(called_method))
    end
  end
  #--------------------------------------------------------------------------
  # create_status_window
  #--------------------------------------------------------------------------
  def create_status_window
    wy = @help_window.height
    @status_window = Window_SkillStatus.new(@command_window.width, wy)
    @status_window.viewport = @viewport
    @status_window.actor = @actor
  end 
  #--------------------------------------------------------------------------
  # create_param_window
  #--------------------------------------------------------------------------
  def create_param_window
    dx = Graphics.width - (Graphics.width * 2 / 5)
    dy = @status_window.y + @status_window.height
    @param_window = Window_TitleParam.new(dx, dy)
    @param_window.viewport = @viewport
    @param_window.actor = @actor
  end 
  #--------------------------------------------------------------------------
  # create_item_window
  #--------------------------------------------------------------------------
  def create_item_window
    dy = @status_window.y + @status_window.height
    @item_window = Window_TitleList.new(0, dy)
    @item_window.help_window = @help_window
    @item_window.command_window = @command_window
    @item_window.status_window = @param_window
    @item_window.viewport = @viewport
    @item_window.actor = @actor
    @command_window.item_window = @item_window
    @item_window.set_handler(:ok,     method(:on_title_ok))
    @item_window.set_handler(:cancel, method(:on_title_cancel))
  end 
  #--------------------------------------------------------------------------
  # relocate_windows
  #--------------------------------------------------------------------------
  def relocate_windows
    return unless $imported["YEA-AceMenuEngine"]
    case Menu.help_window_location
    when 0 # Top
      @help_window.y = 0
      @command_window.y = @help_window.height
      @param_window.y = @command_window.y + @command_window.height
    when 1 # Middle
      @command_window.y = 0
      @help_window.y = @command_window.height
      @param_window.y = @help_window.y + @help_window.height
    else # Bottom
      @command_window.y = 0
      @param_window.y = @command_window.height
      @help_window.y = @param_window.y + @param_window.height
    end
    @status_window.y = @command_window.y
    @item_window.y = @param_window.y
  end 
  #--------------------------------------------------------------------------
  # on_actor_change
  #--------------------------------------------------------------------------
  def on_actor_change
    @command_window.actor = @actor
    @status_window.actor = @actor
    @param_window.actor = @actor
    @item_window.actor = @actor
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # command_title_change
  #--------------------------------------------------------------------------
  def command_title_change
    @item_window.activate
    @item_window.select_last
  end 
  #--------------------------------------------------------------------------
  # on_title_cancel
  #--------------------------------------------------------------------------
  def on_title_cancel
    @item_window.unselect
    @command_window.activate
    @param_window.set_temp_actor(nil)
  end 
  #--------------------------------------------------------------------------
  # on_title_ok
  #--------------------------------------------------------------------------
  def on_title_ok
    Sound.play_equip
    title_id = @item_window.item
    hp = @actor.hp * 1.0 / @actor.mhp
    mp = @actor.mp * 1.0 / [@actor.mmp, 1].max
    case @command_window.current_symbol
    when :primary
      @actor.change_title(title_id)
    else
      @item_window.activate
      return
    end
    @actor.hp = (@actor.mhp * hp).to_i
    @actor.mp = (@actor.mmp * mp).to_i
    @status_window.refresh
    @item_window.update_titles
  end
  #--------------------------------------------------------------------------
  # command_name1
  #--------------------------------------------------------------------------
  def command_name1
    # Do nothing.
  end 
  #--------------------------------------------------------------------------
  # command_name2
  #--------------------------------------------------------------------------
  def command_name2
    # Do nothing.
  end
end
#==============================================================================
# ** Scene_Status
#==============================================================================
class Scene_Status < Scene_MenuBase
  #--------------------------------------------------------------------------
  # new method: command_titles
  #--------------------------------------------------------------------------
  def command_titles
    SceneManager.call(Scene_Titles)
  end 
end # Scene_Status
#==============================================================================
if $imported["YEA-StatusMenu"]
  if !YEA::STATUS::CUSTOM_STATUS_COMMANDS.include?(:titles)
    YEA::STATUS::CUSTOM_STATUS_COMMANDS.merge!(BM::TITLES_SYSTEM::STATUS_COMMANDS)
  end
end
#==============================================================================
if $imported["YEA-AceMenuEngine"]
  if !YEA::MENU::CUSTOM_COMMANDS.include?(:titles)
    YEA::MENU::CUSTOM_COMMANDS.merge!(BM::TITLES_SYSTEM::MENU_COMMANDS)
  end
end