![]() |
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 |