[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
这个关键是up-target-point 这个动作吧,居然没有cc标识,这样的话随便写个AI不就是可以坑人了? 标本 发表于 2020-5-23 10:02
这个关键是up-target-point 这个动作吧,居然没有cc标识,这样的话随便写个AI不就是可以坑人了? ...
关键是up-add-object-by-id。
如果获取到了对方单位的地图id,就可以用这个语句强行选中控制。
页:
[1]