![]() |
Routines |
Prev: 25306 | Up: Map | Next: 25385 |
Used by the command list at 64890. Checks whether conditions are right for the sniper to appear, and if they are, hands over control to the interruptible subcommand routine at 25118.
|
||||
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 |