В game docs такой вещи нет. Но вы можете использовать аргумент avoid
функции findPath, чтобы попытаться избежать болотных плит. По умолчанию он предпочитает наименьшие шаги, самый быстрый маршрут, как я полагаю.
Существует способ расчета стоимости путем поиска пути, а затем сравнения координат с вызовом lookAtArea().
var path = creep.room.findPath(creep, target);
path
возвращается:
[
{ x: 10, y: 5, dx: 1, dy: 0, direction: Game.RIGHT },
{ x: 10, y: 6, dx: 0, dy: 1, direction: Game.BOTTOM },
{ x: 9, y: 7, dx: -1, dy: 1, direction: Game.BOTTOM_LEFT },
...
]
Вы можете запрашивают сверху/слева и снизу/справа область с lookAtArea():
var look = creep.room.lookAtArea(10,5,11,7);
look
возвращается:
// 10,5,11,7
{
10: {
5: [{ type: ‘creep’, creep: {...} },
{ type: ‘terrain’, terrain: ‘swamp’ }],
6: [{ type: ‘terrain’, terrain: ‘swamp’ }],
7: [{ type: ‘terrain’, terrain: ‘swamp’ }]
},
11: {
5: [{ type: ‘terrain’, terrain: ‘normal’ }],
6: [{ type: ‘spawn’, spawn: {...} },
{ type: ‘terrain’, terrain: ‘swamp’ }],
7: [{ type: ‘terrain’, terrain: ‘wall’ }]
}
}
И затем пройдите через каждый шаг шага, который у вас есть, и проверьте тип местности.
3 типа мы должны:
- Обычной земля - просто земля с ценой движения 2
- Болот увеличивают стоимость передвижения до 10.
- дорог уменьшают стоимость движения 1.
Что-то вроде (непроверенной, неполный код):
function terrainSpeed(terrainType) {
var speed = 0;
switch(terrainType) {
case 'swamp':
speed = 10;
break;
case 'normal':
speed = 2;
break;
case 'road':
speed = 1;
break;
}
return speed;
}
// Traverse through path and check how many thicks it would take
// based on carried energy and body
function calculateTicksRequired(path,look,energy,body) {
var ticksRequired = 0;
for (var i = 0; i < path.length; i++) {
var terrainForStep = look[path[i].y][path[i].x].terrain];
var defaultTicks = terrainSpeed(terrainForStep);
var moveCost = 1;
// Perform calculation by looking at bodymove cost (based on body)
// and carry cost (based on energy)
// LOGIC TO CALCULATE MOVECOST
// ...
// Multiply that by defaultTicks
ticksRequired += defaultTicks * moveCost;
}
return ticksRequired;
}