#==============================================================================
# □ 装備欄拡張(for VX)
#------------------------------------------------------------------------------
# Version : 2_20120407
# by サリサ・タイクーン
# [url]http://www.tycoon812.com/rgss/[/url]
#==============================================================================
#==============================================================================
# □ 素材スイッチ
#==============================================================================
$rgsslab = {} if $rgsslab == nil
$rgsslab["装備欄拡張"] = true
if $rgsslab["装備欄拡張"]
#==============================================================================
# □ カスタマイズポイント
#==============================================================================
module RGSSLAB end
module RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ○ 新しく追加する装備部位名
# 新しい部位の設定を行います。
#
# 0番目から順に、5、6、7…と関連付けられます。
#
# 又、装備画面において、部位名称も
# ここで記述した文字列が使われます。
#--------------------------------------------------------------------------
APPEND_ARMOR_PART = [
"腰带", # 部位番号5 : 耳
"手套", # 部位番号6 : 足
"鞋子", # 部位番号7 : 腕
"戒指", # 部位番号8 : 腕
"项链", # 部位番号9 : 腕
"星尘", # 部位番号10 : 腕
]
#--------------------------------------------------------------------------
# ○ 装備部位の文字列設定
# 防具のメモ欄において、記述する文字列を指定します。
#
# メモ欄に、[ + ARMOR_PART_NOTEの値 + 部位番号 +] と記述して
# 装備部位を変更します。
# (部位以外の設定は、そのまま引き継がれます)
#
# 例:
# ARMOR_PART_NOTEの値が"部位番号:"で、部位番号が5の場合
# [部位番号:5] と記述します。
#--------------------------------------------------------------------------
ARMOR_PART_NOTE = "部位番号:"
#--------------------------------------------------------------------------
# ○ 装備欄の配列設定
# アクター毎に装備部位を指定します。
#
# ・記述方法
# アクターID => [2番目の部位, …],
# (最後の設定のみ、後ろのカンマを省略する事ができます)
#
# ・部位番号について
# 1 : 盾
# 2 : 頭
# 3 : 身体
# 4 : 装飾品
# 5以降 : この素材で定義した部位番号に対応
#--------------------------------------------------------------------------
EQUIP_SLOTS_ARRAY = {
1 => [1, 2, 3, 5, 6, 7, 8,9,10],
}
#--------------------------------------------------------------------------
# ○ 二刀流時の装備無効化設定
# 二刀流のアクターのみ影響を受ける設定です。
#
# ・記述方法
# アクターID => 無効にしたいEQUIP_SLOTS_ARRAYの添字番号,
# (最後の設定のみ、後ろのカンマを省略する事ができます)
#
# 上記に書かれていないアクターは、常に0番目として設定されます。
#--------------------------------------------------------------------------
TWO_SWORD_STYLE_SETTING = {
1 => 0,
}
#--------------------------------------------------------------------------
# ○ 逆手判定
# 逆手(主に両手持ち違反の際に判定される時に使用)の設定を行います。
#
# ・記述方法
# アクターID => 逆手として判定させたいEQUIP_SLOTS_ARRAYの添字番号,
# (最後の設定のみ、後ろのカンマを省略する事ができます)
#
# 上記に書かれていないアクターは、常に1番目として設定されます。
#--------------------------------------------------------------------------
TWO_HANDS_LEGAL = {
1 => 1,
}
#--------------------------------------------------------------------------
# ○ 初期装備の設定
# EQUIP_SLOTS_ARRAYの関係上、データベースでの設定では
# 合致しない場合もある上に、追加した部位まで反映されません。
#
# そこで、この素材による設定で初期装備を行いたいアクターのみ
# INITIALIZE_EQUIPに設定する事で、解決させます。
# (記述されていないアクターは、データベースの初期装備が行われます)
#
# ・記述方法
# アクターID => [部位内容],
# (最後の設定のみ、後ろのカンマを省略する事ができます)
#
# 部位内容については
# 武器+二刀流のアクター時の武器+EQUIP_SLOTS_ARRAYの配列として
# 設定する必要があります。
# (二刀流アクターでない場合は、二刀流のアクター時の武器は省きます)
#--------------------------------------------------------------------------
INITIALIZE_EQUIP = {
}
end
# カスタマイズポイントは、ここまで
#==============================================================================
# □ RGSSLAB::Equipment_Slots_Extension [module]
#==============================================================================
module RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ○ 素材設定用の定数定義
#--------------------------------------------------------------------------
MATERIAL_NAME = "装備欄拡張"
VERSION = 2
RELEASE = 20120407
end
#==============================================================================
# ■ Game_Actor [class]
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ○ モジュールの設定
#--------------------------------------------------------------------------
RGSSLAB_039 = RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :equip_array
attr_reader :equip_slots
#--------------------------------------------------------------------------
# ● セットアップ [エイリアス]
#--------------------------------------------------------------------------
alias equipment_slots_extension_setup setup
def setup(actor_id)
equipment_slots_extension_setup(actor_id)
setup_equipment_slots_extension
end
#--------------------------------------------------------------------------
# ○ 装備欄拡張のセットアップ [プライベート]
#--------------------------------------------------------------------------
def setup_equipment_slots_extension
setup_equip_slots
setup_equip_array
cancellation_equipment
setup_update_auto_state_process if $rgsslab["オートステート実装"]
end
#--------------------------------------------------------------------------
# ○ 装備の無効化 [プライベート]
#--------------------------------------------------------------------------
def cancellation_equipment
@weapon_id = 0
@armor1_id = 0
@armor2_id = 0
@armor3_id = 0
@armor4_id = 0
end
#--------------------------------------------------------------------------
# ○ 装備欄の配列のセットアップ [プライベート]
#--------------------------------------------------------------------------
def setup_equip_slots
if RGSSLAB_039::EQUIP_SLOTS_ARRAY[@actor_id]
@equip_slots = [0]
RGSSLAB_039::EQUIP_SLOTS_ARRAY[@actor_id].each {|i|
@equip_slots.push(i) if slots_check(i)
}
else
@equip_slots = [0, 1, 2, 3, 4]
end
if self.two_swords_style
@equip_slots.delete_at(RGSSLAB_039::TWO_SWORD_STYLE_SETTING[@actor_id] + 1) if RGSSLAB_039::TWO_SWORD_STYLE_SETTING[@actor_id]
@equip_slots.insert(1, 0)
end
end
#--------------------------------------------------------------------------
# ○ 装備部位のチェック [プライベート]
# slot_id : 部位番号
#--------------------------------------------------------------------------
def slots_check(slot_id)
return true if slot_id <= 4 && slot_id > 0
return true if RGSSLAB_039::APPEND_ARMOR_PART[slot_id - 5]
return false
end
#--------------------------------------------------------------------------
# ○ 装備配列のセットアップ [プライベート]
#--------------------------------------------------------------------------
def setup_equip_array
@equip_array = []
if RGSSLAB_039::INITIALIZE_EQUIP[@actor_id]
@equip_slots.each_index {|i|
@equip_array.push(RGSSLAB_039::INITIALIZE_EQUIP[@actor_id][i])
}
else
@equip_slots.each {|i|
case i
when 0 ; @equip_array.push(@weapon_id)
when 1 ; @equip_array.push(@armor1_id)
when 2 ; @equip_array.push(@armor2_id)
when 3 ; @equip_array.push(@armor3_id)
when 4 ; @equip_array.push(@armor4_id)
else ; @equip_array.push(0)
end
}
end
end
#--------------------------------------------------------------------------
# ○ アクセス制限の設定
#--------------------------------------------------------------------------
private :setup_equipment_slots_extension
private :cancellation_equipment
private :setup_equip_slots
private :slots_check
private :setup_equip_array
#--------------------------------------------------------------------------
# ● 武器オブジェクトの配列取得 [再構築]
#--------------------------------------------------------------------------
def weapons
result = []
return result if @equip_array == nil
unless two_swords_style
result.push($data_weapons[@equip_array[0]])
else
@equip_slots.each_with_index {|i, s|
result.push($data_weapons[@equip_array[s]]) if i == 0
}
end
return result
end
#--------------------------------------------------------------------------
# ● 防具オブジェクトの配列取得 [再構築]
#--------------------------------------------------------------------------
def armors
result = []
return result if @equip_array == nil
@equip_slots.each_with_index {|i, s|
result.push($data_armors[@equip_array[s]]) unless i == 0
}
return result
end
#--------------------------------------------------------------------------
# ● 装備オブジェクトの配列取得 [再構築]
#--------------------------------------------------------------------------
def equips
result = []
@equip_slots.each_with_index {|i, s|
if i == 0
result.push($data_weapons[@equip_array[s]])
else
result.push($data_armors[@equip_array[s]])
end
}
return result
end
#--------------------------------------------------------------------------
# ● 装備の変更:オブジェクトで指定 [再構築]
# equip_type : 欄の位置
# item : 武器/防具 (nil なら装備解除)
# test : テストフラグ (戦闘テスト、または装備画面での一時装備)
#--------------------------------------------------------------------------
def change_equip(equip_type, item, test = false)
last_item = equips[equip_type]
unless test
return if $game_party.item_number(item) == 0 if item != nil
$game_party.gain_item(last_item, 1)
$game_party.lose_item(item, 1)
end
item_id = item == nil ? 0 : item.id
@equip_array[equip_type] = item_id
case equip_type
when 0 ; change_equip(two_hands_index_check, nil, test) unless two_hands_legal?
when two_hands_index_check ; change_equip(0, nil, test) unless two_hands_legal?
end
end
#--------------------------------------------------------------------------
# ○ 逆手判定
#--------------------------------------------------------------------------
def two_hands_index_check
if RGSSLAB_039::TWO_HANDS_LEGAL[@actor_id]
return RGSSLAB_039::TWO_HANDS_LEGAL[@actor_id]
else
return 1
end
end
#--------------------------------------------------------------------------
# ● 装備の破棄 [再構築]
# item : 破棄する武器/防具
#--------------------------------------------------------------------------
def discard_equip(item)
@equip_array.each_index do |index|
@equip_array[index] = 0 if index == item.id
end
end
#--------------------------------------------------------------------------
# ● 両手装備合法判定 [再構築]
#--------------------------------------------------------------------------
def two_hands_legal?
if weapons[0] != nil and weapons[0].two_handed
return false if @equip_array[two_hands_index_check] != 0
end
if weapons[1] != nil and weapons[1].two_handed
return false if @equip_array[0] != 0
end
return true
end
#--------------------------------------------------------------------------
# ● 職業 ID の変更 [再構築]
# class_id : 新しい職業 ID
#--------------------------------------------------------------------------
def class_id=(class_id)
@class_id = class_id
@equip_array.each_index do |index|
change_equip(index, nil) unless equippable?(equips[index])
end
end
end
#==============================================================================
# ■ Window_Equip [class]
#==============================================================================
class Window_Equip < Window_Selectable
#--------------------------------------------------------------------------
# ○ モジュールの設定
#--------------------------------------------------------------------------
RGSSLAB_039 = RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ● オブジェクト初期化 [再構築]
# x : ウィンドウの X 座標
# y : ウィンドウの Y 座標
# actor : アクター
#--------------------------------------------------------------------------
def initialize(x, y, actor)
super(x, y, 336, WLH * 5 + 32)
self.contents.dispose
self.contents = Bitmap.new(width - 32, (actor.equip_slots.size * WLH))
@actor = actor
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● リフレッシュ [再構築]
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@data = []
for item in @actor.equips do @data.push(item) end
@item_max = @data.size
@data.each_index do |index|
self.contents.font.color = system_color
self.contents.draw_text(4, WLH * index, 92, WLH, slot_name(@actor.equip_slots[index]))
draw_item_name(@data[index], 92, WLH * index)
end
end
#--------------------------------------------------------------------------
# ○ 装備スロットの名前を取得
# index : 部位番号
#--------------------------------------------------------------------------
def slot_name(index)
a = $data_system.terms
array = [a.weapon, a.armor1, a.armor2, a.armor3, a.armor4]
for i in 0...RGSSLAB_039::APPEND_ARMOR_PART.size do array.push(RGSSLAB_039::APPEND_ARMOR_PART[i]) end
array[1] = a.weapon if @actor.two_swords_style
return @actor ? array[index] : ""
end
end
#==============================================================================
# ■ Scene_Equip [class]
#==============================================================================
class Scene_Equip < Scene_Base
#--------------------------------------------------------------------------
# ○ モジュールの設定
#--------------------------------------------------------------------------
RGSSLAB_039 = RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ● アイテムウィンドウの作成 [再定義]
#--------------------------------------------------------------------------
def create_item_windows
equip_size = EQUIP_TYPE_MAX
ax = 0
ay = 0
if $rgsslab["装備欄拡張"]
equip_size = @actor.equip_slots.size
end
if $rgsslab["XP画面サイズ"]
ax = 48
ay = 32
end
@item_windows = []
for i in 0...equip_size
if $rgsslab["装備欄拡張"]
@item_windows[i] = Window_EquipItem.new(0 + ax, 208 + ay, 544, 208, @actor, @actor.equip_slots[i])
else
@item_windows[i] = Window_EquipItem.new(0 + ax, 208 + ay, 544, 208, i)
end
@item_windows[i].help_window = @help_window
@item_windows[i].visible = (@equip_index == i)
@item_windows[i].y = 208 + ay
@item_windows[i].height = 208
@item_windows[i].active = false
@item_windows[i].index = -1
end
end
#--------------------------------------------------------------------------
# ● アイテムウィンドウの更新 [再構築]
#--------------------------------------------------------------------------
def update_item_windows
for i in [email]0...@actor.equip_slots.size[/email]
@item_windows[i].visible = (@equip_window.index == i)
@item_windows[i].update
end
@item_window = @item_windows[@equip_window.index]
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウの更新 [再構築]
#--------------------------------------------------------------------------
def update_status_window
if @equip_window.active
@status_window.set_new_parameters(nil, nil, nil, nil)
elsif @item_window.active
temp_actor = @actor.dup
temp_array = @actor.equip_array.dup
temp_actor.change_equip(@actor.equip_slots[@equip_window.index], @item_window.item, true)
@actor.equip_array = temp_array
new_atk = temp_actor.atk
new_def = temp_actor.def
new_spi = temp_actor.spi
new_agi = temp_actor.agi
@status_window.set_new_parameters(new_atk, new_def, new_spi, new_agi)
end
@status_window.update
end
end
#==============================================================================
# ■ Scene_Title [class]
#==============================================================================
class Scene_Title
#--------------------------------------------------------------------------
# ○ モジュールの設定
#--------------------------------------------------------------------------
RGSSLAB_039 = RGSSLAB::Equipment_Slots_Extension
#--------------------------------------------------------------------------
# ● 開始処理 [エイリアス]
#--------------------------------------------------------------------------
alias equips_extension_start start
def start
equips_extension_start
setting
end
#--------------------------------------------------------------------------
# ● 戦闘テスト [再定義]
#--------------------------------------------------------------------------
def battle_test
load_bt_database
create_game_objects
setting
Graphics.frame_count = 0
$game_party.setup_battle_test_members
if $rgsslab["戦闘テスト拡張"] && $BTEST
$scene = Scene_BattleTest_Setting.new
else
$scene = Scene_Battle.new
end
end
#--------------------------------------------------------------------------
# ○ 装備部位の変更
#--------------------------------------------------------------------------
def setting
for i in 1...$data_armors.size
if $data_armors[i].note[/\[#{RGSSLAB_039::ARMOR_PART_NOTE}(\d+)\]/]
$data_armors[i].kind = $data_armors[i].note[/\[#{RGSSLAB_039::ARMOR_PART_NOTE}(\d+)\]/].scan(/(\d+)/)[0][0].to_i - 1
end
end
end
end
end