Project1
标题:
这个战斗qte脚本,靠装备备注内容判定,我想增加个状态判定
[打印本页]
作者:
asddsa16085
时间:
2024-1-21 21:04
标题:
这个战斗qte脚本,靠装备备注内容判定,我想增加个状态判定
要怎么添加进去呢,就是靠状态判定是否来进行qte或者状态的备注来进行判断qte?
#------------------------------------------------------------------------------#
# Galv的战斗用QTE限时按钮脚本
#------------------------------------------------------------------------------#
# 用于RPGMAKER VX ACE
# Version 1.7
#------------------------------------------------------------------------------#
# 2013-04-25 - Version 1.7 - 添加了与Yanfly的投射动画脚本的兼容性。
# 2013-04-17 - Version 1.6 - 修正了战斗结束后的一个比较大的bug
# 2013-04-17 - Version 1.5 - 修正了在Yanfly的战斗脚本中,即使设定必中,
# - 仍会弹出闪避的bug
# - 添加了对战斗提早结束但指针仍在活跃这一状况的修复
# 2013-04-08 - Version 1.4 - 修正防御指针并未指向正确角色的bug
# 2013-03-15 - Version 1.3 - 修正动画设定
# 2013-03-15 - Version 1.2 - 修正未按下按钮时出现的bug
# 2013-03-15 - Version 1.1 - 增加关闭战斗文字提示的设置方案
# - 当角色处于混乱状态时关闭攻击指针
# - 修复与Yanfly战斗引擎的兼容bug
# 2013-03-11 - Version 1.0 - 发布
#------------------------------------------------------------------------------#
# 为选中的攻击指令添加一个图形指针,使玩家若在特定时刻按中按钮时激发额外效果。
# 该效果可能是提高伤害、增加防御,增加效果或移除效果。不同类型的攻击可对应
# 不同的按钮和图形,且可设定多种速度与QTE难度。
#
# 注意: 把本脚本插在一些其他战斗用插件脚本下面. 在默认战斗系统和Yanfly的默认
# 战斗引擎脚本下已经测试过,可以兼容。
#
# 还要注意: 若指针消失得太快, 请提高数据库中动画库的对应技能动画的帧数.
#
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# 在技能或物品的备注中写
#------------------------------------------------------------------------------#
#
# <btnpress> # 允许技能使用QTE,并在成功后播放闪光或声效
# 或
# <btnpress n> # 允许技能使用QTE,并在成功后播放编号为n的动画
# # 这会导致原本的技能动画设定被取消
#
# # 注意: 对同一技能来说,两个标签只需要写其中一个,不要都写
#
#------------------------------------------------------------------------------#
# 在技能或物品的备注中写(省略部分项目,则被省略的项采用默认设置)
#------------------------------------------------------------------------------#
#
# <btn x> # 设定另一个按钮 (默认:X)
# <btnmsg x> # 当成功击中时,用另一个提示编号
#
# <btnmultiply x> # 若QTE击中,伤害或治疗值乘以x倍 (默认2)
#
# <btnstates x,x,x> # 若QTE击中,则添加id为x的状态
# <btnrstates x,x,x> # 若QTE击中,则移除id为x的状态
#
# <btnopt a,b,c,d> # a = 开始时间(在指针移动前的准备时刻)
# # b = 目标时间(按钮被正确按下的时刻)
# # c = 预备使用的指针图像编号
# # d = 难度等级. 数字越大越容易击中.
#
# # 开始时间时,指针出现,并且逐渐缩小以接近目标圈。在目标时间时恰好达到
# # 目标圈的位置,此时此刻即为玩家应当按下按钮的有效时间。
# # 默认设定: a = 0 b = 31 c = 1 d = 0
#------------------------------------------------------------------------------#
# 例如:
#
# <btnpress 4> # 本技能使用QTE,并在击中后播放编号为4的动画
# <btn Y> # 改用:Y键作为待按下的键 (即键盘上的"s"键)
# <btnmultiply 3> # 击中后3倍伤害
# <btnstates 2,3> # 击中后目标添加状态库2,3号状态
# <btnrstates 5,6,7> # 击中后目标移除状态库5,6,7号状态
# <btnopt 10,61,2,0> # 指针活跃时间为第10到第61帧
# # 改用2号指针图形;难度不变
#
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# 在角色或装备的备注中写 - 这部分用于设置防御QTE
#------------------------------------------------------------------------------#
#
# <btnpress> # 允许角色或装备使用防御QTE
# 或
# <btnpress n> # 允许角色或装备使用防御QTE,且成功时播放动画库编号为n的动画。
# # 若使用横版战斗脚本时,只能采用本条标签。
# # 只对技能动画直接落在角色身上的横版战斗脚本起作用。
#
# # 注意: 某个角色或他当时的装备,只需要有一个填写标签即可,无需同时填写。
#
#------------------------------------------------------------------------------#
# 在角色或装备的备注中写设定(省略部分项目,则被省略的项采用默认设置)
#------------------------------------------------------------------------------#
# <btn x> # 设定另一个按钮 (默认:Z)
# <btnmsg x> # 当成功击中时,用另一个提示编号
#
# <btnmultiply x> # 若QTE击中,伤害或治疗值乘以x倍 (默认0.5)
#
# <btnstates x,x,x> # 若QTE击中,则添加id为x的状态
# <btnrstates x,x,x> # 若QTE击中,则添加移除为x的状态
#
# <btnopt a,b,c,d> # a = 开始时间(在指针移动前的准备时刻)
# # 默认设定: a = 0 b = 31 c = 3 d = 0
#
#------------------------------------------------------------------------------#
#($imported ||= {})["Galv_BtnPress_Hit"] = true
#module Galv_BtnAtk
#------------------------------------------------------------------------------#
# 预备设定
#------------------------------------------------------------------------------#
#---------------#
# 参数设定 #
#---------------#
#GUARANTEE_HIT = true # 若玩家QTE成功击中,则打击不可能落空
#SHOW_AS_CRIT = true # 对敌伤害显示为暴击伤害
#ATK_MULTIPLIER = 2 # 击中QTE时的默认伤害倍率为2
#DEF_MULTIPLIER = 0.5 # 默认防御倍率为0.5
#DIFFICULTY = 1 # 难度系数:数字越大,被允许判定为成功击中的范围越大
# 所以击中QTE就变得越简单
# 设置为0的时候是最难的
#DISABLE_SWITCH = 194 # 打开194号开关以关闭QTE功能
#ATK_BTN = :X # 默认的攻击按键:X指的是"a"
#DEF_BTN = :Z # 默认的攻击按键:Z指的是"d"
#Y_OFFSET = -50 # 设置QTE图像的Y坐标的位置,默认为-50.
# 0的位置设置在战斗人员的底部。
#Y_FRONT_OFFSET = 0 # 当你使用未设定己方角色x,y坐标的战斗系统时,
#X_FRONT_OFFSET = 0 # 针对以你的队伍为目标的攻击,设置QTE图像的X和Y坐标
# 默认情况下它的中心在战斗状态窗口的顶端.
#---------------#
# 词汇库 #
#---------------#
#BATTLE_LOG_TXT = true # 是否显示以下的战斗文字说明(写true或false)
# 本功能导致某些战斗脚本中的多段攻击技能变慢。
# 以下是战斗场合中,QTE成功击中时可能显示的语句。
#TXT = [ # 不要碰
#"打得漂亮!", # 0) 默认的打击QTE成功时的信息
# "效果拔群!", # 1) 默认的魔法QTE成功时的信息
# "不动如山!", # 2) 默认的防御QTE成功时的信息
#"举例试试!", # 3) 如果你标注了<btnmsg 3>这个标签
#"啧", # 4) 其实你在这里高兴加点什么就加点什么
#"爆树", # 5) 其实你在这里高兴加点什么就加点什么
#"问黄薯片", # 6) 其实你在这里高兴加点什么就加点什么
#"6", # 7) 其实你在这里高兴加点什么就加点什么
# ] # 不要碰
#---------------#
# 图 像 #
#---------------#
# TARGET_IMG = "hit_target" # 指针内圈的命名前缀,作为目标出现
# INDICATOR_IMG = "hit_indicator" # 指针外圈的命名前缀,外圈缩小以贴近内圈
#
# 注意: 这些是图像文件名的前缀,后门应当跟着数字编号。默认编号是1.
# 所以默认文件名也应该分别写作"hit_target1.png"和"hit_indicator1.png"
# 若想要使用其他图像,则添加后缀2,3等别的数字的图像,当然技能栏备注也要相应修改.
# 这些图像都放在文件夹/Graphics/System/下.
# COLOR_HIT = [0, 255, 0] # [R,G,B] 成功击中时指针变成何种颜色
# COLOR_MISS = [255, 0, 0] # [R,G,B] 未击中时指针变成何种颜色
#---------------#
# 声 音 #
#---------------#
# SE_HIT = ["Flash1",100,100] # 当QTE成功击中时的"声效文件名", 音量, 频率
# SE_MISS = ["Buzzer1",85,100] # 当QTE未击中时的"声效文件名", 音量, 频率
#------------------------------------------------------------------------------#
# 预备设定到此为止
#------------------------------------------------------------------------------#
#end
class RPG::BaseItem
def btnpress
if @btnpress.nil?
if @note =~ /<btnpress>/i
@btnpress = 0
elsif @note =~ /<btnpress[ ](.*)>/i
@btnpress = $1.to_i
else
@btnpress = -1
end
end
@btnpress
end
def btnmultiply
if @btnmultiply.nil?
if @note =~ /<btnmultiply[ ](.*)>/i
@btnmultiply = $1.to_f
else
if self.is_a?(RPG::Actor) || self.is_a?(RPG::EquipItem)
@btnmultiply = Galv_BtnAtk::DEF_MULTIPLIER
else
@btnmultiply = Galv_BtnAtk::ATK_MULTIPLIER
end
end
end
@btnmultiply
end
def btn
if @btn.nil?
if @note =~ /<btn[ ](.*)>/i
@btn = $1.to_sym
else
if self.is_a?(RPG::Actor) || self.is_a?(RPG::EquipItem)
@btn = Galv_BtnAtk::DEF_BTN
else
@btn = Galv_BtnAtk::ATK_BTN
end
end
end
@btn
end
def btnmsg
if @btnmsg.nil?
if @note =~ /<btnmsg[ ](.*)>/i
@btnmsg = $1.to_i
else
@btnmsg = nil
end
end
@btnmsg
end
def btnstates
if @btnstates.nil?
if @note =~ /<btnstates[ ](.*)>/i
@btnstates = $1.to_s.split(",").map {|i| i.to_i}
else
@btnstates = []
end
end
@btnstates
end
def btnrstates
if @btnrstates.nil?
if @note =~ /<btnrstates[ ](.*)>/i
@btnrstates = $1.to_s.split(",").map {|i| i.to_i}
else
@btnrstates = []
end
end
@btnrstates
end
def btnopt
if @btnopt.nil?
if @note =~ /<btnopt[ ](.*)>/i
@btnopt = $1.to_s.split(",").map {|i| i.to_i}
else
if self.is_a?(RPG::Actor) || self.is_a?(RPG::EquipItem)
@btnopt = [0,31,3,0]
else
@btnopt = [0,31,1,0]
end
end
end
@btnopt
end
end # RPG::BaseItem
class Game_Temp
attr_accessor :btncrit
attr_accessor :btndata
alias galv_btnhit_gt_initialize initialize
def initialize
galv_btnhit_gt_initialize
@btncrit = false
@btndata = [2,nil] # [multipler,vocab]
end
end # Game_Temp
class Game_Actor < Game_Battler
if !$imported["YEA-BattleEngine"]
attr_accessor :screen_x
attr_accessor :screen_y
end
end # Game_Actor < Game_Battler
class Game_ActionResult
# Cannot miss if hit button at right time
alias galv_btnhit_gar_hit? hit?
def hit?
if $game_temp.btncrit && Galv_BtnAtk::GUARANTEE_HIT
@missed = false
@evaded = false
@used
else
galv_btnhit_gar_hit?
end
end
# Modify damage if button is hit and make it show critical
alias galv_btnhit_gar_make_damage make_damage
def make_damage(value, item)
if $game_temp.btncrit
value = (value * $game_temp.btndata[0]).to_i
@critical = true if @battler.is_a?(Game_Enemy) && Galv_BtnAtk::SHOW_AS_CRIT
end
galv_btnhit_gar_make_damage(value, item)
end
end # Game_ActionResult
class Window_BattleLog < Window_Selectable
alias galv_btnhit_wblog_display_critical display_critical
def display_critical(target, item)
if $game_temp.btncrit && Galv_BtnAtk::BATTLE_LOG_TXT
if $game_temp.btndata[1]
text = $game_temp.btndata[1]
else
text = target.actor? ? Galv_BtnAtk::TXT[1] : Galv_BtnAtk::TXT[0]
end
add_text(text)
wait
else
galv_btnhit_wblog_display_critical(target, item)
end
end
end # Window_BattleLog < Window_Selectable
class Scene_Battle < Scene_Base
attr_accessor :btnactive
alias galv_btnhit_sb_update_basic update_basic
def update_basic
if @btnactive
btn_pressed
@hit_indicator.update if @hit_indicator
end
galv_btnhit_sb_update_basic
end
def hskill
if @def_opts
@def_opts
else
@subject.current_action.item
end
end
def btn_pressed
return if $game_switches[Galv_BtnAtk::DISABLE_SWITCH] || $game_troop.all_dead?
if Input.trigger?(hskill.btn) && @hit_indicator.hit?
$game_temp.btncrit = true
$game_temp.btndata[0] = hskill.btnmultiply
btn_addstate if hskill.btnstates
btn_remstate if hskill.btnrstates
@hit_indicator.success
if hskill.btnpress > 0
show_hit_success_anim(@current_inditargets, hskill.btnpress)
else
$game_troop.screen.start_flash(Color.new(255,255,255,255),25)
RPG::SE.new(Galv_BtnAtk::SE_HIT[0],Galv_BtnAtk::SE_HIT[1],Galv_BtnAtk::SE_HIT[2]).play
end
@btnactive = nil
elsif Input.trigger?(hskill.btn)
$game_temp.btncrit = false
@hit_indicator.fail
RPG::SE.new(Galv_BtnAtk::SE_MISS[0],Galv_BtnAtk::SE_MISS[1],Galv_BtnAtk::SE_MISS[2]).play
@btnactive = nil
end
end
def btn_addstate
@current_inditargets.each { |t|
already_dead = t.dead?
hskill.btnstates.each { |state| t.add_state(state) if !already_dead }
t.perform_collapse_effect if t.dead? && !already_dead
}
end
def btn_remstate
@current_inditargets.each { |t|
already_dead = t.dead?
hskill.btnrstates.each { |state| t.remove_state(state) }
t.perform_collapse_effect if t.dead? && !already_dead
}
end
def show_hit_success_anim(targets, animation_id, mirror = false)
if $data_animations[animation_id]
targets[0].animation_id = animation_id
targets[0].animation_mirror = mirror
end
end
alias galv_btnhit_sb_use_item use_item
def use_item
galv_btnhit_sb_use_item
$game_temp.btncrit = false
end
def do_indicator(targets)
return if targets.nil? || targets.empty? || @castanim
@def_opts = nil
item = @subject.current_action.item
target = targets[0]
if @subject.is_a?(Game_Actor) &&
[email protected]
? && item.btnpress >= 0
$game_temp.btndata[1] = item.btnmsg ? Galv_BtnAtk::TXT[item.btnmsg] : nil
@current_inditargets = targets
setup_hit_indicator(item.btnopt)
@btnactive = true
elsif target && defender?(target)
$game_temp.btndata[1] = @def_opts.btnmsg ?
Galv_BtnAtk::TXT[@def_opts.btnmsg] : Galv_BtnAtk::TXT[2]
@current_inditargets = targets
setup_hit_indicator(@def_opts.btnopt)
@btnactive = true
end
update_for_wait
end
alias galv_btnhit_sb_show_animation show_animation
def show_animation(targets, animation_id)
do_indicator(targets)
galv_btnhit_sb_show_animation(targets, animation_id)
end
def defender?(target)
return false if !target.is_a?(Game_Actor)
return false if @subject.is_a?(Game_Actor)
defend = -1
defend = $data_actors[target.id].btnpress
@def_opts = $data_actors[target.id]
target.equips.each { |i|
next if i.nil?
if i.btnpress > defend
defend = i.btnpress
@def_opts = i
end
}
return true if defend >= 0
end
def setup_hit_indicator(array)
return if @current_inditargets[0].nil? ||
$game_switches[Galv_BtnAtk::DISABLE_SWITCH] || $game_troop.all_dead?
if !@current_inditargets.empty? && @current_inditargets[0].screen_x
x = @current_inditargets[0].screen_x
y = @current_inditargets[0].screen_y + Galv_BtnAtk::Y_OFFSET
else
x = Graphics.width / 2 + Galv_BtnAtk::X_FRONT_OFFSET
y = Graphics.width / 1.7 + Galv_BtnAtk::Y_FRONT_OFFSET
end
@hit_indicator = Timed_Hits.new(x,y,array)
end
alias galv_btnhit_sb_invoke_item invoke_item
def invoke_item(target, item)
if !$imported["YEA-BattleEngine"]
@btnactive = nil
@hit_indicator.dispose if @hit_indicator
end
galv_btnhit_sb_invoke_item(target, item)
if $imported["YEA-BattleEngine"]
@btnactive = nil
@hit_indicator.dispose if @hit_indicator
end
end
alias galv_btnhit_sb_terminate terminate
def terminate
galv_btnhit_sb_terminate
@hit_indicator.dispose if @hit_indicator
end
if $imported["YEA-CastAnimations"]
alias galv_btnhit_sb_process_casting_animation process_casting_animation
def process_casting_animation
@castanim = true
item = @subject.current_action.item
cast_ani = item.cast_ani
return if cast_ani <= 0
show_animation([@subject], cast_ani)
@castanim = false
end
end
end # Scene_Battle < Scene_Base
#------------------------------------------------------------------------------#
# Class Timed_Hits
#------------------------------------------------------------------------------#
class Timed_Hits
def initialize(x,y,options)
@x = x
@y = y
@opt = options
@img = @opt[2].to_s
@start_frame = @opt[0]
@target_frame = @opt[1]
@current_frame = 0
@s = (3.to_f - 0.6) / (@target_frame - @start_frame)
@d = (Galv_BtnAtk::DIFFICULTY + @opt[3]).to_f * 0.5
create_hit_indicator
create_target_indicator
end
def create_target_indicator
@hittarget = Sprite.new(@viewport1)
@hittarget.bitmap = Cache.system(Galv_BtnAtk::TARGET_IMG + @img)
@hittarget.z = 100
@hittarget.x = @x - (@hittarget.bitmap.width / 2)
@hittarget.y = @y - (@hittarget.bitmap.height / 2)
@hittarget.opacity = 130
end
def create_hit_indicator
@hitindi = Sprite.new(@viewport1)
@hitindi.bitmap = Cache.system(Galv_BtnAtk::INDICATOR_IMG + @img)
@hitindi.x = @x
@hitindi.y = @y
@hitindi.z = 100
@hitindi.opacity = 0
@hitindi.zoom_x = 3
@hitindi.zoom_y = 3
@hitindi.color = Color.new(0, 0, 0, 0)
end
def hit?
@current_frame.between?(@target_frame - @d,@target_frame + @d)
end
def success
c = Galv_BtnAtk::COLOR_HIT
@hitindi.color = Color.new(c[0],c[1],c[2],255)
end
def fail
c = Galv_BtnAtk::COLOR_MISS
@hitindi.color = Color.new(c[0],c[1],c[2],255)
end
def update
update_indicators
end
def update_indicators
return @current_frame += 1 if @current_frame < @start_frame
@hitindi.opacity = 100
@hitindi.zoom_x -= @s
@hitindi.zoom_y -= @s
@hitindi.x = @x - (@hitindi.bitmap.width / 2) * @hitindi.zoom_x
@hitindi.y = @y - (@hitindi.bitmap.height / 2) * @hitindi.zoom_y
@current_frame += 1
if @hitindi.zoom_x <= 0
fail
SceneManager.scene.btnactive = nil
end
end
def dispose
@hitindi.dispose if @hitindi
@hittarget.dispose if @hittarget
end
end # Timed_Hits
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1