From 301e3abaa253cffc7929de5c6ee46c11acc4b395 Mon Sep 17 00:00:00 2001 From: David Franke Date: Sat, 25 May 2024 20:28:18 +0200 Subject: [PATCH] fix: Catch several cases where data might not be fully initialized. --- src/dispatcher/resource-source/factory.ts | 1 + src/operation/remote-mining.ts | 3 +++ src/process/report.ts | 2 ++ src/process/strategy/intershard.ts | 9 +++++++++ src/role/harvester.remote.ts | 3 ++- src/spawn-role/remote-mining.ts | 2 ++ 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/dispatcher/resource-source/factory.ts b/src/dispatcher/resource-source/factory.ts index f34a570d..dacabf59 100644 --- a/src/dispatcher/resource-source/factory.ts +++ b/src/dispatcher/resource-source/factory.ts @@ -21,6 +21,7 @@ export default class FactorySource extends StructureSource { getTasks(context: ResourceSourceContext) { if (!this.room.factory) return []; + if (!this.room.factoryManager) return []; return this.cacheEmptyTaskListFor(context.resourceType || '', 25, () => { const options: FactorySourceTask[] = []; diff --git a/src/operation/remote-mining.ts b/src/operation/remote-mining.ts index 729ce64e..fd396101 100644 --- a/src/operation/remote-mining.ts +++ b/src/operation/remote-mining.ts @@ -367,6 +367,9 @@ export default class RemoteMiningOperation extends Operation { return cache.inObject(this, 'hasContainer:' + sourceLocation, 0, () => { if (!this.memory.status[sourceLocation]) return false; + const paths = this.getPaths(); + if (!paths[sourceLocation] || !paths[sourceLocation].accessible) return false; + if (!Game.rooms[this.roomName]) { return Boolean(this.memory.status[sourceLocation].containerId); } diff --git a/src/process/report.ts b/src/process/report.ts index 31722a8d..33968d7b 100644 --- a/src/process/report.ts +++ b/src/process/report.ts @@ -206,6 +206,8 @@ export default class ReportProcess extends Process { * Generates report email for remote mining. */ generateRemoteMiningReport() { + if (!Memory.strategy.remoteHarvesting) return; + let reportText = this.generateHeading('⚒ Remote mining'); reportText += 'Remote mining in ' + Memory.strategy.remoteHarvesting.currentCount + ' rooms'; diff --git a/src/process/strategy/intershard.ts b/src/process/strategy/intershard.ts index ea1e7967..3a56281c 100644 --- a/src/process/strategy/intershard.ts +++ b/src/process/strategy/intershard.ts @@ -257,6 +257,15 @@ export default class InterShardProcess extends Process { } failIntershardExpansion() { + if (!Memory.strategy.expand) { + Memory.strategy.expand = { + failedExpansions: [], + currentTarget: null, + pathBlocked: null, + evacuatingRoom: null, + }; + } + if (!Memory.strategy.expand.failedExpansions) { Memory.strategy.expand.failedExpansions = []; } diff --git a/src/role/harvester.remote.ts b/src/role/harvester.remote.ts index 4426d3c7..ca3ce7b0 100644 --- a/src/role/harvester.remote.ts +++ b/src/role/harvester.remote.ts @@ -236,6 +236,7 @@ export default class RemoteHarvesterRole extends Role { const workParts = creep.getActiveBodyparts(CARRY) ? creep.getActiveBodyparts(WORK) : 0; if (workParts === 0) return false; if (creep.store.energy < workParts) return false; + if (!creep.operation.hasContainer(creep.memory.source)) return false; const needsRepair = _.filter( creep.room.structuresByType[STRUCTURE_CONTAINER], @@ -243,7 +244,7 @@ export default class RemoteHarvesterRole extends Role { structure => structure.hits <= structure.hitsMax - (workParts * REPAIR_POWER) && creep.pos.getRangeTo(structure.pos) <= 3 - && creep.operation.getContainerPosition(creep.memory.source).isEqualTo(structure.pos), + && creep.operation.getContainerPosition(creep.memory.source)?.isEqualTo(structure.pos), ); if (needsRepair.length > 0) { const result = creep.repair(needsRepair[0]); diff --git a/src/spawn-role/remote-mining.ts b/src/spawn-role/remote-mining.ts index 6fafa535..21013c8d 100644 --- a/src/spawn-role/remote-mining.ts +++ b/src/spawn-role/remote-mining.ts @@ -307,6 +307,8 @@ export default class RemoteMiningSpawnRole extends SpawnRole { // Don't spawn if there is no full path. const operation = Game.operationsByType.mining['mine:' + roomName]; + if (!operation) return; + const paths = operation.getPaths(); const travelTime = _.min(_.map(paths, path => path.travelTime ?? 500)); if (!travelTime) return;