Transferring energy to storage

  • Why is the coding excessively cryptic? It seems that the command which works fine when transferring energy to STRUCTURE_EXTENSION does not also work for STRUCTURE_STORAGE or CONTAINER. Any help would be great, see my current code below:

    run: function(creep) {
        if( < creep.carryCapacity) {
            var sources =;
            if(creep.harvest(sources[1]) == ERR_NOT_IN_RANGE) {
                creep.moveTo(sources[1], {visualizePathStyle: {stroke: '#ffaa00'}});
        else {
            var targets = creep.pos.findClosestByPath(FIND_STRUCTURES, {
                    filter: (s) => (s.structureType == STRUCTURE_STORAGE) &&
                   < s.energyCapacity
            if(targets) {
                if(creep.transfer(targets, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
                    creep.moveTo(targets, {visualizePathStyle: {stroke: '#ffffff'}});

  • energy structures vs store structures

    Terminal/Storage/Container/Tombstone have a "store" which works similar to a creep's "carry". < s.energyCapacity would work for an energy structure like an extension but not for a store structure like a container. In this case you need < s.storeCapacity.

  • Or better remember if there is some mineral in there too, maybe use lowdash container.storeCapacity - _.sum( for free space.

  • The reason that containers/storage/terminals are different is because they can store minerals. Extensions and spawns and towers can only store energy, so there's no need for the store object.

    For store, store[RESOURCE_ENERGY] is always defined, 0 if it's empty. If the other minerals/compounds aren't present, those values are undefined. So if there's no lemergium, then store[RESOURCE_LEMERGIUM] would be undefined

  • @wtfrank @Saruss @famine Thanks a lot for the explanation guys now I understand why it is different and the code is working all good also.