[UP1.5] 搜索并报告场景里某个单位的地图ID的AI
本帖最后由 newtonerdai 于 2020-6-14 18:21 编辑利用UP1.5的搜索-筛选系统来写了这个简短的AI,作用是获取并报告地图上某个特定单位的地图ID。
决定版暂时没有适配的AOKTS,无法直接查看一个单位的地图ID,这个或许可以帮到一些朋友。
能运用的地方是:如果需要用AI来检测一个主角的各项数据用于计算,辅助触发条件判定,可以获取他的ID,然后直接使用(up-set-target-by-id <主角的地图ID>)来方便地锁定主角来检测。
下面的是代码预览
【代码内置排版,但放到论坛里显示效果不好,推荐直接下载文件,用SimSun-ExtB字体打开】
;///////////////////////////////////////////////////////////
;// 搜索并获取某个单位的地图编号 //
;// 作者:newtonerdai//
;// www.hawkaoe.net//
;///////////////////////////////////////////////////////////
;注:本AI仅适用于支持UP1.5 AI语句的游戏。如UP1.5、WK、LK、DE。
; 前几个可以通过AOKTS查到地图id,但DE暂无适配的AOKTS,所以一般用于DE。
;乱码问题:本per文件使用的是UTF-8编码。在DE之前的旧版本使用时,请先转码为GB-2312。
;使用方法:
; 把这个AI(包括.ai和.per两个文件)放到游戏目录的ai文件夹。(DE的为 AoE2DE\resources\_common\ai)。
; 重新载入编辑器场景,然后在编辑器中给任意电脑玩家A指定这个AI。
; 在你想要检测地图编号的单位处,用触发生成一个电脑玩家A的全开地图(地图启示者),或直接放置一个单位,以提供视野,用于搜索。
; 打开per文件,在初始化部分输入你想要的参数,保存。
; 有需要时,可在运作部分把你想要的语句取消注释(注释符为英文分号)。
; 进入游戏,用Ctrl+Shift+F1~F9切换控制玩家,控制这个单位执行某个指令(如移动、跟随等),直到搜索计数为1,用于精确筛选。
; 如果要获取地图id的是一个建筑或冲车,可以给它驻扎几个单位,用于精确筛选。
;===== 常数/目标定义部分
(defconst gl-local-total 200) ;本地搜索结果计数(即搜索AI玩家自己)
(defconst gl-local-last 201)
(defconst gl-remote-total 202) ;远程搜索结果计数(可以是搜索任何玩家)
(defconst gl-remote-last 203)
(defconst unit 204)
(defconst player 205)
(defconst orderid 206)
(defconst min-garrison 207)
(defconst max-garrison 208)
(defconst map-id 209) ;用于储存并报告搜索到的单位的地图编号
;===== 初始化。可在此修改你想要的参数
(defrule
(true)
=>
(set-goal unit 4) ;要检测的单位的编号,如 4 为步弓兵(可查AGE或DE/WK大典)
(set-goal player 1) ;要检测的单位的所属玩家,如 1 为玩家1。可以为其他玩家,也可以为AI玩家自身
; (set-goal orderid 710) ;(不支持goal代数,需要到下面填写数字)要检测的单位的执行编号,即正在执行的命令,用于辅助筛选。如 710 为移动,712 为跟随。详见后附的执行编号表
(set-goal min-garrison 1) ;要检测的单位的驻扎数量下限,用于辅助筛选。如 1 为最少驻扎有1个单位
(set-goal max-garrison 5) ;要检测的单位的驻扎数量上限,用于辅助筛选。如 5 为最多驻扎有5个单位
(disable-self) ;只执行一次
)
;===== 运作部分
;重置搜索
(defrule
(true) ;恒成立
=>
(up-full-reset-search) ;清空搜索结果和筛选条件
(up-get-search-state gl-local-total);清空搜索计数
)
;搜索并报告结果
(defrule
(true)
=>
(up-filter-include -1 -1 710 -1) ;添加筛选条件,只搜索执行编号为 710(移动) 的单位。只能用数字,不支持goal
; (up-filter-garrison g: min-garrison g: max-garrison);添加筛选条件,只搜索驻扎单位数量为min到max的单位(用于建筑或冲车)
(up-modify-sn sn-focus-player-number g:= player) ;设置焦点玩家为player代表的数字。
(up-find-remote g: unit c: 40) ;搜索最多40个焦点玩家的unit指定的单位
(up-get-search-state gl-local-total) ;检查用,可获取当前搜索计数,储存到以gl-local-total为首的连续四个变量中
(up-chat-data-to-all "找到单位:%d个" g: gl-remote-total) ;检查用,可报告远程搜索结果数。远程搜索即使用
(up-set-target-object 2 c: 0) ;设置目标单位为远程搜索结果(2)的第一个单位(0)
(up-get-object-data 0 map-id) ;获取目标单位的地图编号(0),储存到map-id里。查UserPatchConst.per可获取更多object-data数值。
(up-chat-data-to-all "地图ID:%d" g: map-id) ;报告map-id里保存的数字
)
;重置搜索
(defrule
(true)
=>
(up-full-reset-search) ;清空搜索结果和筛选条件
(up-get-search-state gl-local-total) ;清空搜索计数
)
;===== 附录:执行编号表
;(defconst orderid-attack 700) ;攻击(自动寻敌时为-1)
;(defconst orderid-defend 701) ;警戒
;(defconst orderid-build 702) ;建造
;(defconst orderid-heal 703) ;治疗
;(defconst orderid-convert 704) ;转化
;(defconst orderid-explore 705) ;探索
;(defconst orderid-stop 706) ;停止
;(defconst orderid-runaway 707) ;逃跑
;(defconst orderid-retreat 708) ;撤退
;(defconst orderid-gather 709) ;采集
;(defconst orderid-move 710) ;移动
;(defconst orderid-patrol 711) ;巡逻
;(defconst orderid-follow 712) ;跟随
;(defconst orderid-hunt 713) ;捕猎
;(defconst orderid-transport 714) ;运输
;(defconst orderid-trade 715) ;贸易
;(defconst orderid-evade 716) ;躲避
;(defconst orderid-enter 717) ;进驻
;(defconst orderid-repair 718) ;维修
;(defconst orderid-train 719) ;训练
;(defconst orderid-research 720) ;研究
;(defconst orderid-unload 721) ;卸载
;(defconst orderid-relic 731) ;遗迹
很棒。這是一個非常重要的結果。以AI而言,這可以精確的計算出一些已知ID的行為與數據。甚至比目前已知觸發的條件還要精準。只要透過資源與觸發進行溝通,這個AI就能幫助戰役
製作者設計出更為精細的敵人與效果。
如果配上死者復活的技術,設計出戰役就會是不同次元的東西了。
优化排版!
页:
[1]