Routines 
Prev: 62DA  Up: Map  Next: 6329 


62DB  LD A,($7FFF)  7FFF holds the ycoordinate 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 03 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 xcoordinates 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 xcoordinate for the sniper  
630D  INC E  Point DE at the next potential xcoordinate  
630E  LD (HL),A  Set the sniper's xcoordinate for testing  
630F  CALL $66DA  Would this bring the sniper on screen no less than 8 xcoordinates away from Sam?  
6312  JR Z,$6317  Jump if so  
6314  DJNZ $630C  Otherwise consider the next potential xcoordinate  
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  Next: 6329 