Routines 
Prev: 25113  Up: Map  Next: 25306 
The address of this interruptible subcommand routine is placed into bytes 14 and 15 of the sniper's buffer by the routine at 25307. It controls the sniper from the moment he appears until he hides again.


25118  LD L,2  A=sniper's ycoordinate  
25120  LD A,(HL)  
25121  LD L,17  Point HL at byte 17 of the sniper's buffer  
25123  INC (HL)  Is it zero (meaning the sniper has not fired recently)?  
25124  DEC (HL)  
25125  JR Z,25128  Jump if so  
25127  DEC (HL)  Otherwise decrement byte 17  
25128  DEC L  L=16  
25129  CP 50  The sniper's ycoordinate is 50 when he's inactive  
25131  JR NZ,25168  Jump if the sniper is currently active  
The sniper is currently inactive.


25133  DEC (HL)  Decrement byte 16 of the sniper's buffer  
25134  JP Z,62084  Terminate this subcommand if byte 16 is now 0  
25137  CALL 26328  Is the sniper on screen at least 8 xcoordinates away from Sam?  
25140  NOP  
25141  JP NZ,62084  Terminate this subcommand if not  
25144  INC L  Point HL at byte 2 of the sniper's buffer  
25145  LD (HL),37  Set the sniper's ycoordinate to 37 (out of sight, but ready to emerge)  
25147  LD A,(58881)  A=Sam's xcoordinate  
25150  DEC L  L=1  
25151  SUB (HL)  Subtract the sniper's xcoordinate  
25152  CCF  Compute the appropriate animatory state for the sniper: 54 if he's to the right of Sam, 182 if he's to the left  
25153  LD A,108  
25155  RRA  
25156  DEC HL  Set the sniper's animatory state  
25157  LD (HL),A  
This entry point is used by the routine at 28646.


25158  LD L,2  Collect the sniper's x and ycoordinates in DE  
25160  LD D,(HL)  
25161  DEC HL  
25162  LD E,(HL)  
25163  DEC HL  A=sniper's animatory state  
25164  LD A,(HL)  
25165  JP 26224  Update the sniper's sprite tile references  
The sniper is currently active (his ycoordinate is 3437).


25168  LD A,(57014)  Collect the sprite tile reference for tile 7 of animatory states 54/182; this will be 235 if the sniper is firing, or 0, 110, 111 or 113 otherwise  
25171  CP H  Is the sniper firing?  
25172  JP NC,28646  If so, make the firing sound effect  
25175  LD A,(32767)  A=ycoordinate of the topmost row of the play area on screen  
25178  CP 20  Is the sidewalk on screen?  
25180  JR NZ,25193  If not, deactivate the sniper and terminate this subcommand  
25182  DEC (HL)  Decrement byte 16 of the sniper's buffer  
25183  JR NZ,25210  Jump unless byte 16 is now zero  
Byte 16 of the sniper's buffer has been decremented to zero. The apparent intention here is to make the sniper duck out of sight and terminate this subcommand; however, if the sniper is not already out of sight, he will duck briefly but remain in view, and byte 16 will be decremented to 255 on the next pass through this routine. This is a bug.


25185  CALL 59848  Update the SRB for the sniper's current animatory state and location  
25188  LD A,D  A=sniper's ycoordinate  
25189  CP 37  Is the sniper currently out of sight?  
25191  JR NZ,25202  Jump if not to make him duck  
25193  LD L,15  Remove the address of this routine from bytes 14 and 15 of the sniper's buffer  
25195  LD (HL),0  
25197  LD L,2  Set the sniper's ycoordinate to 50 (inactive)  
25199  LD (HL),50  
25201  RET  
The sniper is in the process of ducking.


25202  INC D  D=sniper's next ycoordinate (3537)  
25203  LD L,0  Point HL at byte 0 of the sniper's buffer  
25205  LD A,(HL)  A=sniper's animatory state  
25206  AND A  Reset the carry flag to indicate that the sniper is not firing  
25207  JP 26224  Update the sniper's sprite tile references  
Byte 16 of the sniper's buffer is not zero.


25210  CALL 26328  Compare the sniper's coordinates with Sam's  
25213  JR Z,25227  Jump if the sniper is on screen and at least 8 xcoordinates away from Sam  
25215  JR NC,25193  Terminate this subcommand if the sniper if off screen  
25217  CALL 59848  Update the SRB for the sniper's current animatory state and location  
25220  LD A,D  A=sniper's ycoordinate  
25221  CP 37  Has the sniper already ducked out of sight?  
25223  JR NZ,25202  Jump if not to make the sniper continue ducking  
25225  JR 25197  Deactivate the sniper  
The sniper is on screen and at least 8 xcoordinates away from Sam. If he's already popped his head out far enough (his ycoordinate is 34 or 35), he can consider shooting; otherwise he'll need to emerge a little further first.


25227  LD L,2  Point HL at byte 2 of the sniper's buffer  
25229  LD A,(HL)  A=sniper's ycoordinate  
25230  CP 36  Is at least half of the sniper visible?  
25232  JR C,25240  Jump if so  
25234  CALL 59848  Update the SRB for the sniper's current animatory state and location  
25237  DEC D  D=sniper's next ycoordinate (35 or 36)  
25238  JR 25206  Jump back to update the sniper's sprite tile references  
At least half of the sniper is visible (his ycoordinate is 34 or 35), which means he can shoot.


25240  LD L,16  Collect byte 16 of the sniper's buffer  
25242  LD A,(HL)  
25243  AND 3  Is bit 0 or bit 1 set?  
25245  JR NZ,25263  Jump if so  
25247  CALL 61823  Get a random number in A  
25250  CP 160  Should the sniper consider shooting?  
25252  JR C,25263  Jump if so (5 times out of 8)  
25254  CALL 59848  Update the SRB for the sniper's current animatory state and location  
25257  LD A,D  A=sniper's ycoordinate (34 or 35)  
25258  XOR 1  Toggle between 34 and 35  
25260  LD D,A  D=sniper's next ycoordinate (35 or 34)  
25261  JR 25203  Jump back to update the sniper's sprite tile references  
The sniper will consider shooting.


25263  LD A,(58884)  A=Sam's zcoordinate  
25266  RRCA  Is Sam indoors?  
25267  RET C  Return if so  
25268  LD A,(32764)  Collect Sam's status flags from 32764  
25271  AND 129  Is Sam falling from a building or being carried?  
25273  RET NZ  Return if so  
25274  LD L,17  Collect byte 17 of the sniper's buffer  
25276  LD A,(HL)  
25277  AND A  Has the sniper fired recently?  
25278  RET NZ  Return if so  
25279  CALL 61823  Get a random number in A  
25282  CP 84  Should the sniper continue to consider shooting?  
25284  RET NC  Return if not (21 times out of 64)  
25285  LD DE,32706  Point DE at the third byte of bullet buffer 1 (at 32704)  
25288  LD A,(DE)  Pick this up in A  
25289  AND A  Is bullet buffer 1 in use?  
25290  JR Z,25297  Jump if not  
25292  LD E,198  Point DE at the third byte of bullet buffer 2 (at 32708)  
25294  LD A,(DE)  Pick this up in A  
25295  AND A  Is bullet buffer 2 in use?  
25296  RET NZ  Return if so  
The sniper has decided to shoot, and a bullet buffer is available.


25297  LD (HL),12  Place 12 into byte 17 of the sniper's buffer (indicating that he's just fired)  
25299  CALL 59848  Update the SRB for the sniper's current animatory state and location  
25302  SCF  Set the carry flag to indicate that the sniper is firing  
25303  JP 26224  Update the sniper's sprite tile references and initialise a bullet 
Prev: 25113  Up: Map  Next: 25306 