Project1

标题: [已解决]如何实现每回合自动被技能攻击 [打印本页]

作者: devil033    时间: 2018-3-12 22:40
标题: [已解决]如何实现每回合自动被技能攻击
本帖最后由 devil033 于 2018-3-14 20:31 编辑

想实现一种战斗场景,就好像是中了埋伏,每回合开始或结束的时候,我方角色会被某个技能全体攻击

想到2个办法,但都不理想:
方法1: 在敌群里面设置每回合某个敌人强制使用技能,但如果使用技能的敌人挂了,在剩下的回合中就无法再使用了,而且中埋伏还要敌人去使用技能感觉也不合理
方法2: 同样是在敌群中设置,我方角色每回合增减体力,这种设置既没有技能动画,也不会有伤害提示,感觉也不理想

所以想请教下,怎么实现,每回合开始或结束的时候,自动触发某个技能,使我方角色受到伤害, 既有技能动画也有伤害显示?

补充一下,使用的是SV100横版战斗脚本
作者: 不死鸟之翼    时间: 2018-3-12 23:38
和使用哪个脚本关系不大
大体说一下思路
你需要找到游戏回合处理的地方,并插入自己的处理逻辑
我手头只有VX,位置是Scene_Battle,你会看到一个叫turn_end的函数,它会在每次回合结束时调用
在这里对我方全体使用一次攻击技能即可
参考
skill_effect(user, skill)是对Game_Battler释放一次技能
execute_damage(user)是对Game_Battler结算一次伤害
类似地,你还能插入更多的处理位置,比如伤害结算时,可以自定义增伤减伤,etc

如果用敌人强制技能的思路的话会更加麻烦,例如这个敌人必须是不死的,那么胜利条件如何判定,以及这个敌人会不会干扰你的多目标技能等等
作者: devil033    时间: 2018-3-13 00:08
不死鸟之翼 发表于 2018-3-12 23:38
和使用哪个脚本关系不大
大体说一下思路
你需要找到游戏回合处理的地方,并插入自己的处理逻辑

VA没有skill_effect(user, skill)函数

VA类似的应该是这个吧?
#--------------------------------------------------------------------------
  # ● 使用技能/物品
  #--------------------------------------------------------------------------
  def use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    show_animation(targets, item.animation_id)
    targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  end

感觉要写个类似的,可是不会
作者: 不死鸟之翼    时间: 2018-3-13 00:20
devil033 发表于 2018-3-13 00:08
VA没有skill_effect(user, skill)函数

VA类似的应该是这个吧?

这是使用技能或物品的选项处理,我手头没有脚本,但我看到这里面有一个invoke_item
那么我建议你看看invoke_item这个函数,它是实际执行物品/技能效果的
作者: devil033    时间: 2018-3-13 00:32
不死鸟之翼 发表于 2018-3-13 00:20
这是使用技能或物品的选项处理,我手头没有脚本,但我看到这里面有一个invoke_item
那么我建议你看看invo ...

  #--------------------------------------------------------------------------
  # ● 发动技能/物品
  #--------------------------------------------------------------------------
  def invoke_item(target, item)
    if rand < target.item_cnt(@subject, item)   
      invoke_counter_attack(target, item)
    elsif rand < target.item_mrf(@subject, item)
      invoke_magic_reflection(target, item)
    else
      apply_item_effects(apply_substitute(target, item), item)
    end
    @subject.last_target_index = target.index
  end
  #--------------------------------------------------------------------------
  # ● 应用技能/物品效果
  #--------------------------------------------------------------------------
  def apply_item_effects(target, item)
    target.item_apply(@subject, item)
    refresh_status
    @log_window.display_action_results(target, item)
  end

看着像这个 apply_item_effects(target, item) 吧?

作者: 不死鸟之翼    时间: 2018-3-13 00:55
devil033 发表于 2018-3-13 00:32
#--------------------------------------------------------------------------
  # ● 发动技能/物 ...

是的。用合适的参数调用它应该就行。调用时机还是在类似turn_end的地方
作者: ekmomo    时间: 2018-3-13 09:40
透明战斗图的敌军,回合结束时解除无法战斗——释放技能——添加无法战斗。
作者: 百里_飞柳    时间: 2018-3-13 14:43
本帖最后由 百里_飞柳 于 2018-3-13 14:50 编辑

如果你敌人数目没到8个的话,可以试试加个 中途出现 的敌人用来触发你回合数释放技能,而且它也不会被判定成 存活敌人
当然如果你已经用到了中途出现援兵,那就只能自己造个额外敌人了
注意到事件里的强制战斗指令
  1.   #--------------------------------------------------------------------------
  2.   # ● 强制战斗行动
  3.   #--------------------------------------------------------------------------
  4.   def command_339
  5.   #  @param[0] : 0 则敌人、1 则角色
  6.   #  @param[1] : 敌人的索引 或 角色的 ID
  7.     iterate_battler(@params[0], @params[1]) do |battler|
  8.       next if battler.death_state?
  9.       battler.force_action(@params[2], @params[3])
  10.       BattleManager.force_action(battler)
  11.       Fiber.yield while BattleManager.action_forced?
  12.     end
  13.   end
复制代码

新建一个敌人,并强制行动一下(事件-脚本 中使用)
  1. enemy_id = 1 # 此处为作为技能使用者的敌人id
  2. skill_id = 1 # 此处为需要使用的技能id
  3. target_index = -2 # 此处替换成目标的index
  4. #敌人:0~7 我方:0~4 上次目标:-2 随机:-1
  5. battler = Game_Enemy.new(9, enemy_id)
  6. battler.force_action(skill_id, target_index)
  7. BattleManager.force_action(battler)
  8. while BattleManager.action_forced?
  9.   Fiber.yield
  10. end
复制代码

对了,那个目标index不用特别在意,如果你是群体范围的话,它自己会重新按照技能的设置计算一遍,只有对单体范围的技能,这个目标index有效,而且如果目标index对象不存在会被顺延处理
作者: 不死鸟之翼    时间: 2018-3-13 22:05
好吧 我下了个VA
这个方案应该更直观一些
首先去数据库新建一个技能 比如127号

一般这种剧情伤害是固定值,你也可以勾上无视防御

然后去脚本里的插件部分加入
RUBY 代码复制
  1. class Scene_Battle
  2.   alias turn_start_c99d0b193c676ebc turn_start
  3.   def turn_start
  4.     user=$game_troop.members[0]
  5.     item=$data_skills[127]
  6.     @log_window.add_text("Foo message text")
  7.     @log_window.wait
  8.     targets = $game_party.members
  9.     show_animation(targets, item.animation_id)
  10.     targets.each {|t|
  11.       t.item_apply(user, item)
  12.       refresh_status
  13.       @log_window.display_action_results(t, item)
  14.     }
  15.     turn_start_c99d0b193c676ebc
  16.   end
  17. end

回合开始前和开始后都可以
也可以显示一下战斗消息
@devil033
作者: devil033    时间: 2018-3-14 00:42
上传个SV100的工程

ace横版汉化范例工程.zip

1.78 MB, 下载次数: 76


作者: sq333333    时间: 2018-3-14 11:04
本帖最后由 sq333333 于 2018-3-14 21:29 编辑

已过期,请删除
作者: 不死鸟之翼    时间: 2018-3-14 11:24
本帖最后由 不死鸟之翼 于 2018-3-14 11:52 编辑
devil033 发表于 2018-3-14 00:42
上传个SV100的工程


现在消息应该没问题了 建议脚本加在SV后面
RUBY 代码复制
  1. class Scene_Battle
  2.   alias turn_start_c99d0b193c676ebc turn_start
  3.   def turn_start
  4.     user=$game_troop.members[0]
  5.     item=$data_skills[127]
  6.     @log_window.add_text("Foo message text")
  7.     wait(40)
  8.     wait_for_message
  9.     targets = $game_party.members
  10.     show_animation(targets, item.animation_id)
  11.     targets.each {|t|
  12.       t.item_apply(user, item)
  13.       t.result.used=true
  14.       refresh_status
  15.       @log_window.display_action_results(t, item)
  16.       @spriteset.set_damage_pop(t)
  17.       wait(40)
  18.       wait_for_message
  19.     }
  20.     turn_start_c99d0b193c676ebc
  21.   end
  22. end



作者: devil033    时间: 2018-3-14 21:46
本帖最后由 devil033 于 2018-3-14 22:36 编辑
不死鸟之翼 发表于 2018-3-14 11:24
现在消息应该没问题了 建议脚本加在SV后面
class Scene_Battle
  alias turn_start_c99d0b193c676ebc tur ...


[line]抱歉,再追问个小问题
我把你这个稍微改了一下,改成每个队员单独轮流执行你这个脚本,但现在问题是
因为我队伍人比较多,当所有人中埋伏时,需要显示的message比较多,然而我的信息显示框大概只能显示4行,导致后面两个人受到伤害的信息无法显示
所以请问一下,在你这个脚本的11行之前,插入哪个函数可以把之前显示message都清除掉?[/line]


好了,已经解决了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1