-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRoom.upgraderSpawn.js
More file actions
90 lines (89 loc) · 3.62 KB
/
Room.upgraderSpawn.js
File metadata and controls
90 lines (89 loc) · 3.62 KB
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
var optimalUpgrader = function(room) {
var i;
var ticksToUpgrade = 30;
var workBodyparts = Math.floor((2 * CARRY_CAPACITY * room.energyAvailable) / ((2 * BODYPART_COST[CARRY] + BODYPART_COST[MOVE]) * ticksToUpgrade * UPGRADE_CONTROLLER_POWER + CARRY_CAPACITY * (BODYPART_COST[MOVE] + 2 * BODYPART_COST[WORK])));
//z
// z = (2 * C * t) / ((2 * c + m) * T * U + C * (m + 2 * w))
var carryBodyparts = Math.floor((ticksToUpgrade * UPGRADE_CONTROLLER_POWER * workBodyparts) / CARRY_CAPACITY);
//y
// T = (carryBodyparts * CARRY_CAPACITY) / (UPGRADE_CONTROLLER_POWER * workBodyparts)
// T = (y * 50) / (1 * z)
// y = (T * U * z) / C
var moveBodyparts = Math.floor((workBodyparts + carryBodyparts) / 2);
//x
//x = (z + y) / 2
var creepCost = moveBodyparts * BODYPART_COST[MOVE] + carryBodyparts * BODYPART_COST[CARRY] + workBodyparts * BODYPART_COST[WORK];
// t = x * m + y * c + z * w
var bodyparts = [];
for(i = 0; i < moveBodyparts; i++) {
bodyparts.push(MOVE);
}
for(i = 0; i < workBodyparts; i++) {
bodyparts.push(WORK);
}
for(i = 0; i < carryBodyparts; i++) {
bodyparts.push(CARRY);
}
if(workBodyparts > 0 && moveBodyparts > 0) {
return {
bodyparts: bodyparts,
workBodyparts: workBodyparts,
moveBodyparts: moveBodyparts,
carryBodyparts: carryBodyparts,
creepCost: creepCost
};
}
};
var RoomUpgraderSpawn = function() {
var multiplier = 0.5;
var upgraderLimit = Math.ceil(this.memory.harvestPoints * multiplier);
var myCreeps = this.memory.found.myCreeps;
var upgraders = _.filter(myCreeps, function(creep) {
if(creep.memory.recycle) {
return false;
} else if(creep.memory.role == 'upgrader') {
return true;
}
});
var upgrader = optimalUpgrader(this);
if(upgraders.length > 0) {
upgraders.sort(function(a, b) {
var a_work = a.getActiveBodyparts(WORK);
var b_work = b.getActiveBodyparts(WORK);
return a_work - b_work;
});
var upgradePerTick = 0;
upgraders.forEach(function(creep) {
upgradePerTick = upgradePerTick + creep.getActiveBodyparts(WORK);
});
//console.log(JSON.stringify(this));
if(upgrader) {
if(this.memory.spawns.length > 0) {
if(upgrader.workBodyparts > upgraders[0].getActiveBodyparts(WORK)) {
upgraders[0].memory.recycle = true;
this.memory.spawns[0].createCreep(upgrader.bodyparts, undefined, {role: 'upgrader'});
this.memory.spawns[0].memory.busy = Game.time;
} else if(upgradePerTick + upgrader.workBodyparts < this.memory.harvestPerTick * multiplier) {
if(upgraders.length < upgraderLimit) {
this.memory.spawns[0].createCreep(upgrader.bodyparts, undefined, {role: 'upgrader'});
this.memory.spawns[0].memory.busy = Game.time;
}
}
}
}
if(upgradePerTick > this.memory.harvestPerTick * multiplier) {
upgraders[0].memory.recycle = true;
}
if(upgraders.length > upgraderLimit) {
upgraders[0].memory.recycle = true;
}
} else {
if(upgrader) {
if(this.memory.spawns.length > 0) {
this.memory.spawns[0].createCreep(upgrader.bodyparts, undefined, {role: 'upgrader'});
this.memory.spawns[0].memory.busy = Game.time;
}
}
}
};
module.exports = RoomUpgraderSpawn;