![]() |
Routines |
Prev: 29194 | Up: Map |
Used by the routine at 29559. Returns with the carry flag reset if the policeman spots, recognises and starts chasing Sam.
|
|||||||||
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 |