![]() |
Routines |
Prev: 720A | Up: Map |
Used by the routine at 7377. Returns with the carry flag reset if the policeman spots, recognises and starts chasing Sam.
|
||||||||||
7222 | CALL $70AA | Is Sam close enough that the policeman has a chance of spotting him? | ||||||||
7225 | CCF | Return with the carry flag set if not | ||||||||
7226 | RET C | |||||||||
7227 | PUSH DE | E and D hold the horizontal and vertical distances between Sam and the policeman; save these briefly | ||||||||
7228 | PUSH HL | Save the policeman's character number briefly | ||||||||
7229 | LD H,$E6 | 0xE6=Sam | ||||||||
722B | CALL $70D6 | Check whether Sam is visible to passers-by | ||||||||
722E | LD B,$06 | Prepare B for the case where Sam is visible to passers-by | ||||||||
7230 | JR Z,$7240 | Jump if Sam is visible to passers-by | ||||||||
7232 | CALL $F436 | Is Sam standing next to a light switch? | ||||||||
7235 | JR Z,$723F | Jump if not | ||||||||
7237 | LD A,(BC) | A=window flags for Sam's location | ||||||||
7238 | AND $20 | Set the zero flag if the light switch for this window is in the 'on' position | ||||||||
723A | LD A,$04 | Prepare A for the case where Sam is standing next to a light switch in the 'on' position | ||||||||
723C | JR Z,$723F | Jump if the light switch for this window is in the 'on' position | ||||||||
723E | 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 | ||||||||
723F | 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.
|
||||||||||
7240 | CALL $7294 | Check whether Sam's disguise is known to the police | ||||||||
7243 | POP HL | Restore the policeman's character number to H | ||||||||
7244 | POP DE | Restore the horizontal and vertical distances between Sam and the policeman to E and D | ||||||||
7245 | LD A,B | A=0, 1, 4, 5, 6 or 7 | ||||||||
7246 | CP $06 | Is Sam visible to passers-by? | ||||||||
7248 | JR NC,$7251 | Jump if so | ||||||||
724A | CALL $70D6 | Is the policeman visible to passers-by? | ||||||||
724D | JR NZ,$7251 | Jump if not | ||||||||
724F | INC B | B=2, 3, 6 or 7 | ||||||||
7250 | INC B | |||||||||
7251 | LD A,B | A=0-7 | ||||||||
7252 | LD L,A | Save this value in L | ||||||||
7253 | ADD A,A | Point BC at an entry in the table at 720A | ||||||||
7254 | ADD A,B | |||||||||
7255 | ADD A,$0A | |||||||||
7257 | LD C,A | |||||||||
7258 | LD B,$72 | |||||||||
725A | LD A,(BC) | Pick up the first byte of the entry | ||||||||
725B | CP D | Compare it with the vertical distance between Sam and the policeman | ||||||||
725C | RET C | Return (with the carry flag set) if the vertical distance is greater | ||||||||
725D | INC C | Pick up the second byte of the entry | ||||||||
725E | LD A,(BC) | |||||||||
725F | CP E | Compare it with the horizontal distance between Sam and the policeman | ||||||||
7260 | RET C | Return (with the carry flag set) if the horizontal distance is greater | ||||||||
7261 | INC C | Pick up the third byte of the entry | ||||||||
7262 | LD A,(BC) | |||||||||
7263 | SUB D | Subtract both the horizontal and vertical distances between Sam and the policeman | ||||||||
7264 | SUB E | |||||||||
7265 | RET C | Return (with the carry flag set) if the result is negative | ||||||||
7266 | BIT 0,L | Bit 0 of L is set if Sam's current disguise (if any) is known to the police | ||||||||
7268 | LD L,$1D | Point HL at byte 0x1D of the policeman's buffer | ||||||||
726A | JR NZ,$728A | 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.
|
||||||||||
726C | LD A,($7FC9) | Collect Sam's current disguise ID (1-7) from 7FC9 | ||||||||
726F | RRCA | Move bits 0-2 into bits 5-7 | ||||||||
7270 | RRCA | |||||||||
7271 | RRCA | |||||||||
7272 | LD C,A | Copy these disguise identifier bits into C | ||||||||
7273 | LD A,(HL) | Pick up byte 0x1D of the policeman's buffer | ||||||||
7274 | AND $1F | Keep only bits 0-4 (the disguise timeout counter) | ||||||||
7276 | JR NZ,$727A | Jump unless they are all 0 | ||||||||
7278 | LD A,$10 | The disguise timeout counter will be initialised to 0x10 | ||||||||
727A | OR C | Copy the disguise identifier bits from C into bits 5-7 of A | ||||||||
727B | LD (HL),A | Copy the disguise identifier bits and the timeout counter into byte 0x1D of the policeman's buffer | ||||||||
727C | INC L | L=0x1E | ||||||||
727D | CALL $6558 | Determine Sam's location | ||||||||
7280 | LD (HL),E | Copy Sam's x-coordinate into byte 0x1E of the policeman's buffer | ||||||||
7281 | INC L | L=0x1F | ||||||||
7282 | AND $03 | A=0 if z (Sam's z-coordinate) is 4, 2 if z is 2, or 1 if z is 1 | ||||||||
7284 | RRCA | A=0x00 if z=4, 0x80 (bit 7 set) if z=2, or 0x40 (bit 6 set) if z=1 | ||||||||
7285 | RRCA | |||||||||
7286 | OR D | Copy Sam's y-coordinate into bits 0-5 of A | ||||||||
7287 | LD (HL),A | Copy this value into byte 0x1F of the policeman's buffer | ||||||||
7288 | SCF | Set the carry flag: the policeman is not chasing Sam | ||||||||
7289 | RET | |||||||||
Sam has been spotted by the policeman, and his current disguise (if any) is known to the police.
|
||||||||||
728A | LD A,(HL) | Collect byte 0x1D of the policeman's buffer | ||||||||
728B | AND A | Is there a disguise ID in bits 5-7? | ||||||||
728C | CALL NZ,$71C6 | If so, make that disguise known to the police (if it isn't already) | ||||||||
728F | CALL $71A0 | Set the policeman's destination to Sam's current location | ||||||||
7292 | AND A | Clear the carry flag to indicate that the policeman is now chasing Sam | ||||||||
7293 | RET |
Prev: 720A | Up: Map |