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
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
这是使用技能或物品的选项处理,我手头没有脚本,但我看到这里面有一个invoke_item
那么我建议你看看invoke_item这个函数,它是实际执行物品/技能效果的
作者: devil033 时间: 2018-3-13 00:32
#--------------------------------------------------------------------------
# ● 发动技能/物品
#--------------------------------------------------------------------------
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
是的。用合适的参数调用它应该就行。调用时机还是在类似turn_end的地方
作者: ekmomo 时间: 2018-3-13 09:40
透明战斗图的敌军,回合结束时解除无法战斗——释放技能——添加无法战斗。
作者: 百里_飞柳 时间: 2018-3-13 14:43
本帖最后由 百里_飞柳 于 2018-3-13 14:50 编辑
如果你敌人数目没到8个的话,可以试试加个 中途出现 的敌人用来触发你回合数释放技能,而且它也不会被判定成 存活敌人
当然如果你已经用到了中途出现援兵,那就只能自己造个额外敌人了
注意到事件里的强制战斗指令
- #--------------------------------------------------------------------------
- # ● 强制战斗行动
- #--------------------------------------------------------------------------
- def command_339
- # @param[0] : 0 则敌人、1 则角色
- # @param[1] : 敌人的索引 或 角色的 ID
- iterate_battler(@params[0], @params[1]) do |battler|
- next if battler.death_state?
- battler.force_action(@params[2], @params[3])
- BattleManager.force_action(battler)
- Fiber.yield while BattleManager.action_forced?
- end
- end
复制代码
新建一个敌人,并强制行动一下(事件-脚本 中使用)
- enemy_id = 1 # 此处为作为技能使用者的敌人id
- skill_id = 1 # 此处为需要使用的技能id
- target_index = -2 # 此处替换成目标的index
- #敌人:0~7 我方:0~4 上次目标:-2 随机:-1
- battler = Game_Enemy.new(9, enemy_id)
- battler.force_action(skill_id, target_index)
- BattleManager.force_action(battler)
- while BattleManager.action_forced?
- Fiber.yield
- end
复制代码
对了,那个目标index不用特别在意,如果你是群体范围的话,它自己会重新按照技能的设置计算一遍,只有对单体范围的技能,这个目标index有效,而且如果目标index对象不存在会被顺延处理
作者: 不死鸟之翼 时间: 2018-3-13 22:05
好吧 我下了个VA
这个方案应该更直观一些
首先去数据库新建一个技能 比如127号
一般这种剧情伤害是固定值,你也可以勾上无视防御
然后去脚本里的插件部分加入
class Scene_Battle
alias turn_start_c99d0b193c676ebc turn_start
def turn_start
user=$game_troop.members[0]
item=$data_skills[127]
@log_window.add_text("Foo message text")
@log_window.wait
targets = $game_party.members
show_animation(targets, item.animation_id)
targets.each {|t|
t.item_apply(user, item)
refresh_status
@log_window.display_action_results(t, item)
}
turn_start_c99d0b193c676ebc
end
end
class Scene_Battle
alias turn_start_c99d0b193c676ebc turn_start
def turn_start
user=$game_troop.members[0]
item=$data_skills[127]
@log_window.add_text("Foo message text")
@log_window.wait
targets = $game_party.members
show_animation(targets, item.animation_id)
targets.each {|t|
t.item_apply(user, item)
refresh_status
@log_window.display_action_results(t, item)
}
turn_start_c99d0b193c676ebc
end
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 编辑
现在消息应该没问题了 建议脚本加在SV后面
class Scene_Battle
alias turn_start_c99d0b193c676ebc turn_start
def turn_start
user=$game_troop.members[0]
item=$data_skills[127]
@log_window.add_text("Foo message text")
wait(40)
wait_for_message
targets = $game_party.members
show_animation(targets, item.animation_id)
targets.each {|t|
t.item_apply(user, item)
t.result.used=true
refresh_status
@log_window.display_action_results(t, item)
@spriteset.set_damage_pop(t)
wait(40)
wait_for_message
}
turn_start_c99d0b193c676ebc
end
end
class Scene_Battle
alias turn_start_c99d0b193c676ebc turn_start
def turn_start
user=$game_troop.members[0]
item=$data_skills[127]
@log_window.add_text("Foo message text")
wait(40)
wait_for_message
targets = $game_party.members
show_animation(targets, item.animation_id)
targets.each {|t|
t.item_apply(user, item)
t.result.used=true
refresh_status
@log_window.display_action_results(t, item)
@spriteset.set_damage_pop(t)
wait(40)
wait_for_message
}
turn_start_c99d0b193c676ebc
end
end
作者: devil033 时间: 2018-3-14 21:46
本帖最后由 devil033 于 2018-3-14 22:36 编辑
[line]抱歉,再追问个小问题
我把你这个稍微改了一下,改成每个队员单独轮流执行你这个脚本,但现在问题是
因为我队伍人比较多,当所有人中埋伏时,需要显示的message比较多,然而我的信息显示框大概只能显示4行,导致后面两个人受到伤害的信息无法显示
所以请问一下,在你这个脚本的11行之前,插入哪个函数可以把之前显示message都清除掉?[/line]
好了,已经解决了
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |