| Routines

28942: Check whether a character is close enough to Sam to pick him up

Used by the routines at 25074 and 29361. Returns with the carry flag set if the character is facing Sam and close enough to him to pick him up, and Sam is not already being carried.
Input
H | Character number (215-229)
28942 | LD A,(32764) | Collect Sam's status flags from 32764
28945 | DEC A | Now A=0 if Sam's being carried at the moment
28946 | AND A | Clear the carry flag, and set the zero flag if Sam's being carried
28947 | RET Z | Return with the carry flag reset if Sam's being carried
Sam is not being carried at the moment. Compare his x- and y-coordinates with those of the character chasing him.
28948 | LD L,2 | Point HL at byte 2 of the character's buffer
28950 | CALL 25944 | Collect Sam's x- and y-coordinates in E and D
28953 | NOP |
28954 | LD A,(HL) | A=character's y-coordinate
28955 | INC A | Is the character more than one y-coordinate above or below Sam?
28956 | SUB D
28957 | CP 3
28959 | RET NC | Return if so
28960 | DEC L | L=1
28961 | LD A,(HL) | A=character's x-coordinate
28962 | DEC L | L=0
28963 | BIT 7,(HL) | Is the character facing left?
28965 | JR Z,28969 | Jump if so
28967 | ADD A,2 | A=2+character's x-coordinate
28969 | SUB E | Is the character facing Sam and no more than two x-coordinates away from him?
28970 | CP 3
28972 | RET NC | Return if not
The character is facing Sam, no more than one y-coordinate above or below him, and no more than two x-coordinates to the left or right of him. Now we compare the z-coordinates.
28973 | LD A,(58884) | A=Sam's z-coordinate
28976 | LD L,4 | Set the zero flag if the character's z-coordinate matches Sam's
28978 | CP (HL)
28979 | SCF | Return with the carry flag set if the character can pick up Sam at his current location
28980 | RET Z
The z-coordinates don't match. However, the character will still be able to pick up Sam if they are both standing at or near the open entrance to a building (one inside and the other outside).
28981 | PUSH HL | Save the character number briefly
28982 | LD H,230 | 230=Sam
28984 | CALL 60179 | Obtain descriptors for Sam's current location
28987 | POP HL | Restore the character number to H
28988 | CP 3 | Is Sam standing at the open entrance to a building?
28990 | JR Z,28979 | Jump if so (Sam can be picked up here)
28992 | PUSH HL | Save the character number briefly
28993 | CALL 60179 | Obtain descriptors for the character's current location
28996 | POP HL | Restore the character number to H
28997 | CP 3 | Is the character standing at the open entrance to a building?
28999 | JR Z,28979 | Jump if so (the character can pick Sam up here)
29001 | AND A | Clear the carry flag (Sam cannot be picked up)
29002 | RET |