Prev: 29194 Up: Map Next: 29332
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
Prev: 29194 Up: Map Next: 29332