#==============================================================================
# ■ 连击效果(完美版) v1.3 by SailCat
#------------------------------------------------------------------------------
# 数据库设定(特技):
# 描述:原描述 #hc=连击次数
# 例如:恢复中量HP #hc=2
# 对鸟系敌人特效 #hc=9
# 注意这是连击次数,实际攻击的回数是这个回数+1回。
# 连击次数是负数的话,将取绝对值处理。
# 视觉效果是发动动画只放1回,击中动画放N回,伤害值显示N次,
# 所以,如使用了齐时战斗的话,要修改倒数第四行,该行内容为:
# @phase4_step = 4
# 改为@phase4_step = 3
# 其他:RTAB不适用
#==============================================================================
module Data_Note
#--------------------------------------------------------------------------
# ● 常量
#--------------------------------------------------------------------------
SEPARATOR = "#" # 备注与正文的分隔符,可以更改为其他字符
SEP_REGEX = /#{SEPARATOR}.+$/ # 切分用正则表达式,请不要修改
#--------------------------------------------------------------------------
# ● 备注值(注:不可运行时修改)
#--------------------------------------------------------------------------
def note
# 如果是公共事件,用前面的注释
if self.is_a?(RPG::CommonEvent)
if @note.nil?
index = 0
index += 1 while list[index].code == 108 or list[index].code == 408
@note = (list[0...index].collect {|x| x.parameters[0]}).join(";")
end
# 如果是队伍,用第1页前面的注释
elsif self.is_a?(RPG::Troop)
if @note.nil?
list = pages[0].list
index = 0
index += 1 while list[index].code == 108 or list[index].code == 408
@note = split((list[0...index].collect {|x| x.parameters[0]}).join(";"))
end
# 如果是其他,用描述或者名称来备注
else
@note ||= has_description? ? split(@description) : split(@name)
end
end
#--------------------------------------------------------------------------
# ● 取得备注值
#--------------------------------------------------------------------------
def method_missing(param_name, *args, &block)
return get_note(param_name.to_s, args[0])
end
#--------------------------------------------------------------------------
# ● 是否有描述字段(内部使用)
#--------------------------------------------------------------------------
def has_description?
instance_variables.include?("@description")
end
#--------------------------------------------------------------------------
# ● 切分备注用字段(内部使用)
#--------------------------------------------------------------------------
def split(text)
text.slice(SEP_REGEX).to_s
end
#--------------------------------------------------------------------------
# ● 取得备注参数值(内部使用或重名时使用)
#--------------------------------------------------------------------------
def get_note(param_name, default = nil)
return default if note == ""
param_regex = /^#{param_name}\b([+:=\-]?(.*?))$/
@note_array ||= @note[1, @note.length - 1].split(";")
@note_array.each do |x|
if x[param_regex] != nil
value = $1
# 开关型(+)
if value.strip == "" or value[0] == 43
return true
# 开关型(-)
elsif value[0] == 45
return false
# 数值型
elsif value[0] == 61
return (eval($2) rescue default)
# 字符型
elsif value[0] == 58
return $2
# 不能识别
else
return nil
end
end
end
return default
end
end
#==============================================================================
# ■ RPG 模块的植入
#------------------------------------------------------------------------------
# 以下植入12个数据库内容模块
#==============================================================================
module RPG
[Actor, Class, Enemy, State, Animation, Tileset].each do |c|
c.send :include, Data_Note
c.send :define_method, :name do
@name1 ||= @name.sub(Data_Note::SEP_REGEX) {|s| ""}
end
c.send :define_method, :name= do |value|
@name1 = value
@name = value + Data_Note::SEPARATOR + note
end
end
[Item, Skill, Weapon, Armor].each do |c|
c.send :include, Data_Note
c.send :define_method, :description do
@description1 ||= @description.sub(Data_Note::SEP_REGEX) {|s| ""}
end
c.send :define_method, :description= do |value|
@description1 = value
@description = value + Data_Note::SEPARATOR + note
end
end
[Troop, CommonEvent].each do |c|
c.send :include, Data_Note
end
end
#==============================================================================
# ■ 连击效果实装
#==============================================================================
module RPG
class Skill; def hit_count; hc(0).abs; end; end
class Sprite < ::Sprite
def effect?
@_whiten_duration > 0 or
@_appear_duration > 0 or
@_escape_duration > 0 or
@_animation_duration > 0
end
def damage_effect?
@_damage_duration > 0 or
@_collapse_duration > 0
end
end
end
class Spriteset_Battle
def damage_effect?
for sprite in @enemy_sprites + @actor_sprites
return true if sprite.damage_effect?
end
return false
end
end
class Scene_Battle
unless method_defined? :sailcat_update_phase4_step1
alias sailcat_update_phase4_step1 update_phase4_step1
alias sailcat_make_skill_action_result make_skill_action_result
alias sailcat_update_phase4_step5 update_phase4_step5
end
def update_phase4_step1
@hit_count = 0
sailcat_update_phase4_step1
end
def make_skill_action_result
sailcat_make_skill_action_result
@hit_count = @skill.hit_count
end
def update_phase4_step5
sailcat_update_phase4_step5
if @hit_count > 0
for target in @target_battlers.clone
if target.dead?
if @target_battlers.size > 1
@target_battlers.delete(target)
else
@target_battlers.delete(target)
if target.is_a?(Game_Enemy)
target = $game_troop.smooth_target_enemy(target.index)
else
target = $game_party.smooth_target_actor(target.index)
end
if target.is_a?(Game_Battler)
@target_battlers.push(target)
end
end
end
end
if @target_battlers.size == 0
return
end
for target in @target_battlers
if target.damage != nil
@phase4_step = 5
return
end
target.skill_effect(@active_battler, @skill)
end
# 如果你应用了23种战斗特效的公共事件版脚本请去掉下面几行的注释
# if @common_event_id > 0
# common_event = $data_common_events[@common_event_id]
# $game_system.battle_interpreter.setup(common_event.list, 0)
# end
@hit_count -= 1
@phase4_step = 4
end
end
end