- 好友
- 4
- 在线时间
- 0 小时
- 最后登录
- 2024-11-16
见习骑士
- UID
- 3199602
- 第纳尔
- 1162
- 精华
- 0
- 互助
- 36
- 荣誉
- 0
- 贡献
- 1
- 魅力
- 227
- 注册时间
- 2020-9-4
鲜花( 60) 鸡蛋( 0)
|
首先先感谢给我提供不少思路和建议的彼得、东海、huagao、路奇、var6等人,然后进入正题。
关于弹反,简而言之就是敌人在攻击你时你准确地做出某种操作,能让敌人无法继续攻击,通常是僵直或者失衡。这应该是个很早之前就有人研究过的东西了。领军者里就有吧,而且永恒世界这样的联机mod也引入了。但是不出我意料的话,永恒世界那个盾反是通过检测按键实现的——换言之,只能给玩家用。作为一个pvpmod来说这样已经足够,但我还是觉得应该更进一步。相信玩魂系的人都有被小兵弹中,跪倒在地被致命一击秒杀的经历,为了让玩家在骑砍中也能获得这样的体验,我做了一个单机mod也能使用、玩家和ai都能使用的弹反机制。接下来就讲讲我的思路和代码。
我的思路并不是魂系列那种进攻性较强的弹反策略,亦即“在敌人攻击时解除防御就能弹反”,这是个很危险的操作,宁愿慢不要快,因为开盾快了没弹中就要被砍。相反,我用的是英灵神殿的策略,“在敌人攻击瞬间举盾就能弹反”,偏向防守,宁愿快不要慢,因为举盾快了就算没弹中也能正常格挡。这样的弹反严格来说应该叫“完美格挡”比较合适。话不多说,下面来看代码。
第一个加东西的地方是constant,定义一下核心的slot。搜索AGENT(大写),把slot_agent_blocking = 26加在这个版块下面。
接着自然是mission_template,代码如下
common_battle_shield_strick_back = (
0.05, 0, 0, [],
[
(try_for_agents, ":agent_no"),
(agent_get_defend_action, ":if_strick", ":agent_no"),
(eq, ":if_strick", 2),
(agent_get_slot, ":blocking_count", ":agent_no", slot_agent_blocking),
(val_add, ":blocking_count", 1),
(agent_set_slot, ":agent_no", slot_agent_blocking, ":blocking_count"),
(else_try),
(assign, ":blocking_count", 0),
(agent_set_slot, ":agent_no", slot_agent_blocking, ":blocking_count"),
(try_end),
])
|
由于无法检测举盾的瞬间,我采取的时没0.05秒检测是否举盾了的方法。举了,就给改单位的slot_agent_blocking这个slot加一。不举,就回归到零。在需要采用弹反的mission里加上common_battle_shield_strick_back,这条就行了。
第三个定义的是敌人被弹后失去平衡的动作。打开animation,把
["shield_against", acf_enforce_all, amf_priority_striked|amf_play|amf_accurate_body|amf_restart,
[2, "strikes", 0, 38, arf_blend_in_3],
],
|
加在最下面。那个2是该动作持续的时间。我自己测了一下,1秒一下就太短了,几乎无法补刀;2秒以上太长,不是特别自然,而且ai也能弹玩家,到时候来个七秒八秒的,自己中招了就搞笑了。另外,我这里用到的动作是从strikes里面截取的,可以自己用openbrf去CommonRes里看看别的动作。
最后一个要改的比较特殊,是物品触发器,打开item,找到想加弹反功能的盾的词条,在每个的最后一个]之前加上
, [
(ti_on_shield_hit, [
(store_trigger_param_1, ":defender_no"),
(store_trigger_param_2, ":attacker_no"),
(agent_get_slot, ":blocking_count", ":defender_no", slot_agent_blocking),
(gt, ":blocking_count", 0),
(le, ":blocking_count", 6),
(agent_set_animation, ":attacker_no", "anim_shield_against"),
]),
]
|
为什么最后一步要加在物品触发器里呢?主要是我觉得mt里塞太多条件判定,搞得老长一段不好看。而且,以魂系的特点,每个物品独立设置触发特性是比较符合逻辑的。(le, ":blocking_count", 6),这句的作用就是控制弹反窗口期的长度。还记得之前是0.05秒判定一次吗?这小于6才能弹,相当于0.3秒的窗口期。你在敌人攻击你之前的0.3秒内举盾,就能触发弹反效果,让他失衡。按照魂的惯例,小盾最好弹,因此可以把这个数字改大一点;中盾不好弹,就给个2,只有0.1秒反应时间。塔盾没这个功能,干脆就这个物品触发器都不用加了。甚至,右手的武器也能格挡吧,寻思了一下按我这个写法,好像右手武器也能弹。除了空手不能弹以外,万物皆可弹!这样,通过每件物品个性化的处理,可以实现多样的弹反设定。
此外还有很多东西可以加。比如设置一下不对远程生效;比如,弹中了加个“兵!”的音效什么的;比如,攻击了敌人后能给他一个slot,让他下一次遭受的攻击无视铁骨减伤,还有加成,15铁骨全靠减伤吃饭的狂战士有难了;比如,习得某个技能后能击落一定等级以下的对手的武器(对AI来说太致命了这个);比如,弹反之后下一次攻击,数值超过一定值能把对手打翻在地。上述都是些有利机制,来点不利的,比如输出超过一定值能免疫弹反之类的。这些我自己是以后肯定会安排上的。
|
评分
-
查看全部评分
|