diff --git a/src/console/Console.ts b/src/console/Console.ts index b346dcc39..004ee7e8a 100644 --- a/src/console/Console.ts +++ b/src/console/Console.ts @@ -3,6 +3,7 @@ import {Directive} from '../directives/Directive'; import {RoomIntel} from '../intel/RoomIntel'; import {Overlord} from '../overlords/Overlord'; import {ExpansionEvaluator} from '../strategy/ExpansionEvaluator'; +import {Cartographer} from '../utilities/Cartographer'; import {EmpireAnalysis} from '../utilities/EmpireAnalysis'; import {alignedNewline, bullet} from '../utilities/stringConstants'; import {color, printRoomName, toColumns} from '../utilities/utils'; @@ -57,6 +58,7 @@ export class OvermindConsole { global.getEmpireMineralDistribution = this.getEmpireMineralDistribution; global.listPortals = this.listPortals; global.evaluateOutpostEfficiencies = this.evaluateOutpostEfficiencies; + global.evaluatePotentialOutpostEfficiencies = this.evaluatePotentialOutpostEfficiencies; } // Help, information, and operational changes ====================================================================== @@ -106,6 +108,7 @@ export class OvermindConsole { descr['getEmpireMineralDistribution()'] = 'returns current census of colonies and mined sk room minerals'; descr['getPortals(rangeFromColonies)'] = 'returns active portals within colony range'; descr['evaluateOutpostEfficiencies()'] = 'prints all colony outposts efficiency'; + descr['evaluatePotentialOutpostEfficiencies()'] = 'prints all nearby unmined outposts'; // Console list const descrMsg = toColumns(descr, {justify: true, padChar: '.'}); @@ -534,7 +537,7 @@ export class OvermindConsole { colonies.forEach(colony => { if (colony.bunker) { colony.outposts.forEach(outpost => { - const res = ExpansionEvaluator.computeTheoreticalMiningEfficiency(colony.bunker!.anchor, outpost); + const res = ExpansionEvaluator.computeTheoreticalMiningEfficiency(colony.bunker!.anchor, outpost.name); if (typeof res === 'boolean') { log.error(`Failed on outpost ${outpost.print}`); } else { @@ -557,6 +560,42 @@ export class OvermindConsole { return ret; } + static evaluatePotentialOutpostEfficiencies(): string { + const colonies = getAllColonies(); + const outpostEfficiencies: {[roomName: string]: number} = {}; + let avgEnergyPerCPU = 0; + + colonies.forEach(colony => { + if (colony.bunker) { + Cartographer.findRoomsInRange(colony.name, 2).forEach(outpost => { + if (!colony.outposts.map(room => room.name).includes(outpost)) { + const res = ExpansionEvaluator.computeTheoreticalMiningEfficiency(colony.bunker!.anchor, outpost); + if (typeof res === 'boolean') { + log.error(`Failed on outpost ${outpost}`); + } else { + outpostEfficiencies[outpost] = res; + avgEnergyPerCPU += res; + } + } + }); + } + }); + + avgEnergyPerCPU = avgEnergyPerCPU/Object.keys(outpostEfficiencies).length; + let ret = `Possible new outposts above avg efficiency of ${avgEnergyPerCPU}: \n`; + + for (const outpost in outpostEfficiencies) { + // 20E/cpu is a good guideline for an efficient room + if (outpostEfficiencies[outpost] > avgEnergyPerCPU*1.25 || outpostEfficiencies[outpost] > 20) { + ret += `${outpost} ${outpostEfficiencies[outpost]} \n`; + } + } + + return ret; + } + + + // Memory management =============================================================================================== static deepCleanMemory(): string { diff --git a/src/strategy/ExpansionEvaluator.ts b/src/strategy/ExpansionEvaluator.ts index 0d64dce5e..d584639d8 100644 --- a/src/strategy/ExpansionEvaluator.ts +++ b/src/strategy/ExpansionEvaluator.ts @@ -68,8 +68,9 @@ export class ExpansionEvaluator { * @param room * @param verbose */ - static computeTheoreticalMiningEfficiency(dropoffLocation: RoomPosition, room: Room, verbose = false): boolean|number { - const roomName = room.name; + static computeTheoreticalMiningEfficiency(dropoffLocation: RoomPosition, room: string, verbose = false) + : boolean|number { + const roomName = room; const roomType = Cartographer.roomType(roomName); let cpuCost = 0; let creepEnergyCost = 0; @@ -168,7 +169,7 @@ export class ExpansionEvaluator { const netIncome = (energyPerSource*sourcePositions.length/ENERGY_REGEN_TIME)-creepEnergyCost; - let msg = `(Potential) Outpost ${room.print} type ${roomType} evaluated for colony at ${dropoffLocation.roomName} with per tick results \n`; + let msg = `(Potential) Outpost ${room} type ${roomType} evaluated for colony at ${dropoffLocation.roomName} with per tick results \n`; msg += `Income: ${energyPerSource*sourcePositions.length/ENERGY_REGEN_TIME} Net Income: ${netIncome} Net Energy per CPU: ${netIncome/cpuCost}\n`; msg += `Creep Costs: Energy ${creepEnergyCost}, Spawn Time ${spawnTimeCost}, and CPU ${cpuCost} \n`; log.alert(msg);