- 好友
- 4
- 在线时间
- 0 小时
- 最后登录
- 2024-11-16
见习骑士
- UID
- 3199602
- 第纳尔
- 1162
- 精华
- 0
- 互助
- 36
- 荣誉
- 0
- 贡献
- 1
- 魅力
- 227
- 注册时间
- 2020-9-4
鲜花( 60) 鸡蛋( 0)
|
本帖最后由 奥杜因阿卡托什 于 2022-12-10 00:06 编辑
花了一个中秋节的时间把潜行系统弄出来了,首先还是先感谢东海、花糕、彼得、var6等人,然后为了做这个系统,我和其他某几个人研究并逆向了一下TLD、法亚和泡菜的潜行,珠玉在前,瓦石难当,谢谢这些前辈提供的思路,不过我的实现方法应该和这些都不尽相同。
骑砍想要实现潜行,最核心的问题我觉得应该是team的问题。骑砍战斗分边是分得很严格的,包括友伤在内的一系列内容跟都被控制得死死的,属于是团队竞技,与老滚这种本质上个人竞技的大不相同。打团时team是很方便的,但在潜行这样的系统里却成了阻碍。
从逻辑上来讲,所有敌人应该都是同一team的,但是如何让同属一个team的人,有些无动于衷,有些搜寻玩家,有些对玩家发动攻击,做出这样的区分,而不是像打团那样一拥而上呢?这就成了第一个难题。我听说,有些mod是通过改换team来实现这个机制的,但以我鄙见,这又会导致另一个问题,就是没法用常规攻击手段进行背刺。这是个很矛盾的问题,如果玩家背刺前和ai不同team,不加其他处理的话ai就会杀向玩家;如果玩家和ai同team,那么因为无法友伤玩家近战打ai是无效的——这就引出了第二个难题:如何让玩家能攻击到ai时,但ai无法攻击玩家。舍弃原有战斗系统,弄一个诸如“在背后按特殊键可以实现背刺”之类的功能,应该就能解决这个问题,但如此一来背刺就无法兼用正常战斗中特技、战技、加成、减伤等等一系列效果,很不爽。
为了解决这两个问题,我用了比较暴力的方法。我并不会试图用改team之类的手段去打消ai的攻击欲望,相反,我就让它试图攻击我,但使用一系列的代码让它无法攻击我。agent_set_scripted_destination_no_attack,用来这个代码,本来会冲到我面前拿刀砍我的ai,这下也只会走到我面前大眼瞪小眼了;0.01秒一次的agent_set_look_target_position,揪着ai的脑袋让它死死盯着预设的目标点,即使它知道玩家就在它背后,举着刀准备痛下杀手,想回头想到抽搐,也被这代码控制着不得不做出什么都没注意到的样子。如此一来,就能强行让ai和玩家处于敌对状态下,不得不装作没事人一样自顾自地巡逻,而玩家则百无禁忌,可以随意对ai攻击。以此实现潜行-刺杀-隐匿-回归潜行一整个流程。下面上代码,有且仅有三个战场触发器。
第一个
(ti_on_agent_spawn, 0, 0, [],
[
(store_trigger_param_1, ":agent_no"),
(get_player_agent_no, "$infiltrate_player_agent"),
(neq, ":agent_no", "$infiltrate_player_agent"),
(agent_set_slot, ":agent_no", slot_agent_alarmed_level, 0),
]), |
这段代码的作用是在所有守卫生成时,将它们的警戒等级设为0。没什么好说的。
第二个
(0.01,0,0,[],
[(try_for_agents, ":enemy"),
(neq, ":enemy", "$infiltrate_player_agent"),
(agent_is_alive, ":enemy"),
(agent_is_human, ":enemy"),
(agent_slot_eq, ":enemy", slot_agent_alarmed_level, 0),
(agent_set_look_target_position, ":enemy", pos42),
(try_end),
]), |
第二个代码的作用是,当ai警戒等级为0时,让它们看向某个固定方向(让它们别在玩家背刺时转过身来),看向的位置pos42设置一个自己喜欢的吧。
第三个触发器更是重量级
(0,0,0,[],
[
(agent_get_position, pos44, "$infiltrate_player_agent"),
(try_for_agents, ":enemy"),
(neq, ":enemy", "$infiltrate_player_agent"),
(agent_is_alive, ":enemy"),
(agent_is_human, ":enemy"),
(agent_get_position, pos43, ":enemy"),
#set alarm level
(get_distance_between_positions_in_meters, ":distance", pos44, pos43),
(try_begin),
(store_agent_hit_points, ":enemy_hp", ":enemy"), #ai was attack and then enter level 3
(lt, ":enemy_hp", 100),
(agent_set_slot, ":enemy", slot_agent_alarmed_level, 3),
(agent_get_position, pos45, "$infiltrate_player_agent"), #the place where player is last vitnessed
(else_try),
(agent_is_in_line_of_sight, ":enemy", pos44),
(neg|position_is_behind_position, pos44, pos43),
(le, ":distance", 5), #be detected, dircetly enter level 3
(agent_set_slot, ":enemy", slot_agent_alarmed_level, 3),
(agent_get_position, pos45, "$infiltrate_player_agent"), #the place where player is last vitnessed
(else_try),
(neg|agent_slot_eq, ":enemy", slot_agent_alarmed_level, 3),
(agent_get_slot, ":suspicious_amount", ":enemy", slot_agent_suspicous_amount),
(gt, ":suspicious_amount", 6), #ai will hold for 3s then begain searching, enter level 2
(agent_set_slot, ":enemy", slot_agent_alarmed_level, 2),
(try_begin),
(agent_is_in_line_of_sight, ":enemy", pos44),
(neg|position_is_behind_position, pos44, pos43),
(le, ":distance", 20),
(agent_get_position, pos45, "$infiltrate_player_agent"),
(try_end),
(else_try),
(neg|agent_slot_eq, ":enemy", slot_agent_alarmed_level, 3),
(agent_is_in_line_of_sight, ":enemy", pos44),
(neg|position_is_behind_position, pos44, pos43),
(le, ":distance", 20), #suspected, enter level 1
(agent_set_slot, ":enemy", slot_agent_alarmed_level, 1),
(agent_get_slot, ":suspicious_amount", ":enemy", slot_agent_suspicous_amount),
(val_add, ":suspicious_amount", 2),
(agent_set_slot, ":enemy", slot_agent_suspicous_amount, ":suspicious_amount"),
(agent_get_position, pos45, "$infiltrate_player_agent"), #the place where player is last vitnessed
(try_end),
(try_begin),
(neg|agent_slot_eq, ":enemy", slot_agent_alarmed_level, 3),
(this_or_next|neg|agent_is_in_line_of_sight, ":enemy", pos44),
(position_is_behind_position, pos44, pos43),
(try_begin),
(agent_get_slot, ":suspicious_amount", ":enemy", slot_agent_suspicous_amount),
(gt, ":suspicious_amount", 0),
(val_sub, ":suspicious_amount", 1),
(agent_set_slot, ":enemy", slot_agent_suspicous_amount, ":suspicious_amount"), #need double time to dispel suspicion
(else_try),
(agent_set_slot, ":enemy", slot_agent_alarmed_level, 0), #normal patrol, player is hiding
(try_end),
(try_end),
#get alarm action
(agent_get_slot, ":alarmed_level", ":enemy", slot_agent_alarmed_level),
(try_begin),
(eq, ":alarmed_level", 3),
(try_for_agents, ":enemy_casualities"),
(agent_get_slot, ":enemy_casualities_alarmed_level", ":enemy_casualities", slot_agent_alarmed_level),
(lt, ":enemy_casualities_alarmed_level", 2),
(assign, ":enemy_casualities_alarmed_level", 2),
(agent_set_slot, ":enemy_casualities", slot_agent_alarmed_level, ":enemy_casualities_alarmed_level"), #all enemy will be alarmed
(agent_set_slot, ":enemy", slot_agent_suspicous_amount, 7),
(try_end),
(agent_clear_scripted_mode, ":enemy"),
(agent_set_speed_modifier, ":enemy", 100),
(else_try),
(eq, ":alarmed_level", 2),
(agent_set_speed_modifier, ":enemy", 60),
(agent_set_scripted_destination_no_attack, ":enemy", pos45, 0),
(else_try),
(eq, ":alarmed_level", 1),
(agent_set_speed_modifier, ":enemy", 1),
(else_try),
(eq, ":alarmed_level", 0),
(agent_set_speed_modifier, ":enemy", 1),
(try_end),
(try_end),
]), |
因为太长了,就只讲一下效果。效果是每个守卫都有独立的警戒等级,0123四等。0时就是正常,当玩家在ai正面、能被该ai直接看到(中间没遮挡)且距离小于20米时该ai会起疑,进入警戒等级1;1时ai会看向玩家的方向,每秒增加2点疑心,当疑心超过7时该ai进入警戒等级2;2时ai会以正常速度60%朝玩家方向移动,请注意这里的玩家方向指的是“玩家最后一次被目击到”的位置;进入三阶段的方法有两种,一是玩家跑太快,直接跑到ai跟前(正面、无遮挡、距离小于5),二是这个ai被打了;当有一名守卫进入三阶段,首先它本人会对玩家进行不死不休的全速追击,只有将它干掉或者用一些特定法术(还没做)才能解决这个危机,而且与此同时全图守卫都将被惊扰,进入阶段2,朝玩家最后被目击到的位置展开搜寻,也就是说如果不速战速决,整张图敌人都会被引过来。
降低警戒等级的方法是:一,警戒等级三不会被消除,只能将该agent消灭;二,警戒等级二,如果玩家已经隐蔽起来了,ai的疑心会每秒减少一点,差不多七八秒的样子就能消除;三,警戒等级一,只要玩家在ai进入等级二之前(差不多三秒)快速躲起来就行,ai会觉得“大概是风声吧(便乘)”。
这几个代码设置一下上面提到的pos42,加在任何mt里应该都是能跑的,甚至1000人团战——只不过嘛这么做可能会死。这个死是多重意义上的,首先你的角色会被乱军冲死,然后电脑会死,坐在电脑前的那个人类也有可能死在电脑的爆炸中,三杀。因此使用时还是悠着点吧,四十几个人的潜行局应该是没问题的。
另外,本来是还有一套让ai巡逻、以及自己获取巡逻目的地的代码的,但是那个有点太长了,而且不是很美观,这里就没有一并放出。
|
-
-
评分
-
查看全部评分
|