赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 4 |
经验 | 0 |
最后登录 | 2024-11-20 |
在线时间 | 57 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 399
- 在线时间
- 57 小时
- 注册时间
- 2023-12-2
- 帖子
- 10
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
要怎么添加进去呢,就是靠状态判定是否来进行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
复制代码 |
|