![]() |
Routines |
| Prev: 29194 | Up: Map | Next: 29332 |
|
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 | Next: 29332 |