| Routines

7222: Make a policeman start chasing Sam if appropriate

Used by the routine at 7377. Returns with the carry flag reset if the policeman spots, recognises and starts chasing Sam.
Input
H | 0xDE or 0xDF (policeman)
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 |