newtonerdai 发表于 2020-5-14 16:37:54

[UP1.5] AI信号现已可以循环使用!(up-set-signal)

本帖最后由 newtonerdai 于 2020-6-14 16:15 编辑


[*]提问:AI信号是什么?
[*]回答:电脑AI可以向触发系统发送信号,触发的条件发现信号激活后,可以发动某些效果。这就是最基本的由AI向触发传递信息的方式。


C版里我们是这么做的:
AI部分:
(defrule
    (taunt-detected 1 1)       ;这里是收到P1的数字1。可替换为你的判定条件
=>
    (set-signal 1)       ;激活AI信号#1
    (acknowledge-taunt 1 1)    ;承认P1的数字1。使其可重复使用
)
触发部分:
触发0||初始开启,循环
    条件0||收到AI信号,1号
    效果0||(发动某些你想要的效果)
但是这一套信号联动方式有一个很严重的问题:无法关闭信号,也就是说一个信号只能用一次,且会一直维持激活状态!



无论是AI,还是触发,都没有办法把某个信号注销掉,以重置回到初始状态。
最终结果是,一旦set-signal,这个信号就将一直处于激活状态,只能作为一种永久性的状态被触发识别。

所以一直以来更广泛使用的是[AI:cc-add-resource]和[效果:进贡属性]这一套可以循环使用的“资源法”。
不过“资源法”也被我升级了,哈哈哈哈 —— 用于AI-触发联动的 [资源法] 现已全面升级! - 隐藏资源·储存·归零·维持·运算·判断


现在,这个严重的问题被终结了!
在Userpatch 1.5的时代,我们的战役AI拥有了up-set-signal这柄神器!其功能如下图▼

(注:其中的“c:”意思是把后面的一条内容视为常数,新人可以不用纠结,要纠结的话可以看Userpatch 人工智能简单教程)


所以现在我们可以这么设计:
AI判定认为应该发动某个效果了=>发送AI信号=>触发接收到信号后发动效果=>同时触发向AI发送事件=>AI接收到事件后注销掉这个AI信号=>(回到初始状态)

做法如下:
AI部分:
(defrule
    (taunt-detected 1 1)       ;这里是收到P1的数字1。可替换为你的判定条件
=>
    (set-signal 1)       ;激活AI信号#1
    (acknowledge-taunt 1 1)    ;承认P1的数字1。使其可重复使用
)
(defrule
    (event-detected trigger 1)       ;1号事件激活时,执行↓
=>
    (up-set-signal c: 1 c: 0)      ;注销1号信号
    (acknowledge-event trigger 1)    ;承认1号事件,使其可重复使用
)
触发部分:
触发0||初始开启,循环
    条件0||收到AI信号,1号
    效果0||(发动某些你想要的效果)
    效果1||发送AI事件(或信号),1号
测试!现在这个AI信号可以重复使用了:


期悦 发表于 2020-5-24 23:51:33

本帖最后由 HudsonLee 于 2020-5-28 21:25 编辑

很好,战役用来做AI互交,注入灵魂!

https://www.bilibili.com/video/BV1yz411v7Uh/


页: [1]
查看完整版本: [UP1.5] AI信号现已可以循环使用!(up-set-signal)