Prev: 7AD7 Up: Map Next: 7B95
7ADC: Determine the next move of a character following another character
Used by the routines at 7BA0, F5DA and F78E. Returns with one of the following values in A depending on the relative locations of the follower and his target:
A Meaning
0 Follower is at the same coordinates as the target
1 Follower should go (or continue going) upstairs
2 Follower should go (or continue going) downstairs
3 Follower should go left
4 Follower should go right
Input
DE Target character's coordinates
H Follower's character number (0x98-0xAC)
7ADC LD L,$61 Byte 0x61 of the follower's buffer holds his y-coordinate
7ADE LD A,(HL) Pick this up in A
7ADF CP $9B Is the follower on the top floor?
7AE1 JR Z,$7AF8 Jump if so
7AE3 CP $A2 Is the follower on the middle floor?
7AE5 JR Z,$7AF8 Jump if so
7AE7 CP $A9 Is the follower on the bottom floor?
7AE9 JR Z,$7AF8 Jump if so
The follower is on a staircase. Find out whether he's going up or down and set A accordingly to make him continue.
7AEB LD L,$62 Byte 0x62 of the follower's buffer holds his x-coordinate
7AED LD A,(HL) Pick this up in A
7AEE LD L,$60 Byte 0x60 holds the follower's animatory state
7AF0 ADD A,$50 Set bit 7 of A if the follower is on a staircase at the right of the skool
7AF2 XOR (HL) A=1 if the follower is going upstairs, 2 if he's going downstairs
7AF3 AND $80
7AF5 RLCA
7AF6 INC A
7AF7 RET
The follower is not on a staircase. Which way should he go?
7AF8 CP D Is the follower on the same floor as the target?
7AF9 JR NZ,$7B3D Jump if not
The follower is on the same floor as the target. However, there may be a wall between them.
7AFB INC L Pick up the follower's x-coordinate in A
7AFC LD A,(HL)
7AFD SUB E Is the follower in the same spot as his target?
7AFE RET Z Return if so
7AFF DEC L Pick up the follower's y-coordinate in A
7B00 LD A,(HL)
7B01 CP $A9 Is the follower on the bottom floor?
7B03 JR NZ,$7B0D Jump if not
The follower and target are both on the bottom floor, so the follower should simply move either left or right.
7B05 INC HL L=0x62
7B06 LD A,(HL) A=follower's x-coordinate
7B07 CP E Set the carry flag if the follower should go right
7B08 LD A,$03 A=3 if the follower should go left, 4 if he should go right
7B0A ADC A,$00
7B0C RET
The follower and target are both on the middle floor or both on the top floor.
7B0D CP $A2 Set the zero flag if the follower and target are on the middle floor
7B0F INC HL L=0x62
7B10 LD A,$39 This is the x-coordinate of the wall between the Reading and Map Rooms
7B12 JR NZ,$7B16 Jump if the follower and target are on the top floor
7B14 LD A,$26 This is the x-coordinate of the wall between the White and Exam Rooms
7B16 CP (HL) Compare the follower's x-coordinate with that of the wall
7B17 JR C,$7B2B Jump if the follower is to the right of the wall
7B19 CP E Is the target character to the left of the wall?
7B1A JR NC,$7B06 Jump if so
The follower is on the left side of the skool and must go downstairs to get to the target on the other side of the skool.
7B1C LD A,(HL) A=follower's x-coordinate
7B1D CP $0C This is the x-coordinate of the tops of the staircases at the left of the skool
7B1F JR NZ,$7B08 Jump unless the follower is at the top of a staircase
7B21 LD L,$60 Byte 0x60 of the follower's buffer holds his animatory state
7B23 LD A,$04 A=4 will make the follower turn round if facing left
7B25 BIT 7,(HL) Is the follower facing left?
7B27 RET Z Return if so
7B28 LD A,$02 A=2 will make the follower go down the stairs
7B2A RET
The follower is on the right side of the skool. Is the target there too?
7B2B CP E Is the target character to the right of the wall?
7B2C JR C,$7B06 Jump if so
7B2E LD A,(HL) A=follower's x-coordinate
7B2F CP $4D This is the x-coordinate of the tops of the staircases at the right of the skool
7B31 JR NZ,$7B08 Jump unless the follower is at the top of a staircase
7B33 LD L,$60 Byte 0x60 of the follower's buffer holds his animatory state
7B35 LD A,$03 A=3 will make the follower turn round if facing right
7B37 BIT 7,(HL) Is the follower facing right?
7B39 RET NZ Return if so
7B3A LD A,$02 A=2 will make the follower go down the stairs
7B3C RET
The follower and target are on different floors.
7B3D JR NC,$7B4D Jump if the target is on a floor above the follower
7B3F CP $A2 Set the zero flag if the follower is on the middle floor
7B41 INC HL L=0x62
7B42 LD A,$39 This is the x-coordinate of the wall between the Reading and Map Rooms
7B44 JR NZ,$7B48 Jump if the follower is on the top floor
7B46 LD A,$26 This is the x-coordinate of the wall between the White and Exam Rooms
7B48 CP (HL) Compare the follower's x-coordinate with that of the wall
7B49 JR NC,$7B1C Jump if the follower is to the left of the wall (and so needs to go to the top of a staircase on the left)
7B4B JR C,$7B2E Jump if the follower is to the right of the wall (and so needs to go to the top of a staircase on the right)
The target is on a floor above the follower. Which staircase should the follower use?
7B4D LD A,D A=target's y-coordinate
7B4E LD D,$9B This is the y-coordinate of the top floor
7B50 CP $A2 This is the y-coordinate of the middle floor
7B52 LD A,$39 This is the x-coordinate of the wall between the Reading and Map Rooms
7B54 JR C,$7B5A Jump if the target is above the middle floor
7B56 LD D,$A2 This is the y-coordinate of the middle floor
7B58 LD A,$26 This is the x-coordinate of the wall between the White and Exam Rooms
7B5A CP E Compare the target's x-coordinate with that of the wall
7B5B LD E,$61 Signal: target is to the right of the wall
7B5D JR C,$7B61 Jump if the target is to the right of the wall
7B5F LD E,$01 Signal: target is to the left of the wall
7B61 LD A,(HL) A=follower's y-coordinate
7B62 CP $A9 Set the zero flag if the follower is on the bottom floor
7B64 INC HL L=0x62
7B65 JR NZ,$7B86 Jump if the follower is on the middle floor
7B67 LD A,$13 This is the x-coordinate of the bottoms of the staircases at the left of the skool
7B69 DEC E Is the target to the left of the wall?
7B6A JR Z,$7B6E Jump if so
7B6C LD A,$46 This is the x-coordinate of the bottoms of the staircases at the right of the skool
7B6E CP (HL) Compare this with the follower's x-coordinate
7B6F CCF Set the carry flag if the follower should go right
7B70 JR NZ,$7B08 Jump if the follower is not at the bottom of a staircase
7B72 LD L,$60 Byte 0x60 of the follower's buffer holds his animatory state
7B74 CP $13 This is the x-coordinate of the bottoms of the staircases at the left of the skool
7B76 LD A,$01 A=1 will make the follower go upstairs
7B78 JR Z,$7B80 Jump if the follower should go up a staircase at the left of the skool
7B7A BIT 7,(HL) Is the follower facing right?
7B7C RET NZ Jump if so
7B7D LD A,$04 A=3 will make the follower turn round and face right
7B7F RET
7B80 BIT 7,(HL) Is the follower facing left?
7B82 RET Z Return (with A=1) if so
7B83 LD A,$03 A=3 will make the follower turn round and face left
7B85 RET
The follower is on the middle floor, and the target is on the top floor.
7B86 LD A,$26 This is the x-coordinate of the wall between the White and Exam Rooms
7B88 CP (HL) Compare this with the follower's x-coordinate
7B89 LD A,$61 Signal: follower is to the right of the wall
7B8B JR C,$7B8F Jump if the follower is to the right of the wall
7B8D LD A,$01 Signal: follower is to the left of the wall
7B8F CP E Is the target on the same side of the skool?
7B90 JR Z,$7B67 Jump if so (follower must go up the nearest staircase)
7B92 CCF Set the carry flag if the follower must go down a staircase at the right of the skool, and reset it if he must go down a staircase at the left of the skool
7B93 JR $7B49
Prev: 7AD7 Up: Map Next: 7B95