Routines |
Prev: 25399 | Up: Map | Next: 25886 |
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 | Next: 25886 |