Routines |
Prev: 64D7 | Up: Map | Next: 6554 |
Used by the routines at 6558 and F413. Returns with one of the following values in bits 0-2 of A depending on the relative locations of the follower and his target:
In addition, bit 3 of A will be set if the follower is facing a closed door, and C will hold the identifier of the closed door (see 7040).
|
||||||||||||||||||||||
64F3 | PUSH DE | Save the target coordinates temporarily | ||||||||||||||||||||
64F4 | CALL $6E52 | Is the follower on a staircase? | ||||||||||||||||||||
64F7 | JR NC,$6504 | Jump if not | ||||||||||||||||||||
The follower is on a staircase. At this point, A=0x00 if the staircase goes up and to the left, 0x80 (bit 7 set) if it goes up and to the right.
|
||||||||||||||||||||||
64F9 | LD L,$00 | Point HL at byte 0x00 of the character's buffer | ||||||||||||||||||||
64FB | XOR (HL) | Compare the staircase's direction with the follower's | ||||||||||||||||||||
64FC | RLCA | Set the carry flag if the character is descending the staircase | ||||||||||||||||||||
64FD | LD A,$01 | A=1 if the follower is ascending the staircase, 2 if descending | ||||||||||||||||||||
64FF | ADC A,$00 | |||||||||||||||||||||
6501 | POP DE | Restore the target coordinates to DE | ||||||||||||||||||||
6502 | SCF | Signal: follower is on a staircase (this is ignored by both callers) | ||||||||||||||||||||
6503 | RET | |||||||||||||||||||||
The follower is not on a staircase.
|
||||||||||||||||||||||
6504 | CALL $63D2 | Get the region identifier for the follower's current location | ||||||||||||||||||||
6507 | LD L,A | Copy this to L | ||||||||||||||||||||
6508 | POP DE | Restore the target coordinates to DE | ||||||||||||||||||||
6509 | CALL $63D2 | Get the region identifier for the target coordinates | ||||||||||||||||||||
650C | CP L | Compare the current and target regions | ||||||||||||||||||||
650D | LD D,L | D=region ID for the follower's current location | ||||||||||||||||||||
650E | LD L,$01 | Point HL at byte 0x01 of the follower's buffer | ||||||||||||||||||||
6510 | JR NZ,$6535 | Jump if the follower is not in the same region as his target | ||||||||||||||||||||
6512 | LD A,E | A=target x-coordinate | ||||||||||||||||||||
6513 | SUB (HL) | Is the follower in exactly the same location as his target? | ||||||||||||||||||||
6514 | RET Z | Return if so (with the carry flag reset) | ||||||||||||||||||||
The follower is in the same region as his target, but still has some walking to do. At this point the carry flag is set if the follower is to the right of his target, and reset if he's to the left.
|
||||||||||||||||||||||
6515 | SBC A,A | A=3 if the follower must go left, 4 if right to reach the target | ||||||||||||||||||||
6516 | ADD A,$04 | |||||||||||||||||||||
6518 | PUSH AF | Save this value briefly | ||||||||||||||||||||
6519 | LD L,$00 | Point HL at byte 0x00 of the follower's buffer | ||||||||||||||||||||
651B | RRCA | Set bit 7 of A if the follower is facing the right way to reach his target | ||||||||||||||||||||
651C | XOR (HL) | |||||||||||||||||||||
651D | RLCA | Push bit 7 of A into the carry flag | ||||||||||||||||||||
651E | JR C,$6523 | Jump if the follower is facing the right way to reach his target | ||||||||||||||||||||
6520 | POP AF | A=3 (go left) or 4 (go right) | ||||||||||||||||||||
6521 | AND A | Clear the carry flag (the follower is not on a staircase) | ||||||||||||||||||||
6522 | RET | |||||||||||||||||||||
The follower is in the same region as his target, and is facing the right way to reach him. But are there any doors in the way?
|
||||||||||||||||||||||
6523 | CALL $705F | Check for closed doors in front of the follower | ||||||||||||||||||||
6526 | JR NC,$6520 | Jump if there are none | ||||||||||||||||||||
6528 | LD A,H | A=follower's character number | ||||||||||||||||||||
6529 | CP $D2 | Is this ERIC (in demo mode)? | ||||||||||||||||||||
652B | JR NZ,$6531 | Jump if not | ||||||||||||||||||||
652D | POP AF | A=3 (go left) or 4 (go right) | ||||||||||||||||||||
652E | XOR $07 | 3 (go left) becomes 4 (go right) and vice versa for ERIC | ||||||||||||||||||||
6530 | RET | Return with the carry flag reset and C holding the door identifier | ||||||||||||||||||||
6531 | POP AF | A=3 (go left) or 4 (go right) | ||||||||||||||||||||
6532 | ADD A,$08 | Set bit 3 (A=0x0B, 0x0C): closed door ahead | ||||||||||||||||||||
6534 | RET | Return with the carry flag reset and C holding the door identifier | ||||||||||||||||||||
The follower is not in the same region as his target. This means at least one visit to a staircase first.
|
||||||||||||||||||||||
6535 | SUB $81 | A=identifier of the top or bottom of the staircase (see 6464) | ||||||||||||||||||||
6537 | LD E,A | |||||||||||||||||||||
6538 | LD A,(DE) | |||||||||||||||||||||
6539 | LD D,A | A=x-coordinate of the top or bottom of the staircase the follower will have to go to first in order to reach his target | ||||||||||||||||||||
653A | LD E,$44 | |||||||||||||||||||||
653C | LD A,(DE) | |||||||||||||||||||||
653D | CP (HL) | Is the follower standing at this staircase already? | ||||||||||||||||||||
653E | JR NZ,$6513 | Jump if not | ||||||||||||||||||||
The follower is at the top or bottom of the first staircase he must negotiate in order to reach his target. Is he facing the right way to begin his ascent or descent?
|
||||||||||||||||||||||
6540 | INC E | Point DE at the staircase direction indicator | ||||||||||||||||||||
6541 | DEC L | Point HL at byte 0x00 of the character's buffer | ||||||||||||||||||||
6542 | LD A,(DE) | A=0x00 if the follower must face left to negotiate the stairs, 0x80 (bit 7 set) if right | ||||||||||||||||||||
6543 | XOR (HL) | Set the carry flag if the follower is facing the wrong way | ||||||||||||||||||||
6544 | RLCA | |||||||||||||||||||||
6545 | JR NC,$654E | Jump if the follower is facing the right way to negotiate the stairs | ||||||||||||||||||||
6547 | LD A,(HL) | A=follower's animatory state | ||||||||||||||||||||
6548 | RLCA | A=3 if the follower's facing right, 4 if facing left | ||||||||||||||||||||
6549 | SBC A,A | |||||||||||||||||||||
654A | ADD A,$04 | |||||||||||||||||||||
654C | AND A | Clear the carry flag (the follower is not on a staircase) | ||||||||||||||||||||
654D | RET | |||||||||||||||||||||
The follower is facing the right way to begin his ascent or descent of the staircase.
|
||||||||||||||||||||||
654E | INC E | A=LSB of the routine to make the follower ascend (0x38/6438) or descend (0x4D/644D) the stairs | ||||||||||||||||||||
654F | LD A,(DE) | |||||||||||||||||||||
6550 | AND $01 | A=1 if the follower must ascend the stairs, 2 if he must descend | ||||||||||||||||||||
6552 | INC A | |||||||||||||||||||||
6553 | RET | Return with the carry flag reset |
Prev: 64D7 | Up: Map | Next: 6554 |