Infinite lives
RESTART_PLAYER starts every life, the first included: it copies the player template over his two records and takes a life with DEC (HL) at $C2FD, going to the game over when that leaves less than none. Make the DEC a NOP and LIVES never moves. The JP M after it still tests the sign flag, which the code before it leaves clear on both ways in (read). Put in before a game starts, the panel should show 05 instead of 04 (read, not tried). Tested: standing still at the middle of room 6, where two deadly pacers go back and forth through the spot (the room entered by the game's own restart), he was killed every 16 turns; with 3 lives the fourth death was the game over, at turn 63. With the poke he died 75 times in 1200 turns and the panel said 03 throughout.
POKE 49917,0
Nothing can kill him
Whatever kills the player does it the same way: the collision code sets bit 6 of the +$0D of his legs' record (the mover's bit 7, or the obstacle's bit 5, ADJ_DU_FOR_OBJ_INTERSECT), and the next time his update routine PLAYER_LEGS runs it tests that bit and turns him into the puff. Make the BIT 6 a RES 6 -- one byte, the fourth of the instruction -- and the JR Z after it a JR, and the mark is wiped and ignored every turn. His body is out of every collision test already (PLAYER_TOP), so nothing else needs doing. Deadly things still bump him, and homers still chase him. Tested: the same trial as the lives poke -- room 6, standing between the two deadly pacers -- four deaths in 63 turns and the game over without it; with it, 1200 turns, no death, three lives.
POKE 50246,182: POKE 50247,24
The well gives the bucket at once
WELL counts, in its own record, the turns on which one of his bolts touches it, and makes the bucket on the 32nd -- the CP $20 at $CFE7. Make that CP 1 and the first touch does it. (The count is otherwise lost each time he leaves the room: the well's record is built afresh.) Tested: in room 71, the well's room with no monsters, the player put inside the ring of hazards facing the well and firing a bolt every five turns: the bucket came after 7 shots and 35 turns without the poke (see the bugs for why only 7), after the first shot and 5 turns with it.
POKE 53224,1
Nothing falls from the sky
SKY_DROP runs at the top of every turn and is the only thing that puts a homer, a sky roamer or a sky walker into the two records kept for them. A RET as its first instruction, and nothing ever falls; the things a room starts with are not affected. Tested: standing in room 30, which is empty and allows drops, with the immunity poke in both trials so that nothing restarted the room: without this poke three things fell in 1000 turns, 80 turns apart, the first about 80 turns after he arrived; after the third both records held homers, which do not leave, and nothing more could fall. With it, nothing fell.
POKE 52139,201
Always start in room 51
CHOOSE_START takes RANDOM AND 3 as an index into the four start rooms at START_ROOMS. Make the AND $03 at $C2DC an AND 0 and every game starts in the first of them, room 51. Tested: eight games started, each after a game over reached after a different number of turns (5 to 40): without the poke they began in rooms 92 and 12, with it all eight began in 51. The collectables were put out exactly as without it, since NEW_QUEST reads the same random number.
POKE 49885,0
No waiting between turns
At the end of every turn OBJECT_DONE waits six units of about 33,000 T-states less the drawing the turn has already done (DRAW_WORK), so a quiet room runs no faster than a busy one. Make the ADD A,$06 at $B04A an ADD A,0 and it never waits. Busy rooms, where the work is six units or more already, are unchanged. Tested: standing still in room 30, 50 turns took 123 frames without the poke and 76 with it (four units of work a turn, so two of waiting saved); in the start room, room 92, with nine units of work a turn, 50 turns took 122 frames either way.
POKE 45131,0
Play on a 128K in 128 mode
READ_KEYS sends the half-row it is about to read to port $FD before reading port $FE, an OUT that does nothing on a 48K Spectrum and pages memory on a 128K (see the bugs). The IN after it selects the half-rows by itself, so the OUT can simply go: two NOPs. Tested on the emulator's 128K machine, from the loaded game put into a 128K snapshot with the 48 BASIC ROM and bank 0 paged in and paging unlocked, as the 128's Tape Loader leaves it: without the poke the game crashed to the ROM on its first turn of play; with it, 300 turns of play, walking out of the start room into the next, and the paging was as it started. On the 48K the same 300 turns went exactly as without the poke.
POKE 47442,0: POKE 47443,0