骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
查看: 4606|回复: 15

[osp代码] 非玩家角色捡地上武器的战场触发器

[复制链接]
鲜花(2388) 鸡蛋(8)
发表于 2013-12-10 18:27:26 | 显示全部楼层 |阅读模式
本帖最后由 rubik 于 2013-12-14 15:26 编辑

如题,如下。原理并不复杂,战场上,即便角色倒下了,尸体也消失了,但这个死了或者伤了的agent依然是存在。而且他们手上的武器也并没有真正脱手,依然可以用agent_get_wielded_item来获得他们手上的武器。活着的agent就更不用说了,当然也可以用agent_get_wielded_item来获得手上的武器。 然后匹配一下类型(需要是同类型的),比较一下基础价格(这个基本可以综合评定性能,或者反过来说,MOD制作者应该自己评定武器的性能,然后根据性能给一个与之匹配的基础价格),最后再一换,就结了。 换武器的具体步骤是先解除旧武器,再装上新武器,最后设定到手上。

下列代码其实简化了很多判断,最赤果果的一点是排除了长杆武器。因为长杆的细分起来很复杂,可冲刺的长杆和不能冲刺的长杆完全是两大类,不能冲刺的长杆里面,诺德的长斧和罗多克的长柄大刀是一类,步兵用来克骑兵的只能捅的长矛又是一类。而且同为长杆武器,有的是单手使用,有的是双手使用,这会影响到盾牌,总不可能单手长杆+盾一下换成双手长杆+盾了吧。别的武器类型都明确只能是单手,或者只能是双手,就没有这个问题。
另外这段代码只写了换右手武器或者双手武器的情况,没有写换盾牌的情况。其实也可以做到换盾牌,问题是盾牌有耐久度,通过代码替换的,得到是两个全新的盾牌。而且我在测试的时候,替换盾牌是成功过的,但更多的时候是频繁的跳出。
这段代码没有提到武器的前缀,因为只有玩家和16NPC的武器是有前缀的,其他人的武器都是没有前缀的。AI士兵捡武器,99%都是无前缀武器之间的替换,前缀的问题可以忽略。这也是为什么武器的基础价格在这里能够拿来衡量武器的性能。
细心一点的人会发现这段代码并没有判断AI士兵的力量或者技能够不够用上新的武器。我的MOD里有现成写好的script,但这里却没有将其用上。综合上面各种简化,归根结底一个词:效率。因为这个触发器的主体部分是一个try_for_agents套一个try_for_agents的结构,内层的判断代码需要执行agent数量的平方次,agent一多,执行的次数就很巨大了,如果内层判断代码稍微一复杂,就会带来明显的卡顿,如果各种细节全部考虑到,就等着看幻灯片吧。所以这段代码做到了能简则简的地步。

(
  
3, 0, 0, [],
    [
    (get_player_agent_no,
":player_agent"),
    (try_for_agents,
":agent_no"),
      (agent_is_alive,
":agent_no"),
      (agent_is_human,
":agent_no"),
      (neq,
":agent_no", ":player_agent"),
      (agent_get_wielded_item,
":agent_right_wp", ":agent_no"),
      (gt,
":agent_right_wp", -1),
      (store_item_value,
":value", ":agent_right_wp"),
      (item_get_type,
":item_type", ":agent_right_wp"),
      (agent_get_position, pos2,
":agent_no"),
      (assign,
":weapon_exchanged", 0),
      (try_for_agents,
":agent_no_2"),
        (eq,
":weapon_exchanged", 0),
        (neq,
":agent_no_2", ":agent_no"),
        (agent_is_human,
":agent_no_2"),
        (neg|agent_is_alive,
":agent_no_2"),
        (agent_get_position, pos3,
":agent_no_2"),
        (get_distance_between_positions,
":dist", pos2, pos3),
        (le,
":dist", 150),
        (agent_get_wielded_item,
":agent_2_right_wp", ":agent_no_2"),
        
# right handed weapon
        
(gt, ":agent_2_right_wp", -1),
        (store_item_value,
":value_2", ":agent_2_right_wp"),
        (item_get_type,
":item_type_2", ":agent_2_right_wp"),
        (eq,
":item_type_2", ":item_type"), # same type
        
(neq, ":item_type", itp_type_polearm),
        (gt,
":value_2", ":value"),
        
# exchange weapon
        
(agent_unequip_item, ":agent_no", ":agent_right_wp"),
        (agent_equip_item,
":agent_no", ":agent_2_right_wp"),
        (agent_set_wielded_item,
":agent_no", ":agent_2_right_wp"),
        (agent_unequip_item,
":agent_no_2", ":agent_2_right_wp"),
        (agent_equip_item,
":agent_no_2", ":agent_right_wp"),
        (agent_set_wielded_item,
":agent_no_2", ":agent_right_wp"),
        (assign,
":weapon_exchanged", 1),
      (try_end),
    (try_end),
   ]),

评分

参与人数 1第纳尔 +10 互助 +2 收起 理由
Cain + 10 + 2 您的帖子很有价值!

查看全部评分

鲜花(2388) 鸡蛋(8)
 楼主| 发表于 2013-12-14 15:31:45 | 显示全部楼层
本帖最后由 rubik 于 2013-12-15 12:28 编辑

更新了一点点,现在非玩家的角色在触发器的一个检测周期内,不会遍历所有躺下的agent,去寻找最合适的武器了,而是找到一件能替换的之后,就停止了,不论周围的尸体手上是否有更好的同类武器。3秒钟后,触发器再次检测的时候才会再换一次。这样修改了之后,很大程度减轻了卡机。





鲜花(7) 鸡蛋(0)
发表于 2013-12-14 20:22:43 | 显示全部楼层
sf,好东西学到了,这样就能看见玩家望着兵器傻瞪眼了
鲜花(3) 鸡蛋(0)
发表于 2013-12-15 12:27:41 | 显示全部楼层
不明但觉厉
鲜花(0) 鸡蛋(0)
发表于 2013-12-19 17:55:27 | 显示全部楼层
好厉害,我在玩1.011的时候,就一直在想,我捡个武器那么难,假如对面的AI士兵全部换了双手武器冲过来怎么扛。。。
鲜花(147) 鸡蛋(0)
发表于 2014-5-11 15:27:43 | 显示全部楼层
与其用武器价格,不如直接比较相同的伤害数值大小?
鲜花(58) 鸡蛋(0)
发表于 2014-5-20 12:58:49 | 显示全部楼层
但愿海波平 发表于 2014-5-11 15:27
与其用武器价格,不如直接比较相同的伤害数值大小?

決定武器優勢的不僅僅是傷害,速度、範圍以及其他方面的屬性都很重要。在一個注重合理性的mod中,價格一般都是體現性能的指標。
鲜花(147) 鸡蛋(0)
发表于 2014-5-20 13:16:18 | 显示全部楼层
亚历山大东征 发表于 2014-5-20 12:58
決定武器優勢的不僅僅是傷害,速度、範圍以及其他方面的屬性都很重要。在一個注重合理性的mod中,價格一般 ...

不过在参数里,武器价格是可以独立编辑的。如果是自己动手的话,就得对性能进行评估和定价。

鲜花(0) 鸡蛋(0)
发表于 2014-6-22 11:06:57 | 显示全部楼层
支持楼主支持
头像被屏蔽
鲜花(0) 鸡蛋(0)
发表于 2016-10-25 21:17:42 | 显示全部楼层
rubik 发表于 2013-12-14 15:31
更新了一点点,现在非玩家的角色在触发器的一个检测周期内,不会遍历所有躺下的agent,去寻找最合适的武器了 ...

r大,按照我的想法所有双重判定循环的全部会导致卡机,无论重复触发时间是多少秒。都会让玩家觉得非常不爽,我特别怀念1143版本左右的骑马与砍杀,电脑只要配置够,可以开一千人,而不考虑因为双重循环的卡机,所以r大,您能这样改进一下骑砍吗?去掉所有时间复杂度比较高的算法???
鲜花(336) 鸡蛋(0)
发表于 2017-1-4 11:01:09 | 显示全部楼层
其实根据 价格判断 有时候很不准确!!    比如一件 破烂的 黑甲 ,属性 应该比 一件  豪华的 锁子甲高!   但是  价格 可能豪华的锁子甲更高!

其实我绝对没必要全部判断!  做部分判断即可!

比如弓箭类兵种,只判断弓,如果有他能装上的好弓,他可以替换, 物品比较单一之后,就可以通过 刺伤 和 速度来判断了!   其实让他们在 箭射完之后能 捡 附近的箭囊 就可以了!
鲜花(0) 鸡蛋(0)
发表于 2018-12-17 10:51:40 | 显示全部楼层
小白求问一下R大,这个代码放在哪个里面
鲜花(52) 鸡蛋(0)
发表于 2018-12-17 17:27:44 | 显示全部楼层
到底该怎么办 发表于 2018-12-17 10:51
小白求问一下R大,这个代码放在哪个里面

放在mission_templetes.py里你想让这个触发器生效的那个场景类型的触发器列表里。
鲜花(0) 鸡蛋(0)
发表于 2018-12-17 22:07:47 | 显示全部楼层
多谢多谢啊
鲜花(0) 鸡蛋(0)
发表于 2018-12-17 22:08:04 | 显示全部楼层
JustinZCQ 发表于 2018-12-17 17:27
放在mission_templetes.py里你想让这个触发器生效的那个场景类型的触发器列表里。

多谢大佬啊
鲜花(0) 鸡蛋(0)
发表于 2019-2-20 15:55:53 | 显示全部楼层
其实要是弄成主要捡那些一次性武器的话会更骚一些,比如带投掷武器的步兵扔完了投掷武器之后去捡地上的投掷武器然后接着扔,这样就很真实了……(玩家看着自己刚扔出去的斧子被对面捡了起来扔回自己头上)
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2019-8-23 22:40 , Processed in 0.215187 second(s), 34 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表