![]() |
Routines |
Prev: 25306 | Up: Map | Next: 25385 |
|
||||
25307 | LD A,(32767) | 32767 holds the y-coordinate of the topmost row of the play area on screen | ||
25310 | CP 20 | Is the sidewalk on screen at the moment? | ||
25312 | RET NZ | Return if not | ||
25313 | LD A,(32764) | Collect Sam's status flags from 32764 | ||
25316 | AND 129 | Is Sam being carried or falling from a building at the moment? | ||
25318 | RET NZ | Return if so | ||
25319 | LD L,3 | Set bit 7 of byte 3 of the sniper's buffer, making him move quickly | ||
25321 | SET 7,(HL) | |||
25323 | LD L,10 | Decrement and then collect byte 10 of the sniper's buffer | ||
25325 | DEC (HL) | |||
25326 | LD A,(HL) | |||
25327 | AND 15 | Are any of bits 0-3 set? | ||
25329 | RET NZ | Return if so (15 times out of 16) | ||
Now we check how many keys Sam has collected. The exact number in Sam's possession affects the probability that the sniper will appear.
|
||||
25330 | LD A,(32746) | Collect the key inventory flags from 32746 | ||
25333 | LD B,31 | B=31 if Sam has no keys or one key, 63 if he has two keys, 127 if he has three, or 255 if he has all four | ||
25335 | ADD A,A | |||
25336 | JR Z,25344 | |||
25338 | JR NC,25335 | |||
25340 | RL B | |||
25342 | JR 25335 | |||
25344 | CALL 61823 | Get a random number in A | ||
25347 | CP B | Is A>=B? | ||
25348 | RET NC | Return if so | ||
The dice are telling us that the sniper should appear. But can we find a suitable spot for him?
|
||||
25349 | LD DE,25106 | Point DE at the table of potential x-coordinates for the sniper at 25106 | ||
25352 | LD L,1 | Point HL at byte 1 of the sniper's buffer | ||
25354 | LD B,7 | There are 7 entries in the table | ||
25356 | LD A,(DE) | A=potential x-coordinate for the sniper | ||
25357 | INC E | Point DE at the next potential x-coordinate | ||
25358 | LD (HL),A | Set the sniper's x-coordinate for testing | ||
25359 | CALL 26330 | Would this bring the sniper on screen no less than 8 x-coordinates away from Sam? | ||
25362 | JR Z,25367 | Jump if so | ||
25364 | DJNZ 25356 | Otherwise consider the next potential x-coordinate | ||
25366 | RET | |||
We have found a suitable place for the sniper to emerge from.
|
||||
25367 | LD L,17 | Byte 17 of the sniper's buffer is used to regulate the delay between shots; initialise it to 0 | ||
25369 | LD (HL),A | |||
25370 | DEC L | L=16 | ||
25371 | CALL 61823 | Get a random number in A | ||
25374 | AND 15 | Byte 16 of the sniper's buffer is used to decide when to duck and when to shoot; initialise it to a number between 10 and 25 | ||
25376 | ADD A,10 | |||
25378 | LD (HL),A | |||
25379 | LD BC,25118 | Copy the address of the interruptible subcommand routine at 25118 into bytes 14 and 15 of the sniper's buffer, and then jump to it | ||
25382 | JP 63403 |
Prev: 25306 | Up: Map | Next: 25385 |