TsarBot/role_dispatcher.js

105 lines
2.5 KiB
JavaScript

var roleHarvester = require('role_harvester');
var roleUpgrader = require('role_upgrader');
var roleBuilder = require('role_builder');
var roleRepairer = require('role_repairer');
var roleGuard = require('role_guard');
var roleBase = require('role_base');
const roleMap = {
harvester: roleHarvester,
upgrader: roleUpgrader,
builder: roleBuilder,
repairer: roleRepairer,
streltsy: roleGuard
};
function calculateCreepCounts(room){
var creepCounts = {
"harvester" : 3,
"builder" : 1,
"upgrader" : 1,
"repairer" : 1,
"streltsy" : 0
};
// 2 harvesters per source by default
creepCounts.harvester = room.find(FIND_SOURCES).length * 2;
if(room.memory.containers == 0){
// -1 harvester until at least a container built in order
// to reduce congestion
creepCounts.harvester -= 1;
}
// streltsy cost 400 energy, and thus cant be built
// you have at least 2 extensions (300+50+50)
// i guess there wouldnt be a big difference since
// they wouldnt spawn anyways, but whatever
if(room.memory.extensions >= 2){
creepCounts.streltsy += 2;
}
if(room.memory.extensions >= 3){
creepCounts.builder += 1;
}
room.memory.creepCounts = creepCounts;
}
function calculateCreepBodies(room){
var creepBodies = {
// 200 base cost
"harvester" : [WORK, CARRY, MOVE],
"builder" : [WORK, CARRY, MOVE],
"upgrader" : [WORK, CARRY, MOVE],
"repairer" : [WORK, CARRY, MOVE],
// 400 base cost
"streltsy" : [MOVE, MOVE, RANGED_ATTACK, RANGED_ATTACK]
};
// 450 cost
if(room.memory.extensions >= 3){
creepBodies.harvester = [MOVE, MOVE, WORK, WORK, WORK, CARRY];
}
// 400 cost
// but only want the upgrading to scale up when have a bunch
// of extra energy
if(room.memory.extensions >= 10){
creepBodies.upgrader = [MOVE, MOVE, WORK, WORK, CARRY, CARRY];
}
room.memory.creepBodies = creepBodies;
}
function runRole(creep){
const role = roleMap[creep.memory.role];
if(typeof role.run === 'function'){
role.run(creep);
} else {
console.log('Unknown or undefined role: ' + creep.memory.role);
}
}
function spawnCreeps(spawn){
calculateCreepCounts(spawn.room);
for(const [role, count] of Object.entries(spawn.room.memory.creepCounts)){
var roleCreeps = _.filter(Game.creeps, (creep) => creep.memory.role == role);
if(roleCreeps.length < count && !spawn.spawning) {
calculateCreepBodies(spawn.room);
if(typeof roleMap[role].spawn === 'function')
roleMap[role].spawn(spawn);
else
roleBase.spawn(spawn, roleMap[role].name);
break;
}
}
}
module.exports = { runRole, spawnCreeps};