newtonerdai 发表于 2020-5-22 01:58:43

[UP1.5] 让AI强行控制玩家1的单位!

本帖最后由 newtonerdai 于 2020-5-22 16:34 编辑

演示:


AI文件:(与下面的正文完全一致,可选择其中一种阅读)
注:本per文件为GBK编码,可直接用于UP1.5/WK。在DE里用时,需要自己转码为UTF-8。





;///////////////////////////////////////////////////////////
;// --------------------- AI实用模块 ---------------------//
;//               让AI强行控制玩家1的单位               //
;//                                     作者:newtonerdai //
;//                                       www.hawkaoe.net //
;///////////////////////////////////////////////////////////

;                         【前言】
;▲模块作用:让AI能强行控制玩家1的单位执行一些行动。
;         (心灵控制技能、托管重复性操作、士气溃败……这会开启一个新时代)
;
;▲适用版本:仅适用于支持UP1.5 AI语句的版本。如UP1.5、WK、DE。

;----------------------------------------------------------
;                  让AI强行控制玩家1的单位
;----------------------------------------------------------
(defconst g-point-x 100)
(defconst g-point-y 101)

(defconst gl-local-total 102)   ;用于储存本地搜索结果总数
(defconst gl-local-last 103)
(defconst gl-remote-total 104);用于储存远程搜索结果总数
(defconst gl-remote-last 105)

(defconst index 106)            ;用于临时储存搜索结果索引编号
(defconst temp-unit-id 107)   ;用于临时储存获取到的单位地图ID

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;方式①:已知地图ID的情况,直接加入本地搜索结果指派
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
(defrule
    (taunt-detected 1 3)                  ; 使用数字3来手动测试
=>
    (up-full-reset-search)                  ; 使用DUC前完全重置
    (up-modify-goal g-point-x c:= 68)       ; 随便设一个点作为巡逻目的地
    (up-modify-goal g-point-y c:= 78)       ; 同上

    (up-add-object-by-id 1 c: 0)            ;【核心语句】强行将一个单位加入到自己的搜索结果里
    (up-add-object-by-id 1 c: 1)            ;(这些是玩家1单位的地图ID)
    (up-add-object-by-id 1 c: 2)            ; 同上
    (up-add-object-by-id 1 c: 3)            ; 同上

    (up-target-point g-point-x 2 -1 -1)   ; 2 = 巡逻

    (acknowledge-taunt 1 3)
)

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;方式②:地图ID实时变化的情况,搜索后逐一加入本地搜索结果,最后统一指派
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

;------------------
;搜索玩家1的任意单位,最多40个。可自行添加筛选和剔除
;------------------
(defrule
    (taunt-detected 1 4)                  ; 使用数字4来手动测试
=>
    (up-modify-goal index c:= 0)            ; 复原index为0
    (up-full-reset-search)                  ; 使用DUC前完全重置
    (set-strategic-number sn-focus-player-number 1)
    (up-find-remote c: -1 c: 40)            ; 搜索到远程结果
    (up-get-search-state gl-local-total)    ; 获取搜索计数
;    (up-chat-data-to-all "remote:%d" g: gl-remote-total);测试用
)
;------------------
;依次获取远程搜索结果的ID,并强行加入本地搜索结果
;------------------
(defrule
    (taunt-detected 1 4)
    (up-compare-goal index g:< gl-remote-total) ;循环直到遍历所有远程结果
=>
    (up-set-target-object 2 g: index)         ;【核心语句】设目标单位为第(index-1)个单位
    (up-get-object-data 0 temp-unit-id)         ;获取该单位的地图ID
    (up-add-object-by-id 1 g: temp-unit-id)   ;【核心语句】强行将该单位加入到自己的搜索结果里
    (up-modify-goal index c:+ 1)                ;index + 1
    (up-jump-rule -1)                           ;循环遍历
)
;------------------
;获取完之后,强行指派找到的玩家1单位
;------------------
(defrule
    (taunt-detected 1 4)
    (up-compare-goal index g:>= gl-remote-total)
=>
    (up-modify-goal g-point-x c:= 68)       ; 随便设一个点作为巡逻目的地
    (up-modify-goal g-point-y c:= 78)       ; 同上

    (up-target-point g-point-x 2 -1 -1)   ; 2 = 巡逻

    (up-modify-goal index c:= 0)            ; 复原index为0
    (acknowledge-taunt 1 4)
)

;【附录:指派行动】
;用于 up-target-point 和 up-target-objects

;(defconst action-default 0) 默认       相当于框选单位右键点击目标点地面或目标单位。使用target-point时相当于action-move
;(defconst action-move 1) 移动          命令单位前往目标点或目标单位所在点。适用于target-point和target-objects
;(defconst action-patrol 2) 巡逻      命令单位向目标点或目标单位所在点巡逻。适用于target-point和target-objects
;(defconst action-guard 3) 警戒         使用target-objects时是护卫目标单位;使用target-point时相当于action-move
;(defconst action-follow 4) 跟随      使用target-objects时是跟随目标单位;使用target-point时相当于action-move
;(defconst action-stop 5) 停止          命令单位停止,相当于按下单位“停止”按钮。适用于target-point和target-objects
;(defconst action-ground 6) 强制攻击    命令单位攻击目标点或目标单位处的地面,即强制攻击。对于无强制攻击能力的单位相当于action-none。适用于target-point和target-objects
;(defconst action-garrison 7) 进驻      使用target-objects时是命令单位进驻到目标单位里;如果目标单位并不能进驻,则大部分时候相当于action-stop。使用target-point时相当于action-move
;(defconst action-delete 8) 自杀      本地搜索结果里能自杀的单位将自杀(Del)。适用于target-point和target-objects
;(defconst action-unload 9) 卸载      使用target-point时是命令建筑释放进驻在其内的单位到目标点,攻城武器(种属913)则将运送到目标点附近合适的地方卸载。使用target-objects时相当于action-none
;(defconst action-train 10) 训练      使用target-point时本地搜索结果里的建筑将训练单位。并且必须改用这个语法:,例如(up-target-point 0 action-train c: spearman-line)。使用target-objects时相当于action-none
;(defconst action-gather 11) 集结       命令建筑将集结点设为目标点或目标单位所在点。适用于target-point和target-objects
;(defconst action-lock 12) 锁定         使用target-point时是命令城门切换锁定状态,已解锁的城门会锁定,已锁定的城门会解锁。使用target-objects时相当于action-none
;(defconst action-work 13) 返工         使用target-point时是命令建筑释放驻扎的村民返回工作岗位。使用target-objects时相当于action-none
;(defconst action-ungarrison 14) 取消驻扎 使用target-point时是命令单位从他们驻扎的建筑里离开。使用target-objects时相当于action-none
;(defconst action-drop-relic 15) 放下圣物 使用target-point时是命令僧侣单位放下他们携带的圣物。使用target-objects时相当于action-none
;(defconst action-pack 16) 组装         使用target-point时是命令抛石机组装。使用target-objects时相当于action-none
;(defconst action-unpack 17) 展开       使用target-point时是命令抛石机展开。使用target-objects时相当于action-none
;(defconst action-none 18) 无 不作为。被命令的单位的当前行动不会变更。适用于target-point和target-objects



标本 发表于 2020-5-23 10:02:44

这个关键是up-target-point 这个动作吧,居然没有cc标识,这样的话随便写个AI不就是可以坑人了?

newtonerdai 发表于 2020-5-24 11:14:47

标本 发表于 2020-5-23 10:02
这个关键是up-target-point 这个动作吧,居然没有cc标识,这样的话随便写个AI不就是可以坑人了? ...

关键是up-add-object-by-id。
如果获取到了对方单位的地图id,就可以用这个语句强行选中控制。
页: [1]
查看完整版本: [UP1.5] 让AI强行控制玩家1的单位!