Equipment Optimization for
Guillaume777's Multi Slot Script
Version: 1.0
Introduction
Based initially on RPG Advocate's Advanced Equipment Optimization System, this version works specifically for Guillaume777's Multiple Slot Equipment System. Like RPG Advocates, you'll be able to press the 'X' button when highlighted over a single slot and the system will choose the best weapon or armor piece, or you can press the 'Y' button and it targets every slot for the actor.
Like the original version, you can change how the algorithm chooses the best equipment by changing the weight constants included with the script. However, the system will not erase/remove armor from an armor if no 'optimal' equipment piece is found to replace it. I found that kind of annoying.
Script
Autoc Equip Optimizer for Guillaume777 MultiSlots
Code:
#==============================================================================
# ** Auto Equip Optimizer for Guillaume777's MultiSlots
# Original version by RPG Advocate
#------------------------------------------------------------------------------
# Edit by DerVVulfman
# version 1.0
# 06-19-2012
# RPGMaker XP
#==============================================================================
#==============================================================================
# ** Scene_Equip
#------------------------------------------------------------------------------
# This class performs equipment screen processing.
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# * Constants
#--------------------------------------------------------------------------
WEAPON_ATK_WEIGHT = 1.0
WEAPON_PDF_WEIGHT = 0.0
WEAPON_MDF_WEIGHT = 0.0
WEAPON_STR_WEIGHT = 0.0
WEAPON_DEX_WEIGHT = 0.0
WEAPON_AGI_WEIGHT = 0.0
WEAPON_INT_WEIGHT = 0.0
ARMOR_EVA_WEIGHT = 0.0
ARMOR_PDF_WEIGHT = 0.75
ARMOR_MDF_WEIGHT = 0.25
ARMOR_STR_WEIGHT = 0.0
ARMOR_DEX_WEIGHT = 0.0
ARMOR_AGI_WEIGHT = 0.0
ARMOR_INT_WEIGHT = 0.0
NO_ACCESSORY_OPTIMIZATION = false
#--------------------------------------------------------------------------
# * Frame Update (when right window is active)
#--------------------------------------------------------------------------
alias aeo_update_right update_right
def update_right
# Perform the original call
aeo_update_right
# If X button was pressed
if Input.trigger?(Input::X)
# Play decision SE
$game_system.se_play($data_system.decision_se)
# optimize
optimize(@right_window.index)
# Refresh windows
@left_window.refresh
@right_window.refresh
for i in 0..@actor.armor_slots.max+1
@item_windows[i].refresh
end
return
end
# If Y button was pressed
if Input.trigger?(Input::Y)
# Play decision SE
$game_system.se_play($data_system.decision_se)
for i in 0..@actor.armor_slots.max+1
optimize(i)
end
@left_window.refresh
@right_window.refresh
for i in 0..@actor.armor_slots.max+1
@item_windows[i].refresh
end
return
end
end
#--------------------------------------------------------------------------
# * Optimize Equipment
# slot : equipment slot
#--------------------------------------------------------------------------
def optimize(slot)
old_slot = slot
slot = index_to_equip_kind(old_slot)
# IF WEAPON SLOT.....
if slot == 0
# SORT through Weapons
for w_slot in 0...@actor.weapon_slots.size
# Only if the equipment menu slot is the matching weapon hand slot
if old_slot == w_slot
w_id = @actor.weapon_ids[w_slot]
# Cannot be cursed if unequipped
unless w_id == 0
object = $data_weapons[w_id]
return if object.cursed
end
optimal = object.id
eval_current = 0.00
if w_id != 0
eval_current = calc_weapon_stats(object)
else
optimal = 0
end
@actor.equip_weapon(w_slot,0)
flag = false
zero_flag = true
for weapon in $data_weapons
if !flag
flag = true
next
end
# Cannot proceed w/ 2nd slot if first is two-handed
unless @actor.weapon_ids[0].nil?
unless $data_weapons[@actor.weapon_ids[0]].nil?
if w_slot != 0 && $data_weapons[@actor.weapon_ids[0]].nb_hands > 1
next
end
end
end
eval_new = 0.00
eval_new = calc_weapon_stats(weapon)
zero_flag = false if eval_new > 0
if @actor.equippable?(weapon) &&
$game_party.weapon_number(weapon.id) > 0 && eval_new > eval_current
eval_current = eval_new
optimal = weapon.id
end
end
optimal = 0 if zero_flag
@actor.equip_weapon(w_slot, optimal)
# If two-handed weapon (can't be if unarmed)
unless object.nil?
@actor.equip(1, 0) if object.nb_hands > 1
end
end
end
end
# IF ARMOR SLOT.....
if slot >= 1
# Prevent accessories if no accesory switch is on
return if NO_ACCESSORY_OPTIMIZATION && slot > 3
# Obtain eval_current Object
for a_slot in 0..@actor.armor_slots.size-1
slot_place = old_slot - @actor.weapon_slots.size
if slot_place == a_slot
id = @actor.armor_ids[a_slot]
id = 0 if id.nil?
object = $data_armors[id]
# Do not proceed if cursed item
unless object.nil?
return if object.cursed
end
# Set Unequipped flag
not_equipped = false
# If shield slot
if a_slot == 0
# Skip Shield slot if two-handed equipped...
for w_slot in 0...@actor.weapon_slots.size
w_id = @actor.weapon_ids[w_slot]
w_id = 0 if w_id.nil?
w_object = $data_weapons[w_id]
unless w_object.nil?
return if w_object.nb_hands > 1
end
end
end
# Set optimal start
if object.nil?
optimal = 0
not_equipped = true
else
if object.id == 0
optimal = 0
not_equipped = true
else
optimal = object.id
end
end
# Calculate eval_current armor stats
eval_current = 0.00
if not_equipped == false
eval_current = calc_armor_stats(object)
end
# Set Flag
flag = false
# Sort through Armor Database
for armor in $data_armors
if !flag
flag = true
next
end
# Skip for invalid slots
next if armor.kind != slot-1
# Calculate
eval_new = 0.00
eval_new = calc_armor_stats(armor)
# If Armor Equippable by Actor and valid and above eval_current level
if @actor.equippable?(armor) &&
$game_party.armor_number(armor.id) > 0 && eval_new > eval_current
# Set new eval_current level stat and ID
eval_current = eval_new
optimal = armor.id
end
end
@actor.equip_armor(a_slot, optimal)
end
end
end
end
#--------------------------------------------------------------------------
# * Calculate Weapon Stats
# object : weapon evaluated
#--------------------------------------------------------------------------
def calc_weapon_stats(object)
eval_new = 0.00
eval_new += object.atk * WEAPON_ATK_WEIGHT
eval_new += object.pdef * WEAPON_PDF_WEIGHT
eval_new += object.mdef * WEAPON_MDF_WEIGHT
eval_new += object.str_plus * WEAPON_STR_WEIGHT
eval_new += object.dex_plus * WEAPON_DEX_WEIGHT
eval_new += object.agi_plus * WEAPON_AGI_WEIGHT
eval_new += object.int_plus * WEAPON_INT_WEIGHT
return eval_new
end
#--------------------------------------------------------------------------
# * Calculate Armor Stats
# object : armor evaluated
#--------------------------------------------------------------------------
def calc_armor_stats(object)
eval_new = 0.00
eval_new += object.eva * ARMOR_EVA_WEIGHT
eval_new += object.pdef * ARMOR_PDF_WEIGHT
eval_new += object.mdef * ARMOR_MDF_WEIGHT
eval_new += object.str_plus * ARMOR_STR_WEIGHT
eval_new += object.dex_plus * ARMOR_DEX_WEIGHT
eval_new += object.agi_plus * ARMOR_AGI_WEIGHT
eval_new += object.int_plus * ARMOR_INT_WEIGHT
return eval_new
end
end
Instructions
Should be easy enough for those who used the original system by RPG Advocate.
Compatibility
Specifically designed for RPGMaker XP and the Guillaume777 MultiSlots Equipment System.
Terms and Conditions
Free for use, even in commercial games. However, due credit to both myself and buddysievers of Save-Point.Org is required.
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)