世界
Ants 的世界是一张由陆地和水域组成的矩形网格。坐标写作 [row, column],两者都从零开始。观测中的 size 给出 [rows, columns];不要假定地图是正方形的。
网格,以及它为什么环绕
两个轴都环绕。在 64 × 96 的地图上,从 [0, 10] 向北移动会到达 [63, 10],从 [20, 95] 向东移动会到达 [20, 0]。边界不会阻挡任何东西:敌人可以从地图边界的另一侧攻击靠近边界的蚁丘。
距离在每个轴上都取环绕后较短的那段位移。设行差为 dr、列差为 dc,则:
dr = min(abs(r1 - r2), rows - abs(r1 - r2))
dc = min(abs(c1 - c2), cols - abs(c1 - c2))
distance_squared = dr * dr + dc * dc
视野、战斗和食物采集都使用这套几何。
两步就能看明白。一只蚂蚁从最上面一行被命令向北移动,会出现在最下面一行;从最左边一列被命令向西移动,会出现在最右边一列。没有任何东西阻拦蚂蚁,也没有任何标记提示它跨越了边界;它的行号或列号直接跳到另一端。
红方的蚁丘在左上角。按一下右方向键:向北的指令让蚂蚁离开最上面一行,出现在最下面一行。再按一下:向西的指令让它离开最左边一列,出现在最右边一列。离家才两步,它就站在了画面的对角。地图上没有可以据守的角落,也没有能让敌人把你逼到死角的边缘。
地形与水域
水域不可通行且永久存在。试图移入水域的蚂蚁会留在原地,而且仍然可能与另一只到达它所在格子的蚂蚁相撞。食物同样会拒绝移动:蚂蚁不能踏上有食物的格子,所以只能从旁边采集。一个陆地格可以同时容纳一座蚁丘和一只蚂蚁,而引擎只在空的陆地上放置新食物。移动结算之后,不会有两只蚂蚁留在同一格。
你的观测会保留你已发现的水域。水域掩码中的 0 表示陆地或尚未发现的格子,所以一条全是 0 的路线仍然可能撞上水域。观测格式给出了编码方式。
蚁丘
新蚂蚁只会在蚁丘上出生,别处不会。战斗结束后仍站在蚁丘上的敌方蚂蚁会摧毁它,被摧毁的蚁丘永远消失。站在自己蚁丘上的蚂蚁会阻止那里出生新蚂蚁,即使蚁巢里有食物也一样。
失去所有蚁丘的蚁群,只要还有蚂蚁存活,就仍留在对局中。它们可以继续移动和攻击,但没有尚存的蚁丘,蚁群就无法补充它们。
食物
出生结算之后,蚂蚁可以采集自己所在格或相邻四格中的食物。食物进入蚁群的蚁巢,这是一个共享的储备,在地图上没有位置。一单位储备的食物可以在一座空闲的蚁丘上生成一只蚂蚁。
每张地图都会在起始蚁丘附近放置食物,让蚁群能够开始发展。第零回合之后,食物按一个隐藏的速率出现,这个速率由引擎根据对局的种子抽取:每 19 到 37 个回合,每个蚁群得到 5 到 11 单位。食物以对称的组合落下,所以不会出现一个蚁群吃饱而对手挨饿的情况;应该落在已被占据格子上的那一单位会等到格子空出来。这个速率是地图上唯一无法从地图文件中读出的东西。
视野与迷雾
如果一个格子到你任意一只存活蚂蚁的环绕距离平方不超过 77,你就能看到它。水域不会遮挡视野。半径之外的敌人、食物和蚁丘不会出现在当前观测中,所以失去一只蚂蚁可能让你上一回合还看得到的区域消失。
引擎只替你记住已发现的水域,视野之外的其他一切都不记:敌人、食物和蚁丘一旦离开视野,就从观测中消失。观测不包含回合数、得分或蚁巢中的食物数。它确实包含 vis,即本回合你能看到哪些格子的掩码,这样你的模型就能区分空格子和看不到的格子。模型在两次调用之间携带的其他任何东西都属于它自己的记忆,而且只有在它的重量级允许记忆时才行。
查看器目前还无法展示这一点。回放帧携带的是裁判看到的地图(每一只蚂蚁、全部水域),因为重新模拟动作流重建的正是这个视图。
replay-decode目前还说不出某个席位在某一回合知道什么;在它能做到之前,放在这里的回放只会教给你与本节相反的东西。
对称性与地图
每个席位的起点都是同一张地图:席位 k 的地形、蚁丘和第零回合的食物,就是席位 0 的那些按地图的平移量移动 k 次得到的,地图文件把这个平移量称为 symmetry。各个蚁群选择不同的移动,所以从第一回合起,对局就可能打破这种对称。
地图决定尺寸、地形、每个席位的蚁丘数和席位数。地图可容纳 2 到 8 名玩家,每个赛季的地图都是它自己的,同一尺寸的两张地图可以容纳不同的人数,所以席位数要从地图中读取,绝不要根据尺寸推断。