Common development problems
This article is a stub. You can help Screeps Wiki by editing to add more information. This is a list of some of the most common problems people come across while playing the game.
Creep.build silently fails
There is probably a creep standing on the construction site. This is intended behavior; however, the fact that there is no error code for this is a known bug.
Why are all my creeps one role?
If you have made some new changes to you code and you suddenly find that all your creeps are the same role, likely when assigning, searching or checking the new role somewhere a
= is suppose to be a
== for example if your running logic for a creep
if(creep.memory.role = 'roleName') Will set every creep run, to the role name, instead of comparing.
How can I tell what my creep/tombstone/container is storing?
You can use
Object.keys() on the object's
store property to retrieve the keys that are active, then check the amounts by looping though the keys and its store.
Why is store.getXXX() returning Null?
If you do not provide a
RESOURCE_* (Where * is a resource) constant to the method, and it is a non-generalized store it will return null. A generalized store (Terminal, storage) will return the 'total' regardless, but most other objects will not.
What is using all my CPU!?
You can use https://docs.screeps.com/api/#Game.cpu.getUsed before and after various parts of your code to determine how much CPU a certain snippet uses.
Why is pathfinder pathing though my spawn/extension/tower?
By default, pathfinder only uses terrain. You need to provide a
roomCallback with a
costMatrix with the buildings/objects you wish to avoid set.
Why is my pathfinder path not working with moveByPath and/or not what I want?
There are a few common issues that can happen when using pathfinder if not set correctly.
- If your object is on a terrain wall (Source/Controller/ect) or otherwise 'not possible' for a creep to stand on, you need to provide a range for the goal object. Elsewise, it will not be able to find the object as an 'end goal' as walls are not path able by default. (see API doc)
- If you are passing the whole return from to moveByPath, then it will not recognize it as a path. You need to use the
pathproperty of the returned object, which is the 'path'
- If the path is not what you thought it 'should' be, check the
incompeleteproperty of the returned object, if true, then the path could not be found. It is possible for some reasons mentioned here for that to occur, or it simply ran out of
opsbefore it could find the path. the
maxOpsby default is 2000, however you can set this higher if need be. It is important to note, EVEN with an
incompleteof true, you will still get a
pathof whatever was last 'found/tried' which will likely not be correct.
- If you are storing the path in
Memoryto use later on, you will probably find that moveByPath will return an error. This is because when an object is stored to memory, it is
JSON.stringified()into a string, saved, then next tick on first memory call
JSON.parsed()into an object again. However, this object is now 'new' and is not a
roomPositioneven though it still contains, x,y, and roomName.
moveByPath()accepts an array of
roomPositionsnot of this new object, as such you need to reconstrue each obj in the array back to a roomPosition, or use another method to encode it.
Why can't I dismantle this InvaderCore!?
Invader cores are alien, Invader technology, as such careful and effective dismantling by a creep is ineffectual as they do not know how it is put together. However, it is still quite possible to bluntly attack and destroy it.
(code reason: It doesn't have an entry in the
CONSTRUCTION_COST constant, as such calling
dismantle() will return before any damage is done)
Why is getObjectByID() not returning an Object?
If your object is in a room you do not have vision on, then you will not be able to fetch the object.
Why is my game object in memory not working/updating?
Storing a live-game object in memory makes it 'stale', and not reference the original. This is because when an object is stored to
Memory it is
JSON.stringified() for storage, and next tick on first
JSON.parsed() into a new object, losing all reference to its live counterpart. It is recommended you instead store its
ID so you can retrive it when necessary using
Why is my creep not using exclusively roads with moveTo?
While roads are 'preferred' when set with the cost-matrix for the default moveTo, they are not 'only' considered. It is quite possible for steps off the road to be taken, you may want to consider using path-caching or other methods such as a custom costMatrix to make them take the path you desire.
Why is creep.transfer() returning an error when targeting my controller?
Likely, your creep does not have any
WORK parts, the proper method in upgrading a controller is
upgradeController which is called by default when using
transfer() and the target is a controller. See the: https://docs.screeps.com/api/#Creep.upgradeController API doc.
Why is my spawn not generating any more energy, shouldn't it generate to 300?
A spawn will only generate energy when the total room energy is <300, check extensions (even if not owned by you) to see if there is energy there.
Why does findClosestByRange & Path not working?
If your object is outside the room, is a common issue. findClosest only works for in-room objects, you have to code your own solution for out-of-room objects. findClosestByPath can also fail to 'find' or detect an object if a path can not be found/fails to be found.
Why is console.log() returning [Object, object]?
Objects to console such as creeps, rooms, memory, ect, console will output
[Object,object] if you wish to view it as a simplified string you can use
JSON.stringify() on the object to print it out as a plain string.
Why can't I remove/delete ruins?
Ruins are remains of old buildings from other users. They can not be removed or deleted except by a nuke (which deletes all creeps/constructionSites and ruins from a room on-landing). They do not block creep movement however and resources contained within them can be withdrawn by creeps.
Why isn't RESOURCES_ALL working to withdraw/transfer from this container/tombstone/creep?
transfer() ONLY accept 1
RESOURCE_* (where * is a resource) constant at a time, you can not pass it an array of them, or more than one. You can retrieve active resources in an object by looping over
RESOURCES_ALL and checking for amounts contained within, or simply by getting the keys from the object's
Object.keys() and then selecting one to use.