#==============================================================================
# ▲スロット式装備システム(RGSS3)
# 武器に「スロット数」というパラメータを設定し、
# その数だけ装飾品を装備できるようにします。
# 武器を変えれば、スロット数も変動します。
###################################################
# 设定槽数方法:在武器的备注栏写 ###############
# <技能槽 x> (x是任意数字) ############### 如果你懂脚本
# 即可。 ############### 那么可以在120行
################################################# 改有关的正则式
# 制作元:Lemon slice [url]http://www.lemon-slice.net/[/url]
#==============================================================================
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors)
# の内部で使用され、Game_Party クラス($game_party)からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 装備品の初期化
# equips : 初期装備の配列
#--------------------------------------------------------------------------
def init_equips(equips)
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
if equip_slots.size > @equips.size
size = equip_slots.size - @equips.size
size.times { @equips.push(Game_BaseItem.new) }
end
refresh
end
#--------------------------------------------------------------------------
# ● 装備の変更
# slot_id : 装備スロット ID
# item : 武器/防具(nil なら装備解除)
#--------------------------------------------------------------------------
def change_equip(slot_id, item, dev_flag = false)
return unless trade_item_with_party(item, equips[slot_id])
return if item && equip_slots[slot_id] != item.etype_id
if equip_slots.size > @equips.size
size = equip_slots.size - @equips.size
size.times { @equips.push(Game_BaseItem.new) }
end
@equips[slot_id].object = item
return if dev_flag
skill_slot_reset
release_unequippable_items
refresh
end
#--------------------------------------------------------------------------
# ● スキルスロット数の更新
#--------------------------------------------------------------------------
def skill_slot_reset
if equip_slots.size > @equips.size
size = equip_slots.size - @equips.size
size.times { @equips.push(Game_BaseItem.new) }
elsif equip_slots.size < @equips.size
size = @equips.size - equip_slots.size
size.times do
change_equip(-1, nil, true)
@equips.pop
end
end
end
#--------------------------------------------------------------------------
# ● 装備を全て外す
#--------------------------------------------------------------------------
def clear_equipments
5.times do |i|
change_equip(i, nil) if equip_change_ok?(i)
end
end
#--------------------------------------------------------------------------
# ● 最強装備
#--------------------------------------------------------------------------
def optimize_equipments
clear_equipments
4.times do |i|
next if !equip_change_ok?(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
end
#--------------------------------------------------------------------------
# ● 装備スロットの配列を取得
#--------------------------------------------------------------------------
def equip_slots
slot = [0,1,2,3] # 通常
slot = [0,0,2,3] if dual_wield? # 二刀流
skill_slots.times { slot.push(4) }
return slot
end
#--------------------------------------------------------------------------
# ● スキルスロットの最大数を取得
#--------------------------------------------------------------------------
def skill_slots
if dual_wield?
slot1 = set_skill_slots(weapons[0])
slot2 = set_skill_slots(weapons[1])
slot = slot1 + slot2
else
slot = set_skill_slots(weapons[0])
end
return [[slot, slot].min, 1].max
end
#--------------------------------------------------------------------------
# ● スキルスロットの最大数を設定
#--------------------------------------------------------------------------
def set_skill_slots(weapon)
return 0 if weapon == nil
n = /<技能槽\s+(\d+)>/ =~ weapon.note ? $1.to_i : 1 #被修改
return n
end
end
#==============================================================================
# ■ Window_EquipSlot
#------------------------------------------------------------------------------
# 装備画面で、アクターが現在装備しているアイテムを表示するウィンドウです。
#==============================================================================
class Window_EquipSlot < Window_Selectable
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
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)) if index <= 4
draw_item_name(@actor.equips[index], rect.x + 92, rect.y, enable?(index))
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
create_contents
draw_all_items
end
end
#==============================================================================
# ■ Window_Status
#------------------------------------------------------------------------------
# ステータス画面で表示する、フル仕様のステータスウィンドウです。
#==============================================================================
class Window_Status < Window_Selectable
#--------------------------------------------------------------------------
# ● ブロック 3 の描画
#--------------------------------------------------------------------------
def draw_block3(y)
draw_parameters(32, y)
end
end
#==============================================================================
# ■ Window_StatusEquip
#------------------------------------------------------------------------------
# ステータス画面で、アクターが現在装備しているアイテムを表示するウィンドウです。
#==============================================================================
class Window_StatusEquip < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
x = 272
y = line_height * 7
width = 224
super(x, y, width, window_height)
self.back_opacity = 0
self.opacity = 0
self.active = true
self.index = 0
[url=home.php?mod=space&uid=95897]@actor[/url] = nil
refresh
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
fitting_height(visible_line_number)
end
#--------------------------------------------------------------------------
# ● 表示行数の取得
#--------------------------------------------------------------------------
def visible_line_number
return 6
end
#--------------------------------------------------------------------------
# ● アクターの設定
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if @item_window
@item_window.slot_id = index < 4 ? index : 4
end
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
@actor ? @actor.equip_slots.size : 0
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def item
@actor ? @actor.equips[index] : nil
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
return unless @actor
rect = item_rect_for_text(index)
change_color(system_color, true)
draw_item_name(@actor.equips[index], rect.x, rect.y, true)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
create_contents
draw_all_items
end
end
#==============================================================================
# ■ Scene_Status
#------------------------------------------------------------------------------
# ステータス画面の処理を行うクラスです。
#==============================================================================
class Scene_Status < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
super
@status_window = Window_Status.new(@actor)
@status_window.set_handler(:cancel, method(:return_scene))
@status_window.set_handler(:pagedown, method(:next_actor))
@status_window.set_handler(:pageup, method(:prev_actor))
create_slot_window
end
#--------------------------------------------------------------------------
# ● スロットウィンドウの作成
#--------------------------------------------------------------------------
def create_slot_window
@slot_window = Window_StatusEquip.new
@slot_window.actor = @actor
end
#--------------------------------------------------------------------------
# ● アクターの切り替え
#--------------------------------------------------------------------------
def on_actor_change
@status_window.actor = @actor
@status_window.activate
@slot_window.actor = @actor
end
end