newtonerdai 发表于 2020-4-28 01:14:54

[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)                  ;遗迹




troytroytroy 发表于 2020-4-28 01:48:28

很棒。這是一個非常重要的結果。以AI而言,這可以精確的計算出一些已知ID的行為與數據。甚至比目前已知觸發的條件還要精準。只要透過資源與觸發進行溝通,這個AI就能幫助戰役
製作者設計出更為精細的敵人與效果。

如果配上死者復活的技術,設計出戰役就會是不同次元的東西了。

newtonerdai 发表于 2020-5-14 15:44:55

优化排版!
页: [1]
查看完整版本: [UP1.5] 搜索并报告场景里某个单位的地图ID的AI