我已经改变了一些我的role.builders.js文件,让我的小兵首先检查产卵是否有能量,如果没有收获能量来构建,否则从产卵中获取它。这就是我所拥有的:
var roleBuilder = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.memory.building && creep.carry.energy == 0) {
creep.memory.building = false;
creep.say('harvesting');
}
if(!creep.memory.building && creep.carry.energy == creep.carryCapacity) {
creep.memory.building = true;
creep.say('building');
}
if(creep.memory.building) {
var targets = creep.room.find(FIND_CONSTRUCTION_SITES);
if(targets.length) {
if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(targets[0]);
}
}
}
else
{
if(!Game.spawns['MySpawn'].energy)
{
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE)
{
creep.moveTo(sources[0]);
}
}
else
{
if(creep.withdraw(Game.spawns['MySpawn'],RESOURCE_ENERGY) == ERR_NOT_IN_RANGE)
{
creep.moveTo(Game.spawns['MySpawn']);
}
}
}
}
};
module.exports = roleBuilder;
有关我失踪的建议吗?即使它们说它们正在移动到产卵区,建筑商也会冻结在原地。
答案 0 :(得分:2)
就像你已经注意到的那样,如果你使用预设变量,这样的东西效果会更好
为了完整起见,我会重新发布您的解决方案。但是你不需要else
部分:
var spns = creep.room.find(FIND_MY_SPAWNS);
if(creep.withdraw(spns[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(spns[0]);
}
如果您希望构建器仅使用一个特定的spawn,您也可以使用它的ID:
var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
if(creep.withdraw(spwn, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(spwn);
}
但无论如何,我在你的代码中注意到了另外一件事!如果产卵中存在 NO 能量,您可以告诉建筑商去采矿。
if(!Game.spawns['MySpawn'].energy) { ... }
问题在于,那里几乎总会有一些能量,因为只要你总共低于300能量,你的产卵就会产生每一个能量1能量!所以你的建造者最多会收获一次剔> ,然后转身从产卵中取出 - 因为现在至少有一种能量。
下一个问题是,你会遇到一个无法建立新生物的问题,因为你的建造者总是会在生成之前获取所有的能量!
为了弥补这两个问题,请尝试以下方法:
var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23");
var secureEnergy = 300;
if(spwn.energy > secureEnergy) { ... }
将secureEnergy
设置为高于平均蠕变需要产生的数量(至少高于您最重要的收割机需要的数量!)。例如,基本的[WORK,CARRY,MOVE]
蠕变需要250点能量,而你的建造者可以携带50点能量,所以你可能希望你的建造者只能在生成物中至少有300 secureEnergy
时撤回它的50点能量。这样你总能产生新的蠕变。这对你有意义吗?
我希望我能帮助你一点......并且在Screeps中享受乐趣! ;)