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 |