Prev: 7C3F Up: Map Next: 7CC7
7C40: Check whether a character will soon be entering or leaving the hotel
Used by the routine at ED8C. Checks whether a character will soon be entering or leaving the hotel, and if so, determines where he should start climbing the front steps (depending on his current location), or through which door he should leave (left or right, depending on his destination).
Input
H Character number (0xD7-0xE6)
7C40 CALL $ED36 Obtain an identifier for the character's current location
7C43 PUSH AF Save the identifier
7C44 AND A Is the character on the sidewalk or the road?
7C45 JR NZ,$7C70 Jump if not
The character is on the sidewalk or the road.
7C47 LD L,$0C Collect the character's destination location identifier from byte 0x0C of his buffer
7C49 LD A,(HL)
7C4A AND $F0 Keep only the region identifier bits (bits 4-7)
7C4C CP $90 Is the character going to the hotel?
7C4E JR NZ,$7C6E Jump if not
The character is on the sidewalk or road, and destined for somewhere inside or outside the hotel. Figure out which entrance (left or right) the character should use, based on his current location and his destination.
7C50 LD A,(HL) A=destination location identifier
7C51 CP $95 Set the carry flag if the destination is on the first floor or the front steps of the hotel
7C53 LD L,$0A Point HL at byte 0x0A of the character's buffer
7C55 LD A,(HL) A=x' (the character's destination x-coordinate)
7C56 JR C,$7C5A Jump if the destination is on the first floor or the front steps of the hotel (in which case 75<=x'<=82)
7C58 LD A,$4F Assume x'=79 (the x-coordinate of the middle of the doorsteps of the hotel)
7C5A LD L,$01 Add x (the character's current x-coordinate)
7C5C ADD A,(HL)
7C5D SUB $9E Reset the carry flag if 158-x'<=x<=285-x'
7C5F RLCA
7C60 LD A,$58 This is the x-coordinate of the rightmost front doorstep of the hotel
7C62 JR NC,$7C66 Jump if x>=158-x' (the character will enter the hotel from the right)
7C64 LD A,$43 This is the x-coordinate of the leftmost front doorstep of the hotel
7C66 LD BC,$FFA8 Point BC at the first byte of the entry that corresponds to the hotel in the data table of building entrance x-coordinates at FF98
7C69 LD (BC),A Set the first byte to 0x43 or 0x58
7C6A ADD A,$02 Set the second byte of the entry to 0x45 or 0x5A
7C6C INC C
7C6D LD (BC),A
7C6E POP AF Restore the identifier for the character's current location to A
7C6F RET
The character is not on the sidewalk or the road.
7C70 CP $95 If the character's location identifier is at least 0x95, then he's not on the first floor or the front steps of the hotel
7C72 JR NC,$7C6E Jump if this is the case
7C74 CP $91 Is the character on the front steps of the hotel (below the level of the first floor)?
7C76 JR Z,$7C8F Jump if so
7C78 AND $F0 Keep only the region identifier bits (bits 4-7)
7C7A CP $90 Is the character on the first floor of the hotel?
7C7C JR NZ,$7C6E Jump if not
The character is on the first floor of the hotel.
7C7E LD L,$0A Point HL at byte 0x0A of the character's buffer
7C80 LD A,(HL) A=x' (character's destination x-coordinate)
7C81 LD L,$01 Add x (the character's current x-coordinate; 75<=x<=82)
7C83 ADD A,(HL)
7C84 SUB $9E Reset the carry flag if 158-x<=x'<=285-x
7C86 RLCA
7C87 LD D,$4C Set D (which holds the x-coordinate of the top of the steps going down to the sidewalk below) to 76 (x-coordinate of the left-hand entrance of the hotel)
7C89 JR C,$7C6E Jump if x'<158-x (the character will exit the hotel on the left)
7C8B LD D,$51 This is the x-coordinate of the right-hand entrance of the hotel
7C8D JR $7C6E Return to the caller with D adjusted depending on the character's destination x-coordinate
The character is on the front steps of the hotel (below the level of the first floor).
7C8F LD L,$0D Set the location/destination indicator in byte 0x0D of the character's buffer to 0 (the front steps of the hotel count as part of the sidewalk if the character is going somewhere other than the hotel)
7C91 LD (HL),$00
7C93 DEC L L=0x0C
7C94 LD A,(HL) A=destination location identifier
7C95 AND $F0 Keep only the region identifier bits (bits 4-7)
7C97 CP $90 Is the character going to the hotel?
7C99 JR NZ,$7C6E Jump if not
The character is on the front steps of the hotel (below the level of the first floor), and his destination is somewhere inside or outside the hotel.
7C9B INC L Set byte 0x0D of the character's buffer to 1 (indicating that the character is not on the sidewalk or the road, and is in the same region as his destination)
7C9C INC (HL)
7C9D DEC L L=0x0C
7C9E LD A,(HL) A=destination location identifier
7C9F CP $95 Is the destination on or below the first floor of the hotel?
7CA1 JR C,$7CC2 Jump if so
The character is on the front steps of the hotel (below the level of the first floor), and his destination is somewhere inside the hotel, above the first floor.
7CA3 LD L,$01 Point HL at byte 0x01 of the character's buffer
7CA5 LD B,L B=1 (go right)
7CA6 LD A,(HL) A=x (the character's x-coordinate)
7CA7 CP $4F Set the carry flag if x<79
7CA9 LD A,$4C This is the x-coordinate of the left edge of the front door of the hotel
7CAB JR C,$7CAF Jump if x<79
7CAD LD A,$52 This is the x-coordinate of the right edge of the front door of the hotel
7CAF CP (HL) Compare A (76 or 82) with x (the character's x-coordinate)
7CB0 DEC HL Point HL at byte 0x00 of the character's buffer
7CB1 JR C,$7CBB Jump if x is 77 or 78, or greater than 82 (meaning the character should go left to reach the hotel entrance)
7CB3 BIT 7,(HL) Is the character facing right?
7CB5 JR NZ,$7C6E Jump if so
7CB7 POP AF Restore the identifier for the character's current location to A (though it is ignored)
7CB8 LD A,B A=1 (go right) or 2 (go left)
7CB9 POP BC Drop the return address from the stack
7CBA RET Return to the caller of ED8C
7CBB BIT 7,(HL) Is the character facing left?
7CBD JR Z,$7C6E Jump if so
7CBF INC B B=2 (go left)
7CC0 JR $7CB8
The character is on the front steps of the hotel (below the level of the first floor), and his destination is on or below the first floor of the hotel.
7CC2 POP AF Restore the identifier for the character's current location to A (though it is ignored)
7CC3 POP BC Drop the return address from the stack
7CC4 JP $ED9B Re-enter the calling routine at ED9B
Prev: 7C3F Up: Map Next: 7CC7