New algo for repair
This commit is contained in:
parent
ea5ff7a63a
commit
db60d70ee8
@ -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) {
|
||||
if (repairTarget.hits < repairTarget.hitsMax) {
|
||||
if (creep.repair(repairTarget) == ERR_NOT_IN_RANGE) {
|
||||
creep.say('🚧 repair');
|
||||
creep.moveTo(target, { visualizePathStyle: { stroke: '#ffffff' } });
|
||||
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);
|
||||
}
|
||||
|
@ -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
4
src/types.d.ts
vendored
@ -15,6 +15,10 @@ interface CreepMemory {
|
||||
* Идентификатор источника энергии для крипа.
|
||||
*/
|
||||
sourceId: Id<Source> | '';
|
||||
/**
|
||||
* Цель для починки.
|
||||
*/
|
||||
repairTargetId: Id<Structure> | '';
|
||||
room: string;
|
||||
working: boolean;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user