![]() |
Routines |
Prev: 62DA | Up: Map |
|
||||||||||
62DB | LD A,($7FFF) | 7FFF holds the y-coordinate of the topmost row of the play area on screen | ||||||||
62DE | CP $14 | Is the sidewalk on screen at the moment? | ||||||||
62E0 | RET NZ | Return if not | ||||||||
62E1 | LD A,($7FFC) | Collect Sam's status flags from 7FFC | ||||||||
62E4 | AND $81 | Is Sam being carried or falling from a building at the moment? | ||||||||
62E6 | RET NZ | Return if so | ||||||||
62E7 | LD L,$03 | Set bit 7 of byte 0x03 of the sniper's buffer, making him move quickly | ||||||||
62E9 | SET 7,(HL) | |||||||||
62EB | LD L,$0A | Decrement and then collect byte 0x0A of the sniper's buffer | ||||||||
62ED | DEC (HL) | |||||||||
62EE | LD A,(HL) | |||||||||
62EF | AND $0F | Are any of bits 0-3 set? | ||||||||
62F1 | 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.
|
||||||||||
62F2 | LD A,($7FEA) | Collect the key inventory flags from 7FEA | ||||||||
62F5 | LD B,$1F | B=0x1F if Sam has no keys or one key, 0x3F if he has two keys, 0x7F if he has three, or 0xFF if he has all four | ||||||||
62F7 | ADD A,A | |||||||||
62F8 | JR Z,$6300 | |||||||||
62FA | JR NC,$62F7 | |||||||||
62FC | RL B | |||||||||
62FE | JR $62F7 | |||||||||
6300 | CALL $F17F | Get a random number in A | ||||||||
6303 | CP B | Is A>=B? | ||||||||
6304 | RET NC | Return if so | ||||||||
The dice are telling us that the sniper should appear. But can we find a suitable spot for him?
|
||||||||||
6305 | LD DE,$6212 | Point DE at the table of potential x-coordinates for the sniper at 6212 | ||||||||
6308 | LD L,$01 | Point HL at byte 0x01 of the sniper's buffer | ||||||||
630A | LD B,$07 | There are 7 entries in the table | ||||||||
630C | LD A,(DE) | A=potential x-coordinate for the sniper | ||||||||
630D | INC E | Point DE at the next potential x-coordinate | ||||||||
630E | LD (HL),A | Set the sniper's x-coordinate for testing | ||||||||
630F | CALL $66DA | Would this bring the sniper on screen no less than 8 x-coordinates away from Sam? | ||||||||
6312 | JR Z,$6317 | Jump if so | ||||||||
6314 | DJNZ $630C | Otherwise consider the next potential x-coordinate | ||||||||
6316 | RET | |||||||||
We have found a suitable place for the sniper to emerge from.
|
||||||||||
6317 | LD L,$11 | Byte 0x11 of the sniper's buffer is used to regulate the delay between shots; initialise it to 0 | ||||||||
6319 | LD (HL),A | |||||||||
631A | DEC L | L=0x10 | ||||||||
631B | CALL $F17F | Get a random number in A | ||||||||
631E | AND $0F | Byte 0x10 of the sniper's buffer is used to decide when to duck and when to shoot; initialise it to a number between 0x0A and 0x19 | ||||||||
6320 | ADD A,$0A | |||||||||
6322 | LD (HL),A | |||||||||
6323 | LD BC,$621E | Copy the address of the interruptible subcommand routine at 621E into bytes 0x0E and 0x0F of the sniper's buffer, and then jump to it | ||||||||
6326 | JP $F7AB |
Prev: 62DA | Up: Map |