TooAngel/screeps

View on GitHub
src/role_storagefiller.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';

/*
 * storagefiller should be present on RCL > 4
 *
 * Gets the energy from the link and transfers it to the tower or storage
 *
 */

roles.storagefiller = {};
roles.storagefiller.killPrevious = true;

roles.storagefiller.settings = {
  layoutString: 'MC',
  amount: [1, 4],
  maxLayoutAmount: 1,
};

/**
 * transferFromLink
 * @param {object} creep
 * @return {boolean}
 */
function transferFromLink(creep) {
  const tower = getTower(creep);
  const link = creep.getCloseByLink();
  if (!link) {
    creep.withdraw(creep.room.storage, RESOURCE_ENERGY);
    creep.transfer(tower, RESOURCE_ENERGY);
    return true;
  }

  creep.withdraw(link, RESOURCE_ENERGY);
  if (tower && tower.store.getFreeCapacity(RESOURCE_ENERGY) > creep.store[RESOURCE_ENERGY]) {
    creep.transfer(tower, RESOURCE_ENERGY);
    return true;
  }

  const result = creep.transfer(creep.room.storage, RESOURCE_ENERGY);
  return result === OK;
}

/**
 * getTower - Gets the tower from heap data, or sets if missing
 *
 * @param {object} creep - The creep
 * @return {object} - The tower
 **/
function getTower(creep) {
  if (!creep.data.tower) {
    const structures = creep.pos.findInRange(FIND_MY_STRUCTURES, 1, {filter: {structureType: STRUCTURE_TOWER}});
    if (structures.length === 0) {
      return;
    }
    creep.data.tower = structures[0].id;
  }
  return Game.getObjectById(creep.data.tower);
}

/**
 * getPowerSpawn - Gets the powerSpawn from heap data, or sets if missing
 *
 * @param {object} creep - The creep
 * @return {object} - The powerSpawn
 **/
function getPowerSpawn(creep) {
  if (!creep.data.powerSpawn) {
    const structures = creep.pos.findInRange(FIND_MY_STRUCTURES, 1, {filter: {structureType: STRUCTURE_POWER_SPAWN}});
    if (structures.length === 0) {
      return;
    }
    creep.data.powerSpawn = structures[0].id;
  }
  return Game.getObjectById(creep.data.powerSpawn);
}

roles.storagefiller.action = function(creep) {
  creep.setNextSpawn();
  creep.spawnReplacement(1);

  if (transferFromLink(creep)) {
    return true;
  }

  if (creep.room.controller.level === 8) {
    const powerSpawn = getPowerSpawn(creep);
    if (powerSpawn) {
      if (creep.room.storage.store[RESOURCE_POWER] > 0) {
        creep.withdraw(creep.room.storage, RESOURCE_POWER);
        creep.transfer(powerSpawn, RESOURCE_POWER);
      }
    }
  }
  return true;
};