const math = require("Math"); module.exports = { setup: function () { StructureSpawn.prototype = _StructureSpawn.prototype; } } class _StructureSpawn extends StructureSpawn { begin(){ if (!this.memory.creepCounter) this.memory.creepCounter = 0; this.memory.init = true; } tick(){ if(!this.memory.init) this.begin(); if(Game.time%100) return; if(this.room.energyAvailable < 300) return; const job = this.room.memory.vacancies.pop(); if(job){ const name = getJobName(job.role); const body = getBodyByJob(job.role, this.room.energyAvailable); if(this.createCreep(job, name, body) != OK) this.room.memory.vacancies.push(job); } } createCreep(job, name, body) { const response = this.spawnCreep(body, name + ": " + this.memory.creepCounter, { memory: { job: job } }); if (response == OK) this.memory.creepCounter++; return response; } } function getJobName(role){ switch (role) { case Role.BUILDER: return "Bob"; case Role.MINER: return "minny"; case Role.SUPPLIER: return "Sully"; case Role.UPGRADER: return "Uppa"; } } function getBodyByJob(role, energyAvailability){ const body = []; switch (role) { case Role.UPGRADER: body.push(CARRY); body.push(MOVE); energyAvailability -= 100; break; case Role.MINER: body.push(MOVE); energyAvailability -= 50; break; } var unitEnergyCost = 0; while(unitEnergyCost <= energyAvailability) { switch (role) { case Role.BUILDER: body.push(WORK); body.push(CARRY); body.push(MOVE); unitEnergyCost = 200; break; case Role.UPGRADER: case Role.MINER: body.push(WORK); unitEnergyCost = 100; if(role === Role.MINER && body.length > 5) energyAvailability = -1; break; case Role.SUPPLIER: body.push(CARRY); body.push(MOVE); unitEnergyCost = 100; break; default: energyAvailability = -1; break; } energyAvailability -= unitEnergyCost; } return body; }