wing 发表于 2014-2-19 04:51:17

请问如何在生物行动之前改变其状态标志

不是BG0这种,而是像魔幻法师那样在进入行动选择之前
原本是想顺手解决一下sagamosa mod里的impatience无限弹消息的问题,没想到其实很不容易,搞了好久……可以说mod里的erm的实现方法完全是错误的,说明作者根本没有测试过这段代码……作者想用BG:A0加上设置等待标志使行动单位不能等待,但实际上等待这个选项不会消失,结果就是AI无限地进行等待,消息框也无限……估计要实现这个功能必须在生物行动之前就先设置好等待标志(如行动之前施放魔法,比如魔幻法师),或是在执行等待之后立即使之再次行动
但是我对erm不太熟练,不知道哪个触发器能实现,只好上来求助了(虽然这个mod bug特别多,我也不准备去捉虫,不过遇到问题还是喜欢把它解决),谢谢

沧海一粟 发表于 2014-2-19 09:14:18

本帖最后由 沧海一粟 于 2014-2-19 09:15 编辑

生物行动之前施法,可以用BG1或者77006两个触发器解决,但各有利弊,得失得考虑全局,BG1是第一轮第一个行动的堆栈无法解决,77006可以正确地检测第一轮第一个行动的堆栈,但无法解决类似全体魔镜之类的-1施法(除非再加上SS限制,个人没试过,感觉也不太好),根据个人使用经验,感觉BG1更稳定,毕竟是老触发器,写得相对严谨。
至于BG0,这个是模拟不到魔幻施法的,至于你说的BG:A可以实现其它功能的想法,但命令的用法其实是错误的,你应该用BG:A12或者BG:A2\A3\A6\A7,偏偏A0不行

wing 发表于 2014-2-19 13:54:45

BG1有想到,但是我不知道怎么取得下一个行动的生物堆栈,第一轮第一个行动的问题就更没考虑到了……
77006根本不知道,找到范例看不太明白,搜索了下才知道原来是ERA的功能,然后才发现ERA开始菜单里还有个ERA手册;bf;(我一直看的是ERM中文帮助2.81,还以为ERA在erm方面的新功能已经在这里面了)

沧海一粟 发表于 2014-2-19 17:06:24

wing 发表于 2014-2-19 13:54
BG1有想到,但是我不知道怎么取得下一个行动的生物堆栈,第一轮第一个行动的问题就更没考虑到了……
77006 ...

只要理解BG0和BG1直接获取的命令参数是完全不一样的就行了。BG1要检测下一个行动的堆栈直接BG:N检查就行了,非常简单。
至于为什么第一轮第一个行动生物无法检测,是因为你BG1前没有BG动作,如果你有类似英雄施法动作之类的一样可以检查出。
77006是决定堆栈行动之前就触发,检查倒没问题,但对于生物施法的可能因为本身的实现原理冲突,会感觉非常不好用,对其它功能倒没问题(比如说模拟施法),自己可以体会下。

wing 发表于 2014-2-19 20:37:54

本帖最后由 wing 于 2014-2-19 20:39 编辑

主楼没说清楚,我其实是想让生物无法等待而必须立即行动(Sagamosa mod里Impatience技能的效果)BG0、BG1、77006都理解了,刚才也试了下,结果完全失败了……总结一下:
原作者是简单地用
====
!!BG:A?y-1;   type of action?
!!FU&y-1<>8:E;continue function only if stack choses to wait
!!BMy-55:T?y-56;      type
!!BG:A0;      cancel "wait" action
!!BMy-55:Fi;    set waiting bit, stack cannot wait anymore.
====
这样的方法来实现,所以我说他都没测试代码一下……(实际这段代码中作者甚至没有设置变量 i 的值)

然后我想实现这个功能,试了下在行动前设置生物标志
====
!?FU77006;
!!SN:X?y1/?y2;y1 - side, y2 - stack number
!!VRy2&y1=1:+21;
!!BMy2:T?y3 F?y4;       y3 - type, y4 - monster flags
!!VRy4:|33554432;
!!BMy2:Fy4;
====
结果没用,生物依然可以选择等待。中间我顺便看了下生物标志的变化,发现33554432这个标志位只有检查正处于等待中的生物才会为1,一旦轮到它行动,这个标志位会置回0


接着再试使生物进行等待这个行动后立即再次行动
====
!?PI;
!!VRv8400:S-1;
==
!?FU77006&v8400>=0/v8400<=41;
!!VRy1……      y1 - 左0右1
!!VRy2……      y2 - 堆栈编号0-20
!!BMv8400:T?y3 F?y4;       y3 - type, y4 - monster flags
!!SN:Xy1/y2;
!!VRv8400:S-1;
==
!?BG0&1000;
!!BG:N?y-55;
!!BG:A?y-1;
!!FU&y-1<>8:E;
!!VRv8400:Sy-55;
====
结果是生物再次行动时依然可以选择等待,也就是说我设想的两个方法都失败了……

另外我还测试了下正常等待之后正常行动后用77006使之再次行动,发现这时不能再等待了。不知道战斗中等待选项是否可用是不是由回合阶段决定的

或者还有什么办法实现“不允许等待”这个功能呢?


沧海一粟 发表于 2014-2-19 21:11:03

wing 发表于 2014-2-19 20:37
主楼没说清楚,我其实是想让生物无法等待而必须立即行动(Sagamosa mod里Impatience技能的效果)BG0、BG1、 ...
原脚本的功能是什么?
你在77006给堆栈增加等待标志的用法是错误的,绝对没效果。要强制生物等待直接BG:A8就行了,应该两个触发器都可以,写那什么标志都是多余的。同理,后面那几个特殊标志位在已经决定行动的生物后再添加都是无效果的。其实我想二楼应该都回答你了,A0不行,其它都可以试试。

wing 发表于 2014-2-19 22:05:19

原脚本的功能是有Impatience技能的英雄对面的生物不能等待,就是二代那样吧,当然作者其实没实现,这是我猜的
不是“要强制生物等待”,是强制生物不等待!
我试过A3,直接就防御了,显然不合要求。至于标志位,从测试结果来看,确实无效
一开始以为会很容易,反正现在找不到办法了……

沧海一粟 发表于 2014-2-19 22:28:46

本帖最后由 沧海一粟 于 2014-2-19 22:30 编辑

wing 发表于 2014-2-19 22:05
原脚本的功能是有Impatience技能的英雄对面的生物不能等待,就是二代那样吧,当然作者其实没实现,这是我猜 ...
强制不等待,而且生物能继续做其它动作....;cool;;cool;
打个比方,假如某AI生物想待机,A0有效你取消了它的动作(或者说删除掉了待机标志),它下一步不用说肯定继续待机,然后你又继续取消.....好吧,死循环了,这是最基本的常理啊,如果要解决,你还是直接想办法改AI的思维(譬如智能方面的)而并不是纠结在这里。作者之所以实现这个功能,应该是针对人类玩家,但没有考虑到去限制电脑而已。

wing 发表于 2014-2-19 22:50:37

主楼一开始可不是说了“无限弹消息”么,因为作者希望在生物受这技能影响时(看字面意思,打野怪或AI技能肯定是要生效的)弹一个消息来提醒,结果AI部队就会一直等待,所以就无限弹消息了
我是觉得这功能蛮有意思,所以想改掉bug,谁知作者的思路根本不对头……;cool;
而我想让生物直接进入“正常等待后再轮到行动”时的状态(看上面的回复,沧海似乎一直没明白我这个意思……),现在看来做不到,那就算了呗……;ym;
不论怎样,非常感谢沧海兄!

贤知有您 发表于 2014-2-20 11:18:51

看楼上2位高人讨论ERM甚是热闹,仿佛又看到了ERM的春天.
我个人觉得,控制AI等待或防御简答,要控制AI其它行动方式就很难了.

不过,我印象中好像有个解决的方法,或者可以解决让生物不等待的问题.
那就是传说中的让AI变笨~~~~貌似AI在最低难度下,战场行动是基本不等待的(忘记了,好像是这样的)
楼主可以自己测试一下.
如果确实这样,在该场战斗开始时,更改游戏难度水平,让AI变笨..或者可以实现;lul;
我看我倒学沧海兄一样,老想些奇怪的解决方案.:lianhong:

另外,楼主说到ERM2.81,应该也有ERA触发器的介绍啊.
不过ERA帮助要详细些,丰富一些.

wing 发表于 2014-2-20 13:59:02

汗,我是货真价实的菜鸟一只
让AI变笨或许可以,我晚上试试。不过这样带来的变化恐怕不小(不太清楚战斗中AI难度对AI的行为有什么影响),感觉不太妙;ft;
ERM2.81里确实有ERA触发器介绍;om;,以前没注意到
页: [1]
查看完整版本: 请问如何在生物行动之前改变其状态标志

捐赠