Pull across room boundaries



  • I've been looking at pull recently with 0 move creeps being pulled. Obviously across room boundires this adds challenges. Just pairs of creeps at the moment. Right now the way to do it is

    • Tick 1: Move onto edge with pulling creep pulling other creep next to edge
    • Tick 2: Do nothing
    • Tick 3: Pulling creep is back in the room with the other creep. Now you have to issue a valid move intent to enable the pull. This is nasty. You cannot move "into the wall", you have to either move along the room edge or move back into the room you just came from. Going to assume you move along the room edge as I think moving into the room you just came from adds a tick.
    • Tick 4: Pulled creep is now through to the other room. If the pulling creep moved along the room edge it is also. Pulling creep moves into the room further.
    • Tick 5: Do nothing
    • Tick 6: Pull other creep off room edge.

    This is all fine except tick 3 should not work as it does. I don't think we should be required to issue a move intent for this. If we are required to issue a move intent, I feel it shold be valid to have an intent that essentially says "stay still and teleport" by moving into the room wall.



  • I feel the Tick 2 could be changed so that if the pullee issued a creep.move(pullerCreep), despite they being technically now in different rooms, the system can check the edge case (here?) and decide that indeed they are still adjacent and as long as the puller itself is moving (which it has to anyway as per any other pull move) move the pullee onto the edge place the puller went last time, and the same square the puller would have been at Tick 3 anyway if it didn't move. then Tick 3 they are both in the dest room and can continue on their journey. This way pulling across the boundary would be as seemless as any other pull.



  • @Snowgoose on slack told me how to avoid the "Tick 3" intent issue. In the OP I complained because the game doesn't let you pull unless you move somewhere, which screws up when you have an "implicit" move by sitting still on an exit tile. You don't want to move anywhere though. You want to teleport back through.

    The trick is to move to the creep object that you're pulling. That seems to confuse the game graphics a little (and maybe the engine), but gets the desired behaviour of pulling using the implicit teleportation.

    I still think we should be allowed ot issue move intents into the room edge and have pull complete.



  • If you're willing to add a single WALK part on the pulled creep you can use the room edge fatigue trick to move through more quickly. Fatigue is reset to 0 when you move onto an exit tile from a regular tile.



  • Yeah, that's an option, but I feel shouldn't be required. On further investigation my previous post was wrong and you can't work around the issue. Going back to where the "wagon" previously was is no worse than any other solution but IMO the game should allow you to sit in place and pull.



  • Sorry to necro this thread, but has anyone found any other solutions besides the ones above?

    These seem pretty awkward, especially for trains longer than a single wagon.



  • @keidence a single MOVE part on each wagon scales up as many as you'd like.

    The engine pulls the whole train right onto the exit tile. The next tick the engine is in the next room. Now the lead wagon pulls the rest of the train onto the exit tile (incurring HUGE fatigue). But it blinks into the next room erasing fatigue. Repeat until the last wagon just moves onto the exit tile without pulling anything.

    Now it's not quite a clever looking as Tigga's exit tango, but it works. The biggest disadvantage is you must waste one body part as a MOVE that will be unused most of the time. (Though I suppose someone could work out the math for an engine that relies on the single MOVE parts in it's wagons.



  • @deft-code Thanks, that makes sense. And will actually work out well for me because all my wagons have 1 move part to be able to reposition themselves when unloaded.



  • @deft-code What do you mean by "But it blinks into the next room erasing fatigue." Does it not keep a huge fatigue on the body?



  • @davaned When a creep moves from a non-exit tile onto an exit tile the creep's fatigue is set to 0.

    https://github.com/screeps/engine/blob/92a3fffee65d547f12f5a99940c6155d9482a254/src/processor/intents/movement.js#L242

        if(utils.isAtEdge(move) && !utils.isAtEdge(object)) {
            fatigue = 0;
            object._fatigue = 0;