#==============================================================================
# ■ Set_Armor 套装插件脚本 by SailCat
#------------------------------------------------------------------------------
# 说明:支持数据库直接设定套装效果的轻量化插件式脚本。
# 由于本脚本基本上没有改动系统内容,故冲突可能性很低,除了和其他套装脚本冲突
# 以外,基本没有冲突。
# 使用方法:插入Main之前即可使用
# 数据库设定规则:
# 1.状态:将状态命名为“[套装名称]件数”的形式(如[密斯利尔]2),可以将该状态
# 定义为装备“密斯利尔”套2件时所附加的状态。
# 套装的加成奖励通过调节状态的参数来实现,注意定量最好设为0。
# 件数最小为1,最大不能超过5,否则是无效的。
# 有多个同名状态的话,则满足条件时都会附加,可借此突破状态的200%加成上限。
# 2.武器/防具:只需将武器/防具的名称开头部分设定为与套装名称相同即可。
# 如“密斯利尔”套装,只要将武器命名为“密斯利尔剑”、“密斯利尔的刃”,甚至
# “密斯利尔的乱七八糟”都可以使得该武器成为套装组件,不需要通过脚本设定。
# 3.同一位置上如果存在多个可能的武器/防具,都属于套装组件,之间是互相替换的关
# 系,如[密斯利尔剑]和[密斯利尔枪]。
# 4.如确有必要,可以在脚本中104行之后手工定义套装、组件和状态,概不赘述。
#==============================================================================
#==============================================================================
# ■ RPG::State
#------------------------------------------------------------------------------
# 对状态数据库的重新解释。
#==============================================================================
module RPG
class State
# 是否为套装用状态(首字母为左方括号)
def is_set_state?
return name[0, 1] == "["
end
# 套装名称
def set_name
if not is_set_state?
return ""
elsif name[/^\[.*\]/] == nil
return ""
else
set = name[/^\[.*\]/]
return set[1, set.length - 2]
end
end
# 触发状态的件数
def set_count
if set_name == ""
return 0
else
return name.gsub(/^\[.*\]/, "").to_i
end
end
end
end
#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
# 处理同伴的类。包含金钱以及物品的信息。本类的实例
# 请参考 $game_party。
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# ● 追加实例变量
#--------------------------------------------------------------------------
attr_accessor :data_set_states # 套装状态清单 Hash
attr_accessor :data_set_items # 套装组件清单 Hash
#--------------------------------------------------------------------------
# ● 初始化套装数据
#--------------------------------------------------------------------------
def init_data_sets
@data_set_states = {}
@data_set_items = {}
# 扫描所有状态,取得套装状态清单
for state in $data_states[1...$data_states.size]
if state.is_set_state?
unless @data_set_states.include?(state.set_name)
@data_set_states[state.set_name] = {}
end
unless @data_set_states[state.set_name].include?(state.set_count)
@data_set_states[state.set_name][state.set_count] = []
end
@data_set_states[state.set_name][state.set_count].push(state.id)
@data_set_items[state.set_name] = []
end
end
# 检索所有武器,将符合套装名称的武器加入组件清单
for weapon in $data_weapons[1...$data_weapons.size]
for state_name in @data_set_states.keys
if weapon.name[0, state_name.length] == state_name
@data_set_items[state_name].push(-weapon.id)
end
end
end
# 检索所有防具,将符合套装名称的防具加入组件清单
for armor in $data_armors[1...$data_weapons.size]
for state_name in @data_set_states.keys
if armor.name[0, state_name.length] == state_name
@data_set_items[state_name].push(armor.id)
end
end
end
end
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# 处理角色的类。本类在 Game_Actors 类 ($game_actors)
# 的内部使用、Game_Party 类请参考 ($game_party) 。
#==============================================================================
class Game_Actor < Game_Battler
alias sailcat_equip equip
alias sailcat_setup setup
#--------------------------------------------------------------------------
# ● 追加实例变量
#--------------------------------------------------------------------------
attr_accessor :active_sets # 当前已上身的套装
#--------------------------------------------------------------------------
# ● 设置
# actor_id : 角色 ID
#--------------------------------------------------------------------------
def setup(actor_id)
sailcat_setup(actor_id)
# 清除上身套装列表
@active_sets = []
# 更新套装状态
update_set_state
end
#--------------------------------------------------------------------------
# ● 变更装备
# equip_type : 装备类型
# id : 武器 or 防具 ID (0 为解除装备)
#--------------------------------------------------------------------------
def equip(equip_type, id)
sailcat_equip(equip_type, id)
# 更新套装状态
update_set_state
end
#--------------------------------------------------------------------------
# ● 更新套装状态
#--------------------------------------------------------------------------
def update_set_state
# 如果数据没有初始化就初始化
$game_party.init_data_sets if $game_party.data_set_states == nil
# 获得当前装备
my_armor_ids = [-@weapon_id, @armor1_id, @armor2_id, @armor3_id, @armor4_id]
# 循环所有套装
for set_name in $game_party.data_set_items.keys
# 获得套装中装备的上身件数
item_count = (my_armor_ids & $game_party.data_set_items[set_name]).size
# 需要解除的状态列表
remove_set = [1, 2, 3, 4, 5]
# 如果件数至少为1件
if item_count > 0
# 更新上身套装列表
@active_sets.push(set_name) unless @active_sets.include?(set_name)
# 附加对应的套装状态
add_set_states(set_name, item_count)
# 删除当前件数
remove_set.delete(item_count)
# 如果件数为0件,且之前上身的套装列表中包含当前套装
elsif @active_sets.include?(set_name)
# 取消当前套装
@active_sets.delete(set_name)
# 和当前套装无关的情况下
else
# 什么也不做
remove_set.clear
end
# 解除件数不相符合的的套装状态
for i in remove_set
remove_set_states(set_name, i)
end
end
end
#--------------------------------------------------------------------------
# ● 附加套装状态
# set_name : 套装名称
# count : 件数
#--------------------------------------------------------------------------
def add_set_states(set_name, count)
# 循环所有状态,逐一附加
unless $game_party.data_set_states[set_name][count] == nil
for state_id in $game_party.data_set_states[set_name][count]
add_state(state_id, true)
end
end
end
#--------------------------------------------------------------------------
# ● 解除套装状态
# set_name : 套装名称
# count : 件数
#--------------------------------------------------------------------------
def remove_set_states(set_name, count)
# 循环所有状态,逐一解除
unless $game_party.data_set_states[set_name][count] == nil
for state_id in $game_party.data_set_states[set_name][count]
remove_state(state_id, true)
end
end
end
end