![]() |
Routines |
Prev: 25399 | Up: Map |
Used by the routine at 25399.
|
||||||||
25562 | LD A,(28094) | Pick up the guard's return delay counter. | ||||||
25565 | AND A | Has this guard been thrown out of the park? | ||||||
25566 | RET NZ | Return if so. | ||||||
25567 | LD HL,(31851) | Pick up Horace's current location. | ||||||
25570 | RR H | Now H=0, 1 or 2, indicating which third of the screen the top row of Horace's sprite is in. | ||||||
25572 | RR H | |||||||
25574 | RR H | |||||||
25576 | LD B,5 | Move bits 5-7 of L down to bits 0-2, and bits 0-2 of H into bits 3-5 of L. | ||||||
25578 | RR H | |||||||
25580 | RR L | |||||||
25582 | DJNZ 25578 | |||||||
25584 | LD A,L | Now A=Horace's screen y-coordinate (0-22). | ||||||
25585 | AND 31 | |||||||
25587 | LD HL,(31851) | Pick up Horace's current location. | ||||||
25590 | LD H,A | H=Horace's screen y-coordinate (0-22). | ||||||
25591 | LD A,L | Now L=Horace's screen x-coordinate (0-30). | ||||||
25592 | AND 31 | |||||||
25594 | LD L,A | |||||||
25595 | LD (31866),HL | Save Horace's screen x- and y-coordinates temporarily. | ||||||
25598 | LD HL,(28088) | Compute the guard's screen x- and y-coordinates. | ||||||
25601 | RR H | |||||||
25603 | RR H | |||||||
25605 | RR H | |||||||
25607 | LD B,5 | |||||||
25609 | RR H | |||||||
25611 | RR L | |||||||
25613 | DJNZ 25609 | |||||||
25615 | LD A,L | |||||||
25616 | AND 31 | |||||||
25618 | LD HL,(28088) | |||||||
25621 | LD H,A | |||||||
25622 | LD A,L | |||||||
25623 | AND 31 | |||||||
25625 | LD L,A | |||||||
25626 | LD (28080),HL | Save the guard's screen x- and y-coordinates temporarily. | ||||||
25629 | LD B,4 | Initialise B (the direction indicator) for the loop that follows. | ||||||
Four passes are made through the following loop, one for each direction the guard might go: left, down, right, or up.
|
||||||||
25631 | DEC B | B=3 (left), 2 (down), 1 (right) or 0 (up). | ||||||
25632 | LD HL,(28088) | Pick up the guard's current location. | ||||||
25635 | LD C,0 | Initialise C to 0; this is the direction probability parameter. | ||||||
25637 | PUSH BC | Save the direction indicator briefly. | ||||||
25638 | LD A,B | Copy the direction indicator to A. | ||||||
25639 | CALL 27842 | Check the tiles next to the guard in that direction. | ||||||
25642 | POP BC | Restore the direction indicator to B. | ||||||
25643 | CP 2 | Is there a wall or the maze exit or entrance in that direction? | ||||||
25645 | JP NC,25795 | Jump if so with C=0: that direction is blocked. | ||||||
25648 | LD C,25 | C=25; this value determines the base probability that the guard will turn 90 degrees in the direction indicated by B when his path is blocked. | ||||||
25650 | LD A,(28090) | Pick up the guard's animation frame. | ||||||
25653 | CP B | Is it equal to the current value of the direction indicator? | ||||||
25654 | JR NZ,25662 | Jump if not. | ||||||
25656 | LD A,40 | C=65; this value ensures that the guard will keep moving in the same direction if he can. | ||||||
25658 | ADD A,C | |||||||
25659 | LD C,A | |||||||
25660 | JR 25691 | |||||||
25662 | ADD A,2 | Add 2 to the guard's current animation frame; this has the effect of toggling his direction between up/down and left/right. | ||||||
25664 | AND 3 | |||||||
25666 | CP B | Is it equal to the current value of the direction indicator now? | ||||||
25667 | JR NZ,25675 | Jump if not. | ||||||
25669 | LD A,246 | C=15; this value determines the probability that the guard will turn round 180 degrees when his path is blocked. | ||||||
25671 | ADD A,C | |||||||
25672 | LD C,A | |||||||
25673 | JR 25691 | |||||||
25675 | LD HL,(23672) | Increment the two least significant bytes of the system variable FRAMES, and copy the value to HL. | ||||||
25678 | INC HL | |||||||
25679 | LD (23672),HL | |||||||
25682 | LD A,H | Use this value to generate a pseudo-random number between 0 and 31. | ||||||
25683 | AND 15 | |||||||
25685 | LD H,A | |||||||
25686 | LD A,(HL) | |||||||
25687 | AND 31 | |||||||
25689 | ADD A,C | Add this to C, giving a number between 25 and 56; the higher this value, the more likely the guard will turn 90 degrees in the direction indicated by B when his path is blocked. | ||||||
25690 | LD C,A | |||||||
25691 | LD A,B | Copy the direction indicator to A. | ||||||
25692 | CP 3 | Set the zero flag if we're considering 'left' at the moment. | ||||||
25694 | LD A,(31844) | Pick up the value of the redundant variable at 31844. | ||||||
25697 | JR NZ,25703 | Jump if we're considering 'right', 'up' or 'down' at the moment. | ||||||
25699 | DEC A | Decrement the redundant variable at 31844. | ||||||
25700 | LD (31844),A | |||||||
25703 | AND A | This instruction is redundant. | ||||||
25704 | LD A,B | Copy the direction indicator to A. | ||||||
25705 | CP 0 | Are we considering 'up' at the moment? | ||||||
25707 | JR NZ,25715 | Jump if not. | ||||||
25709 | LD A,(31842) | Reset the redundant variable at 31844 to the value of the game speed parameter. | ||||||
25712 | LD (31844),A | |||||||
25715 | LD A,B | Copy the direction indicator to A. | ||||||
25716 | CP 0 | Are we considering 'up' at the moment? | ||||||
25718 | JR NZ,25732 | Jump if not. | ||||||
25720 | LD HL,(28080) | Pick up the guard's screen x- and y-coordinates. | ||||||
25723 | LD A,H | A=guard's screen y-coordinate. | ||||||
25724 | LD HL,(31866) | Pick up Horace's screen x- and y-coordinates. | ||||||
25727 | SUB H | Is Horace's y-coordinate greater than the guard's? | ||||||
25728 | JR C,25795 | Jump if so. | ||||||
25730 | JR 25774 | Otherwise jump to increase the probability that the guard will move up (towards Horace). | ||||||
25732 | CP 1 | Are we considering 'right' at the moment? | ||||||
25734 | JR NZ,25748 | Jump if not. | ||||||
25736 | LD HL,(31866) | Pick up Horace's screen x- and y-coordinates. | ||||||
25739 | LD A,L | A=Horace's screen x-coordinate. | ||||||
25740 | LD HL,(28080) | Pick up the guard's screen x- and y-coordinates. | ||||||
25743 | SUB L | Is the guard's x-coordinate greater than Horace's? | ||||||
25744 | JR C,25795 | Jump if so. | ||||||
25746 | JR 25774 | Otherwise jump to increase the probability that the guard will move right (towards Horace). | ||||||
25748 | CP 2 | Are we considering 'down' at the moment? | ||||||
25750 | JR NZ,25764 | Jump if not. | ||||||
25752 | LD HL,(31866) | Pick up Horace's screen x- and y-coordinates. | ||||||
25755 | LD A,H | A=Horace's screen y-coordinate. | ||||||
25756 | LD HL,(28080) | Pick up the guard's screen x- and y-coordinates. | ||||||
25759 | SUB H | Is the guard's y-coordinate greater than Horace's? | ||||||
25760 | JR C,25795 | Jump if so. | ||||||
25762 | JR 25774 | Otherwise jump to increase the probability that the guard will move down (towards Horace). | ||||||
25764 | LD HL,(28080) | Pick up the guard's screen x- and y-coordinates. | ||||||
25767 | LD A,L | A=guard's screen x-coordinate. | ||||||
25768 | LD HL,(31866) | Pick up Horace's screen x- and y-coordinates. | ||||||
25771 | SUB L | Is Horace's x-coordinate greater than the guard's? | ||||||
25772 | JR C,25795 | Jump if so. | ||||||
25774 | AND A | This instruction is redundant. | ||||||
25775 | ADD A,10 | Add 10 to A; the higher the value A holds now, the more likely the guard will move in the direction indicated by B (towards Horace). | ||||||
25777 | PUSH AF | Save this probability modifier briefly. | ||||||
25778 | PUSH HL | Save HL (unnecessarily). | ||||||
25779 | LD HL,(28078) | Pick up the guard panic timer. | ||||||
25782 | LD A,H | Set the zero flag unless the guards are panicking. | ||||||
25783 | OR L | |||||||
25784 | POP HL | Restore HL. | ||||||
25785 | JR Z,25792 | Jump unless the guards are panicking. | ||||||
25787 | POP AF | Restore the probability modifier to A. | ||||||
25788 | NEG | Negate A, making it less likely that the guard will move in the direction indicated by B (towards Horace). | ||||||
25790 | JR 25793 | |||||||
25792 | POP AF | Restore the probability modifier to A. | ||||||
25793 | ADD A,C | Now C holds the probability parameter for the direction indicated by B. | ||||||
25794 | LD C,A | |||||||
25795 | PUSH BC | Save the direction indicator briefly. | ||||||
25796 | LD HL,28082 | Point HL at one of the four slots at 28082. | ||||||
25799 | LD C,B | |||||||
25800 | LD B,0 | |||||||
25802 | ADD HL,BC | |||||||
25803 | POP BC | Restore the direction indicator to B. | ||||||
25804 | LD A,C | Save the direction probability parameter in the appropriate slot. | ||||||
25805 | LD (HL),A | |||||||
25806 | INC B | Have we considered every direction yet? | ||||||
25807 | DEC B | |||||||
25808 | JP NZ,25631 | Jump back if not. | ||||||
Having computed a direction probability parameter for each of the four slots at 28082, we now use those values to determine the guard's next animation frame (and therefore direction of travel).
|
||||||||
25811 | XOR A | Compute in C the index of the slot that holds the largest number (0, 1, 2 or 3). | ||||||
25812 | LD HL,28086 | |||||||
25815 | LD B,4 | |||||||
25817 | DEC B | |||||||
25818 | DEC HL | |||||||
25819 | CP (HL) | |||||||
25820 | JR NC,25824 | |||||||
25822 | LD A,(HL) | |||||||
25823 | LD C,B | |||||||
25824 | INC B | |||||||
25825 | DEC B | |||||||
25826 | JR NZ,25817 | |||||||
25828 | LD A,C | Update the guard's animation frame to this index value. | ||||||
25829 | LD (28090),A | |||||||
25832 | LD A,(28090) | Pick up the guard's animation frame. | ||||||
25835 | LD HL,(28088) | Pick up the guard's current location. | ||||||
25838 | CALL 27842 | Check the tiles in front of the guard. | ||||||
25841 | CP 0 | Is there anything in front of the guard? | ||||||
25843 | JR Z,25866 | Jump if not. | ||||||
25845 | CP 1 | Is the guard facing a tunnel entrance? | ||||||
25847 | JR NZ,25879 | Jump if not. (This jump is never made.) | ||||||
The guard is about to enter a tunnel.
|
||||||||
25849 | LD BC,(28623) | Pick up the the tunnel offset. | ||||||
25853 | LD A,(28090) | Pick up the guard's animation frame. | ||||||
25856 | AND A | Is it 0 (going up)? | ||||||
25857 | JR Z,25863 | Jump if so. | ||||||
25859 | SBC HL,BC | Subtract the tunnel offset from the guard's current location. | ||||||
25861 | JR 25864 | |||||||
25863 | ADD HL,BC | Add the tunnel offset to the guard's current location. | ||||||
25864 | JR 25875 | |||||||
25866 | LD HL,(28088) | Pick up the guard's current location. | ||||||
25869 | LD A,(28090) | Pick up the guard's animation frame. | ||||||
25872 | CALL 27927 | Compute the guard's new location. | ||||||
25875 | LD (28092),HL | Update the guard's location. | ||||||
25878 | RET | |||||||
The guard has been left facing a wall or the maze entrance or exit (so he cannot move). This never happens, so the following code is never executed.
|
||||||||
25879 | LD HL,(28088) | Pick up the guard's current location. | ||||||
25882 | LD (28092),HL | Set the guard's new location. | ||||||
25885 | RET |
Prev: 25399 | Up: Map |