翔鹰帝国网|帝国时代论坛|帝国时代系列|神话时代
 找回密码
 注册翔鹰会员(昵称)
搜索
查看: 1249|回复: 5

[教程] [UP1.5] 用于AI-触发联动的 [资源法] 现已全面升级!

[复制链接]

183

主题

9

精华

2万

积分

教皇

耕战
3325
鹰币
14956
天龙币
0
回帖
1200

翔鹰建站十周年纪念章

附庸关系3
 楼主| 发表于 2020-6-12 17:02:02 | 显示全部楼层 |阅读模式
本帖最后由 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启发,我还是补几道题作为练习吧!)
>课后作业<
(光说不练可不行哦~)

注:做完后回帖发布答案,将得到丰厚的奖励!另外请把答案用这个代码隐藏到按钮里。
  1. [spoiler]答案内容[/spoiler]
复制代码

第一题:[小白难度]
利用一个隐藏资源,仿照 >前言< 部分里的C版范例,做两个联动。
①输入数字1→发动 [一鼓作气] 效果:触发给全体士兵增加攻击5点;
②将英雄带到大部队军营中→完成 [指挥进军] 任务:让盟友AI发动一次进攻(attack-now)

第二题:[入门难度]
系统:“检测到您的资源异常。请不要作弊获取资源哦,下次再作弊我会直接扣回去的哦~”
使用一个AI作为盟友,检测玩家1是否使用秘籍获取了大量资源,如果作弊了则提醒玩家不要作弊,或强行将资源减少回作弊前的量。

解析:决定版的秘籍会瞬间加10000,而征服者的秘籍瞬间加1000,只要检测到零点几秒前后资源差值变大,就可以判定作弊了。(当然,正常游戏中,每秒能获取的黄金量不会超过1k~2k,你也可以用这个上限来做判定条件)

第三题:[入门难度]
兵长 :“将军阵亡了……我们该怎么办?”
参军 :“你问我,我怎么知道……我也只是个半吊子参谋啊”
兵长 :“那……要不咱先慢慢后撤?”
众将 :“同意”(异口同声)
①触发检测到将军存活时,AI的战术为激进攻城(TSA范围拉满)。
②当触发检测到将军死亡后,AI的战术会转为防守退守,且随着时间推移,防守范围一步步回缩到营寨内(TSA范围逐步缩小),AI的敌视回应距离&比率、躲箭力&持距力也会一步步减弱。

贴士:推荐用资源累加来做计时器,用变量来做逐渐减小的效果而不是一条条规则地设置。另外,将军死活其实用AI来检测也很简单,这道题加上联动就是用来刻意练习的!嗯!



亲~不练是学不会的哦~快来赚取属于你的耕战鹰币奖励吧!




延伸阅读:xyz新时代的开启,论帝国中的“变量”
这是对地图编辑器和C版~UP1.5版AI的变量的详细论述,相信看完之后你会对帝国的变量有更深的理解

延伸阅读:数据处理与变量
一个精妙的对资源数值做二次幂分解的方法,可以大幅加快资源法联动中编辑器对资源数值的处理速度

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册翔鹰会员(昵称)

x

评分

参与人数 1鹰币 +10 收起 理由
Nero§Claudius + 10 分享交流

查看全部评分

索引:
Userpatch 实用技术贴索引←点击进入
决定版精品贴大索引←点击进入

战役:
《 兔与豹》——柔弱奴隶公主  猛兽口中求生←点击进入
《敛由国的统一》←点击进入

殊途战役制作群 QQ: 616317226
翔鹰帝国Ⅱ:决定版交流群 QQ: 112822759
回复

使用道具 举报

117

主题

9

精华

9万

积分

教皇

Wolotine

耕战
17250
鹰币
546150
天龙币
0
回帖
1570

翔鹰建站十周年纪念章小评论家第十二届火箭筒杯最佳新人第十三届火箭筒杯亚军第十三届火箭筒杯亚军赌徒勋章第八届战鹰杯单人赛冠军

附庸关系11
发表于 2020-6-13 11:13:38 | 显示全部楼层
光说不练假把戏,来一道课后作业:

[入门难度]先用触发做一个魔法值系统(用石料表示),上限100点,每秒恢复1点魔法值;技能“魔法护盾”可以消除英雄受到的一半伤害(向上取整),每次英雄受到伤害,用触发和AI联动补充相应的生命值并扣除等量魔法值,注意临界点魔法值不足的情况下,使用所有魔法值抵消等量伤害。

[进阶难度]同样的魔法值系统,但是这次魔法值的上限和恢复速度受属性“智力”影响,智力的取值范围为10~50,魔法上限=智力*10,恢复速度=智力*0.1(注意小数,这里要求精确做到保留一位小数),魔法护盾可以抵消的伤害比例是(20+智力)%,向上取整。(难点在于小数如何处理以及变量的体系如何搭建)

能做到进阶的程度,可以说是基本掌握触发与AI的变量联动了,能做到入门的程度,可以说勉强点懂AI,战役不至于太差,入门都做不到,那真的是超过一分都难,新桶这帖子写了也是白写。

评分

参与人数 1耕战 +5 鹰币 +20 收起 理由
newtonerdai + 5 + 20 感谢出题,我顺便也整了几道

查看全部评分

回复

使用道具 举报

109

主题

14

精华

6万

积分

教皇

特洛伊大叔

耕战
10480
鹰币
1610
天龙币
126
回帖
2347

翔鹰建站十周年纪念章二级帝国勋章一级翔鹰勋章二级嘉禾勋章大评论家小评论家创意工坊通行证第十一届火箭筒杯最佳战役

附庸关系10
发表于 2020-6-14 17:18:16 | 显示全部楼层
基本上這篇是1.3版本的這篇文章的加強版:
xyz新时代的开启,论帝国中的“变量”
你其實只需引用此篇並寫出"如何使用新資源"的語句就好,多寫有點浪費時間了。
傭兵外傳-安帝哥崛起 2020十二月發表
傭兵-完整版已公佈下載請點此處
回复

使用道具 举报

183

主题

9

精华

2万

积分

教皇

耕战
3325
鹰币
14956
天龙币
0
回帖
1200

翔鹰建站十周年纪念章

附庸关系3
 楼主| 发表于 2020-6-14 17:45:22 | 显示全部楼层
troytroytroy 发表于 2020-6-14 17:18
基本上這篇是1.3版本的這篇文章的加強版:
xyz新时代的开启,论帝国中的“变量”
你其實只需引用此篇並寫出 ...

才发现这个贴子的重要性。顺带我也如愿找到了骑士不怕长枪写的数的二次幂分解一贴。多谢大叔提醒。我稍后就把帖子接上主楼。

不过仔细想想,xyz那篇还是讲理论居多,没有谈应用,我写的都是应用性居多,望大叔理解。

点评

也沒關係,只是以後你多翻翻舊帖子,就不用花時間重寫很多東西。  发表于 2020-6-14 18:13
索引:
Userpatch 实用技术贴索引←点击进入
决定版精品贴大索引←点击进入

战役:
《 兔与豹》——柔弱奴隶公主  猛兽口中求生←点击进入
《敛由国的统一》←点击进入

殊途战役制作群 QQ: 616317226
翔鹰帝国Ⅱ:决定版交流群 QQ: 112822759
回复

使用道具 举报

21

主题

3

精华

1万

积分

征服者

耕战
3476
鹰币
2316
天龙币
0
回帖
220

第十三届火箭筒杯季军

附庸关系9
发表于 2020-7-7 11:21:52 | 显示全部楼层
本帖最后由 HudsonLee 于 2020-7-7 11:24 编辑

快来投币吧,为嘛我写一行他排版成两行



(defrule
     (taunt-detected 1 1)
=>
     (cc-add-resource food 1)
     (acknowledge-taunt 1 1))
触发1:
条件:堆积属性,玩家2,食物>=1;
效果:修改资源,玩家2,食物为0;
效果:修改攻击力,玩家2,全体军事单位,修改攻击力+5

触发2:
条件:将物体带到指定区域区域
效果:激活触发3
效果:修改资源,玩家2,黄金为1;
(defrule
    (gold-amount >= 1)
=>
    (attack-now)
    (disable-self)
)

评分

参与人数 1耕战 +10 鹰币 +30 收起 理由
newtonerdai + 10 + 30 还是在用旧方法哦,用隐藏资源练练吧.

查看全部评分

![/url]
回复

使用道具 举报

本版积分规则

排行榜|小黑屋|翔鹰帝国

GMT+8, 2024-3-29 08:04 , Processed in 0.121738 second(s), 66 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

Copyright © 2001-2023, Hawkaoe.net All Rights Reserved

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