Back to Skool Routines
Prev: 25815 Up: Map Next: 25940
25843: Compare character's current coordinates with destination
Used by the routines at 25944 and 62483. Returns with the carry flag set if and only if the character is on a staircase (though this flag is ignored by both callers), and with bits 0-2 of A holding one of the following values:
A Meaning
0 Character is at the destination
1 Character is ascending (or about to ascend) a staircase
2 Character is descending (or about to descend) a staircase
3 Character must go left to reach destination
4 Character must go right to reach destination
In addition, bit 3 of A will be set if the character is facing a closed door, and C will hold the identifier of the closed door (see 28736).
DE Destination coordinates
H Character number
25843 PUSH DE Save the destination coordinates temporarily
25844 CALL 28242 Is the character on a staircase?
25847 JR NC,25860 Jump if not
The character is on a staircase. At this point, A=0 if the staircase goes up and to the left, 128 (bit 7 set) if it goes up and to the right.
25849 LD L,0 Point HL at byte 0 of the character's buffer
25851 XOR (HL) Compare the staircase's direction with the character's
25852 RLCA Set the carry flag if the character is descending the staircase
25853 LD A,1 A=1 if the character is ascending the staircase, 2 if descending
25855 ADC A,0
25857 POP DE Restore the destination coordinates to DE
25858 SCF Signal: character is on a staircase
25859 RET
The character is not on a staircase.
25860 CALL 25554 Get the region identifier for the character's current location
25863 LD L,A Copy this to L
25864 POP DE Restore the destination coordinates to DE
25865 CALL 25554 Get the region identifier for the destination coordinates
25868 CP L Compare current and destination regions
25869 LD D,L D=region ID for the character's current location
25870 LD L,1 Point HL at byte 1 of the character's buffer
25872 JR NZ,25909 Jump if the character is not in the same region as his destination
25874 LD A,E A=destination x-coordinate
25875 SUB (HL) Is the character already at his destination?
25876 RET Z Return if so (with the carry flag reset)
The character is in the same region as his destination, but still has some walking to do. At this point the carry flag is set if the character is to the right of his destination, and reset if he's to the left of it.
25877 SBC A,A A=3 if the character must go left, 4 if right to reach the destination
25878 ADD A,4
25880 PUSH AF Save this value briefly
25881 LD L,0 Point HL at byte 0 of the character's buffer
25883 RRCA Set bit 7 of A if the character is facing the right way to reach his destination
25884 XOR (HL)
25885 RLCA Push bit 7 of A into the carry flag
25886 JR C,25891 Jump if the character is facing the right way to reach his destination
25888 POP AF A=3 (go left) or 4 (go right)
25889 AND A Clear the carry flag (character is not on a staircase)
25890 RET
The character is in the same region as his destination, and is facing the right way to reach it. But are there any doors in the way?
25891 CALL 28767 Check for closed doors in front of the character
25894 JR NC,25888 Jump if there are none
25896 LD A,H A=character number
25897 CP 210 Is this ERIC (in demo mode)?
25899 JR NZ,25905 Jump if not
25901 POP AF A=3 (go left) or 4 (go right)
25902 XOR 7 3 (go left) becomes 4 (go right) and vice versa for ERIC
25904 RET Return with the carry flag reset and C holding the door identifier
25905 POP AF A=3 (go left) or 4 (go right)
25906 ADD A,8 Set bit 3 (A=11, 12): closed door ahead
25908 RET Return with the carry flag reset and C holding the door identifier
The character is not in the same region as his destination. This means at least one visit to a staircase first.
25909 SUB 129 A=identifier for the top or bottom of the staircase (see 25700)
25911 LD E,A
25912 LD A,(DE)
25913 LD D,A A=x-coordinate of the top or bottom of the staircase the character will have to go to first in order to reach his destination
25914 LD E,68
25916 LD A,(DE)
25917 CP (HL) Is the character standing at this staircase already?
25918 JR NZ,25875 Jump if not
The character is at the top or bottom of the first staircase he must negotiate in order to reach his destination. Is he facing the right way to begin his ascent or descent?
25920 INC E Point DE at the staircase direction indicator
25921 DEC L Point HL at byte 0 of the character's buffer
25922 LD A,(DE) A=0 if the character must face left to negotiate the stairs, 128 (bit 7 set) if right
25923 XOR (HL) Set the carry flag if the character is facing the wrong way
25924 RLCA
25925 JR NC,25934 Jump if the character is facing the right way to negotiate the stairs
25927 LD A,(HL) A=character's animatory state
25928 RLCA A=3 if the character's facing right, 4 if facing left
25929 SBC A,A
25930 ADD A,4
25932 AND A Clear the carry flag (character is not on a staircase)
25933 RET
The character is facing the right way to begin his ascent or descent of the staircase.
25934 INC E A=LSB of the routine to make the character ascend (56/25656) or descend (77/25677) the stairs
25935 LD A,(DE)
25936 AND 1 A=1 if the character must ascend the stairs, 2 if he must descend
25938 INC A
25939 RET Return with the carry flag reset
Prev: 25815 Up: Map Next: 25940