-
Notifications
You must be signed in to change notification settings - Fork 0
/
role.containerHarvester.js
129 lines (117 loc) · 4.6 KB
/
role.containerHarvester.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var s = require('shared');
var findNearby = function(src, typ, filter){
var area = src.room.lookForAtArea(typ, src.pos.y - 1, src.pos.x - 1, src.pos.y + 1, src.pos.x + 1, true);
//console.log(area.length);
//console.log(area[0].structure.structureType);
var results = _.filter(area, filter);
if (results[0]) {
return results[0].structure;
} else {
return false;
}
};
var freeSpace = function(src) {
//todo: make this source-agnostic
var area = src.room.lookForAtArea(LOOK_STRUCTURES, src.pos.y - 1, src.pos.x - 1, src.pos.y + 1, src.pos.x + 1, true);
var free = _.filter(area, (str) => {
let st = str.structure;
console.log('looking for fat asses at ' + st.id + ' ' + st.structureType);
let fatHarvesters = st.room.find(FIND_MY_CREEPS, {filter: (creep) => {
return creep.memory.role == 'containerHarvester' && creep.memory.container !== undefined && creep.memory.container == st.id;
} });
console.log('found ' + fatHarvesters.length);
let result = st.structureType == STRUCTURE_CONTAINER && fatHarvesters.length === 0;
return result;
});
var free_containers = [];
for (var name in free) {
free_containers.push(free[name].structure);
}
console.log('found ' + free_containers.length + ' free containers at ' + src.id);
// return free[0].structure;
return free_containers;
};
function onTop(creep, container) {
return creep.pos == container.pos;
}
var immobileHarvester = {
run: function(creep) {
var err = OK;
var m = creep.memory;
var source;
var container;
//m.container = undefined;
//m.source = undefined;
if ( m.source === undefined || m.container === undefined) {
let index = 0;
let sources = creep.room.find(FIND_SOURCES, {});
while ( container === undefined && index < sources.length) {
// index++;
console.log('trying source ' + (index) + ' for ' + creep.name );
source = sources[index];
let containers = freeSpace(source);
console.log('found ' + containers.length + ' containers free for ' + creep.name);
container = containers[0];
index++;
}
// let sources = creep.room.find(FIND_SOURCES, {})
// let index = ~~(Math.random() * sources.length );
// console.log(sources);
// console.log('setting source ' + index + ' for ' + creep.name);
// source = sources[~~(Math.random * sources.length)];
if (source !== undefined && container !== undefined) {
console.log('selected source ' + index + ' for ' + creep.name);
m.source = source.id;
m.container = container.id;
}
} else {
source = Game.getObjectById(m.source);
container = Game.getObjectById(m.container);
//console.log('remembered ' + m.source + ' for ' + creep.name);
}
/*
if (m.container !== undefined) {
container = Game.getObjectById(m.container);
} else {
container = freeSpace(source);
}
*/
/*
if (false && container !== undefined && container !== null) {
m.container = container.id;
} else {
//console.log(' no free containers for ' + creep.name);
return;
}*/
//console.log('looking for link near ' + creep.id);
let link = findNearby(creep, LOOK_STRUCTURES, (str) => str.structure.structureType == STRUCTURE_LINK);
//console.log(link);
if (creep && container && creep.pos.x == container.pos.x && creep.pos.y == container.pos.y) {
err = creep.harvest(source);
if (link) {
//console.log('tying to use link ' + link.id);
creep.withdraw(container, RESOURCE_ENERGY);
creep.transfer(link, RESOURCE_ENERGY);
} else {
//console.log('found no links');
}
} else {
err = creep.moveTo(container, {visualizePathStyle: {stroke: '#ffaa00'}});
}
switch (err) {
case ERR_FULL:
//creep.say('err?!')
//break;
case ERR_NOT_ENOUGH_ENERGY:
// case ERR_NOT_ENOUGH_RESOURCES:
case ERR_TIRED:
case OK:
break;
default:
s.creepErr(creep, err);
break;
}
return OK;
}
};
module.exports = immobileHarvester;