| Routines

F748: Make a character walk up and down until somebody knocks on a door

Used by the command lists at FCFC, FE23, FE58, FE77 and FE96. Makes the character start walking up or down towards his next walkabout destination, unless the character is on door duty and someone has knocked on the door (in which case this primary command terminates).
Input
H | Character number (0xD7-0xE5)
F748 | LD L,$0B | Copy the door identifier (0xA8, 0xAC, 0xAD or 0xB3) and walkabout duration indicator (0x00 or 0xFF) from the command list into bytes 0x0B and 0x0C of the character's buffer
F74A | CALL $F171
This entry point is used by the routine at F820.
F74D | CALL $F17F | Get a random number between 32 and 63 in A
F750 | AND $1F
F752 | ADD A,$20
F754 | LD L,$0D | Store this number in byte 0x0D of the character's buffer; it is the number of mini-walkabouts the character will perform (if the walkabout duration indicator in byte 0x0C is 0xFF)
F756 | LD (HL),A
F757 | LD L,$01 | Point HL at byte 0x01 of the character's buffer
F759 | LD A,(HL) | A=character's x-coordinate
F75A | LD L,$0A | Copy this into byte 0x0A of the character's buffer (it will be the walkabout origin)
F75C | LD (HL),A
F75D | CALL $F7B1 | Change the character's primary command routine address to F760 (below)
F760 | LD BC,$F6E9 | Point BC at the interruptible subcommand routine address at F6E9
This entry point is used by the routine at 7A6A with BC=7A57.
F763 | LD L,$0B | Collect the door identifier (0xA8, 0xAC, 0xAD, 0xAF or 0xB3) from byte 0x0B of the character's buffer
F765 | LD E,(HL)
F766 | LD D,$7F | Point HL at 7FA8 (always 0) or the door knock status flags for the door in question (see 7FAA)
F768 | EX DE,HL
F769 | BIT 7,(HL) | Has somebody knocked at the door?
F76B | JR Z,$F775 | Jump if not
F76D | LD A,$C0 | Reset bit 7 and set bit 6 of the door knock status flags to indicate that someone is going to answer the door
F76F | XOR (HL)
F770 | LD (HL),A
F771 | EX DE,HL | Restore the character number to H
F772 | JP $F280 | Move to the next command in the command list (which will send the character to the door)
Either nobody has knocked on the door, or the character is not on door duty.
F775 | EX DE,HL | Restore the character number to H
F776 | LD L,$0C | Collect the walkabout duration indicator (0x00 or 0xFF) from byte 0x0C of the character's buffer
F778 | LD A,(HL)
F779 | INC L | L=0x0D
F77A | ADD A,(HL) | Decrement the walkabout counter in byte 0x0D of the character's buffer, or leave it unchanged
F77B | LD (HL),A
F77C | LD L,$0A | Point HL at byte 0x0A of the character's buffer
F77E | JR NZ,$F78D | Jump unless the walkabout counter is now 0
The character has finished walking up and down. If the character is not on door duty, we move to the next command in the command list; if the character is on door duty, we move six bytes ahead in the command list (past the door-opening commands).
F780 | INC L | Collect the door identifier (0xA8, 0xAC, 0xAD, 0xAF or 0xB3) from byte 0x0B of the character's buffer
F781 | LD A,(HL)
F782 | ADD A,$57 | Set the carry flag if it's > 0xA8 (meaning the character was on door duty)
F784 | SBC A,A | A=6 if the character was on door duty, 0 otherwise
F785 | AND $06
F787 | LD L,$16 | Add 0 or 6 to the character's command list offset (in byte 0x16 of his buffer)
F789 | ADD A,(HL)
F78A | LD (HL),A
F78B | JR $F772 | Terminate this primary command
It's time to set another walkabout destination for this character.
F78D | CALL $F17F | Get a random number in A
F790 | OR $F9 | A=-6, -4, -2 or 0
F792 | INC A
F793 | ADD A,(HL) | Add the walkabout origin x-coordinate
F794 | LD L,$10 | Store this x-coordinate in byte 0x10 of the character's buffer
F796 | LD (HL),A
F797 | JP $F7AB | Copy the interruptible subcommand routine address (7A57 or F6E9) from BC into bytes 0x0E and 0x0F of the character's buffer, and then jump to it