| Routines

29218: Make a policeman start chasing Sam if appropriate

Used by the routine at 29559. Returns with the carry flag reset if the policeman spots, recognises and starts chasing Sam.
Input
H | 222 or 223 (policeman)
29218 | CALL 28842 | Is Sam close enough that the policeman has a chance of spotting him?
29221 | CCF | Return with the carry flag set if not
29222 | RET C
29223 | PUSH DE | E and D hold the horizontal and vertical distances between Sam and the policeman; save these briefly
29224 | PUSH HL | Save the policeman's character number briefly
29225 | LD H,230 | 230=Sam
29227 | CALL 28886 | Check whether Sam is visible to passers-by
29230 | LD B,6 | Prepare B for the case where Sam is visible to passers-by
29232 | JR Z,29248 | Jump if Sam is visible to passers-by
29234 | CALL 62518 | Is Sam standing next to a light switch?
29237 | JR Z,29247 | Jump if not
29239 | LD A,(BC) | A=window flags for Sam's location
29240 | AND 32 | Set the zero flag if the light switch for this window is in the 'on' position
29242 | LD A,4 | Prepare A for the case where Sam is standing next to a light switch in the 'on' position
29244 | JR Z,29247 | Jump if the light switch for this window is in the 'on' position
29246 | XOR A | Prepare A for the case where Sam is neither visible to passers-by nor standing next to a light switch in the 'on' position
29247 | LD B,A | B=0, 4 or 6
Now B=6 (if Sam is visible to passers-by), or 4 (if Sam is standing next to a light switch that is in the 'on' position), or 0 otherwise.
29248 | CALL 29332 | Check whether Sam's disguise is known to the police
29251 | POP HL | Restore the policeman's character number to H
29252 | POP DE | Restore the horizontal and vertical distances between Sam and the policeman to E and D
29253 | LD A,B | A=0, 1, 4, 5, 6 or 7
29254 | CP 6 | Is Sam visible to passers-by?
29256 | JR NC,29265 | Jump if so
29258 | CALL 28886 | Is the policeman visible to passers-by?
29261 | JR NZ,29265 | Jump if not
29263 | INC B | B=2, 3, 6 or 7
29264 | INC B
29265 | LD A,B | A=0-7
29266 | LD L,A | Save this value in L
29267 | ADD A,A | Point BC at an entry in the table at 29194
29268 | ADD A,B
29269 | ADD A,10
29271 | LD C,A
29272 | LD B,114
29274 | LD A,(BC) | Pick up the first byte of the entry
29275 | CP D | Compare it with the vertical distance between Sam and the policeman
29276 | RET C | Return (with the carry flag set) if the vertical distance is greater
29277 | INC C | Pick up the second byte of the entry
29278 | LD A,(BC)
29279 | CP E | Compare it with the horizontal distance between Sam and the policeman
29280 | RET C | Return (with the carry flag set) if the horizontal distance is greater
29281 | INC C | Pick up the third byte of the entry
29282 | LD A,(BC)
29283 | SUB D | Subtract both the horizontal and vertical distances between Sam and the policeman
29284 | SUB E
29285 | RET C | Return (with the carry flag set) if the result is negative
29286 | BIT 0,L | Bit 0 of L is set if Sam's current disguise (if any) is known to the police
29288 | LD L,29 | Point HL at byte 29 of the policeman's buffer
29290 | JR NZ,29322 | Jump if Sam's current disguise is known to the police
Sam has been spotted by the policeman, but he's wearing a disguise that is not (yet) known to the police.
29292 | LD A,(32713) | Collect Sam's current disguise ID (1-7) from 32713
29295 | RRCA | Move bits 0-2 into bits 5-7
29296 | RRCA
29297 | RRCA
29298 | LD C,A | Copy these disguise identifier bits into C
29299 | LD A,(HL) | Pick up byte 29 of the policeman's buffer
29300 | AND 31 | Keep only bits 0-4 (the disguise timeout counter)
29302 | JR NZ,29306 | Jump unless they are all 0
29304 | LD A,16 | The disguise timeout counter will be initialised to 16
29306 | OR C | Copy the disguise identifier bits from C into bits 5-7 of A
29307 | LD (HL),A | Copy the disguise identifier bits and the timeout counter into byte 29 of the policeman's buffer
29308 | INC L | L=30
29309 | CALL 25944 | Determine Sam's location
29312 | LD (HL),E | Copy Sam's x-coordinate into byte 30 of the policeman's buffer
29313 | INC L | L=31
29314 | AND 3 | A=0 if z (Sam's z-coordinate) is 4, 2 if z is 2, or 1 if z is 1
29316 | RRCA | A=0 if z=4, 128 (bit 7 set) if z=2, or 64 (bit 6 set) if z=1
29317 | RRCA
29318 | OR D | Copy Sam's y-coordinate into bits 0-5 of A
29319 | LD (HL),A | Copy this value into byte 31 of the policeman's buffer
29320 | SCF | Set the carry flag: the policeman is not chasing Sam
29321 | RET |
Sam has been spotted by the policeman, and his current disguise (if any) is known to the police.
29322 | LD A,(HL) | Collect byte 29 of the policeman's buffer
29323 | AND A | Is there a disguise ID in bits 5-7?
29324 | CALL NZ,29126 | If so, make that disguise known to the police (if it isn't already)
29327 | CALL 29088 | Set the policeman's destination to Sam's current location
29330 | AND A | Clear the carry flag to indicate that the policeman is now chasing Sam
29331 | RET |