/* ##################################### # Controls the way creeps are spawn # #####################################*/ var roles = require("roles"); module.exports = { run: function () { for (var sp in Game.spawns) { sp = Game.spawns[sp] // values var creep_count = 0 for (var cr in Game.creeps) { if (Game.creeps[cr].room.name == sp.room.name) creep_count += 1; } var source_count = 0; if (sp.memory.sources_ids != undefined) source_count = sp.memory.sources_ids.length; // Memory setup if (sp.memory.creep_iterate == undefined) sp.memory.creep_iterate = 0; if (sp.memory.sources_ids == undefined) { sp.memory.sources_ids = []; var sources = sp.room.find(FIND_SOURCES); for (var source in sources) { source = sources[source]; sp.memory.sources_ids.push(source.id); } source_count = sp.memory.sources_ids.length; } if (sp.memory.containers_ids == undefined || sp.memory.containers_ids.length != source_count) { sp.memory.containers_ids = []; var containers = sp.room.find(FIND_STRUCTURES, { filter: { structureType: STRUCTURE_CONTAINER } }); if (containers.length > 0) { for (let i = 0; i < containers.length; i += 1) { sp.memory.containers_ids.push(containers[i].id); } } } // Different spawning configurations // Add improved versions at top of if-else statement if (sp.memory.containers_ids.length >= source_count && sp.room.energyCapacityAvailable >= 550 && creep_count > source_count) { // Miner method: Miners fille containers rest picks up from them // Check current creep_jobs var jobs = { miner: 0, supplier: 0, builder: 0, upgrader: 0, defender: 0 }; var container_id = sp.memory.containers_ids[0]; for (var creep in Game.creeps) { var creep = Game.creeps[creep]; if (creep.room.name != sp.room.name) continue; switch (creep.memory.role) { case roles.ROLE_MINER: jobs.miner += 1; for (let i = 0; i < sp.memory.containers_ids.length; i++) { if (creep.memory.container_id != sp.memory.containers_ids[i]) container_id = sp.memory.containers_ids[i]; } break; case roles.ROLE_SUPPLIER: jobs.supplier += creep.body.length; break; case roles.ROLE_BUILDER: jobs.builder += creep.body.length; break; case roles.ROLE_UPGRADER: jobs.upgrader += creep.body.length; break; case roles.ROLE_DEFENDER: jobs.defender += 1; break; default: break; } } if (jobs.miner < source_count) { if (sp.room.energyAvailable >= 550) create_miner(sp, container_id); } else if (jobs.supplier < source_count * 15 && sp.room.energyAvailable >= 300 && jobs.miner > 0) create_supplier(sp); else if (jobs.builder < source_count * 5 && sp.room.energyAvailable >= 300 && jobs.miner > 0) create_builder(sp); else if (jobs.upgrader < source_count * 5 && sp.room.energyAvailable >= 300 && jobs.miner > 0) create_upgrader(sp); else if (jobs.defender < 0 && sp.room.energyAvailable >= sp.room.energyCapacityAvailable * 0.8 && jobs.miner > 0) create_defender(sp); } else { // Harvesting method: everybody mines own sources if (sp.room.find(FIND_MY_CREEPS).length < source_count * 5 && sp.room.energyAvailable >= 300) { var source_id = sp.memory.sources_ids[sp.memory.creep_iterate % source_count]; create_harvester(sp, source_id); } } } } }; function create_harvester(sp, source_id) { var body = []; for (let i = 0; i < Math.floor(sp.room.energyAvailable / 200); i++) { body.push(WORK); body.push(CARRY); body.push(MOVE); } var name = "Harvy" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_HARVESTER, source_id: source_id } }); sp.memory.creep_iterate += 1; } function create_miner(sp, container_id) { var body = [WORK, WORK, WORK, WORK, WORK, MOVE]; // (creep)5*work(2energy/tick)=10energy/tick -> (source)3000energy/300tick=10energy/tick var name = "Mindy" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_MINER, container_id: container_id } }); sp.memory.creep_iterate += 1; } function create_supplier(sp) { var body = [WORK]; for (let i = 0; i < Math.floor(sp.room.energyAvailable / 100) - 1 && i < 8; i++) { // as big as possible body.push(CARRY); body.push(MOVE); } var name = "Suppry" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_SUPPLIER } }); sp.memory.creep_iterate += 1; } function create_builder(sp) { var body = []; for (let i = 0; i < Math.floor(sp.room.energyAvailable / 200); i++) { // as big as possible body.push(CARRY); body.push(MOVE); body.push(WORK); } var name = "Bobby" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_BUILDER } }); sp.memory.creep_iterate += 1; } function create_upgrader(sp) { var body = []; for (let i = 0; i < Math.floor(sp.room.energyAvailable / 300); i++) { // as big as possible body.push(CARRY); body.push(MOVE); body.push(WORK); body.push(WORK); } var name = "Undy" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_UPGRADER } }); sp.memory.creep_iterate += 1; } function create_defender(sp) { var body = []; for (let i = 0; i < Math.floor(sp.room.energyAvailable / 150); i++) { // as big as possible body.push(TOUGH); body.push(TOUGH); body.push(ATTACK); body.push(MOVE); } var name = "Destroyer CODE" + sp.memory.creep_iterate; sp.spawnCreep(body, name, { memory: { role: roles.ROLE_DEFENDER } }); sp.memory.creep_iterate += 1; }