creep.pull(). For me this was one of the most radical changes to screeps and filled a big gap where it felt like something was missing.
When this was introduced somebody suggested the idea of a corresponding
creep.push() (IIRC their desire was to push creeps forward into battle, which is a cool idea).
I have been thinking about this a bit more and I think a corresponding
creep.push() would be a big help. One of the more fiddly things about using
pull() is crossing room boundaries. Whilst it's an interesting challenge to implement at first, it just ends up feeling messy and unsatisfying, with creeps having to do this elaborate dance and taking 5 ticks to move across instead of 2.
push(), this could be reduced to 4 ticks: pull up to the exit then (1) pull/swap, (2) push trailer onto exit, (3) move onto exit, (4) move off exit, ready to continue pulling again on tick 5. It's much more natural.
If you were already pushing up to the exit then it's literally just 2 ticks, although you'll be pulling on the other side, but it only takes 2 ticks to go from pulling to pushing and you can do it at your leisure anywhere in the room without having to dance around the exit portals.
I haven't worked out what would happen for longer trains, but I'm sure it would make life MUCH easier and faster. A really interesting feature of
push() would be the ability to have a creep pulling at the front of the train and another creep pushing at the back. With this setup it might be possible to move a train across a room boundary without doing any swapping.
Another potential use of
push() would be for dealing with tricky traffic situations. As it stands, if a tug/trailer pair enters a heavy traffic area it can be a real nightmare. If two pairs meet there is no hope. With
push() you've got many more options to resolve the situation.
I propose it should work as follows:
- As the one in front, the "wagon" calls
move(pos) to decide where to move. The pushing creep calls
push(wagon), which causes it to move to the wagon's current position, and transfers the fatigue like
- The pushing creep always moves to where the wagon was to stay adjacent to it. If this is not possible for some reason, the push does not happen. If the wagon is capable of moving by itself then it can move away, but you cannot push a creep away from you to create a gap.
- It should be possible to
push() a creep which is pushing another creep in front of it, just like you can
pull() a creep that is pulling another creep behind it.
- A creep should be allowed to
pull() creeps behind it and
push() creeps in front at the same time (Wagon-Tug-Wagon).