-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathroomaspect.supplies.js
94 lines (77 loc) · 3.54 KB
/
roomaspect.supplies.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
var spawnHelper = require("helper.spawning");
var carrier = require("role.carrier");
var harvester = require("role.harvester");
var linkCollector = require("role.linkCollector");
var miner = require("role.miner");
var logistic = require('helper.logistic');
module.exports = class SuppliesAspect {
constructor(roomai) {
this.roomai = roomai;
this.room = roomai.room;
this.linksEnabled = this.room.storage && this.roomai.links.storage();
}
run() {
// Choosing source far away from upgraders to avoid conflict
let source = _.sortBy(this.room.find(FIND_SOURCES), (s) => -s.pos.getRangeTo(this.room.controller))[0];
this.buildHarvesters(source);
if(this.linksEnabled) {
let collector = spawnHelper.localCreepsWithRole(this.roomai, linkCollector.name)[0];
if(!collector) {
this.buildLinkCollector();
}
}
this.buildCollectors();
}
buildHarvesters(source) {
var partConfigs = harvester.carryConfigs;
var neededHarvesters = 1;
if(!logistic.storeFor(source) && !(this.room.storage && this.room.storage.store.energy)) {
partConfigs = harvester.miningConfigs;
neededHarvesters = 2;
}
if(!this.roomai.canSpawn() || spawnHelper.numberOfLocalCreeps(this.roomai, harvester.name) >= neededHarvesters) {
return;
}
var parts = null;
if(spawnHelper.numberOfLocalCreeps(this.roomai, harvester.name) == 0) {
parts = spawnHelper.bestAffordableParts(this.room, partConfigs);
} else {
parts = spawnHelper.bestAvailableParts(this.room, partConfigs);
}
this.roomai.spawn(parts, { role: harvester.name, source: source.id });
}
buildCollectors() {
let storage = this.room.storage;
if(!storage) return;
let sources = this.room.find(FIND_SOURCES);
// FIXME: ordering duplicated with miners
let roomai = this.roomai;
sources = _.sortBy(sources, (s) => s.pos.getRangeTo(roomai.spawns.primary));
let existingCollectors = spawnHelper.localCreepsWithRole(this.roomai, carrier.name);
let existingMiners = spawnHelper.localCreepsWithRole(this.roomai, miner.name);
for(let source of sources) {
if(!this.roomai.canSpawn()) continue;
if(logistic.storeFor(source) === storage) continue;
if(_.any(existingCollectors, (m) => m.memory.source == source.id && m.memory.destination == storage.id)) continue;
if(this.linksEnabled && this.roomai.links.linkAt(source)) continue;
if(_.any(existingMiners, (m) => m.memory.target == source.id)) {
let parts = spawnHelper.bestAffordableParts(this.room, carrier.configsForCapacity(this.neededCollectorCapacity(source)), true);
this.roomai.spawn(parts, { role: carrier.name, source: source.id, destination: storage.id, resource: RESOURCE_ENERGY });
}
}
}
neededCollectorCapacity(source) {
// back and forth while 10 energy per tick are generated
var needed = logistic.distanceByPath(source, this.room.storage) * 20;
// adding at least one extra CARRY to make up for inefficiencies
return needed + 60;
}
buildLinkCollector() {
if(!this.roomai.canSpawn()) {
return;
}
this.roomai.spawn(linkCollector.parts, { role: linkCollector.name });
}
}
const profiler = require("screeps-profiler");
profiler.registerClass(module.exports, 'SuppliesAspect');