| Routines

31713: 'C' pressed - use hook

The address of this routine is found in the table of keypress handling routines at 60672. It is called from the main loop at 61483 when 'C' is pressed.
31713 | LD A,(32745) | Collect the object inventory flags from 32745
31716 | BIT 6,A | Has Sam got the hook?
31718 | RET Z | Return if not
31719 | LD A,(58884) | A=Sam's z-coordinate
31722 | LD HL,(58881) | Collect Sam's x- and y-coordinates in L and H
31725 | RRCA | Is Sam's z-coordinate 1 (indoors)?
31726 | JR NC,31755 | Jump if not
31728 | LD A,L | A=x (Sam's x-coordinate)
31729 | CP 222 | Is Sam in no. 17 or no. 15 (x>=222)?
31731 | RET NC | Return if so
31732 | CP 207 | Is Sam in no. 19 (207<=x<222)?
31734 | JR NC,31751 | Jump if so
31736 | CP 122 | Is Sam in the police station, no. 27, or the apartments next to no. 19 (122<=x<207)?
31738 | JR NC,31747 | Jump if so
31740 | CP 103 | Is Sam in no. 31 (103<=x<122)?
31742 | JR NC,31751 | Jump if so
31744 | CP 25 | Is Sam in no. 74 or the hotel (25<=x<103)?
31746 | RET NC | Return if so
31747 | LD A,7 | 7 is the y-coordinate of the roof of the police station, no. 27, and the apartment building next to no. 19
31749 | JR 31753 |
31751 | LD A,13 | 13 is the y-coordinate of the roofs of no. 19 and no. 31
31753 | CP H | Is Sam on the roof of a building?
31754 | RET C | Return if not
Sam is in a location that is amenable to hook-throwing.
31755 | INC H | H=1+Sam's y-coordinate
31756 | LD A,(58880) | A=Sam's animatory state
31759 | AND 128 | Keep only the direction bit (bit 7)
31761 | JR Z,31764 | Jump if Sam is facing left
31763 | INC L | L=1+Sam's x-coordinate
31764 | ADD A,121 | A=121/249 (hook)
31766 | EX DE,HL | DE=hook's initial coordinates
31767 | LD HL,58643 | Point HL at byte 19 of character buffer 229
31770 | INC (HL) | Is the current owner of character buffer 229 (the hook or a banknote) under the control of an uninterruptible subcommand routine?
31771 | DEC (HL)
31772 | RET NZ | Return if so (the hook must currently be in flight, which is unlikely)
The hook will be thrown. Prepare it for launch now.
31773 | INC L | Initialise the distance remaining for the hook to fly (stored in byte 20 of the hook's buffer)
31774 | LD (HL),20
31776 | DEC L | Place the address of the uninterruptible subcommand routine at 31670 into bytes 18 and 19 of the hook's buffer
31777 | LD (HL),123
31779 | DEC L
31780 | LD (HL),182
31782 | LD L,4 | Set the hook's z-coordinate to 4
31784 | LD (HL),L
31785 | DEC L | Set bit 7 of byte 3 of the hook's buffer, thus making the hook fly as fast as possible
31786 | LD (HL),128
31788 | DEC L | Initialise the hook's x- and y-coordinates
31789 | LD (HL),D
31790 | DEC L
31791 | LD (HL),E
31792 | DEC L | Initialise the hook's animatory state
31793 | LD (HL),A
31794 | CALL 59861 | Update the hook's animatory state and location and update the SRB
31797 | LD HL,32745 | The object inventory flags are stored at 32745
31800 | RES 6,(HL) | Clear bit 6, thus removing the hook from Sam's possession
31802 | LD H,230 | 230=Sam
31804 | JP 62212 | Raise Sam's arm and make a sound effect