Source Thread: http://save-point.org/thread-4195.html
Guillaume777씨의 장비확장 스크립트를 위한 최강장비 장착 스크립트입니다. 스크립트를 끼워넣은 뒤 장비창에서 X나 Y버튼(또는 거기에 대응하는 키)을 눌러보시길. 최강장비 선정기준은 Scene_Equip 처음의 상수부분을 편집해서 변경할 수 있습니다.
#==============================================================================
# ** 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