220 lines
8.7 KiB
JavaScript
220 lines
8.7 KiB
JavaScript
|
|
/* ###################################################################
|
|
# An inherited creep class and a module to expose it to the loop. #
|
|
###################################################################*/
|
|
|
|
const roles = require("roles");
|
|
|
|
module.exports = {
|
|
|
|
configure: function () {
|
|
// Replaces the creep class by the MyCreep class which changes the type of all Creep objects as well.
|
|
Creep.prototype = MyCreep.prototype;
|
|
setConstants();
|
|
// configure all creeps (in case new memory requirements).
|
|
for (const name in Game.creeps) {
|
|
Game.creeps[name].configure();
|
|
}
|
|
},
|
|
|
|
// All creeps execute their roles every tick.
|
|
execute: function () {
|
|
for (const name in Game.creeps) {
|
|
Game.creeps[name].execute();
|
|
}
|
|
}
|
|
};
|
|
|
|
class MyCreep extends Creep {
|
|
configure() {
|
|
// Basic values every creep has.
|
|
if (this.memory.restock == undefined) this.memory.restock = true;
|
|
if (this.memory.target == undefined) this.memory.target = null;
|
|
if (this.memory.counter == undefined) this.memory.counter = 0;
|
|
}
|
|
|
|
execute() {
|
|
// This line is temporary untill the spawns are renewed as well.
|
|
if (this.memory.restock == undefined) this.configure();
|
|
switch (this.memory.role) {
|
|
case HARVESTER:
|
|
if (this.memory.restock) {
|
|
this.getEnergy();
|
|
} else {
|
|
const role = this.memory.counter % 3;
|
|
if (role == 0) this.memory.role = SUPPLIER;
|
|
if (role == 1) this.memory.role = BUILDER;
|
|
if (role == 2) this.memory.role = UPGRADER;
|
|
this.execute();
|
|
this.memory.role = HARVESTER;
|
|
}
|
|
break;
|
|
case MINER:
|
|
this.memory.target = this.memory.container_id;
|
|
if (this.moveToTarget()) {
|
|
this.harvestSource();
|
|
}
|
|
break;
|
|
case SUPPLIER:
|
|
if (this.memory.restock) {
|
|
this.getEnergy();
|
|
} else {
|
|
this.supplyEnergy();
|
|
}
|
|
break;
|
|
case BUILDER:
|
|
if (this.memory.restock) {
|
|
this.getEnergy();
|
|
} else {
|
|
this.construct();
|
|
}
|
|
break;
|
|
case UPGRADER:
|
|
if (this.memory.restock) {
|
|
this.getEnergy();
|
|
} else {
|
|
this.upgrade();
|
|
}
|
|
break;
|
|
case DEFENDER: roles.defend(this);
|
|
break;
|
|
case RESERVER: roles.reserve(this);
|
|
break;
|
|
case RESERVED_HARVESTER: roles.harvest_reserved(this);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Moves to the object with given id. Returns true if arrived.
|
|
moveToTarget() {
|
|
const target = Game.getObjectById(this.memory.target);
|
|
if (target != null) {
|
|
if (this.pos.isEqualTo(target.pos)) return true;
|
|
this.moveTo(target);
|
|
} else {
|
|
console.log(this.name + " can't find object with id: " + this.memory.target);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Searches for a energy source, moves towards it and collects the energy.
|
|
getEnergy() {
|
|
// Search for an energy source.
|
|
if (this.memory.target == null) {
|
|
var target = this.pos.findClosestByPath(FIND_DROPPED_RESOURCES);
|
|
if (target == null) target = this.pos.findClosestByPath(FIND_TOMBSTONES);
|
|
else if (target == null) target = this.pos.findClosestByPath(FIND_STRUCTURES, { filter: { structureType: STRUCTURE_CONTAINER } });
|
|
else if (target == null) target = this.room.storage;
|
|
else if (target == null) target = this.pos.findClosestByPath(FIND_SOURCES);
|
|
if (target != null) this.memory.target = target.id;
|
|
}
|
|
// Get energy from the source.
|
|
var target = Game.getObjectById(this.memory.target);
|
|
var response = this.withdraw(target, RESOURCE_ENERGY);
|
|
if (response == ERR_INVALID_TARGET) response = this.pickup(target);
|
|
else if (response == ERR_INVALID_TARGET) response = this.harvest(target);
|
|
if (response == OK);
|
|
else if (response == ERR_NOT_IN_RANGE) this.moveToTarget();
|
|
else if (response == ERR_FULL) {
|
|
this.memory.restock = false;
|
|
this.memory.target = null;
|
|
} else {
|
|
this.memory.target = null;
|
|
}
|
|
}
|
|
|
|
// harvests set or closest source, moves to it if to far and return true if fully loaded.
|
|
harvestSource() {
|
|
if (this.memory.source_id == undefined) {
|
|
this.memory.source_id = this.pos.findClosestByPath(FIND_SOURCES).id;
|
|
}
|
|
const response = this.harvest(Game.getObjectById(this.memory.source_id));
|
|
if (response == ERR_NOT_IN_RANGE) this.goTo(this.memory.source_id);
|
|
return this.store.getFreeCapacity(RESOURCE_ENERGY) == 0;
|
|
}
|
|
|
|
// supplies a load of energy to a structure who requires it.
|
|
supplyEnergy() {
|
|
// Search for a structure who requires energy.
|
|
if (this.memory.target == null) {
|
|
var target = this.pos.findClosestByPath(FIND_MY_STRUCTURES,
|
|
{ filter: (s) => (s.structureType == STRUCTURE_TOWER && 100 < s.store.getFreeCapacity(RESOURCE_ENERGY)) });
|
|
if (target == null) target = this.pos.findClosestByPath(FIND_MY_STRUCTURES,
|
|
{ filter: (s) => ((s.structureType == STRUCTURE_SPAWN || s.structureType == STRUCTURE_EXTENSION) && 0 < s.store.getFreeCapacity(RESOURCE_ENERGY)) });
|
|
else if (target == null) target = this.room.storage;
|
|
if (target != null) this.memory.target = target.id;
|
|
}
|
|
// Supply structure with energy or move towards it.
|
|
var target = Game.getObjectById(this.memory.target);
|
|
const response = this.transfer(target, RESOURCE_ENERGY);
|
|
if (response == OK);
|
|
else if (response == ERR_NOT_IN_RANGE) this.moveToTarget();
|
|
else if (response == ERR_NOT_ENOUGH_RESOURCES) {
|
|
this.memory.restock = true;
|
|
this.memory.target = null;
|
|
} else {
|
|
this.memory.target = null;
|
|
}
|
|
}
|
|
|
|
construct() {
|
|
// Search for a structure who requires energy.
|
|
if (this.memory.target == null) {
|
|
// Build new buildings
|
|
var target = this.pos.findClosestByPath(FIND_MY_CONSTRUCTION_SITES);
|
|
// Search buildings that are damaged and sort by most damaged first.
|
|
if (target == null) {
|
|
var structures = this.room.find(FIND_STRUCTURES,
|
|
{ filter: (s) => (s.structureType != STRUCTURE_RAMPART && s.structureType != STRUCTURE_WALL && s.hits < s.hitsMax) });
|
|
structures.sort((s1, s2) => (s1.hits - s2.hits));
|
|
target = structures[0];
|
|
}
|
|
// All buildings are in repaired search for walls that can be improved.
|
|
if (target == null) {
|
|
var structures = this.room.find(FIND_STRUCTURES,
|
|
{ filter: (s) => ((s.structureType == STRUCTURE_RAMPART || s.structureType == STRUCTURE_WALL) && s.hits < s.hitsMax) });
|
|
structures.sort((s1, s2) => (s1.hits - s2.hits));
|
|
target = structures[0];
|
|
}
|
|
if (target != null) this.memory.target = target.id;
|
|
}
|
|
// Build or repair the found structure.
|
|
var target = Game.getObjectById(this.memory.target);
|
|
var response = this.build(target);
|
|
if (response == ERR_INVALID_TARGET) response = this.repair(target);
|
|
if (response == OK);
|
|
else if (response == ERR_NOT_IN_RANGE) this.moveToTarget();
|
|
else if (response == ERR_NOT_ENOUGH_RESOURCES) {
|
|
this.memory.restock = true;
|
|
this.memory.target = null;
|
|
} else {
|
|
this.memory.target = null;
|
|
}
|
|
}
|
|
|
|
upgrade() {
|
|
this.memory.target = this.room.controller.id;
|
|
// Upgrade the controller or walk towards it.
|
|
var response = this.upgradeController(this.room.controller);
|
|
if (response == OK);
|
|
else if (response == ERR_NOT_IN_RANGE) this.moveToTarget();
|
|
else if (response == ERR_NOT_ENOUGH_RESOURCES) {
|
|
this.memory.restock = true;
|
|
this.memory.target = null;
|
|
} else {
|
|
this.memory.target = null;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function setConstants() {
|
|
global.HARVESTER = 0;
|
|
global.MINER = 1;
|
|
global.SUPPLIER = 2;
|
|
global.BUILDER = 3;
|
|
global.UPGRADER = 4;
|
|
global.DEFENDER = 5;
|
|
global.RESERVER = 6;
|
|
global.RESERVED_HARVESTER = 7;
|
|
} |