Prev: 720A Up: Map Next: 7294
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
Prev: 720A Up: Map Next: 7294