First commit

This commit is contained in:
ObeseTermite 2025-06-03 20:21:08 -07:00
commit 4b61534d6f
10 changed files with 1690 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.tern-project
ScreepsAutocomplete

37
main.js Normal file
View file

@ -0,0 +1,37 @@
var roleDispatcher = require('role.dispatcher');
var creepCounts = {"harvester" : 3, "builder" : 1, "upgrader" : 2, "repairer" : 1};
module.exports.loop = function () {
for(var name in Memory.creeps) {
if(!Game.creeps[name]) {
delete Memory.creeps[name];
}
}
for(const [role, count] of Object.entries(creepCounts)){
var roleCreeps = _.filter(Game.creeps, (creep) => creep.memory.role == role);
if(roleCreeps.length < count && !Game.spawns['Moscow'].spawning) {
var newName = role + Game.time;
Game.spawns['Moscow'].spawnCreep([WORK,CARRY,MOVE], newName,
{memory: {role: role}});
break;
}
}
if(Game.spawns['Moscow'].spawning) {
var spawningCreep = Game.creeps[Game.spawns['Moscow'].spawning.name];
Game.spawns['Moscow'].room.visual.text(
'🛠️' + spawningCreep.memory.role,
Game.spawns['Moscow'].pos.x + 1,
Game.spawns['Moscow'].pos.y,
{align: 'left', opacity: 0.8});
}
for(var name in Game.creeps) {
var creep = Game.creeps[name];
roleDispatcher.runRole(creep);
}
}

29
role.builder.js Normal file
View file

@ -0,0 +1,29 @@
var energyUtils = require('utils.energy');
var roleBuilder = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.memory.building && creep.store[RESOURCE_ENERGY] == 0) {
creep.memory.building = false;
}
if(!creep.memory.building && creep.store.getFreeCapacity() == 0) {
creep.memory.building = true;
}
if(creep.memory.building) {
var targets = creep.room.find(FIND_CONSTRUCTION_SITES);
if(targets.length) {
if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}});
}
}
}
else {
energyUtils.gatherEnergy(creep);
}
}
};
module.exports = roleBuilder;

23
role.dispatcher.js Normal file
View file

@ -0,0 +1,23 @@
var roleHarvester = require('role.harvester');
var roleUpgrader = require('role.upgrader');
var roleBuilder = require('role.builder');
var roleRepairer = require('role.repairer');
const roleMap = {
harvester: roleHarvester,
upgrader: roleUpgrader,
builder: roleBuilder,
repairer: roleRepairer
};
function runRole(creep){
const role = roleMap[creep.memory.role];
if(role && typeof role.run === 'function'){
role.run(creep);
} else {
console.log('Unknown or underfied role: ' + creep.memory.role);
}
}
module.exports = { runRole };

21
role.guard.js Normal file
View file

@ -0,0 +1,21 @@
var energyUtils = require('utils.energy');
var roleHarvester = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.store.getFreeCapacity() > 0) {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0], {visualizePathStyle: {stroke: '#ffaa00'}});
}
}
else {
if(!energyUtils.depositEnergy(creep)){
creep.moveTo(Game.flags.IdleArea);
}
}
}
};
module.exports = roleHarvester;

21
role.harvester.js Normal file
View file

@ -0,0 +1,21 @@
var energyUtils = require('utils.energy');
var roleHarvester = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.store.getFreeCapacity() > 0) {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[0], {visualizePathStyle: {stroke: '#ffaa00'}});
}
}
else {
if(!energyUtils.depositEnergy(creep)){
creep.moveTo(Game.flags.IdleArea);
}
}
}
};
module.exports = roleHarvester;

36
role.repairer.js Normal file
View file

@ -0,0 +1,36 @@
var energyUtils = require('utils.energy');
var roleRepairer = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.memory.building && creep.store[RESOURCE_ENERGY] == 0) {
creep.memory.building = false;
}
if(!creep.memory.building && creep.store.getFreeCapacity() == 0) {
creep.memory.building = true;
}
if(creep.memory.building) {
var targets = creep.room.find(FIND_STRUCTURES, {
filter: (structure) => {
return structure.hitsMax - structure.hits > 0;
}
});
if(targets.length > 0) {
if(creep.repair(targets[0]) == ERR_NOT_IN_RANGE) {
creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}});
}
}
else{
creep.say("IDLE")
}
}
else {
energyUtils.gatherEnergy(creep);
}
}
};
module.exports = roleRepairer;

27
role.upgrader.js Normal file
View file

@ -0,0 +1,27 @@
var roleUpgrader = {
/** @param {Creep} creep **/
run: function(creep) {
if(creep.memory.upgrading && creep.store[RESOURCE_ENERGY] == 0) {
creep.memory.upgrading = false;
}
if(!creep.memory.upgrading && creep.store.getFreeCapacity() == 0) {
creep.memory.upgrading = true;
}
if(creep.memory.upgrading) {
if(creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) {
creep.moveTo(creep.room.controller, {visualizePathStyle: {stroke: '#ffffff'}});
}
}
else {
var sources = creep.room.find(FIND_SOURCES);
if(creep.harvest(sources[1]) == ERR_NOT_IN_RANGE) {
creep.moveTo(sources[1], {visualizePathStyle: {stroke: '#ffaa00'}});
}
}
}
};
module.exports = roleUpgrader;

1445
tags Normal file

File diff suppressed because it is too large Load diff

49
utils.energy.js Normal file
View file

@ -0,0 +1,49 @@
var energyUtils = {
gatherEnergy : function(creep) {
var storage = creep.room.find(FIND_STRUCTURES, {
filter: (structure) => {
return (structure.structureType == STRUCTURE_CONTAINER) &&
structure.store.getUsedCapacity(RESOURCE_ENERGY) > 0;
}
});
/**
if(storage.length == 0){
storage = creep.room.find(FIND_STRUCTURES, {
filter: (structure) => {
return (structure.structureType == STRUCTURE_SPAWN) &&
structure.store.getUsedCapacity(RESOURCE_ENERGY) > 0;
}
});
}
**/
if(creep.withdraw(storage[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(storage[0], {visualizePathStyle: {stroke: '#ffaa00'}});
}
},
depositEnergy : function(creep) {
var targets = creep.room.find(FIND_STRUCTURES, {
filter: (structure) => {
return structure.structureType == STRUCTURE_SPAWN &&
structure.store.getUsedCapacity(RESOURCE_ENERGY) < 250;
}
});
if(targets.length == 0){
targets = creep.room.find(FIND_STRUCTURES, {
filter: (structure) => {
return (structure.structureType == STRUCTURE_EXTENSION ||
structure.structureType == STRUCTURE_CONTAINER ||
structure.structureType == STRUCTURE_TOWER) &&
structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0;
}
});
}
if(targets.length > 0) {
if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
creep.moveTo(targets[0], {visualizePathStyle: {stroke: '#ffffff'}});
}
}
return targets.length > 0;
}
}
module.exports = energyUtils;