New algo for repair

This commit is contained in:
Anton Vakhrushev 2020-07-23 15:24:27 +03:00
parent ea5ff7a63a
commit db60d70ee8
3 changed files with 50 additions and 14 deletions

View File

@ -9,6 +9,7 @@ export function runAsBuilder(creep: Creep) {
if (memory.building && creep.store[RESOURCE_ENERGY] === 0) {
memory.building = false;
memory.repairTargetId = '';
}
if (!memory.building && creep.store.getFreeCapacity() === 0) {
@ -52,26 +53,49 @@ function build(creep: Creep): boolean {
return true;
}
/**
* Починить.
*
* Если цель нужно чинить, то дойти до цели и произвести починку.
* Если цель починена, найти ближайшую цель в радиусе починки и чинить ее.
*
* @param creep
*/
function repair(creep: Creep) {
const target = findRepairTarget(creep);
if (!target) {
const memory = creep.memory as BuilderMemory;
let repairTarget;
// Если уже установлена цель, то получаем объект,
// иначе ищем подходящую цель для ремонта.
if (memory.repairTargetId) {
repairTarget = Game.getObjectById(memory.repairTargetId);
} else {
repairTarget = findBestRepairTarget(creep);
memory.repairTargetId = repairTarget ? repairTarget.id : '';
}
// Если цель ремонта не найдена, то ничего не делаем.
if (!repairTarget) {
memory.repairTargetId = '';
return false;
}
if (creep.repair(target) == ERR_NOT_IN_RANGE) {
creep.say('🚧 repair');
creep.moveTo(target, { visualizePathStyle: { stroke: '#ffffff' } });
if (repairTarget.hits < repairTarget.hitsMax) {
if (creep.repair(repairTarget) == ERR_NOT_IN_RANGE) {
creep.say('🚧 repair');
creep.moveTo(repairTarget, { visualizePathStyle: { stroke: '#ffffff' } });
}
} else {
const closestRepairTarget = findClosestRepairTarget(creep);
if (closestRepairTarget) {
if (creep.repair(closestRepairTarget) !== OK) {
memory.repairTargetId = '';
}
} else {
memory.repairTargetId = '';
}
}
return true;
}
function findRepairTarget(creep: Creep): Structure | undefined {
const nearest = creep.pos.findInRange(FIND_STRUCTURES, 3, {
filter: (t) => t.hits < t.hitsMax && t.structureType !== STRUCTURE_ROAD
});
if (nearest.length > 0) {
nearest.sort((t1, t2) => t1.hits - t2.hits);
return nearest[0];
}
function findBestRepairTarget(creep: Creep): Structure | undefined {
const targets = creep.room.find(FIND_STRUCTURES, {
filter: (t) => t.hits < t.hitsMax && t.structureType !== STRUCTURE_ROAD
});
@ -81,3 +105,10 @@ function findRepairTarget(creep: Creep): Structure | undefined {
}
return undefined;
}
function findClosestRepairTarget(creep: Creep): Structure | undefined {
const targets = creep.pos.findInRange(FIND_STRUCTURES, 3, {
filter: (t) => t.hits < t.hitsMax && t.structureType !== STRUCTURE_ROAD
});
return _.first(targets);
}

View File

@ -27,12 +27,13 @@ function makeCreep(role: CreepRole, count: number) {
memory,
directions: [BOTTOM, BOTTOM_RIGHT, RIGHT, BOTTOM_LEFT, LEFT]
});
console.log(`Make creep "${role}"`, 'err', err);
console.log(`Make creep "${role}"`, 'body', calcBodyCost(body), 'err', err);
}
}
function selectBody(capacity: number): Array<BodyPartConstant> {
const bodies = [
[WORK, WORK, CARRY, CARRY, CARRY, CARRY, MOVE, MOVE, MOVE, MOVE],
[WORK, WORK, CARRY, CARRY, CARRY, MOVE, MOVE, MOVE],
[WORK, WORK, CARRY, CARRY, MOVE, MOVE],
[WORK, CARRY, CARRY, MOVE, MOVE]

4
src/types.d.ts vendored
View File

@ -15,6 +15,10 @@ interface CreepMemory {
* Идентификатор источника энергии для крипа.
*/
sourceId: Id<Source> | '';
/**
* Цель для починки.
*/
repairTargetId: Id<Structure> | '';
room: string;
working: boolean;
}