![]() |
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. | |||||
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 is facing a wall or the maze entrance or exit (so he cannot move).
|
|||||||
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 |