翔鹰帝国网|帝国时代论坛|帝国时代系列|神话时代
 找回密码
 注册翔鹰会员(昵称)
搜索
查看: 636|回复: 3

[战役AI] 据点防御AI

[复制链接]

23

主题

1

精华

2万

积分

征服者

耕战
3880
鹰币
3530
天龙币
75
回帖
1132

翔鹰建站十周年纪念章二级翔鹰勋章第八届火箭筒杯最佳战役第八届火箭筒杯最佳新人

附庸关系0
 楼主| 发表于 2021-4-9 00:00:23 | 显示全部楼层 |阅读模式
本帖最后由 春田一九零三 于 2021-4-9 00:17 编辑

之前为了某战役(烂尾)定置的AI。可以供需要的人参考。注意并非所有变量都有用。主要是考虑到多个AI共存的情况才做了定义。
如果需要公用,可以在defconst中把变量对应的数字修改掉(当然如果缺乏ai基础可能不知道吾辈在说什么

据点防御AI:
主要是代替传统TSA,每个AI玩家只能围绕一个TC展开防守的问题。
这个AI可以防御复数据点,并且为每个据点配置防御半径,并且他只会防御会移动的攻击单位,因此不会被建筑物吸引走。。。

  1. ;// 单位不动(简单版) //
  2. (defrule
  3.     (true)
  4. =>
  5.     (set-strategic-number sn-maximum-food-drop-distance -2)
  6.     (set-strategic-number sn-maximum-wood-drop-distance -2)
  7.     (set-strategic-number sn-maximum-gold-drop-distance -2)
  8.     (set-strategic-number sn-maximum-stone-drop-distance -2)
  9.     (set-strategic-number sn-maximum-hunt-drop-distance -2)
  10.     (set-strategic-number sn-percent-civilian-gatherers 0)
  11.     (set-strategic-number sn-percent-civilian-builders 0)
  12.     (set-strategic-number sn-percent-civilian-explorers 0)
  13.     (set-strategic-number sn-maximum-fish-boat-drop-distance -2)
  14.     (set-strategic-number sn-task-ungrouped-soldiers 0)
  15.     (set-strategic-number sn-total-number-explorers 0)
  16.     (set-strategic-number sn-relic-return-distance 0)
  17.     (disable-self)
  18. )

  19. ;// 敌作战能力 //
  20. (defrule
  21.     (true)
  22. =>
  23.     (set-difficulty-parameter ability-to-maintain-distance 0)
  24.     (set-difficulty-parameter ability-to-dodge-missiles 0)
  25.     (set-strategic-number sn-percent-enemy-sighted-response 100)
  26.     (set-strategic-number sn-enemy-sighted-response-distance 32)
  27.     (disable-self)
  28. )

  29. ;// 据点防御:召集半径X内的我方闲置单位,巡逻攻击同范围内发现的敌方单位 //

  30. (defconst gl-point-x 100)       ;探测玩家信号座标x
  31. (defconst gl-point-y 101)       ;探测玩家信号座标y
  32. (defconst gl-point-x2 102)       ;转存玩家信号座标x,作为最终目标
  33. (defconst gl-point-y2 103)       ;转存玩家信号座标y,作为最终目标
  34. (defconst gl-point-x3 104)       ;设置的当前进攻座标x
  35. (defconst gl-point-y3 105)       ;设置的当前进攻座标y
  36. (defconst gl-point-x4 106)       ;设置ai的集结出发点x
  37. (defconst gl-point-y4 107)       ;设置ai的集结出发点y
  38. (defconst gl-point-A 108)       ;过渡用变量A
  39. (defconst gl-point-B 109)       ;过渡用变量B
  40. (defconst gl-faith 110)       ;队伍信心
  41. (defconst gl-point-r 111)       ;探测半径
  42. (defconst gl-player 112)       ;搜索的目标玩家
  43. (defconst gl-enemy-unit-detect 113)      ;搜索到可攻击的敌人单位数
  44. (defconst gl-local-total 120)
  45. (defconst gl-local-last 121)
  46. (defconst gl-remote-total 122)
  47. (defconst gl-remote-last 123)
  48. (defconst gl-random-number 124)       ;随机数

  49. (defconst search-local 1)       ;搜索源常数:本地
  50. (defconst search-remote 2)       ;搜索源常数:远方
  51. (defconst stance-aggressive 0)       ;进攻状态常数:进攻
  52. (defconst action-patrol 2)       ;行动编号常数:巡逻
  53. (defconst position-object 12)       ;位置类型常数:物件
  54. (defconst actionid-enter 617)       ;行动编号常数:进入(驻扎)
  55. (defconst object-data-index -1)       ;up-remove-objects专用
  56. (defconst object-data-action 5)       ;单位动作
  57. (defconst object-data-target-id 23)      ;单位目标
  58. (defconst object-data-tasks-count 32)      ;单位获得任务数
  59. (defconst object-data-attacker-count 33)     ;单位的攻击数
  60. (defconst object-data-next-attack 55)      ;单位正在交战
  61. (defconst object-data-group-flag 73)      ;单位所属组0-9,无为-2
  62. (defconst flare 274)        ;信号
  63. (defconst king-class 959)       ;国王类
  64. (defconst infantry-class 906)       ;步兵类
  65. (defconst archery-class 900)       ;弓箭手类
  66. (defconst archery-cannon-class 944)      ;火枪手类
  67. (defconst cavalry-class 912)       ;骑兵类
  68. (defconst cavalry-archer-class 936)      ;骑射手类
  69. (defconst cavalry-cannon-class 923)      ;征服者类
  70. (defconst siege-weapon-class 913)      ;攻城武器类


  71. (defconst POINT 201)        ;据点编号
  72. (defconst POINT-max 202)       ;最大据点数量

  73. ;// 据点防御初始化 //

  74. (defrule
  75.     (true)
  76. =>
  77.     (set-goal POINT 0)        ;据点未开启防御模式,编号0
  78.     (set-goal POINT-max 2)       ;设定最大据点数量
  79.     (disable-self)
  80. )

  81. ;// 据点防御开启 //

  82. (defrule
  83.     (game-time greater-than 4)       ;游戏时间经过4秒(防开局加资源)
  84.     (goal POINT 0)          ;据点防御模式未开启
  85.     (stone-amount >= 100)       ;配合触发,AI玩家拥有100石开启据点防御
  86.     (stone-amount < 200)
  87. =>
  88.     (cc-add-resource stone -100)      ;清除石头指令
  89.     (enable-timer 1 0)        ;激活定时器1,时间为0秒(立刻启动)
  90.     (set-goal POINT 1)        ;从据点1开始计算
  91.     (chat-to-all "据点防御开启")
  92. )

  93. (defrule
  94.     (up-compare-goal POINT g:== POINT-max)     ;开启过据点防御,并且遍历过至少一次
  95.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  96. =>
  97.     (set-goal POINT 1)        ;重置当前据点编号为1
  98. )

  99. ;// 据点防御开启-循环起点A //
  100. ;// 据点1:上方村庄(94,47),防御半径20 //
  101. ;// 据点2:下方港口(45,82),防御半径10 //
  102. ;// 复制下方段落实现扩展,并修改最后的jump差值 //

  103. (defrule
  104.     (up-compare-goal POINT c:== 1)
  105.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  106. =>
  107.     (up-modify-goal gl-point-x c:= 94)      ;读取据点1座标x
  108.     (up-modify-goal gl-point-y c:= 47)      ;读取据点1座标y
  109.     (up-modify-goal gl-point-r c:= 20)      ;读取据点1防御半径r



  110. (defrule
  111.     (up-compare-goal POINT c:== 2)
  112.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  113. =>
  114.     (up-modify-goal gl-point-x c:= 45)      ;读取据点2座标x
  115.     (up-modify-goal gl-point-y c:= 82)      ;读取据点2座标y
  116.     (up-modify-goal gl-point-r c:= 10)      ;读取据点2防御半径r
  117. )

  118. ;// 查找敌人目标 //

  119. (defrule
  120.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  121.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  122. =>
  123.     (set-goal gl-player 1)       ;初始化搜索从玩家1开始
  124.     (up-set-target-point gl-point-x)      ;将据点座标设置为搜索圆点
  125.     (up-full-reset-search)       ;重置直接寻的系统的搜索索引和筛选状态、搜索状态
  126.     (up-get-search-state gl-local-total)     ;重置搜索数量
  127. ;   (up-chat-data-to-all "目前据点的X座标是 %d 点" g: gl-point-x)  ;汇报座标
  128. ;   (up-chat-data-to-all "目前据点的Y座标是 %d 点" g: gl-point-y)
  129. )

  130. ;// 查找敌人目标-循环起点B //

  131. (defrule
  132.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  133.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  134. =>
  135.     (up-modify-sn sn-focus-player-number g:= gl-player)    ;设置当前玩家为焦点玩家
  136. )

  137. (defrule
  138.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  139.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  140.     (or (players-stance focus-player enemy)     ;只侦察敌对或中立玩家
  141. (players-stance focus-player neutral))

  142. =>
  143.     (up-filter-distance c: -1 g: gl-point-r)     ;设置搜索半径
  144.     (up-filter-include 4 -1 -1 -1)      ;只搜寻会移动的军事单位
  145.     (up-find-remote c: -1 c: 40)      ;上限40
  146.     (up-remove-objects search-remote object-data-action == actionid-enter)      ;忽略已经驻军的单位
  147. ;   (up-chat-data-to-all "我在探测 %d 号玩家" g: gl-player)   ;汇报玩家侦察情况
  148. )

  149. (defrule
  150.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  151.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  152. =>
  153.     (up-get-search-state gl-local-total)     ;记录搜索数量
  154.     (up-reset-filters)        ;重置过滤器(每次filters后都应当重置才不会出错)
  155.     (up-modify-goal gl-player c:+ 1)      ;搜索下一个玩家
  156. )

  157. (defrule
  158.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  159.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  160.     (up-compare-goal gl-player c:<= 8)
  161.     (up-compare-goal gl-remote-total c:< 40)
  162. =>
  163.     (up-jump-rule -4)        ;跳回循环起点B
  164. )

  165. (defrule
  166.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  167.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  168. =>
  169.     (up-get-search-state gl-local-total)     ;记录搜索数量
  170.     (up-modify-goal gl-enemy-unit-detect g:= gl-remote-total)
  171.     (up-get-precise-time 0 gl-random-number)     ;利用系统时间生成伪随机数
  172.     (up-modify-goal gl-random-number g:mod gl-remote-total)   ;伪随机数除以搜索个数得到其中1个
  173.     (up-chat-data-to-all "我找到了 %d 个敌人" g: gl-remote-total)  ;汇报玩家防御情况
  174. )

  175. (defrule
  176.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  177.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  178.     (up-compare-goal gl-random-number c:< 0)
  179. =>
  180.     (up-modify-goal gl-random-number c:* -1)
  181. )

  182. (defrule
  183.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  184.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  185.     (up-compare-goal gl-remote-total c:>= 1)
  186. =>
  187.     (up-remove-objects search-remote object-data-index g:!= gl-random-number) ;只瞄准一个单位
  188.     (up-set-target-object search-remote c: 0)     ;将该单位设为目标单位
  189.     (up-get-point position-object gl-point-x2)     ;将该单位座标存入x2
  190. )

  191. (defrule
  192.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  193.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  194.     (up-compare-goal gl-remote-total c:>= 1)     ;搜索到目标
  195.     (up-path-distance gl-point-x2 1 == 65535)     ;目标无法到达
  196. =>
  197.     (up-modify-goal gl-enemy-unit-detect c:= 0)     ;潜在敌人数为0
  198. )

  199. ;// 检测可安排的兵力 //

  200. (defrule
  201.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  202.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  203.     (up-modify-goal gl-enemy-unit-detect c:>= 1)    ;搜索到可攻击的敌人单位数至少为1
  204. =>
  205.     (up-full-reset-search)       ;重置直接寻的系统的搜索索引和筛选状态、搜索状态
  206.     (up-get-search-state gl-local-total)     ;重置搜索数量
  207.     (up-set-target-point gl-point-x)      ;将据点座标设置为搜索圆点
  208.     (up-filter-distance c: -1 g: gl-point-r)     ;设置搜索半径
  209.     (up-filter-include 4 -1 -1 -1)      ;只搜寻会移动的军事单位
  210.     (up-find-local c: -1 c: 200)      ;搜索目标附近的自军单位,上限200
  211.     (up-remove-objects search-local object-data-target-id c:!= -1)   ;忽略正在攻击的单位
  212.     (up-remove-objects search-local object-data-next-attack c:> 0)   ;忽略正在交战的单位
  213. ;   (up-remove-objects search-local object-data-tasks-count c:>= 1)  ;忽略已有任务的单位
  214. ;   (up-remove-objects search-local object-data-attacker-count c:>= 1)
  215. ;   (up-remove-objects search-local object-data-group-flag c:!= -2)  ;忽略已有组队的单位
  216. ;   (up-remove-objects search-local object-data-index c:>= 1)
  217. )

  218. ;// 让闲置兵力向发现敌人的位置巡逻 //

  219. (defrule
  220.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  221.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  222.     (up-compare-goal gl-enemy-unit-detect c:>= 1)    ;搜索到可攻击的敌人单位数至少为1
  223. =>
  224. ;   (up-send-flare gl-point-x)       ;产生自己的闪光信号
  225.     (up-target-point gl-point-x2 action-patrol -1 stance-aggressive)  ;用巡逻方式、攻击姿态向目标进发
  226.     (up-chat-data-to-all "我在防御 %d 号据点" g: POINT)    ;汇报玩家防御情况
  227. )

  228. ;// 去下一个据点指挥 //

  229. (defrule
  230.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  231.     (up-compare-goal POINT g:< POINT-max)     ;未遍历完全部据点
  232.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  233. =>
  234.     (up-modify-goal POINT c:+ 1)      ;进入下一个据点
  235.     (up-jump-rule -14)        ;跳回循环起点A,为负(12+最大据点数)
  236. )

  237. ;// 完成所有据点后延时,避免单位抽风 //

  238. (defrule
  239.     (up-compare-goal POINT c:> 0)      ;据点防御模式开启
  240.     (timer-triggered 1)        ;定时器1,每60秒检测一次
  241. =>
  242.     (disable-timer 1)        ;关闭定时器1
  243.     (enable-timer 1 60)        ;重新激活定时器1,时间为60秒(可按需要缩短)
  244. )

  245. ;// 关闭据点防御只要把PONIT设为0 //

复制代码




                 【2021】天堂之路DE版                                   【2016】霭之坡的窈蔚之森
个人网盘
回复

使用道具 举报

14

主题

0

精华

1165

积分

伯爵

耕战
100
鹰币
320
天龙币
0
回帖
30
附庸关系0
发表于 2021-4-9 12:54:07 | 显示全部楼层
据点坐标定死了吗
回复

使用道具 举报

23

主题

1

精华

2万

积分

征服者

耕战
3880
鹰币
3530
天龙币
75
回帖
1132

翔鹰建站十周年纪念章二级翔鹰勋章第八届火箭筒杯最佳战役第八届火箭筒杯最佳新人

附庸关系0
 楼主| 发表于 2021-4-12 11:11:56 | 显示全部楼层
wangzhen 发表于 2021-4-9 12:54
据点坐标定死了吗

根据使用情况自己改

                 【2021】天堂之路DE版                                   【2016】霭之坡的窈蔚之森
个人网盘
回复

使用道具 举报

0

主题

0

精华

31

积分

骑士

耕战
0
鹰币
0
天龙币
0
回帖
2
附庸关系0
发表于 2023-1-12 20:41:11 | 显示全部楼层
本帖最后由 ziranjun 于 2023-1-12 20:47 编辑

大佬还在吗,想了解一下这个据点防御功能的一些问题,有空解答吗
回复

使用道具 举报

本版积分规则

排行榜|小黑屋|翔鹰帝国

GMT+8, 2024-3-29 09:19 , Processed in 0.118627 second(s), 60 queries , File On.

Powered by Hawk Studio  QS Security Corp.® Licensed

Copyright © 2001-2023, Hawkaoe.net All Rights Reserved

快速回复 返回顶部 返回列表