Visual PaperDoll Equipment Script
#1
Hello everyone, I need help...

I am using  Yanfly Engine Ace - Ace Equip Engine v1.06 that allows to addon several new layers to equipment, and that works fine for my equipment screen. I've even got it to recognize the extra icons in Mog's Ultimate Hud for the additional layers, but here's what I'd like to do.

I've re-arranged some of the windows to show the different layers and am placing that variation of the script here. I'd like to add an additional window that takes the equipment sections and creates a paperdoll of the character. I've created a mockup of what that would sort of look like....


Code:
#==============================================================================
#
# ▼ Yanfly Engine Ace - Ace Equip Engine v1.06
# -- Last Updated: 2014.05.01
# -- Level: Normal, Hard
# -- Requires: n/a
#
#==============================================================================

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

#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2014.05.01 - Bug Fixed: Refresh Equip Item List when change slot.
# 2012.02.02 - Bug Fixed: Crash when changing classes to different equip slots.
# 2012.01.22 - Bug Fixed: <equip slot> notetags updated to factor in spaces.
# 2012.01.05 - Compatibility Update: Equip Dynamic Stats
# 2011.12.30 - Bug Fixed: Stats didn't update.
# 2011.12.23 - Script efficiency optimized.
# 2011.12.18 - Script efficiency optimized.
# 2011.12.13 - Started Script and Finished.
#
#==============================================================================
# ▼ Introduction
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# The default equipment system in RPG Maker VX is the standard equipment system
# seen in all of the previous iterations, which consists of weapon, shield,
# headgear, bodygear, and accessory. To break free of that norm, this script
# allows users access to giving actors and/or classes dynamic equipment setups
# (including having multiples of the same categories). In addition to having
# different equip slot setups, newer equipment types can be made to allow for
# more diversity in armour types.
#
#==============================================================================
# ▼ 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.
#
# -----------------------------------------------------------------------------
# Actor Notetags - These notetags go in the actors notebox in the database.
# -----------------------------------------------------------------------------
# <equip slots>
#  string
#  string
# </equip slots>
# This sets the actor's default slots to whatever is listed in between the two
# notetags. An actor's custom equip slots will take priority over a class's
# custom equip slots, which will take priority over the default equip slots.
# Replace "string" with the proper equipment type name or when in doubt, use
# "equip type: x" with x as the equipment type.
#
# <starting gear: x>
# <starting gear: x, x>
# Adds armour x to the actor's list of starting gear. This is used primarily
# for the newer pieces of gear that can't be added through the starting set of
# equipment through the RPG Maker VX Ace editor by default. Insert multiple of
# these notetags to add more pieces of starting gear if so desired.
#
# <fixed equip: x>
# <fixed equip: x, x>
# This will fix the equip type x. Fixed equip slots mean that the equipment
# already on it are unable to be exchanged in or out by the player. This tag
# has been made so that equip types can be fixed for equip type 5 and above.
# Use multiple of these notetags to add more fixed equipment restrictions.
#
# <sealed equip: x>
# <sealed equip: x, x>
# This will seal the equip type x. Sealed equip slots mean that no equipment
# can be equipped onto that equip type slot. This tag has been made so that
# equip types can be sealed for equip type 5 and above. Use multiple of these
# notetags to add more sealed equipment restrictions.
#
# -----------------------------------------------------------------------------
# Class Notetags - These notetags go in the class notebox in the database.
# -----------------------------------------------------------------------------
# <equip slots>
#  string
#  string
# </equip slots>
# This sets the class's default slots to whatever is listed in between the two
# notetags. An actor's custom equip slots will take priority over a class's
# custom equip slots, which will take priority over the default equip slots.
# Replace "string" with the proper equipment type name or when in doubt, use
# "equip type: x" with x as the equipment type.
#
# <fixed equip: x>
# <fixed equip: x, x>
# This will fix the equip type x. Fixed equip slots mean that the equipment
# already on it are unable to be exchanged in or out by the player. This tag
# has been made so that equip types can be fixed for equip type 5 and above.
# Use multiple of these notetags to add more fixed equipment restrictions.
#
# <sealed equip: x>
# <sealed equip: x, x>
# This will seal the equip type x. Sealed equip slots mean that no equipment
# can be equipped onto that equip type slot. This tag has been made so that
# equip types can be sealed for equip type 5 and above. Use multiple of these
# notetags to add more sealed equipment restrictions.
#
# -----------------------------------------------------------------------------
# Weapon Notetags - These notetags go in the weapons notebox in the database.
# -----------------------------------------------------------------------------
# <fixed equip: x>
# <fixed equip: x, x>
# This will fix the equip type x. Fixed equip slots mean that the equipment
# already on it are unable to be exchanged in or out by the player. This tag
# has been made so that equip types can be fixed for equip type 5 and above.
# Use multiple of these notetags to add more fixed equipment restrictions.
#
# <sealed equip: x>
# <sealed equip: x, x>
# This will seal the equip type x. Sealed equip slots mean that no equipment
# can be equipped onto that equip type slot. This tag has been made so that
# equip types can be sealed for equip type 5 and above. Use multiple of these
# notetags to add more sealed equipment restrictions.
#
# -----------------------------------------------------------------------------
# Armour Notetags - These notetags go in the armour notebox in the database.
# -----------------------------------------------------------------------------
# <equip type: x>
# <equip type: string>
# For the newer equip types, replace x or string with the equip type ID or the
# name of the equip type respectively. This will set that armour to that
# particular equip type.
#
# <fixed equip: x>
# <fixed equip: x, x>
# This will fix the equip type x. Fixed equip slots mean that the equipment
# already on it are unable to be exchanged in or out by the player. This tag
# has been made so that equip types can be fixed for equip type 5 and above.
# Use multiple of these notetags to add more fixed equipment restrictions.
#
# <sealed equip: x>
# <sealed equip: x, x>
# This will seal the equip type x. Sealed equip slots mean that no equipment
# can be equipped onto that equip type slot. This tag has been made so that
# equip types can be sealed for equip type 5 and above. Use multiple of these
# notetags to add more sealed equipment restrictions.
#
# -----------------------------------------------------------------------------
# State Notetags - These notetags go in the states notebox in the database.
# -----------------------------------------------------------------------------
# <fixed equip: x>
# <fixed equip: x, x>
# This will fix the equip type x. Fixed equip slots mean that the equipment
# already on it are unable to be exchanged in or out by the player. This tag
# has been made so that equip types can be fixed for equip type 5 and above.
# Use multiple of these notetags to add more fixed equipment restrictions.
#
# <sealed equip: x>
# <sealed equip: x, x>
# This will seal the equip type x. Sealed equip slots mean that no equipment
# can be equipped onto that equip type slot. This tag has been made so that
# equip types can be sealed for equip type 5 and above. Use multiple of these
# notetags to add more sealed equipment restrictions.
#
#==============================================================================
# ▼ 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.
#
#==============================================================================

module YEA
 module EQUIP
   
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # - General Equip Settings -
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # This adjusts the default equip configuration. While actors can have their
   # own unique equipment configurations, it's recommended to not change too
   # much as things get really hairy when it comes to proper eventing.
   #
   # ID   Equip Type
   # ---  ------------
   #  0   Weapon
   #  1   Shield
   #  2   Headgear
   #  3   Bodygear
   #  4   Accessory
   #
   # Whatever you set the below slots to, the dual wield setup will be exactly
   # identical except that the second slot will be changed to a weapon (0).
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # Adjust this array to set the default slots used for all of your actors
   # and classes if they do not have a custom equipment slot setup.
   DEFAULT_BASE_SLOTS = [ 0, 1, 2, 3, 5, 6, 4, 4]
   
   # This hash adjusts the new equip types (past 4+). Adjust them to match
   # their names properly. You can choose to allow certain types of equipment
   # be removable or not, or whether or not optimize will affect them.
   TYPES ={
   # TypeID => ["Type Name", Removable?, Optimize?],
          0 => [   "Weapon",      false,      true],
          1 => [   "Shield",       true,      true],
          2 => [ "Headgear",       true,      true],
          3 => [ "Bodygear",       true,      true],
          4 => ["Accessory",       true,     false],
          5 => [    "Cloak",       true,      true],
          6 => [ "Necklace",       true,      true],
   } # Do not remove this.
   
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # - Equip Command List -
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # Here, you can adjust the order at which the commands appear (or even
   # remove commands as you see fit). Here's a list of which does what:
   #
   # -------------------------------------------------------------------------
   # :command         Description
   # -------------------------------------------------------------------------
   # :equip           Activates the manual equip window. Default.
   # :optimize        Optimizes equipment for the actor. Default.
   # :clear           Clears all equipment from the actor. Default
   #
   # And that's all of the currently available commands. This list will be
   # updated as more scripts become available.
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # This array arranges the order of which the commands appear in the Equip
   # Command window in the Equip Scene.
   COMMAND_LIST =[
     :equip,
     :optimize,
     :clear,
   # :custom1,
   # :custom2,
   ] # Do not remove this.
   
   #--------------------------------------------------------------------------
   # - Equip Custom Commands -
   # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   # For those who use scripts to that may produce unique effects for
   # equipping, use this hash to manage the custom commands for the Equip
   # 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_EQUIP_COMMANDS ={
   # :command => ["Display Name", EnableSwitch, ShowSwitch, Handler Method],
     :custom1 => [ "Custom Name",            0,          0, :command_name1],
     :custom2 => [ "Custom Text",           13,          0, :command_name2],
   } # Do not remove this.
   
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # - Misc Window Settings -
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # This section adjusts the minor visuals that you see inside of the newly
   # organized Equip Scene. Adjust the settings as you see fit.
   #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   # This sets the font size used for the status window in the lower right
   # corner of the screen (which shows stats and comparisons).
   STATUS_FONT_SIZE = 20
   
   # This sets the remove equip command in the item window.
   REMOVE_EQUIP_ICON = 185
   REMOVE_EQUIP_TEXT = "<Remove Equip>"
   
   # This sets the no-equipment text in the slot window.
   NOTHING_ICON = 185
   NOTHING_TEXT = "<Empty>"
   
 end # EQUIP
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 REGEXP
 module BASEITEM
   
   EQUIP_SLOTS_ON  = /<(?:EQUIP_SLOTS|equip slots)>/i
   EQUIP_SLOTS_OFF = /<\/(?:EQUIP_SLOTS|equip slots)>/i
   
   EQUIP_TYPE_INT = /<(?:EQUIP_TYPE|equip type):[ ]*(\d+)>/i
   EQUIP_TYPE_STR = /<(?:EQUIP_TYPE|equip type):[ ]*(.*)>/i
   
   STARTING_GEAR = /<(?:STARTING_GEAR|starting gear):[ ](\d+(?:\s*,\s*\d+)*)>/i
   
   FIXED_EQUIP = /<(?:FIXED_EQUIP|fixed equip):[ ](\d+(?:\s*,\s*\d+)*)>/i
   SEALED_EQUIP = /<(?:SEALED_EQUIP|sealed equip):[ ](\d+(?:\s*,\s*\d+)*)>/i
   
 end # BASEITEM
 end # REGEXP
end # YEA

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
 
 #--------------------------------------------------------------------------
 # overwrite method: self.etype
 #--------------------------------------------------------------------------
 def self.etype(etype)
   return $data_system.terms.etypes[etype] if [0,1,2,3,4].include?(etype)
   return YEA::EQUIP::TYPES[etype][0] if YEA::EQUIP::TYPES.include?(etype)
   return ""
 end
 
end # Vocab

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

module Icon
 
 #--------------------------------------------------------------------------
 # self.remove_equip
 #--------------------------------------------------------------------------
 def self.remove_equip; return YEA::EQUIP::REMOVE_EQUIP_ICON; end
 
 #--------------------------------------------------------------------------
 # self.nothing_equip
 #--------------------------------------------------------------------------
 def self.nothing_equip; return YEA::EQUIP::NOTHING_ICON; end
   
end # Icon

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

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

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

module DataManager
 
 #--------------------------------------------------------------------------
 # alias method: load_database
 #--------------------------------------------------------------------------
 class <<self; alias load_database_aee load_database; end
 def self.load_database
   load_database_aee
   load_notetags_aee
 end
 
 #--------------------------------------------------------------------------
 # new method: load_notetags_aee
 #--------------------------------------------------------------------------
 def self.load_notetags_aee
   groups = [$data_actors, $data_classes, $data_weapons, $data_armors,
     $data_states]
   for group in groups
     for obj in group
       next if obj.nil?
       obj.load_notetags_aee
     end
   end
 end
 
end # DataManager

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
 
 #--------------------------------------------------------------------------
 # public instance variables
 #--------------------------------------------------------------------------
 attr_accessor :base_equip_slots
 attr_accessor :fixed_equip_type
 attr_accessor :sealed_equip_type
 attr_accessor :extra_starting_equips
 
 #--------------------------------------------------------------------------
 # common cache: load_notetags_aee
 #--------------------------------------------------------------------------
 def load_notetags_aee
   @base_equip_slots = []
   @equip_slots_on = false
   @fixed_equip_type = []
   @sealed_equip_type = []
   @extra_starting_equips = []
   #---
   self.note.split(/[\r\n]+/).each { |line|
     case line
     #---
     when YEA::REGEXP::BASEITEM::EQUIP_SLOTS_ON
       next unless self.is_a?(RPG::Actor) ||self.is_a?(RPG::Class)
       @equip_slots_on = true
     when YEA::REGEXP::BASEITEM::EQUIP_SLOTS_OFF
       next unless self.is_a?(RPG::Actor) ||self.is_a?(RPG::Class)
       @equip_slots_on = false
     #---
     when YEA::REGEXP::BASEITEM::STARTING_GEAR
       next unless self.is_a?(RPG::Actor)
       $1.scan(/\d+/).each { |num|
       @extra_starting_equips.push(num.to_i) if num.to_i > 0 }
     when YEA::REGEXP::BASEITEM::FIXED_EQUIP
       $1.scan(/\d+/).each { |num|
       @fixed_equip_type.push(num.to_i) if num.to_i > 0 }
     when YEA::REGEXP::BASEITEM::SEALED_EQUIP
       $1.scan(/\d+/).each { |num|
       @sealed_equip_type.push(num.to_i) if num.to_i > 0 }
     #---
     when YEA::REGEXP::BASEITEM::EQUIP_TYPE_INT
       next unless self.is_a?(RPG::Armor)
       @etype_id = [1, $1.to_i].max
     when YEA::REGEXP::BASEITEM::EQUIP_TYPE_STR
       next unless self.is_a?(RPG::Armor)
       for key in YEA::EQUIP::TYPES
         id = key[0]
         next if YEA::EQUIP::TYPES[id][0].upcase != $1.to_s.upcase
         @etype_id = [1, id].max
         break
       end
     #---
     else
       if @equip_slots_on
         case line.upcase
         when /EQUIP TYPE[ ](\d+)/i, /EQUIP TYPE:[ ](\d+)/i
           id = $1.to_i
           @base_equip_slots.push(id) if [0,1,2,3,4].include?(id)
           @base_equip_slots.push(id) if YEA::EQUIP::TYPES.include?(id)
         when /WEAPON/i
           @base_equip_slots.push(0)
         when /SHIELD/i
           @base_equip_slots.push(1)
         when /HEAD/i
           @base_equip_slots.push(2)
         when /BODY/i, /ARMOR/i, /ARMOUR/i
           @base_equip_slots.push(3)
         when /ETC/i, /OTHER/i, /ACCESSOR/i
           @base_equip_slots.push(4)
         else
           text = line.upcase.delete(" ")
           for key in YEA::EQUIP::TYPES
             id = key[0]
             next if YEA::EQUIP::TYPES[id][0].upcase.delete(" ")!= text
             @base_equip_slots.push(id)
             break
           end
         end
       end
     end
   } # self.note.split
   #---
   return unless self.is_a?(RPG::Class)
   if @base_equip_slots.empty?
     @base_equip_slots = YEA::EQUIP::DEFAULT_BASE_SLOTS.clone
   end
 end
 
end # RPG::BaseItem

#==============================================================================
# ■ Game_Temp
#==============================================================================

class Game_Temp
 
 #--------------------------------------------------------------------------
 # public instance variables
 #--------------------------------------------------------------------------
 attr_accessor :eds_actor
 attr_accessor :scene_equip_index
 attr_accessor :scene_equip_oy
 
end # Game_Temp

#==============================================================================
# ■ Game_BaseItem
#==============================================================================

class Game_BaseItem
 
 #--------------------------------------------------------------------------
 # public instance variables
 #--------------------------------------------------------------------------
 attr_accessor :item_id
 
end # Game_BaseItem

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
 
 #--------------------------------------------------------------------------
 # alias method: equip_type_fixed?
 #--------------------------------------------------------------------------
 alias game_battlerbase_equip_type_fixed_aee equip_type_fixed?
 def equip_type_fixed?(etype_id)
   return true if fixed_etypes.include?(etype_id) if actor?
   return game_battlerbase_equip_type_fixed_aee(etype_id)
 end
 
 #--------------------------------------------------------------------------
 # alias method: equip_type_sealed?
 #--------------------------------------------------------------------------
 alias game_battlerbase_equip_type_sealed_aee equip_type_sealed?
 def equip_type_sealed?(etype_id)
   return true if sealed_etypes.include?(etype_id) if actor?
   return game_battlerbase_equip_type_sealed_aee(etype_id)
 end
 
end # Game_BattlerBase

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

class Game_Actor < Game_Battler
 
 #--------------------------------------------------------------------------
 # alias method: init_equips
 #--------------------------------------------------------------------------
 alias game_actor_init_equips_aee init_equips
 def init_equips(equips)
   game_actor_init_equips_aee(equips)
   equip_extra_starting_equips
 end
 
 #--------------------------------------------------------------------------
 # new method: equip_extra_starting_equips
 #--------------------------------------------------------------------------
 def equip_extra_starting_equips
   for equip_id in actor.extra_starting_equips
     armour = $data_armors[equip_id]
     next if armour.nil?
     etype_id = armour.etype_id
     next unless equip_slots.include?(etype_id)
     slot_id = empty_slot(etype_id)
     @equips[slot_id].set_equip(etype_id == 0, armour.id)
   end
   refresh
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: equip_slots
 #--------------------------------------------------------------------------
 def equip_slots
   return equip_slots_dual if dual_wield?
   return equip_slots_normal
 end
 
 #--------------------------------------------------------------------------
 # new method: equip_slots_normal
 #--------------------------------------------------------------------------
 def equip_slots_normal
   return self.actor.base_equip_slots if self.actor.base_equip_slots != []
   return self.class.base_equip_slots
 end
 
 #--------------------------------------------------------------------------
 # new method: equip_slots_dual
 #--------------------------------------------------------------------------
 def equip_slots_dual
   array = equip_slots_normal.clone
   array[1] = 0 if array.size >= 2
   return array
 end
 
 #--------------------------------------------------------------------------
 # new method: fixed_etypes
 #--------------------------------------------------------------------------
 def fixed_etypes
   array = []
   array |= self.actor.fixed_equip_type
   array |= self.class.fixed_equip_type
   for equip in equips
     next if equip.nil?
     array |= equip.fixed_equip_type
   end
   for state in states
     next if state.nil?
     array |= state.fixed_equip_type
   end
   return array
 end
 
 #--------------------------------------------------------------------------
 # new method: sealed_etypes
 #--------------------------------------------------------------------------
 def sealed_etypes
   array = []
   array |= self.actor.sealed_equip_type
   array |= self.class.sealed_equip_type
   for equip in equips
     next if equip.nil?
     array |= equip.sealed_equip_type
   end
   for state in states
     next if state.nil?
     array |= state.sealed_equip_type
   end
   return array
 end
 
 #--------------------------------------------------------------------------
 # alias method: change_equip
 #--------------------------------------------------------------------------
 alias game_actor_change_equip_aee change_equip
 def change_equip(slot_id, item)
   if item.nil? && !@optimize_clear
     etype_id = equip_slots[slot_id]
     return unless YEA::EQUIP::TYPES[etype_id][1]
   elsif item.nil? && @optimize_clear
     etype_id = equip_slots[slot_id]
     return unless YEA::EQUIP::TYPES[etype_id][2]
   end
   @equips[slot_id] = Game_BaseItem.new if @equips[slot_id].nil?
   game_actor_change_equip_aee(slot_id, item)
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: optimize_equipments
 #--------------------------------------------------------------------------
 def optimize_equipments
   $game_temp.eds_actor = self
   @optimize_clear = true
   clear_equipments
   @optimize_clear = false
   equip_slots.size.times do |i|
     next if !equip_change_ok?(i)
     next unless can_optimize?(i)
     items = $game_party.equip_items.select do |item|
       item.etype_id == equip_slots[i] &&
       equippable?(item) && item.performance >= 0
     end
     change_equip(i, items.max_by {|item| item.performance })
   end
   $game_temp.eds_actor = nil
 end
 
 #--------------------------------------------------------------------------
 # new method: can_optimize?
 #--------------------------------------------------------------------------
 def can_optimize?(slot_id)
   etype_id = equip_slots[slot_id]
   return YEA::EQUIP::TYPES[etype_id][2]
 end
 
 #--------------------------------------------------------------------------
 # alias method: force_change_equip
 #--------------------------------------------------------------------------
 alias game_actor_force_change_equip_aee force_change_equip
 def force_change_equip(slot_id, item)
   @equips[slot_id] = Game_BaseItem.new if @equips[slot_id].nil?
   game_actor_force_change_equip_aee(slot_id, item)
 end
 
 #--------------------------------------------------------------------------
 # alias method: weapons
 #--------------------------------------------------------------------------
 alias game_actor_weapons_aee weapons
 def weapons
   anti_crash_equips
   return game_actor_weapons_aee
 end
 
 #--------------------------------------------------------------------------
 # alias method: armors
 #--------------------------------------------------------------------------
 alias game_actor_armors_aee armors
 def armors
   anti_crash_equips
   return game_actor_armors_aee
 end
 
 #--------------------------------------------------------------------------
 # alias method: equips
 #--------------------------------------------------------------------------
 alias game_actor_equips_aee equips
 def equips
   anti_crash_equips
   return game_actor_equips_aee
 end
 
 #--------------------------------------------------------------------------
 # new method: equips
 #--------------------------------------------------------------------------
 def anti_crash_equips
   for i in 0...@equips.size
     next unless @equips[i].nil?
     @equips[i] = Game_BaseItem.new
   end
 end
 
end # Game_Actor

#==============================================================================
# ■ Game_Interpreter
#==============================================================================

class Game_Interpreter
 
 #--------------------------------------------------------------------------
 # overwrite method: change equip
 #--------------------------------------------------------------------------
 def command_319
   actor = $game_actors[@params[0]]
   return if actor.nil?
   if @params[1] == 0 && @params[2] != 0
     item = $data_weapons[@params[2]]
     return unless actor.equip_slots.include?(0)
     slot_id = actor.empty_slot(0)
   elsif @params[2] != 0
     item = $data_armors[@params[2]]
     return unless actor.equip_slots.include?(item.etype_id)
     slot_id = actor.empty_slot(item.etype_id)
   else
     slot_id = @params[1]
   end
   actor.change_equip_by_id(slot_id, @params[2])
 end
 
end # Game_Interpreter

#==============================================================================
# ■ Window_EquipStatus
#==============================================================================

class Window_EquipStatus < Window_Base
 
 #--------------------------------------------------------------------------
 # overwrite method: initialize
 #--------------------------------------------------------------------------
 def initialize(dx, dy)
   super(dx, dy, window_width, Graphics.height - dy)
   @actor = nil
   @temp_actor = nil
   refresh
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: window_width
 #--------------------------------------------------------------------------
 def window_width; return Graphics.width * 2 / 5; end
 
 #--------------------------------------------------------------------------
 # overwrite method: refresh
 #--------------------------------------------------------------------------
 def refresh
   contents.clear
   8.times {|i| draw_item(0, line_height * i, i) }
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: 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
 
 #--------------------------------------------------------------------------
 # new method: 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
 
 #--------------------------------------------------------------------------
 # overwrite method: draw_param_name
 #--------------------------------------------------------------------------
 def draw_param_name(dx, dy, param_id)
   contents.font.size = YEA::EQUIP::STATUS_FONT_SIZE
   change_color(system_color)
   draw_text(dx, dy, contents.width, line_height, Vocab::param(param_id))
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: 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
 
 #--------------------------------------------------------------------------
 # overwrite method: draw_new_param
 #--------------------------------------------------------------------------
 def draw_new_param(dx, dy, param_id)
   contents.font.size = YEA::EQUIP::STATUS_FONT_SIZE
   new_value = @temp_actor.param(param_id)
   change_color(param_change_color(new_value - @actor.param(param_id)))
   draw_text(0, dy, contents.width-4, line_height, new_value.group, 2)
   reset_font_settings
 end
 
end # Window_EquipStatus

#==============================================================================
# ■ Window_EquipCommand
#==============================================================================

class Window_EquipCommand < Window_HorzCommand
 
 #--------------------------------------------------------------------------
 # overwrite method: make_command_list
 #--------------------------------------------------------------------------
 def make_command_list
   for command in YEA::EQUIP::COMMAND_LIST
     case command
     when :equip
       add_command(Vocab::equip2, :equip)
     when :optimize
       add_command(Vocab::optimize, :optimize)
     when :clear
       add_command(Vocab::clear, :clear)
     else
       process_custom_command(command)
     end
   end
 end
 
 #--------------------------------------------------------------------------
 # process_ok
 #--------------------------------------------------------------------------
 def process_ok
   $game_temp.scene_equip_index = index
   $game_temp.scene_equip_oy = self.oy
   super
 end
 
 #--------------------------------------------------------------------------
 # new method: process_custom_command
 #--------------------------------------------------------------------------
 def process_custom_command(command)
   return unless YEA::EQUIP::CUSTOM_EQUIP_COMMANDS.include?(command)
   show = YEA::EQUIP::CUSTOM_EQUIP_COMMANDS[command][2]
   continue = show <= 0 ? true : $game_switches[show]
   return unless continue
   text = YEA::EQUIP::CUSTOM_EQUIP_COMMANDS[command][0]
   switch = YEA::EQUIP::CUSTOM_EQUIP_COMMANDS[command][1]
   enabled = switch <= 0 ? true : $game_switches[switch]
   add_command(text, command, enabled)
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: window_width
 #--------------------------------------------------------------------------
 def window_width; return 160; end
 
 #--------------------------------------------------------------------------
 # overwrite method: contents_width
 #--------------------------------------------------------------------------
 def contents_width; return width - standard_padding * 2; end
 
 #--------------------------------------------------------------------------
 # overwrite method: contents_height
 #--------------------------------------------------------------------------
 def contents_height
   ch = height - standard_padding * 2
   return [ch - ch % item_height, row_max * item_height].max
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: visible_line_number
 #--------------------------------------------------------------------------
 def visible_line_number; return 4; end
 
 #--------------------------------------------------------------------------
 # overwrite method: col_max
 #--------------------------------------------------------------------------
 def col_max; return 1; end
   
 #--------------------------------------------------------------------------
 # overwrite method: item_rect
 #--------------------------------------------------------------------------
 def item_rect(index)
   rect = Rect.new
   rect.width = item_width
   rect.height = item_height
   rect.x = index % col_max * (item_width + spacing)
   rect.y = index / col_max * item_height
   rect
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: ensure_cursor_visible
 #--------------------------------------------------------------------------
 def ensure_cursor_visible
   self.top_row = row if row < top_row
   self.bottom_row = row if row > bottom_row
 end
   
 #--------------------------------------------------------------------------
 # overwrite method: cursor_down
 #--------------------------------------------------------------------------
 def cursor_down(wrap = false)
   if index < item_max - col_max || (wrap && col_max == 1)
     select((index + col_max) % item_max)
   end
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: cursor_up
 #--------------------------------------------------------------------------
 def cursor_up(wrap = false)
   if index >= col_max || (wrap && col_max == 1)
     select((index - col_max + item_max) % item_max)
   end
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: process_pageup
 #--------------------------------------------------------------------------
 def process_pageup
   Sound.play_cursor
   Input.update
   deactivate
   call_handler(:pageup)
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: process_pagedown
 #--------------------------------------------------------------------------
 def process_pagedown
   Sound.play_cursor
   Input.update
   deactivate
   call_handler(:pagedown)
 end
 
end # Window_EquipCommand

#==============================================================================
# ■ Window_EquipSlot
#==============================================================================

class Window_EquipSlot < Window_Selectable
 
 #--------------------------------------------------------------------------
 # overwrite method: initialize
 #--------------------------------------------------------------------------
 def initialize(dx, dy, dw)
   super(dx, dy, dw, Graphics.height - dy)
   @actor = nil
   refresh
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: window_height
 #--------------------------------------------------------------------------
 def window_height; return self.height; end
 
 #--------------------------------------------------------------------------
 # overwrite method: visible_line_number
 #--------------------------------------------------------------------------
 def visible_line_number; return item_max; end
 
 #--------------------------------------------------------------------------
 # overwrite method: refresh
 #--------------------------------------------------------------------------
 def refresh
   create_contents
   super
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: draw_item
 #--------------------------------------------------------------------------
 def draw_item(index)
   return unless @actor
   rect = item_rect_for_text(index)
   change_color(system_color, enable?(index))
   draw_text(rect.x, rect.y, 92, line_height, slot_name(index))
   item = @actor.equips[index]
   dx = rect.x + 92
   dw = contents.width - dx - 24
   if item.nil?
     draw_nothing_equip(dx, rect.y, false, dw)
   else
     draw_item_name(item, dx, rect.y, enable?(index), dw)
   end
 end
 
 #--------------------------------------------------------------------------
 # new method: draw_nothing_equip
 #--------------------------------------------------------------------------
 def draw_nothing_equip(dx, dy, enabled, dw)
   change_color(normal_color, enabled)
   draw_icon(Icon.nothing_equip, dx, dy, enabled)
   text = YEA::EQUIP::NOTHING_TEXT
   draw_text(dx + 24, dy, dw - 24, line_height, text)
 end
 
end # Window_EquipSlot

#==============================================================================
# ■ Window_EquipItem
#==============================================================================

class Window_EquipItem < Window_ItemList
 
 #--------------------------------------------------------------------------
 # overwrite method: col_max
 #--------------------------------------------------------------------------
 def col_max; return 1; end
 
 #--------------------------------------------------------------------------
 # overwrite method: slot_id=
 #--------------------------------------------------------------------------
 def slot_id=(slot_id)
   return if @slot_id == slot_id
   @slot_id = slot_id
   @last_item = nil
   self.oy = 0
   refresh
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: draw_item
 #--------------------------------------------------------------------------
 def draw_item(index)
   item = @data[index]
   rect = item_rect(index)
   rect.width -= 4
   if item.nil?
     draw_remove_equip(rect)
     return
   end
   dw = contents.width - rect.x - 24
   draw_item_name(item, rect.x, rect.y, enable?(item), dw)
   draw_item_number(rect, item)
 end
 
 #--------------------------------------------------------------------------
 # new method: draw_remove_equip
 #--------------------------------------------------------------------------
 def draw_remove_equip(rect)
   draw_icon(Icon.remove_equip, rect.x, rect.y)
   text = YEA::EQUIP::REMOVE_EQUIP_TEXT
   rect.x += 24
   rect.width -= 24
   draw_text(rect, text)
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: include?
 #--------------------------------------------------------------------------
 def include?(item)
   if item.nil? && !@actor.nil?
     etype_id = @actor.equip_slots[@slot_id]
     return YEA::EQUIP::TYPES[etype_id][1]
   end
   return true if item.nil?
   return false unless item.is_a?(RPG::EquipItem)
   return false if @slot_id < 0
   return false if item.etype_id != @actor.equip_slots[@slot_id]
   return @actor.equippable?(item)
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: enable?
 #--------------------------------------------------------------------------
 def enable?(item)
   if item.nil? && !@actor.nil?
     etype_id = @actor.equip_slots[@slot_id]
     return YEA::EQUIP::TYPES[etype_id][1]
   end
   return @actor.equippable?(item)
 end
 
 #--------------------------------------------------------------------------
 # new method: show
 #--------------------------------------------------------------------------
 def show
   @last_item = 0
   update_help
   super
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: update_help
 #--------------------------------------------------------------------------
 def update_help
   super
   return if @actor.nil?
   return if @status_window.nil?
   return if @last_item == item
   @last_item = item
   temp_actor = Marshal.load(Marshal.dump(@actor))
   temp_actor.force_change_equip(@slot_id, item)
   @status_window.set_temp_actor(temp_actor)
 end
 
end # Window_EquipItem

#==============================================================================
# ■ Window_EquipActor
#==============================================================================

class Window_EquipActor < Window_Base
 
 #--------------------------------------------------------------------------
 # initialize
 #--------------------------------------------------------------------------
 def initialize(dx, dy)
   super(dx, dy, window_width, fitting_height(4))
   @actor = nil
 end
 
 #--------------------------------------------------------------------------
 # window_width
 #--------------------------------------------------------------------------
 def window_width; return Graphics.width - 160; end
 
 #--------------------------------------------------------------------------
 # actor=
 #--------------------------------------------------------------------------
 def actor=(actor)
   return if @actor == actor
   @actor = actor
   refresh
 end
 
 #--------------------------------------------------------------------------
 # refresh
 #--------------------------------------------------------------------------
 def refresh
   contents.clear
   return unless @actor
   draw_actor_face(@actor, 0, 0)
   draw_actor_simple_status(@actor, 108, line_height / 2)
 end
 
end # Window_EquipActor

#==============================================================================
# ■ Scene_Equip
#==============================================================================

class Scene_Equip < Scene_MenuBase
 
 #--------------------------------------------------------------------------
 # overwrite method: create_status_window
 #--------------------------------------------------------------------------
 def create_status_window
   #wx = Graphics.width - (Graphics.width * 2 / 5)
   wx = 400
   #wy = @help_window.height + 120
   wy = 560
   @status_window = Window_EquipStatus.new(wx, wy)
   @status_window.width = 632
   @status_window.viewport = @viewport
   @status_window.actor = @actor
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: create_command_window
 #--------------------------------------------------------------------------
 def create_command_window
   wx = 0
   wy = @help_window.height
   ww = 360
   @command_window = Window_EquipCommand.new(wx, wy, ww)
   @command_window.viewport = @viewport
   @command_window.help_window = @help_window
   if !$game_temp.scene_equip_index.nil?
     @command_window.select($game_temp.scene_equip_index)
     @command_window.oy = $game_temp.scene_equip_oy
   end
   $game_temp.scene_equip_index = nil
   $game_temp.scene_equip_oy = nil
   @command_window.set_handler(:equip,    method(:command_equip))
   @command_window.set_handler(:optimize, method(:command_optimize))
   @command_window.set_handler(:clear,    method(:command_clear))
   @command_window.set_handler(:cancel,   method(:return_scene))
   @command_window.set_handler(:pagedown, method(:next_actor))
   @command_window.set_handler(:pageup,   method(:prev_actor))
   process_custom_equip_commands
   create_actor_window
 end
 
 #--------------------------------------------------------------------------
 # new method: create_actor_window
 #--------------------------------------------------------------------------
 def create_actor_window
   wy = @help_window.height
   @actor_window = Window_EquipActor.new(@command_window.width, wy)
   @actor_window.viewport = @viewport
   @actor_window.actor = @actor
 end
 
 #--------------------------------------------------------------------------
 # new method: process_custom_equip_commands
 #--------------------------------------------------------------------------
 def process_custom_equip_commands
   for command in YEA::EQUIP::COMMAND_LIST
     next unless YEA::EQUIP::CUSTOM_EQUIP_COMMANDS.include?(command)
     called_method = YEA::EQUIP::CUSTOM_EQUIP_COMMANDS[command][3]
     @command_window.set_handler(command, method(called_method))
   end
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: create_slot_window
 #--------------------------------------------------------------------------
 def create_slot_window
   wx = 0
   wy = @command_window.y + @command_window.height
   #ww = Graphics.width - @status_window.width
   ww = 400
   @slot_window = Window_EquipSlot.new(wx, wy, ww)
   @slot_window.viewport = @viewport
   @slot_window.help_window = @help_window
   @slot_window.status_window = @status_window
   @slot_window.actor = @actor
   @slot_window.set_handler(:ok,       method(:on_slot_ok))
   @slot_window.set_handler(:cancel,   method(:on_slot_cancel))
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: create_item_window
 #--------------------------------------------------------------------------
 def create_item_window
   wx = @slot_window.x
   wy = @slot_window.y
   ww = @slot_window.width
   wh = @slot_window.height
   @item_window = Window_EquipItem.new(wx, wy, ww, wh)
   @item_window.viewport = @viewport
   @item_window.help_window = @help_window
   @item_window.status_window = @status_window
   @item_window.actor = @actor
   @item_window.set_handler(:ok,     method(:on_item_ok))
   @item_window.set_handler(:cancel, method(:on_item_cancel))
   @slot_window.item_window = @item_window
   @item_window.hide
 end
 
 #--------------------------------------------------------------------------
 # alias method: command_optimize
 #--------------------------------------------------------------------------
 alias scene_equip_command_optimize_aee command_optimize
 def command_optimize
   scene_equip_command_optimize_aee
   @actor_window.refresh
 end
 
 #--------------------------------------------------------------------------
 # alias method: command_clear
 #--------------------------------------------------------------------------
 alias scene_equip_command_clear_aee command_clear
 def command_clear
   scene_equip_command_clear_aee
   @actor_window.refresh
 end
 
 #--------------------------------------------------------------------------
 # alias method: on_slot_ok
 #--------------------------------------------------------------------------
 alias scene_equip_on_slot_ok_aee on_slot_ok
 def on_slot_ok
   scene_equip_on_slot_ok_aee
   @slot_window.hide
   @item_window.refresh
   @item_window.show
 end
 
 #--------------------------------------------------------------------------
 # alias method: on_item_ok
 #--------------------------------------------------------------------------
 alias scene_equip_on_item_ok_aee on_item_ok
 def on_item_ok
   scene_equip_on_item_ok_aee
   @actor_window.refresh
   @slot_window.show
   @item_window.hide
 end
 
 #--------------------------------------------------------------------------
 # alias method: on_item_cancel
 #--------------------------------------------------------------------------
 alias scene_equip_on_item_cancel_aee on_item_cancel
 def on_item_cancel
   scene_equip_on_item_cancel_aee
   @slot_window.show
   @item_window.hide
 end
 
 #--------------------------------------------------------------------------
 # alias method: on_actor_change
 #--------------------------------------------------------------------------
 alias scene_equip_on_actor_change_aee on_actor_change
 def on_actor_change
   scene_equip_on_actor_change_aee
   @actor_window.actor = @actor
 end
 
 #--------------------------------------------------------------------------
 # new method: command_name1
 #--------------------------------------------------------------------------
 def command_name1
   # Do nothing.
 end
 
 #--------------------------------------------------------------------------
 # new method: command_name2
 #--------------------------------------------------------------------------
 def command_name2
   # Do nothing.
 end
 
end # Scene_Equip

#==============================================================================
#
# ▼ End of File
#
#==============================================================================
 here's what I sorta want it to look like. Now, also, I wanted it to be known that this is for a point and click adventure game, not necessarily a sprite visual equipment, but I WOULD want a version of the window that can also be used in HUD on the main screen too, possibly as an extension of Ventwig's HUD

here's the mockup of sort of what I'm going for.[Image: meredemockup_zpsdbk3n1dz.png]
[Image: AVvXsEga1vIr5Rx3FkoFbGo1OoMJAqgq6TeqcbpF...L3AWg=s752]

BLOG: JayVinci.blogspot.com
FORUM COMING SOON
Currently working on:
Ambitions: RPG Developer Bakin
Heart of Vox: RPG Developer Bakin
Reply }


Possibly Related Threads…
Thread Author Replies Views Last Post
   Plugin or Script help with Item menu, SKill menu, and Equip menu JayRay 3 319 11-22-2024, 07:02 PM
Last Post: JayRay
   Atoa ACBS, Equipment Set Add-on Error Solitaire 10 1,204 10-13-2024, 11:41 PM
Last Post: Solitaire
   Script compatibility help Lord Vectra 3 4,771 07-25-2021, 11:42 PM
Last Post: DerVVulfman
   Adding face script on Cogwheel's RTAB Battle Status rekkatsu 15 16,177 08-25-2020, 03:09 AM
Last Post: DerVVulfman
   "Wait" in the script Whisper 13 16,501 04-28-2020, 04:06 PM
Last Post: Whisper
   Skill Cooldown script Fenriswolf 11 16,804 12-10-2019, 11:10 AM
Last Post: Fenriswolf
   Help iwth script (RGSS Player crash) Whisper 3 8,629 06-17-2017, 05:03 PM
Last Post: Whisper
   Help modifying a script Keeroh 7 10,399 06-11-2017, 04:43 PM
Last Post: DerVVulfman
Question  Mog Menu script: help me stop the crazy picture movement during transitions Zachariad 4 10,072 05-31-2017, 05:10 AM
Last Post: Zachariad
   Actor names in Quest Script jreagan406 5 8,808 03-07-2017, 08:06 AM
Last Post: JayRay



Users browsing this thread: 1 Guest(s)