Routines
 Prev: 31807 Up: Map Next: 31943
31808: Check whether a character will soon be entering or leaving the hotel
Used by the routine at 60812. 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 (215-230)
31808 CALL 60726 Obtain an identifier for the character's current location
31811 PUSH AF Save the identifier
31812 AND A Is the character on the sidewalk or the road?
31813 JR NZ,31856 Jump if not
The character is on the sidewalk or the road.
31815 LD L,12 Collect the character's destination location identifier from byte 12 of his buffer
31817 LD A,(HL)
31818 AND 240 Keep only the region identifier bits (bits 4-7)
31820 CP 144 Is the character going to the hotel?
31822 JR NZ,31854 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.
31824 LD A,(HL) A=destination location identifier
31825 CP 149 Set the carry flag if the destination is on the first floor or the front steps of the hotel
31827 LD L,10 Point HL at byte 10 of the character's buffer
31829 LD A,(HL) A=x' (the character's destination x-coordinate)
31830 JR C,31834 Jump if the destination is on the first floor or the front steps of the hotel (in which case 75<=x'<=82)
31832 LD A,79 Assume x'=79 (the x-coordinate of the middle of the doorsteps of the hotel)
31834 LD L,1 Add x (the character's current x-coordinate)
31837 SUB 158 Reset the carry flag if 158-x'<=x<=285-x'
31839 RLCA
31840 LD A,88 This is the x-coordinate of the rightmost front doorstep of the hotel
31842 JR NC,31846 Jump if x>=158-x' (the character will enter the hotel from the right)
31844 LD A,67 This is the x-coordinate of the leftmost front doorstep of the hotel
31846 LD BC,65448 Point BC at the first byte of the entry that corresponds to the hotel in the data table of building entrance x-coordinates at 65432
31849 LD (BC),A Set the first byte to 67 or 88
31850 ADD A,2 Set the second byte of the entry to 69 or 90
31852 INC C
31853 LD (BC),A
31854 POP AF Restore the identifier for the character's current location to A
31855 RET
The character is not on the sidewalk or the road.
31856 CP 149 If the character's location identifier is at least 149, then he's not on the first floor or the front steps of the hotel
31858 JR NC,31854 Jump if this is the case
31860 CP 145 Is the character on the front steps of the hotel (below the level of the first floor)?
31862 JR Z,31887 Jump if so
31864 AND 240 Keep only the region identifier bits (bits 4-7)
31866 CP 144 Is the character on the first floor of the hotel?
31868 JR NZ,31854 Jump if not
The character is on the first floor of the hotel.
31870 LD L,10 Point HL at byte 10 of the character's buffer
31872 LD A,(HL) A=x' (character's destination x-coordinate)
31873 LD L,1 Add x (the character's current x-coordinate; 75<=x<=82)
31876 SUB 158 Reset the carry flag if 158-x<=x'<=285-x
31878 RLCA
31879 LD D,76 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)
31881 JR C,31854 Jump if x'<158-x (the character will exit the hotel on the left)
31883 LD D,81 This is the x-coordinate of the right-hand entrance of the hotel
The character is on the front steps of the hotel (below the level of the first floor).
31887 LD L,13 Set the location/destination indicator in byte 13 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)
31889 LD (HL),0
31891 DEC L L=12
31892 LD A,(HL) A=destination location identifier
31893 AND 240 Keep only the region identifier bits (bits 4-7)
31895 CP 144 Is the character going to the hotel?
31897 JR NZ,31854 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.
31899 INC L Set byte 13 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)
31900 INC (HL)
31901 DEC L L=12
31902 LD A,(HL) A=destination location identifier
31903 CP 149 Is the destination on or below the first floor of the hotel?
31905 JR C,31938 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.
31907 LD L,1 Point HL at byte 1 of the character's buffer
31909 LD B,L B=1 (go right)
31910 LD A,(HL) A=x (the character's x-coordinate)
31911 CP 79 Set the carry flag if x<79
31913 LD A,76 This is the x-coordinate of the left edge of the front door of the hotel
31915 JR C,31919 Jump if x<79
31917 LD A,82 This is the x-coordinate of the right edge of the front door of the hotel
31919 CP (HL) Compare A (76 or 82) with x (the character's x-coordinate)
31920 DEC HL Point HL at byte 0 of the character's buffer
31921 JR C,31931 Jump if x is 77 or 78, or greater than 82 (meaning the character should go left to reach the hotel entrance)
31923 BIT 7,(HL) Is the character facing right?
31925 JR NZ,31854 Jump if so
31927 POP AF Restore the identifier for the character's current location to A (though it is ignored)
31928 LD A,B A=1 (go right) or 2 (go left)
31929 POP BC Drop the return address from the stack