arenaInfoobject
namestring
竞技场的名字
levelnumber
目前处于Basic(基础)竞技场的等级为1,Advance(高级)竞技场的等级为2
seasonstring
赛季,目前等于“alpha”
ticksLimitnumber
游戏tick(时间)限制
cpuTimeLimitnumber
每刻的CPU执行效率时间限制(除了第一刻)
cpuTimeLimitFirstTicknumber
第一刻的CPU执行效率时间限制
import { arenaInfo } from 'game';
export function loop(){
console.log(arenaInfo.name);
}
ConstructionSiteclass extends GameObject
一个正在建筑中的结构空位,要在该空位上建造一个结构,你需要给附有 WORK 属性的creep一些能量,并且执行build功能。
myboolean
该结构空位目前是你正在建造的
progressnumber
该结构目前建筑的进度
progressTotalnumber
场上要建筑的结构的总进度
remove()
移除建造的结构
CostMatrixclass
用于自定义导航成本数据的一个类,如果在该类中发现非0值,则将使用该值代替掉默认地形造成的成本。
为所有位置创建一个初始值为0的新CostMatrix。
set(x, y, cost)
在该CostMatrix中设置来自x, y位置的成本值。
参数 | 类型 | 描述 |
x | number | 游戏场上的x轴 |
y | number | 游戏场上的y轴 |
cost | number | 该位置的成本值,必须是一个整数。0的成本将使用该位置的默认成本。大于或等于255的成本将被视作无法使用。 |
clone()
将该CostMatrix复制到具有着相同数据的一个新的CostMatrix中,并返回一个新的CostMatrix。
import { CostMatrix } from 'game/path-finder';
export function loop() {
let costs = new CostMatrix;
}
import { CostMatrix } from 'game/path-finder';
export function loop() {
let costs = new CostMatrix;
costs.set(constructionSite.x, constructionSite.y, 10); // 避免在建筑空位上走过。
}
Creepclass extends GameObject
Creep们是你的工作单位,Creep们可以移动、抓取能量、建造结构、攻击其他人的Creep以及执行很多别的功能。每个Creep最多可以拥有50个bodyPart(属性【下同】)构成,可以有以下几种类型:
属性 | 花费 | 属性功能 |
MOVE | 50 | 每刻减少2点疲劳值 |
WORK | 100 | 每刻从一个能量源抓取2点能量单元 每刻构建一个可容纳5点能源单元的结构 |
CARRY | 50 | 最多可以容纳50个资源单元 |
ATTACK | 80 | 攻击其他的Creep、结构,用短距离每刻攻击30次 |
RANGED_ATTACK | 150 | 攻击其他的Creep、结构,用3格远长距离每刻攻击10次 攻击3格范围内所有Creep、结构,命中1-4-10次【取决于格数】 |
HEAL | 250 | 治疗自身或另一个Creep,在短距离内每刻治疗12次,远距离每刻治疗4次 |
TOUGH | 10 | 没有任何效果,只是对Creep增加了额外的命中点。(ps:就一占位符) |
fatiguenumber
疲劳值,如果该值大于0,则该Creep不能移动
hitsnumber
该Creep目前的血量
hitsMaxnumber
该Creep的最大血量
myboolean
属于你自己的Creep
attack(target)
使用近战攻击邻近的另一个Creep或结构。需要该Creep具有ATTACK属性。如果要攻击的目标位于墙壁内,则会攻击该墙壁。要攻击的目标必须位于Creep的相邻区块中。
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不属于可被攻击的对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 这个Creep的属性列表里并没有ATTACK(攻击)属性 |
build(target)
使用该Creep携带的能量在目标区块建造一个结构。需要该Creep具有WORK和CARRY属性。目标区块必须在Creep的3个区块范围以内。
参数 | 类型 | 描述 |
target | ConstructionSite | 要建造的目标建筑描述 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_RESOURCES | -6 | 该Creep没有足够多的搬运能量 |
ERR_INVALID_TARGET | -7 | 目标不是可以被建造的单位,或者是你无法在此处建造结构(可能是因为你要建造的区块有障碍物) |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 这个Creep的属性列表里并没有WORK(攻击)属性 |
drop(resourceType, [amount])
将该Creep身上的资源置于当前区块位置(扔掉)
参数 | 类型 | 描述 |
resourceType | string | RESOURCE_*的常量之一 |
amount (optional) | number | 要置于当前区块的资源数量 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_RESOURCES | -6 | 该Creep没有该数量那么多的资源要置于地上 |
ERR_INVALID_ARGS | -10 | resourceType参数有误,并不是有效的RESOURCE_*常量之一 |
harvest(target)
从能量源区块获取能量,需要该Creep具有WORK属性,如果该Creep具有CARRY属性,将会把收集的资源置入身体里,否则资源将会掉落在相邻的地面上。目标必须位于该Creep的相邻区块内
参数 | 类型 | 描述 |
target | Source | 要收集的资源对象 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_RESOURCES | -6 | 目标不包含任何可收集的资源 |
ERR_INVALID_TARGET | -7 | 目标不属于可以被收集资源的对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含WORK属性 |
heal(target)
治疗自己或其他己方的Creep,它将恢复Creep们受到伤害的部分,并恢复血量。需要该Creep具有HEAL属性,目标必须位于该Creep的相邻区块内
参数 | 类型 | 描述 |
target | Creep | 要治疗的目标对象 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不是有效的Creep对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含HEAL属性 |
move(direction)
将该Creep沿指定方向一直移动,直到撞到墙壁。需要该Creep具有MOVE属性
参数 | 类型 | 描述 |
direction | number | 支持以下常量之一 TOP TOP_RIGHT RIGHT BOTTOM_RIGHT BOTTOM BOTTOM_LEFT LEFT TOP_LEFT |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_ARGS | -10 | 输入的方向常量不正确 |
ERR_TIRED | -11 | 该Creep的疲劳值大于0,无法移动 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含MOVE属性 |
moveTo(target, opts)
找到到达目标区块的最佳路径,并尝试移动到该目标区块。需要该Creep具有MOVE属性
参数 | 类型 | 描述 |
target | object | 可以是GameObject或者任何包含了x和y属性的对象 |
opts | object | 一个附带着附加属性的对象,这些选项将按照参数传值给game/utils findPath |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_TIRED | -11 | 该Creep的疲劳值大于0,无法移动 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含MOVE属性 |
pickup(target)
捡起该区块的一个物品(一个扔掉的资源),需要该Creep具有CARRY属性。目标必须位于该Creep的相邻区块或位于同一区块内
参数 | 类型 | 描述 |
target | Resource | 要拾取的目标对象 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不是一个有效的Creep对象 |
ERR_FULL | -8 | 该Creep已经不能接收更多的资源了(已经满了) |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
pull(target)
帮助另一个Creep跟随这个Creep,target(目标)移动所产生的疲劳值将赋给这个Creep。需要该Creep具有MOVE属性。目标必须位于该Creep的相邻区块内,Creep必须移动到其他地方,目标需要向着该Creep移动。
参数 | 类型 | 描述 |
target | Creep | 目标Creep |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不是一个有效的Creep对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
rangedAttack(target)
使用远程攻击邻近的另一个Creep或结构。需要该Creep具有RANGED_ATTACK属性。如果要攻击的目标位于墙壁内,则会攻击该墙壁。要攻击的目标必须位于Creep的3格区块内
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不属于可被攻击的对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 这个Creep的属性列表里并没有RANGED_ATTACK属性 |
rangedHeal(target)
治疗自己或远处的其他己方的Creep,它将恢复Creep们受到伤害的部分,并恢复血量。需要该Creep具有HEAL属性,目标必须位于该Creep的3格区块内
参数 | 类型 | 描述 |
target | Creep | 要治疗的目标Creep对象 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_INVALID_TARGET | -7 | 目标不是有效的Creep对象 |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含HEAL属性 |
对3格区块以内的所有敌方Creep或建筑进行远程攻击。需要该Creep具有RANGED_ATTACK属性,攻击力取决于该Creep对每个目标的射程,己方单位不受此影响。
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NO_BODYPART | -12 | 你的Creep属性列表没有包含RANGED_ATTACK属性 |
transfer(target, resourceType, [amount])
将资源从Creep身上转到另一个【对象】上。目标必须位于该Creep的相邻区块内
参数 | 类型 | 描述 |
target | Creep Structure |
要转移的目标对象 |
resourceType | string | RESOURCE_*的常量之一 |
amount (optional) | number | 要转移的资源数量,如果省略该值,则默认转移所有可用的资源。 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_RESOURCES | -6 | 该Creep目前没有指定数量的资源可供转移 |
ERR_INVALID_TARGET | -7 | 要转移的目标对象不属于可以包含指定资源的有效对象 |
ERR_FULL | -8 | 目标已经不能接收更多的资源了(已经满了) |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_INVALID_ARGS | -10 | resourceType参数填写不属于RESOURCE_*常量之一,或者填写的数量不正确。 |
withdraw(target, resourceType, [amount])
从结构中抓取资源。目标必须位于该Creep的相邻区块内。多个Creep可以在同一个tick里对同一个对象进行抓取。你的Creep也可以从敌人的结构中抓取资源,以防止你的领地里没有敌人的结构。
参数 | 类型 | 描述 |
target | Structure | 要抓取的目标结构 |
resourceType | string | RESOURCE_*的常量之一 |
amount (optional) | number | 要抓取的资源数量,如果省略该值,则默认抓取所有可用的资源。 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_RESOURCES | -6 | 目标结构目前没有指定数量的资源可供转移 |
ERR_INVALID_TARGET | -7 | 要抓取的目标对象不属于可以包含指定资源的有效对象 |
ERR_FULL | -8 | 该Creep已经不能接收更多的资源了(已经满了) |
ERR_NOT_IN_RANGE | -9 | 目标太远啦 |
ERR_INVALID_ARGS | -10 | resourceType参数填写不属于RESOURCE_*常量之一,或者填写的数量不正确。 |
let hostileCreeps = getObjectsByPrototype(Creep).filter(i => !i.my);
let target = creep.findClosestByRange(hostileCreeps);
if (target){
creep.move(target);
creep.attack(target);
}
let myConstructionSites = getObjectsByPrototype(ConstructionSite).filter(i => i.my);
let target = creep.findClosestByRange(myConstructionSites);
if (target) {
if (creep.build(target) == ERR_NOT_IN_RANGE) {
creep.move(target);
}
}
creep.drop(RESOURCE_ENERGY);
let activeSources = getObjectsByPrototype(Source).filter(i => i.energy > 0);
let source = creep.findClosestByRange(activeSources);
if(source){
if (creep.harvest(source) == ERR_NOT_IN_RANGE) {
creep.move(source);
}
}
let creeps = getObjectsByPrototype(Creep);
let myDamagedCreeps = creeps.filter(i => i.my && i.hits < i.hitsMax);
let target = tower.findClosestByRange(myDamagedCreeps);
if (creep.heal(target) == ERR_NOT_IN_RANGE) {
creep.moveTo(target);
}
creep.move(RIGHT);
creep1.moveTo(creep2);
creep2.moveTo({x: 50, y: 50});
let resources = getObjectsByPrototype(Resource);
let target = creep.findClosestByRange(resources);
if (target) {
if (creep.pickup(target) == ERR_NOT_IN_RANGE) {
creep.moveTo(target);
}
}
creep1.move(TOP);
creep1.pull(creep2);
creep2.moveTo(creep1);
let hostileCreeps = getObjectsByPrototype(Creep).filter(i => !i.my);
let targets = creep.findInRange(hostileCreeps);
if (targets.length) {
creep.rangedAttack(targets[0]);
}
let creeps = getObjectsByPrototype(Creep);
let myDamagedCreeps = creeps.filter(i => i.my && i.hits < i.hitsMax);
let targets = creep.findInRange(myDamagedCreeps);
if (targets.length) {
creep.rangedHeal(targets[0]);
}
if (creep.transfer(tower, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(tower);
}
if (creep.withdraw(container, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(container);
}
GameObjectclass
游戏对象的基类,所有的对象和类都继承自这个类
existsboolean
如果当前对象存在于游戏中,则返回true。在游戏刷新缓存时或创建新对象时可以检查该属性【ps:比如new了一个Creep的时候】
idstring
可以通过game/utils getObjectById函数找到该对象的唯一ID
ticksToDecaynumber
如果该对象已被定义,则该对象将在该数量的tick后被销毁。
xnumber
该对象目前处于房间区块的x坐标
ynumber
该对象目前处于房间区块的y坐标
findClosestByPath(position, [opts])
找到给定参数中路径与该GameObject最短的那一个对象的位置。(请参阅game/utils findClosestByPath)
参数 | 类型 | 描述 |
positions | array | 要搜索的对象数组,内容须是GameObject或任何包含x和y属性的对象数组。 |
opts (optional) | object | 包含了searchPath函数支持的其他寻路标志的对象。 |
返回路径最短的那个对象位置,如果找不到或没有有效位置,则返回null。
findClosestByRange(position)
找到给定参数中直线距离与该GameObject最短的那一个对象的位置。(请参阅game/utils findClosestByRange)
参数 | 类型 | 描述 |
positions | array | 要搜索的对象数组,内容须是GameObject或任何包含x和y属性的对象数组。 |
返回直线距离最短的那个对象位置。
findInRange(position, range)
查找指定线性范围内的所有对象。(请参阅game/utils findInRange)
参数 | 类型 | 描述 |
positions | array | 要搜索的对象数组,内容须是GameObject或任何包含x和y属性的对象数组。 |
range | number | 距离范围 |
返回一个范围内找到的所有对象的数组。
findPathTo(pos, [opts])
找到从该GameObject到指定参数对象的路径(请参阅game/utils findPathTo)
参数 | 类型 | 描述 |
pos | object | 一个包含了x和y属性的对象 |
opts (optional) | object | 一个附带着附加属性的对象,这些选项将按照参数传值给game/utils findPath |
返回一个包含x和y属性的对象数组找到的路径
let path = creep.findPathTo(spawn);
console.log(path.length);
OwnedStructureclass extends Structure
一个具有所属玩家的结构的基类。
myboolean
对于属于你的结构将返回true,对于敌方的结构返回false,对于双方都可以使用的结构返回undefined
import { getObjectsByPrototype } from 'game/utils';
import { Creep, StructureSpawn } from 'game/prototypes';
export function loop() {
let target = getObjectsByPrototype(StructureSpawn).find(i => !i.my);
}
Resourceclass extends GameObject
一个被丢弃的资源,如果迟迟不捡起来,过一段时间则会消失。丢弃的资源每刻减少的资源数计算公式为:向上取整(数量/1000)
amountnumber
丢弃资源目前的剩余数量
resourceTypestring
RESOURCE_*的常量之一
Sourceclass extends GameObject
一种能量源,可以使用具有WORK属性的Creep进行采集。
能量数量 | 1000 |
能量恢复 | 每刻10能量 |
energynumber
当前能量源中的能量
energyCapacitynumber
该能量源的最大存储能量
Spawningobject
当前正在生成的Creep详情,可以通过StructureSpawn.spawning属性获取并进行处理。
needTimenumber
生成Creep所需要的总时间
remainingTimenumber
余下的时间
Storeobject
在其货物中包含资源的一个类对象。
在游戏中共有两种存储器类型,分别是:通用存储器和限制存储器。
你可以通过寻址他们作为对象属性,可以从存储器获取特定资源
getCapacity([resource])
返回此存储器对于指定资源的容量,如果是通用存储,并且参数resource是undefined,则返回该存储器的总容量。
参数 | 类型 | 描述 |
resource (optional) | RESOURCE_ENERGY |
getFreeCapacity([resource])
返回该存储器的可用容量,对于限制存储器,如果传了参数并且该存储器可以存储该资源(有效),则返回该存储器对于参数资源可用容量。
参数 | 类型 | 描述 |
resource (optional) | RESOURCE_ENERGY |
getUsedCapacity([resource])
返回此存储器对于指定资源已使用的容量,如果是通用存储,并且参数resource是undefined,则返回该存储器已使用的的总容量。
参数 | 类型 | 描述 |
resource (optional) | RESOURCE_ENERGY |
console.log(creep.store[RESOURCE_ENERGY]);
if (creep.store[RESOURCE_ENERGY] < creep.store.getCapacity()) {
creep.harvest(source);
}
if (tower.store.getFreeCapacity(RESOURCE_ENERGY) > 0) {
creep.transfer(tower, RESOURCE_ENERGY);
}
if (container.store.getUsedCapacity() == 0) {
// 该存储器是空的
}
import { getObjectsByPrototype } from 'game/utils';
import { Structure } from 'game/prototypes';
export function loop() {
let structures = getObjectsByPrototype(Structure).filter(i => i.hits < i.hitsMax);
console.log(structures.length);
}
StructureContainerclass extends OwnedStructure
一个可以用于存储资源的小型容器,这是一个可移动的结构,所有丢弃/掉落的资源都会自动转移到同一部分的容器中。
容量 | 2000 |
花费 | 100 |
血量 | 300 |
StructureExtensionclass extends OwnedStructure
一个包含了可用于生成更高级的Creep所需要的能量。扩展结构可以放置在任何地方,无论距离远近,任何生成器都可以使用它们。
花费 | 200 |
血量 | 100 |
容量 | 100 |
let allExtensions = getObjectsByPrototype(StructureExtension);
let myEmptyExtensions = allExtensions.filter(e => e.my && e.store.getUsedCapacity(RESOURCE_ENERGY) == 0)
let closestEmptyExtension = creep.findClosestByRange(myEmptyExtensions);
creep.moveTo(closestEmptyExtension);
StructureRoadclass extends Structure
将移动花费降低至1,使用道路结构可以创建更少MOVE属性的Creep。
花费 |
|
血量 |
|
StructureSpawnclass extends OwnedStructure
该结构会生成Creep,并且会在每刻生成少量的能量。
花费 | 3000 |
血量 | 3000 |
容量 | 1000 |
生成时间 | 每个属性生成3刻 |
spawnCreep(body)
如果该生成器正在生成Creep,则该函数将返回一个Spawning对象,否则为null。
参数 | 类型 | 描述 |
body | array<string> | 描述Creep属性的数组,应该包含1-50个具有以下常量之一的元素: WORK MOVE CARRY ATTACK RANGED_ATTACK HEAL TOUGH |
返回一个具有以下属性之一的对象:
error | number | ERR_*的常量之一 |
object | Creep | 正在生成的Creep对象 |
可能的错误代码:
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_BUSY | -4 | 该生成器已经在生成另一个Creep了 |
ERR_NOT_ENOUGH_ENERGY | -6 | 该生成器以及其扩展结构所包含的能量不足以生成给定属性的Creep |
ERR_INVALID_ARGS | -10 | 属性参数不正确 |
import { getObjectsByPrototype } from 'game/utils';
import { StructureSpawn } from 'game/prototypes';
export function loop() {
const mySpawn = getObjectsByPrototype(StructureSpawn).find(s => s.my);
const creep = mySpawn.spawnCreep([WORK, CARRY, MOVE]).object;
}
StructureTowerclass extends OwnedStructure
远程攻击范围内的游戏对象或者治疗己方Creep。其效果与距离成线性关系。每次行动都会消耗能量。
花费 | 1250 |
血量 | 3000 |
容量 | 50 |
冷却 | 10刻 |
行动最大距离 | 50 |
行动一次的能量 | 10 |
攻击效果 | 距离≤5时150血直到距离≥20时37血 |
治疗效果 | 距离≤5时100血直到距离≥20时25血 |
cooldownnumber
该塔结构正在处于冷却状态的剩余刻时间。
attack(target)
远程攻击范围内的任何Creep或结构。
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_ENERGY | -6 | 该塔结构没有足够的能量 |
ERR_INVALID_TARGET | -7 | 提供的参数不正确 |
ERR_TIRED | -11 | 该塔目前正在冷却 |
heal(target)
远程治疗范围内的任何Creep。
参数 | 类型 | 描述 |
target | Creep | 要治疗的目标Creep对象 |
返回以下代码之一:
OK | 0 | 操作已成功执行 |
ERR_NOT_OWNER | -1 | 该Creep不属于你 |
ERR_NOT_ENOUGH_ENERGY | -6 | 该塔结构没有足够的能量 |
ERR_INVALID_TARGET | -7 | 提供的参数不正确 |
ERR_TIRED | -11 | 该塔目前正在冷却 |
import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';
import { TOWER_RANGE } from 'game/constants';
export function loop() {
let target = tower.findClosestByRange(getObjectsByPrototype(Creep).filter(i => !i.my));
if (tower.getRangeTo(target) <= TOWER_RANGE) {
tower.attack(target);
}
}
let creeps = getObjectsByPrototype(Creep);
let myDamagedCreeps = creeps.filter(i => i.my && i.hits < i.hitsMax);
let target = tower.findClosestByRange(myDamagedCreeps);
if (creep.heal(target) == ERR_NOT_IN_RANGE) {
creep.moveTo(target);
}
Visualclass
可视化操作提供了一种在游戏中显示各种可视化调试信息的方法。所有绘制的坐标均以游戏坐标为单位,并且以场地中心为中心。例如(10,10)将指向x:10; y:10的Creep中心。允许使用分数的坐标。
layernumber
对象的视觉层。
persistentboolean
此对象的视觉效果是否持续。
constructor([layer], persistent)
创建一个新的可视化空实例。
参数 | 类型 | 描述 |
layer (optional) | number | 该对象的视觉效果层。上层的视觉效果与下层的视觉效果重叠。默认值为0。 |
persistent | boolean | 此对象中的视觉效果是否持久。非持久视觉效果仅在当前刻期间可见。 |
circle(pos, [style])
绘制一个圆。
参数 | 类型 | 描述 |
pos | object | 对象的位置中心,可以是来自GameObject或任何包含了x和y的对象。 |
style (optional) | object | 一个具有以下属性的对象:
|
返回Visual对象本身,以便进行链式调用。
line(pos1, pos2, [style])
绘制一条线。
参数 | 类型 | 描述 |
pos | object | 对象的起始位置,可以是来自GameObject或任何包含了x和y的对象。 |
pos | object | 对象的结束位置,可以是来自GameObject或任何包含了x和y的对象。 |
style (optional) | object | 一个具有以下属性的对象:
|
返回Visual对象本身,以便进行链式调用。
poly(points, [style])
绘制一条折线。
参数 | 类型 | 描述 |
points | array | 一个点的数组,每个元素都可以是来自GameObject或任何包含了x和y的对象。 |
style (optional) | object | 一个具有以下属性的对象:
|
返回Visual对象本身,以便进行链式调用。
rect(pos, w, h, [style])
绘制一条矩形。
参数 | 类型 | 描述 |
pos | object | 对象的位置左上角,可以是来自GameObject或任何包含了x和y的对象。 |
w | number | 矩形的宽度。 |
h | number | 矩形的高度。 |
style (optional) | object | 一个具有以下属性的对象:
|
返回Visual对象本身,以便进行链式调用。
text(text, pos, [style])
绘制一个文本,你可以使用任何有效的Unicode字符,包括emoji。
参数 | 类型 | 描述 |
text | string | 文本信息。 |
pos | object | 对象标签基线的位置,可以是来自GameObject或任何包含了x和y的对象。 |
style (optional) | object | 一个具有以下属性的对象:
|
返回Visual对象本身,以便进行链式调用。
for(const creep of creeps) {
if(!creep.hitsVisual) {
creep.hitsVisual = new Visual(10, true);
}
creep.hitsVisual.clear().text(
creep.hits,
{ x: creep.x, y: creep.y - 0.5 }, // 在Creep的上方
{
font: '0.5',
opacity: 0.7,
backgroundColor: '#808080',
backgroundPadding: '0.03'
});
}
new Visual().line({x: 1, y: 99}, {x: 99, y: 1}, {color: '#ff0000'});
new Visual().line(creep, tower, {lineStyle: 'dashed'});
createConstructionSite(position, prototype)
在指定的位置建造一个新的ConstructionSite。
参数 | 类型 | 描述 |
position | object | 一个包含了x和y属性的对象 |
prototype | class | 一个继承了GameObject的原型。 |
返回一个具有以下属性的对象:
可能的错误代码:
ERR_INVALID_ARGS | -10 | 位置或结构原型不正确 |
ERR_INVALID_TARGET | -7 | 结构无法放置在指定位置 |
ERR_FULL | -8 | 你有太多的结构空位啦。每名玩家最多拥有10个结构空位。 |
findClosestByPath(fromPos, positions, [opts])
从给定位置数组中找到与搜索位置路径最短的位置。
参数 | 类型 | 描述 |
fromPos | object | 要搜索的位置。可以是GameObject或任何包含x和y属性的对象。 |
position | array | 要搜索的位置。一个包含GameObjects或任何包含x和y属性对象的数组。 |
opts (optional) | object | 包含searchPath函数支持的其他寻路标志的对象。 |
如果从位置数组中找到距离该位置最接近的一个对象,则返回这个对象,否则为空。
let targets = getObjectsByPrototype(Creep).filter(c => !c.my);
let closestTarget = findClosestByPath(creep, targets);
creep.moveTo(closestTarget);
creep.attack(closestTarget);
findClosestByRange(fromPos, positions)
找出与给定位置直线距离最短的位置。
参数 | 类型 | 描述 |
fromPos | object | 要搜索的位置。可以是GameObject或任何包含x和y属性的对象。 |
position | array | 要搜索的位置。一个包含GameObjects或任何包含x和y属性对象的数组。 |
返回给定位置数组中找到距离给定位置最近的对象,如果没有有效位置,则返回空值。
let targets = getObjectsByPrototype(Creep).filter(c => !c.my);
let closestTarget = findClosestByRange(tower, targets);
tower.attack(closestTarget);
findInRange(fromPos, positions, range)
查找指定线性范围内的所有基本游戏对象。
参数 | 类型 | 描述 |
fromPos | object | 要搜索的位置。可以是GameObject或任何包含x和y属性的对象。 |
position | array | 要搜索的位置。一个包含GameObjects或任何包含x和y属性对象的数组。 |
range | number | 距离范围。 |
返回一个数组,其中包含了在指定范围内找到的所有对象。
let targets = getObjectsByPrototype(Creep).filter(c => !c.my);
let targetsInRange = findInRange(creep, targets, 3);
if (targetsInRange.length >= 3) {
creep.rangedMassAttack();
} else if (targetsInRange.length > 0) {
creep.rangedAttack(targetsInRange[0]);
}
findPath(fromPos, toPos, [opts])
查询从fromPos到toPos之间的最佳路径。与searchPath不同,findPath默认会避开所有的障碍物,(除非指定了CostMatrix)
参数 | 类型 | 描述 |
fromPos | object | 要搜索的起始位置。可以是GameObject或任何包含x和y属性的对象。 |
toPos | object | 要搜索的目标位置。可以是GameObject或任何包含x和y属性的对象。 |
opts (optional) | object | 包含附加寻路标志的对象:
|
以包含x和y属性的对象数组形式返回找到的路径。
let targets = getObjectsByPrototype(Creep).filter(c => !c.my);
let targetsInRange = findInRange(creep, targets, 3);
if (targetsInRange.length >= 3) {
creep.rangedMassAttack();
} else if (targetsInRange.length > 0) {
creep.rangedAttack(targetsInRange[0]);
}
获取当前刻度中经过的CPU停滞时间(以纳秒为单位)。
import { getCpuTime } from 'game/utils';
import { arenaInfo } from 'game';
export function loop() {
if( arenaInfo.cpuTimeLimit - getCpuTime() < 1000000) {
// 超时前剩余时间不足 1 毫秒!
}
}
let pos = path.findIndex(p => p.x == creep.x && p.y == creep.y);
let direction = getDirection(path[pos+1].x-path[pos].x, path[pos+1].y-path[pos].y);
creep.move(direction);
使用该方法获取虚拟机的堆统计数据。其返回值与 Node.js 函数 v8.getHeapStatistics()[nodejs.org] 几乎相同。该函数返回一个额外的属性:externally_allocated_size(外部分配的内存大小),这是当前分配的内存总量,不包含在 v8 堆中,但计入了此隔离区的内存限制。超过一定大小的 ArrayBuffer 实例是外部分配的,并将计入此处。
警告:由于该函数不常用,因此我没认真看英文,所以该处使用了DeepL机翻,请见谅!
import { getHeapStatistics } from 'game/utils';
export function loop() {
let heap = getHeapStatistics();
console.log(`Used ${heap.total_heap_size} / ${heap.heap_size_limit}`);
}
import { getObjectById } from 'game/utils';
export function loop() {
runCreep(myCreep.id);
}
function runCreep(id) {
let creep = getObjectById(id);
creep.move(RIGHT);
}
获取场地中的所有游戏对象。
getObjectsByPrototype(prototype)
获取游戏中所有具有指定原型的对象,例如所有Creep。
参数 | 类型 | 描述 |
prototype | class | 继承自GameObject的原型。 |
import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';
export function loop() {
const creeps = getObjectsByPrototype(Creep);
creeps.forEach(function(myCreep) {
runCreep(myCreep);
});
}
function runCreep(creep) {
if(creep.my) {
creep.move(RIGHT);
}
}
getRange(a, b)
获取两个对象之间的线性范围。a和b可以是包含x和y属性的任何对象。
参数 | 类型 | 描述 |
a | object | 两个对象中的第一个。可以是GameObject或任何包含x和y属性的对象。 |
a | object | 两个对象中的第二个。可以是GameObject或任何包含x和y属性的对象。 |
返回两个对象之间的格子数。
import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';
export function loop() {
const creeps = getObjectsByPrototype(Creep);
creeps.forEach(function(myCreep) {
runCreep(myCreep);
});
}
function runCreep(creep) {
if(creep.my) {
creep.move(RIGHT);
}
}
ilet matrix = new CostMatrix;
// 在 CostMatrix 中填入全速地形成本,以便进行分析:
for(let y = 0; y < 100; y++) {
for(let x = 0; x < 100; x++) {
let tile = getTerrainAt({x: x, y: y});
let weight =
tile === TERRAIN_WALL ? 255 : // wall => unwalkable
tile === TERRAIN_SWAMP ? 5 : // swamp => weight: 5
1 ; // plain => weight: 1
matrix.set(x, y, weight);
}
}
getTicks()
从当前一局游戏开始到结束的时间。
import { getTicks } from 'game';
export function loop() {
console.log(getTicks());
}
searchPath(origin, goal, [opts])
查找起始位置与目标位置之间的最佳路径。请注意,如果未指定成本矩阵的searchPath(见下文)将只使用地形数据。
参数 | 类型 | 描述 |
origin | object | 见下文。 |
goal | object | 见下文。 |
opts (optional) | object | 见下文。 |
目标可以是包含x和y属性的对象,也可以是有着下面定义的对象。.
如果提供的目标不止一个(作为目标数组),那么将返回所有目标中成本最少的路径。
属性 | 类型 | 描述 |
pos | object | 一个包含x和y属性的对象 |
range | number | 当被认为达到目标之前的位置范围,默认是0 |
opts是一个包含额外寻路标志的对象:
属性 | 类型 | 描述 |
costMatrix | CostMatrix | 自定义导航成本数据 |
plainCost | number | 在平原位置移动的成本。默认为2 |
swampCost | number | 在沼泽位置移动的成本。默认为10 |
flee | boolean | 这种方法不是搜索通往目标的路径,而是搜索远离目标的路径。将返回超出每个目标范围成本最少的路径。默认值为false |
maxOps | number | 允许的最大寻路搜索操作次数。默认值为50000 |
maxCost | number | 返回的路径允许的最大成本。默认为Infinity(无限) |
heuristicWeight | number | 从1到9的权重,用于 A * 公式F = G + 权重 * H 中的启发式。默认值为1.2 |
返回一个包含以下属性的对象
属性 | 类型 | 描述 |
path | array | 以包含x和y属性形式找到的路径对象数组 |
ops | number | 计算该路径前执行的搜索操作总数 |
cost | number | 根据plainCost、swampCost和给定的成本矩阵实例得出的路径总成本 |
incomplete | boolean | 如果寻路程序未能找到完整的路径,则此值为true |
import { searchPath } from 'game/path-finder';
import { getObjectsByPrototype } from 'game/utils';
export function loop() {
let target = getObjectsByPrototype(StructureSpawn).find(i => !i.my);
let creep = getObjectsByPrototype(Creep).find(i => i.my);
let ret = searchPath(creep, target);
console.log(ret.cost); // 总体成本
console.log(ret.path.length); // 格子数
}
Flagclass extends GameObject
旗帜是这个游戏模式的关键游戏对象,当Creep到达旗帜上方即可夺得该旗帜,并且控制旗帜旁边的塔。当夺下场上所有的旗帜就算胜利!
myboolean
己方为true,敌方为false。如果不属于双方,则返回undefined。
StructureTowerclass extends OwnedStructure
在夺取旗帜游戏模式中,塔结构是经过改装的,它们每回合都可以开火,并能自我获取能量。此外,还可以让Creep走到其相邻的旗帜上以夺得它们。
冷却 | 0 |
能量再生 | 每刻1能量 |
AreaEffectclass extends GameObject
一个可同时对所有Creep应用指定类型效果的对象
effectstring
来自以下常量之一:EFFECT_FREEZE,EFFECT_DAMAGE,EFFECT_HEAL
EFFECT_DAMAGEdamage
EFFECT_FREEZEfreeze
EFFECT_HEALheal
RESOURCE_SCOREscore
RESOURCE_SCORE_Xscore_x
RESOURCE_SCORE_Yscore_y
RESOURCE_SCORE_Zscore_z
ScoreCollectorclass extends GameObject
得分收集器是该游戏模式得关键游戏对象,将相应得资源转移到收集器上,夺取资源并获得胜利。
myboolean
你是否可以控制该收集器。
resourceTypestring
该收集器可以接收的资源类型。
scorenumber
该收集器隶属的玩家当前收集的分数。
scoreTotalnumber
立刻获胜所需要的总分数。
OK0
ERR_BUSY-4
ERR_FULL-8
ERR_TIRED-11
ERR_FULL-12
MOVEmove
RANGED_ATTACKranged_attack
HEALheal
ATTACKattack
CARRYcarry
TOUGHtough
WORKwork
TOP1
LEFT7
RANGED_ATTACK_DISTANCE_RATE{0: 1, 1: 1, 2: 0.4, 3: 0.1}
REPAIR_POWER100
REPAIR_COST0.01
DISMANTLE_COST0.005
OBSTACLE_OBJECT_TYPES
['creep','tower','constructedWall','spawn','extension','link']
TOWER_HITS3000
TOWER_FALLOFF0.75
RESOURCE_ENERGYenergy
RESOURCES_ALL[RESOURCE_ENERGY]
RESOURCE_DECAY1000
WALL_HITS10000
WALL_HITS_MAX10000
RAMPART_HITS10000
RAMPART_HITS_MAX10000
ROAD_HITS500
SPAWN_HITS3000