本帖最后由 newtonerdai 于 2020-5-21 14:58 编辑
演示gif:
AI文件:(与下面的正文完全一致,可选择其中一种阅读)
注:本per文件为UTF-8编码,可直接用于DE。在旧版里用时,需要自己转码为GBK。
;/////////////////////////////////////////////////////////// ;// ------------------- AI演示学习模块 -------------------// ;// 获取闪光位置+精确化+格内微调+【精细指派】 // ;// 作者:newtonerdai // ;/////////////////////////////////////////////////////////// ;
; 【前言】
;▲模块作用:在【帝国电影/过场】里,让单个人物走到一个非常精确的点
; (如果暂时将角色体积缩小到0.01以下,甚至可以每次只挪动0.01格)!
;
;在可以用AOKTS的旧版,我们可以使用(【隐形斗篷】-- 任务目标 / 精准0.N指派单位)来达到相同的效果
;然而在当前无法使用AOKTS的决定版,我们可能无法利用隐形的木桩作为指派目标点。那么这时这个AI就能派上用场了。
;
;▲适用版本:仅适用于支持UP1.5 AI语句的版本。如UP1.5、WK、LK、DE。
;
;▲学习步骤:(请不要被吓到,跟着一步步来,你会学会的,这对于你的UP1.5 AI学习有很大的帮助)
; 准备阶段
; 0. 打开UP作者的脚本说明书如果遇到不懂的语句,可以搜索查看语法说明。
; 1. 把这个AI(包括.ai和.per两个文件)放到游戏根目录的ai文件夹(DE的为 AoE2DE\resources\_common\ai)。
; 2. 新建空白编辑器场景,在编辑器中给任意电脑玩家指定这个AI。
; 3. 在空白地图上,第一个单位先放置该AI的任一普通单位(此时这个单位的地图ID为0)。
; 测点阶段
; 4. 打开per文件。在下面的“参数输入部分 I”里,输入【自定义参数】偏移量,保存。
; 5. 回到编辑器,进入测试,确认已勾选向所有玩家发送信息(右上角聊天菜单)
; 6. 输入数字 2,然后在你想让角色前往的格子里,用 Alt+F 发送一个闪光。
; 7. 记下AI播报的 X、Y 坐标数字
; 指派阶段
; 8. 通过 AOKTS(DE暂不能用) 或 这个贴子(DE版)的方法,获取要指派的角色的地图ID
; 9. 打开per文件。在下面的“参数输入部分 II”里,输入【自定义参数】精确坐标和角色地图ID,保存。
; 10. 回到游戏,重新开始。
; 11. 输入数字 3 ,则角色将往精确化、偏移过的之前的闪光点处行走。
; 学以致用
; 12. 现在你已经学会使用这个系统了,接下来,请参考CPSB.doc或其他AI教程来把这几个系统运用到你的战役过场里吧!
;----------------------------------------------------------
; 第一部分:获取闪光位置+精确化+微调
;----------------------------------------------------------
(defconst g-flare-x 100)
(defconst g-flare-y 101)
(defconst c-adjust-x 102)
(defconst c-adjust-y 103)
;=========== 参数输入部分 I ===========
(defrule
(taunt-detected 1 2)
=>
(set-goal c-adjust-x 50) ;【自定义参数】50 = 稍后对闪光点进行格内偏移的量(1 = 0.01格)。偏移起始点为格子左角。X方向为↗,Y方向为↘
(set-goal c-adjust-y 50) ;【自定义参数】同上。这里两个 50 结果是偏移到格子中央(0.5格)。
(disable-self)
)
;============= 运行部分 I =============
(defrule
(taunt-detected 1 2) ;玩家1输入数字2后执行一次
(cc-players-unit-type-count 1 274 > 0) ;玩家1发送闪光后才会执行
=>
(up-find-player-flare 1 g-flare-x) ;获取玩家1的闪光坐标(保留到整格,即闪光格子最左角),这是第一次获取想要前往的格子的,获取到后就可以直接指定这个点了
(up-modify-goal g-flare-x c:* 100) ;闪光点升格为精确点
(up-modify-goal g-flare-y c:* 100) ;同上
(up-modify-goal g-flare-x g:+ c-adjust-x) ;对精确闪光点进行格内偏移
(up-modify-goal g-flare-y g:+ c-adjust-y) ;同上
(up-chat-data-to-all "偏移后精确坐标 X = %d" g: g-flare-x)
(up-chat-data-to-all "偏移后精确坐标 Y = %d" g: g-flare-y)
(acknowledge-taunt 1 2)
)
;----------------------------------------------------------
; 第二部分:精细指派
;----------------------------------------------------------
(defconst g-destination-x 110)
(defconst g-destination-y 111)
(defconst unit-mapid 112)
;=========== 参数输入部分 II ===========
(defrule
(taunt-detected 1 3)
=>
(up-modify-goal g-destination-x g:= g-flare-x) ;【自定义参数】把 g:= 替换为 c:= ,然后把 g-flare-x 替换为上面报告出来的精确坐标值,后面即可独立使用
(up-modify-goal g-destination-y g:= g-flare-y) ;【自定义参数】同上
(set-goal unit-mapid 0) ;【自定义参数】要指派单位的地图ID,可通过 www.hawkaoe.net/bbs/thread-146210-1-1.html 这个贴子的方法来获取
(disable-self)
)
;============= 运行部分 II =============
(defrule
(taunt-detected 1 3) ;玩家1输入数字3后执行一次。可换成你想要的其他事实,比如 AI触发器/事件 event-detected
=>
(up-full-reset-search) ;每次使用DUC前完全重置一次
(up-add-object-by-id 1 g: unit-mapid) ;把unit-mapid对应的单位加入到本地搜索结果里。
(set-strategic-number sn-target-point-adjustment 6) ;【核心语句】设置up-target-point为精确指派模式,允许使用精确点
(up-target-point g-destination-x 1 -1 -1) ; 指派 unit-mapid 对应的单位 [移动(1)] 到 g-destination-x 点处
(up-full-reset-search) ;每次使用DUC后完全重置一次
(acknowledge-taunt 1 3)
)
|