From 112c3c3a97e422a283b12b62f5fe1ca843a75ac7 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 29 Aug 2023 20:43:10 +0200 Subject: [PATCH] Created supplier and builder functions --- CreepClass.js | 11 +++++- JobBuilder.js | 83 +++++++++++++++++++++++++++++++++++++++- JobHarvester.js | 6 ++- JobMiner.js | 27 ++++++++----- JobSupplier.js | 86 +++++++++++++++++++++++++++++++++++++++++- JobUpgrader.js | 22 ++++++++++- RoomClass.js | 24 ++++++------ StructureSpawnClass.js | 10 ++++- 8 files changed, 239 insertions(+), 30 deletions(-) diff --git a/CreepClass.js b/CreepClass.js index 677f32b..80325c9 100644 --- a/CreepClass.js +++ b/CreepClass.js @@ -1,5 +1,8 @@ +const jobBuilder = require("JobBuilder"); const jobHarvester = require("JobHarvester"); const jobMiner = require("JobMiner"); +const jobSupplier = require("JobSupplier"); +const JobUpgrader = require("JobUpgrader"); module.exports = { setup: function () { @@ -20,8 +23,11 @@ class _Creep extends Creep { begin(){ if(!this.memory.job) this.memory.job = { role: Role.HARVESTER }; switch (this.memory.job.role) { + case Role.BUILDER: jobBuilder.begin(this); break; case Role.HARVESTER: jobHarvester.begin(this); break; case Role.MINER: jobMiner.begin(this); break; + case Role.SUPPLIER: jobSupplier.begin(this); break; + case Role.UPGRADER: JobUpgrader.begin(this); break; } this.memory.init = true; } @@ -29,8 +35,11 @@ class _Creep extends Creep { tick(){ if(!this.memory.init) this.begin(); switch (this.memory.job.role) { + case Role.BUILDER: jobBuilder.tick(this); break; case Role.HARVESTER: jobHarvester.tick(this); break; case Role.MINER: jobMiner.tick(this); break; + case Role.SUPPLIER: jobSupplier.tick(this); break; + case Role.UPGRADER: JobUpgrader.tick(this); break; } } -} +} \ No newline at end of file diff --git a/JobBuilder.js b/JobBuilder.js index 9d100dc..174305e 100644 --- a/JobBuilder.js +++ b/JobBuilder.js @@ -1,8 +1,89 @@ module.exports = { begin(creep){ + if(!creep.memory.collecting) creep.memory.collecting = false; + if(!creep.memory.counter) creep.memory.counter = 0; }, tick(creep){ - + if(creep.memory.collecting) { + GetEnergy(creep); + energyFullCheck(creep); + } + else { + BuildOrRepair(creep); + energyEmptyCheck(creep); + } } +} + +function GetEnergy(creep){ + if(!creep.memory.target) findWithdrawTarget(creep); + const target = Game.getObjectById(creep.memory.target); + if(!target) creep.memory.target = undefined; + if(creep.pos.isNearTo(target)) { + if(!target.store) creep.pickup(target); + else creep.withdraw(target, RESOURCE_ENERGY); + } + else creep.moveTo(target); +} + +function energyFullCheck(creep){ + if(!creep.store.getFreeCapacity(RESOURCE_ENERGY)) { + creep.memory.collecting = false; + creep.memory.target = undefined; + } +} + +function BuildOrRepair(creep){ + if(!creep.memory.target) findBuildOrRepairTarget(creep); + if(!creep.memory.target) return; + const target = Game.getObjectById(creep.memory.target); + if(!target) { creep.memory.target = undefined; return; } + if(target.hits && target.hits === target.hitsMax) { creep.memory.target = undefined; return; } + if(creep.pos.isNearTo(target)) + if(!target.hits) creep.build(target); + else creep.repair(target); + else creep.moveTo(target); +} + +function energyEmptyCheck(creep){ + if(!creep.store.getUsedCapacity(RESOURCE_ENERGY)) { + creep.memory.collecting = true; + creep.memory.target = undefined; + } +} + +function findWithdrawTarget(creep){ + var target = creep.pos.findClosestByRange(FIND_DROPPED_RESOURCES, { + filter: (r)=>{ + return r.resourceType == RESOURCE_ENERGY && r.amount > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_RUINS, { + filter: (r)=>{ + return r.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_TOMBSTONES, { + filter: (t)=>{ + return t.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_STRUCTURES, { + filter: (st)=>{ + return st.structureType == STRUCTURE_CONTAINER && st.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(target) creep.memory.target = target.id; +} + +function findBuildOrRepairTarget(creep) { + var target; + switch (creep.memory.counter%2) { + case 0: target = creep.pos.findClosestByRange(FIND_MY_CONSTRUCTION_SITES); break; + case 1: target = creep.pos.findClosestByRange(FIND_STRUCTURES, { + filter:(s)=> { + return s.hitsMax - s.hits + && s.structureType != STRUCTURE_WALL; + }}); + break; + } + if(target) creep.memory.target = target.id; + creep.memory.counter++; } \ No newline at end of file diff --git a/JobHarvester.js b/JobHarvester.js index 0d49087..22cf243 100644 --- a/JobHarvester.js +++ b/JobHarvester.js @@ -65,10 +65,11 @@ function getSourceIdFromRoomTable(creep) { function getJobTarget(creep) { var target; - switch (creep.memory.counter%3) { + switch (creep.memory.counter%4) { case 0: target = creep.room.controller; break; case 1: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, {filter:{structureType:STRUCTURE_SPAWN}}); break; case 2: target = creep.pos.findClosestByRange(FIND_MY_CONSTRUCTION_SITES); break; + case 3: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, {filter:(s)=>{return s.hitsMax != s.hits;}}); break; } if(target) return target.id; creep.memory.counter++; @@ -77,10 +78,11 @@ function getJobTarget(creep) { function doJob(creep, target){ var response; - switch (creep.memory.counter%3) { + switch (creep.memory.counter%4) { case 0: response = creep.upgradeController(target); break; case 1: response = creep.transfer(target, RESOURCE_ENERGY); break; case 2: response = creep.build(target); break; + case 3: response = creep.repair(target); break; } if(response == ERR_FULL) { creep.memory.counter++; diff --git a/JobMiner.js b/JobMiner.js index 5b06ba1..6ab3003 100644 --- a/JobMiner.js +++ b/JobMiner.js @@ -3,16 +3,23 @@ module.exports = { tick(creep){ const source = Game.getObjectById(creep.memory.job.source); - if(creep.memory.aboveContainer) creep.harvest(source); if(!creep.pos.isNearTo(source)) { creep.moveTo(source); return; } - if(creep.memory.container) { - const container = Game.getObjectById(creep.memory.container); - if(container.pos.x === creep.pos.x, container.pos.y === creep.pos.y) creep.memory.aboveContainer = true; - else creep.moveTo(container); - } else{ - const container = source.pos.findInRange(FIND_STRUCTURES, 1, {filter:{structureType:STRUCTURE_CONTAINER}})[0]; - if(container) creep.memory.container = container.id; - else creep.harvest(source); - } + if(creep.memory.aboveContainer) { creep.harvest(source); return; } + if(creep.memory.container) { moveToContainer(creep); return; } + if(!(Game.time%100)) scanForContainer(creep, source); + creep.harvest(source); } +} + +function moveToContainer(creep){ + const container = Game.getObjectById(creep.memory.container); + if(container.pos.x === creep.pos.x && container.pos.y === creep.pos.y) creep.memory.aboveContainer = true; + else creep.moveTo(container); +} + +function scanForContainer(creep, source){ + const container = source.pos.findInRange(FIND_STRUCTURES, 1, { + filter:{structureType:STRUCTURE_CONTAINER} + })[0]; + if(container) creep.memory.container = container.id; } \ No newline at end of file diff --git a/JobSupplier.js b/JobSupplier.js index 9d100dc..7cd01ee 100644 --- a/JobSupplier.js +++ b/JobSupplier.js @@ -1,8 +1,92 @@ module.exports = { begin(creep){ + if(!creep.memory.collecting) creep.memory.collecting = false; + if(!creep.memory.counter) creep.memory.counter = 0; }, tick(creep){ - + if(creep.memory.collecting) { + withdrawEnergy(creep); + energyFullCheck(creep); + } + else { + transferEnergy(creep); + energyEmptyCheck(creep); + } } +} + +function withdrawEnergy(creep){ + if(!creep.memory.target) findWithdrawTarget(creep); + const target = Game.getObjectById(creep.memory.target); + if(!target) creep.memory.target = undefined; + if(creep.pos.isNearTo(target)) { + if(!target.store) creep.pickup(target); + else creep.withdraw(target, RESOURCE_ENERGY); + } + else creep.moveTo(target); +} + +function energyFullCheck(creep){ + if(!creep.store.getFreeCapacity(RESOURCE_ENERGY)) { + creep.memory.collecting = false; + creep.memory.target = undefined; + } +} + +function transferEnergy(creep){ + if(!creep.memory.target) findTransferTarget(creep); + if(!creep.memory.target) return; + const target = Game.getObjectById(creep.memory.target); + if(target.store.getFreeCapacity(RESOURCE_ENERGY)==0) { creep.memory.target = undefined; creep.memory.counter++; } + if(creep.pos.isNearTo(target)) creep.transfer(target, RESOURCE_ENERGY); + else creep.moveTo(target); +} + +function energyEmptyCheck(creep){ + if(!creep.store.getUsedCapacity(RESOURCE_ENERGY)) { + creep.memory.collecting = true; + creep.memory.target = undefined; + } +} + +function findWithdrawTarget(creep){ + var target = creep.pos.findClosestByRange(FIND_DROPPED_RESOURCES, { + filter: (r)=>{ + return r.resourceType == RESOURCE_ENERGY && r.amount > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_RUINS, { + filter: (r)=>{ + return r.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_TOMBSTONES, { + filter: (t)=>{ + return t.store.getUsedCapacity(RESOURCE_ENERGY) > creep.store.getFreeCapacity(RESOURCE_ENERGY); + }}); + if(!target) target = creep.pos.findClosestByRange(FIND_STRUCTURES, { + filter: (st)=>{ + return st.structureType == STRUCTURE_CONTAINER && st.store.getUsedCapacity(RESOURCE_ENERGY) > 1000; + }}); + if(target) creep.memory.target = target.id; +} + +function findTransferTarget(creep) { + var target; + switch (creep.memory.counter%3) { + case 0: target = creep.pos.findClosestByRange(FIND_MY_STRUCTURES, { + filter:(s)=> { + return (s.structureType == STRUCTURE_SPAWN || s.structureType == STRUCTURE_EXTENSION) + && s.store.getFreeCapacity(RESOURCE_ENERGY) > 0; + }}); + break; + case 1: target = creep.pos.findClosestByRange(FIND_STRUCTURES, { + filter:(s)=> { + return s.structureType == STRUCTURE_CONTAINER + && s.store.getFreeCapacity(RESOURCE_ENERGY) > 1000; + }}); + break; + case 2: target = creep.room.storage; break; + } + if(target) creep.memory.target = target.id; + creep.memory.counter++; } \ No newline at end of file diff --git a/JobUpgrader.js b/JobUpgrader.js index 9d100dc..697b8bd 100644 --- a/JobUpgrader.js +++ b/JobUpgrader.js @@ -3,6 +3,26 @@ module.exports = { }, tick(creep){ - + if(!creep.pos.isNearTo(creep.room.controller)) { creep.moveTo(creep.room.controller); return; } + if(creep.store.getUsedCapacity(RESOURCE_ENERGY) == 0) { getOrWaitForEnergy(creep); return; } + creep.upgradeController(creep.room.controller); } +} + +function getOrWaitForEnergy(creep){ + if(!creep.memory.container) scanForContainer(creep); + if(creep.memory.container) getEnergyFromContainer(creep); +} + +function getEnergyFromContainer(creep){ + const container = Game.getObjectById(creep.memory.container); + if(creep.withdraw(container, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) creep.moveTo(container); +} + +// duplicate see miner +function scanForContainer(creep){ + const container = creep.room.controller.pos.findInRange(FIND_STRUCTURES, 1, { + filter:{structureType:STRUCTURE_CONTAINER} + })[0]; + if(container) creep.memory.container = container.id; } \ No newline at end of file diff --git a/RoomClass.js b/RoomClass.js index b7766d5..35aa95e 100644 --- a/RoomClass.js +++ b/RoomClass.js @@ -2,9 +2,9 @@ module.exports = { setup: function () { Room.prototype = _Room.prototype; } } -class _Room extends Room { +class _Room extends Room { begin(){ - roomScan(this); + roomLayoutScan(this); jobScan(this); vacancyScan(this); this.memory.init = true; @@ -12,33 +12,33 @@ class _Room extends Room { tick(){ if(!this.memory.init) this.begin(); - if(Game.time%100 === 1) vacancyScan(this); + if(!(Game.time%100)) { + vacancyScan(this); + } } } -function roomScan(room){ - room.memory.layout = { - sources: room.find(FIND_SOURCES).map(s=>s.id) - }; +function roomLayoutScan(room){ + if(!room.memory.layout) room.memory.layout = {}; + if(!room.memory.layout.sources) room.memory.layout.sources = room.find(FIND_SOURCES).map(s=>s.id); + room.memory.layout.containers = room.find(FIND_MY_STRUCTURES, {filter:{structureType:STRUCTURE_CONTAINER}}).map(c=>c.id); } function jobScan(room){ - if(!room.memory.jobs) room.memory.jobs = Array(10).fill({role: Role.HARVESTER}) + if(!room.memory.jobs) room.memory.jobs = [{role:Role.UPGRADER}] + .concat(Array(2).fill({role: Role.BUILDER})) + .concat(Array(5).fill({role: Role.SUPPLIER})) .concat(room.memory.layout.sources.map(s=> {return {role: Role.MINER, source: s}})); } function vacancyScan(room){ const activeJobs = room.find(FIND_MY_CREEPS).map(creep=>creep.memory.job); - console.log(activeJobs.toString()); - console.log(room.memory.jobs.toString()); const jobs = room.memory.jobs.filter((j)=>{ const index = activeJobs.findIndex(aj=> _.isEqual(aj,j)); if(index < 0) return true; activeJobs.splice(index,1); return false; }); - console.log(jobs.toString()); - room.memory.vacancies = jobs; } diff --git a/StructureSpawnClass.js b/StructureSpawnClass.js index f1976b0..ec2df2e 100644 --- a/StructureSpawnClass.js +++ b/StructureSpawnClass.js @@ -30,14 +30,20 @@ class _StructureSpawn extends StructureSpawn { function getJobName(role){ switch (role) { + case Role.BUILDER: return "Bob"; case Role.HARVESTER: return "Harvy"; case Role.MINER: return "minny"; + case Role.SUPPLIER: return "Sully"; + case Role.UPGRADER: return "Uppa"; } } function getBodyByJob(role){ switch (role) { - case Role.HARVESTER: return [WORK, CARRY, MOVE, MOVE]; - case Role.MINER: return [WORK, WORK, MOVE]; + case Role.BUILDER: + case Role.HARVESTER: return [WORK, CARRY, CARRY, MOVE, MOVE]; + case Role.UPGRADER: return [WORK, WORK, CARRY, MOVE]; + case Role.MINER: return [WORK, WORK, MOVE, MOVE]; + case Role.SUPPLIER: return [CARRY, CARRY, CARRY, MOVE, MOVE, MOVE] } } \ No newline at end of file