本帖最后由 newtonerdai 于 2020-6-24 18:45 编辑
>前言<
提问 1:什么是“联动”?
回答 1:AI与触发之间传递信息或指令称为联动。比如触发检测到玩家正在建造奇观,就命令AI向奇观进攻;再如AI检测到主角血量减少了,就把减少量的一半发送给触发让其给主角补这么多血。常见的方法有AI信号与AI事件,以及这个资源法。
提问 2:什么是“资源法”?
回答 2:利用资源的增删变化来让AI与触发之间互相传递信息的方法。
C版时代的资源法其核心在于:
触发[条件:堆积属性]——当某个玩家指定资源数值≥某值时满足
触发[效果:进贡资源]——让某个玩家资源减少(或增加)一定数量
AI[事实:food-amount]——对AI玩家四种基础资源数值做比较。其他三项分别为wood-、gold-、stone-。
AI[行动:cc-add-resources]——给自己增加(或减少)一定数量的四种基础资源数值
所以以往我们是这么做的:
AI部分:
(defrule ;对应触发0
(taunt-detected 1 1) ;玩家1输入数字1时满足。可以替换为你的判定条件。
=>
(cc-add-resource food 1)
(chat-to-all "收到数字1,已自增食物1点")
(acknowledge-taunt 1 1) ;承认并注销玩家1的数字1嘲弄,使其可以重复使用。
)
(defrule ;对应触发1
(gold-amount >= 1) ;当前AI玩家的黄金>=1时满足。这里用于接收触发进贡的资源信息。
=>
(cc-add-resource gold -1)
(chat-to-all "检测到黄金>=1,已自减黄金1点")
)
触发部分:
触发0 || 初始开启,循环
条件0 || 堆积属性,玩家2(即AI玩家),食物>=1 //用于接收AI自增的食物量。
效果0 || 进贡资源,玩家2,食物1点,给→盖亚 //用于归零,重复使用。
效果1 || 送出聊天,“触发收到1点食物,且已归零”,给→玩家1。
触发1 || 初始开启,循环
条件0 || 已选择物件(可替换为你自己的条件) //用于某种自定义的判定条件。
效果0 || 进贡资源,盖亚,黄金1点,给→玩家2 //用于向AI传递指令信息。
效果1 || 改变所有权 //用于取消选中,防止持续触发。
效果1 || 送出聊天,“选中物件,触发向AI进贡了1点黄金”,给→玩家1。
第一条AI规则与触发0的效果:
第二条AI规则与触发1的效果:
|
但这样有几个非常严重的缺陷——
- 我们必须占用一个AI或多个AI的基础资源。如果你做的是一部建毁战役,而AI玩家也需要资源来训练部队,那就造成冲突了。
- 我们设计用于辅助战役的AI时,大多数情况都是只用上一两个电脑玩家的,一两个玩家也就4~8个资源能用,如果要把其他玩家也利用上,一来切换会比较麻烦,二来进贡资源时设错玩家的概率也会变大。
- 而且即使一部RPG战役有7个不用运营的不动AI,你也只有4×7=28个资源可以用。要联动的东西多起来,就有点捉襟见肘。
现在我想说:
大人!时代变了!
Userpatch 1.5 下的AI语句已经可以轻松做到:
- 1、自增绝大多数资源。
- 2、获取并储存自己/盟友的绝大多数资源数值。
- 3、(综合1,2) 将绝大多数资源值归为0或重置为任一数值。
- 4、(综合1,2,3) 对绝大多数资源值执行判断。
- 5、(综合1,2,3) 利用绝大多数资源值进行二进制传输(待完善)。
这些功能让我们可以避免对食物、木材、黄金、石料这四种基础资源的占用,还能实现更复杂的系统效果~!
那么有哪些空闲资源我们可以利用呢?
可以查看 UP/WK大典的资源部分 和 DE资源对照表,其中注明无效、空闲、空置或尚不明了的基本都是可以利用的。
- UP/WK有:5、8、10、13、15~18、26、29~31、33~34、38、59~66、81、198~204、212~229、235~239。共54个无用隐藏资源。7个玩家总共有54×7=378个资源。
- DE有:5、8、10、13、15~18、26、29~31、33~34、38、59~66、81、198~204、219~220、225~250。共59个无用隐藏资源。7个玩家总共有59×7=413个资源。(注:DE还在更新,可能有些空闲资源会重新启用)
而我们还没有算上,如果一个资源用上二进制法来处理信息后,就可以有最多24个标志位来储存独立的信息,可谓是1个能顶24个。所以你应该可以看出隐藏资源的前景是何等光明了吧!
学习本效果需要的基础知识:
- 在阅读下面的内容之前,如果你没有任何帝国AI的基础,可以先学习这个教程:如何着手学习AI制作。了解了AI的结构之后,再来看这篇教程会比较得心应手。
- 在阅读下面的内容之前,如果你没有任何Userpatch时代AI的基础,可以先学习这个教程:Userpatch 人工智能简单教程。相信我,学习它之后你会进入一个全新、有趣、无限可能性的世界。
>详细教程部分<
1、自增绝大多数资源。
使用的语句是:up-cc-add-resource
(PS:类型操作符是什么?(in)(op)又是什么?不懂的话,可以下载 UP1.3脚本编写参考 查阅附录部分。同时,我编写的UP1.5版本的参考也即将问世,敬请期待~)
例子:
(defrule
;---事实条件恒成立
(true)
=>
;---198是一个无用的隐藏资源编号,正好用来做联动。
;---“c:”是类型操作符,表示把后面的内容识别为常数。
;---下面这句的作用是“自增198号资源1点”
(up-cc-add-resource c: 198 c: 1)
)
2、获取并储存自己/盟友的绝大多数资源数值。
使用的语句是:up-get-player-fact
例子:
(defconst resource-amount 34) ; 给数字34定义一个代称
(defconst value 100) ; 给数字100定义一个代称。后面会被用为100号目标的代称
(defrule
(true)
=>
;---my-player-number代表本AI玩家的编号。写为数字1~8也是可以的。不过敌人的资源无法检测,盟友则可以。
;---resource-amount代表资源数量参数。写为数字34也是可以的。
;---下面这句的作用是“获取自己的198号资源量,储存到'value'即100号目标变量里”。
(up-get-player-fact my-player-number resource-amount 198 value)
;---下面这句是测试用的,可以报告出value的值。可自行启用。
; (up-chat-data-to-all "资源198为%d" g: value)
)
3、(综合1,2) 将绝大多数资源值归为0或重置为任一数值。
额外使用的语句是:up-modify-goal
例子:
(defconst resource-amount 34)
(defconst value 100)
(defrule
(true)
=>
;---首先获取资源量,储存起来。
(up-get-player-fact my-player-number resource-amount 198 value)
;---下面这句会把value的值乘以-1,变成其相反数。
(up-modify-goal value c:* -1)
;---下面这句会把资源量加上它的相反数,实现归零。其中“g:”会把后面的内容视为目标变量。
(up-cc-add-resource c: 198 g: value)
;---下面这句的 1,即为重置后的资源量。可以改为你想要的值。如果是一个变量,可以用“g:”。
(up-cc-add-resource c: 198 c: 1)
;---下面两句是测试用的,可以报告出重置后的资源量。可自行启用。
; (up-get-player-fact my-player-number resource-amount 198 value)
; (up-chat-data-to-all "资源198应为1,实际为%d" g: value)
)
这样,我们可以轻松实现把诸如血量这种复杂的数据快速发送给触发;
也可以实现把联动资源量维持在一个状态上,就像AI信号和AI事件一样——
也可以轻松把触发发送过来的资源信息归零,以可重复使用——
4、(综合1,2,3) 对绝大多数资源值执行判断
额外使用的语句是:up-resource-amount、up-compare-goal
例子:
方式一。直接对资源量做比较。
比较简单直白,由触发来归零,适合新手,但这样就不支持复杂判断和运算了。
(defrule
;---如果198号资源的值≥1,就执行下面的行动。
(up-resource-amount 198 c:>= 1)
=>
;---这句可以换成你自己的行动语句。
(do-nothing)
;---直接将198号资源量做成负数,实现自锁。在触发里通过 让P2进贡给盖亚1点198号资源 可快速重置为0。
(up-cc-add-resource c: 198 c: -1000)
)
方式二。获取资源量后,再对比所储存的数值。
这个方法可以让AI来归零,还可以在比较前先做一下各种运算。虽然复杂了一丁点,但泛用性和延展性非常强。
(defconst resource-amount 34)
(defconst value 100)
(defrule
(true)
=>
;---先获取一次198号资源值,用于接下来的判断。
(up-get-player-fact my-player-number resource-amount 198 value)
)
(defrule
;---如果value即198号资源的值≥1,就执行下面的行动。
(up-compare-goal value c:>= 1)
=>
;---这句可以换成你自己的行动语句。
(do-nothing)
;---然后重置198号资源为0,实现自锁。
(up-modify-goal value c:* -1)
(up-cc-add-resource c: 198 g: value)
)
5、(综合1,2,3) 利用绝大多数资源值进行二进制传输(待完善)。
二进制传输是什么?——本质是把多个只有"是"和"否"两种状态的信息整合到一个十进制数里,让触发或AI依次拆解。比如二进制数110可以表示3种状态,分别为1是 1是 0否。转为十进制就是4+2+0=6。于是我们成功把3个只有"是""否"两种状态的信息储存到了一个十进制数6中。在触发或AI里,这个6又可以依次取余拆解成4 2 0三个数字。
二进制传输有什么用呢?——假设你的地图上有18名罗汉,触发检测到某名罗汉处于主角3格半径内时,让AI控制这名罗汉护卫主角。一般我们会采取发送AI事件的方式来告知AI
……………………(emmmm例子不是很好,暂时没灵感了,先发帖了。未完待续。)
例子:
(defconst resource-amount 34)
(defconst value 100)
(defconst state-sum 101) ;储存多个二进制状态之总和的变量。
(defrule (true) => (set-goal state-sum 0)) ;每次开始前都归零,重新累加。
(defrule (false) => (up-modify-goal state-sum c:+ 1)) ;状态1(这里用false代表判定未满足)
(defrule (true) => (up-modify-goal state-sum c:+ 2)) ;状态2(这里用true代表判定满足)
(defrule (true) => (up-modify-goal state-sum c:+ 4)) ;状态3(同上)
;---以上四条规则的运算结果应为state-sum = 0+2+4 = 6。
(defrule
(true)
=>
;---先归零。
(up-get-player-fact my-player-number resource-amount 198 value)
(up-modify-goal value c:* -1)
(up-cc-add-resource c: 198 g: value)
;---把二进制状态的总和发送给触发。
(up-cc-add-resource c: 198 g: state-sum)
;---下面两句是测试用的,可自行启用。但实测经常出现明明刚增加过资源,但还是报出0的情况,可能是因为获取之前触发就已经把资源归零了。
; (up-get-player-fact my-player-number resource-amount 198 value)
; (up-chat-data-to-all "资源198应为6,实际为%d" g: value)
)
|
(受cxt启发,我还是补几道题作为练习吧!)
>课后作业<
(光说不练可不行哦~)
注:做完后回帖发布答案,将得到丰厚的奖励!另外请把答案用这个代码隐藏到按钮里。
第一题:[小白难度]
利用一个隐藏资源,仿照 >前言< 部分里的C版范例,做两个联动。
①输入数字1→发动 [一鼓作气] 效果:触发给全体士兵增加攻击5点;
②将英雄带到大部队军营中→完成 [指挥进军] 任务:让盟友AI发动一次进攻(attack-now)
第二题:[入门难度]
系统:“检测到您的资源异常。请不要作弊获取资源哦,下次再作弊我会直接扣回去的哦~”
使用一个AI作为盟友,检测玩家1是否使用秘籍获取了大量资源,如果作弊了则提醒玩家不要作弊,或强行将资源减少回作弊前的量。
解析:决定版的秘籍会瞬间加10000,而征服者的秘籍瞬间加1000,只要检测到零点几秒前后资源差值变大,就可以判定作弊了。(当然,正常游戏中,每秒能获取的黄金量不会超过1k~2k,你也可以用这个上限来做判定条件)
第三题:[入门难度]
兵长 :“将军阵亡了……我们该怎么办?”
参军 :“你问我,我怎么知道……我也只是个半吊子参谋啊”
兵长 :“那……要不咱先慢慢后撤?”
众将 :“同意”(异口同声)
①触发检测到将军存活时,AI的战术为激进攻城(TSA范围拉满)。
②当触发检测到将军死亡后,AI的战术会转为防守退守,且随着时间推移,防守范围一步步回缩到营寨内(TSA范围逐步缩小),AI的敌视回应距离&比率、躲箭力&持距力也会一步步减弱。
贴士:推荐用资源累加来做计时器,用变量来做逐渐减小的效果而不是一条条规则地设置。另外,将军死活其实用AI来检测也很简单,这道题加上联动就是用来刻意练习的!嗯!
亲~不练是学不会的哦~快来赚取属于你的耕战鹰币奖励吧!
延伸阅读:xyz新时代的开启,论帝国中的“变量”
这是对地图编辑器和C版~UP1.5版AI的变量的详细论述,相信看完之后你会对帝国的变量有更深的理解!
延伸阅读:数据处理与变量
一个精妙的对资源数值做二次幂分解的方法,可以大幅加快资源法联动中编辑器对资源数值的处理速度。
|