Routines |
Prev: 6337 | Up: Map | Next: 651E |
Used by the routine at 6337.
|
||||
63DA | LD A,($6DBE) | Pick up the guard's return delay counter. | ||
63DD | AND A | Has this guard been thrown out of the park? | ||
63DE | RET NZ | Return if so. | ||
63DF | LD HL,($7C6B) | Pick up Horace's current location. | ||
63E2 | RR H | Now H=0, 1 or 2, indicating which third of the screen the top row of Horace's sprite is in. | ||
63E4 | RR H | |||
63E6 | RR H | |||
63E8 | LD B,$05 | Move bits 5-7 of L down to bits 0-2, and bits 0-2 of H into bits 3-5 of L. | ||
63EA | RR H | |||
63EC | RR L | |||
63EE | DJNZ $63EA | |||
63F0 | LD A,L | Now A=Horace's screen y-coordinate (0-22). | ||
63F1 | AND $1F | |||
63F3 | LD HL,($7C6B) | Pick up Horace's current location. | ||
63F6 | LD H,A | H=Horace's screen y-coordinate (0-22). | ||
63F7 | LD A,L | Now L=Horace's screen x-coordinate (0-30). | ||
63F8 | AND $1F | |||
63FA | LD L,A | |||
63FB | LD ($7C7A),HL | Save Horace's screen x- and y-coordinates temporarily. | ||
63FE | LD HL,($6DB8) | Compute the guard's screen x- and y-coordinates. | ||
6401 | RR H | |||
6403 | RR H | |||
6405 | RR H | |||
6407 | LD B,$05 | |||
6409 | RR H | |||
640B | RR L | |||
640D | DJNZ $6409 | |||
640F | LD A,L | |||
6410 | AND $1F | |||
6412 | LD HL,($6DB8) | |||
6415 | LD H,A | |||
6416 | LD A,L | |||
6417 | AND $1F | |||
6419 | LD L,A | |||
641A | LD ($6DB0),HL | Save the guard's screen x- and y-coordinates temporarily. | ||
641D | LD B,$04 | 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.
|
||||
641F | DEC B | B=3 (left), 2 (down), 1 (right) or 0 (up). | ||
6420 | LD HL,($6DB8) | Pick up the guard's current location. | ||
6423 | LD C,$00 | Initialise C to 0; this is the direction probability parameter. | ||
6425 | PUSH BC | Save the direction indicator briefly. | ||
6426 | LD A,B | Copy the direction indicator to A. | ||
6427 | CALL $6CC2 | Check the tiles next to the guard in that direction. | ||
642A | POP BC | Restore the direction indicator to B. | ||
642B | CP $02 | Is there a wall or the maze exit or entrance in that direction? | ||
642D | JP NC,$64C3 | Jump if so with C=0: that direction is blocked. | ||
6430 | LD C,$19 | 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. | ||
6432 | LD A,($6DBA) | Pick up the guard's animation frame. | ||
6435 | CP B | Is it equal to the current value of the direction indicator? | ||
6436 | JR NZ,$643E | Jump if not. | ||
6438 | LD A,$28 | C=65; this value ensures that the guard will keep moving in the same direction if he can. | ||
643A | ADD A,C | |||
643B | LD C,A | |||
643C | JR $645B | |||
643E | ADD A,$02 | Add 2 to the guard's current animation frame; this has the effect of toggling his direction between up/down and left/right. | ||
6440 | AND $03 | |||
6442 | CP B | Is it equal to the current value of the direction indicator now? | ||
6443 | JR NZ,$644B | Jump if not. | ||
6445 | LD A,$F6 | C=15; this value determines the probability that the guard will turn round 180 degrees when his path is blocked. | ||
6447 | ADD A,C | |||
6448 | LD C,A | |||
6449 | JR $645B | |||
644B | LD HL,($5C78) | Increment the two least significant bytes of the system variable FRAMES, and copy the value to HL. | ||
644E | INC HL | |||
644F | LD ($5C78),HL | |||
6452 | LD A,H | Use this value to generate a pseudo-random number between 0 and 31. | ||
6453 | AND $0F | |||
6455 | LD H,A | |||
6456 | LD A,(HL) | |||
6457 | AND $1F | |||
6459 | 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. | ||
645A | LD C,A | |||
645B | LD A,B | Copy the direction indicator to A. | ||
645C | CP $03 | Set the zero flag if we're considering 'left' at the moment. | ||
645E | LD A,($7C64) | Pick up the value of the redundant variable at 7C64. | ||
6461 | JR NZ,$6467 | Jump if we're considering 'right', 'up' or 'down' at the moment. | ||
6463 | DEC A | Decrement the redundant variable at 7C64. | ||
6464 | LD ($7C64),A | |||
6467 | AND A | This instruction is redundant. | ||
6468 | LD A,B | Copy the direction indicator to A. | ||
6469 | CP $00 | Are we considering 'up' at the moment? | ||
646B | JR NZ,$6473 | Jump if not. | ||
646D | LD A,($7C62) | Reset the redundant variable at 7C64 to the value of the game speed parameter. | ||
6470 | LD ($7C64),A | |||
6473 | LD A,B | Copy the direction indicator to A. | ||
6474 | CP $00 | Are we considering 'up' at the moment? | ||
6476 | JR NZ,$6484 | Jump if not. | ||
6478 | LD HL,($6DB0) | Pick up the guard's screen x- and y-coordinates. | ||
647B | LD A,H | A=guard's screen y-coordinate. | ||
647C | LD HL,($7C7A) | Pick up Horace's screen x- and y-coordinates. | ||
647F | SUB H | Is Horace's y-coordinate greater than the guard's? | ||
6480 | JR C,$64C3 | Jump if so. | ||
6482 | JR $64AE | Otherwise jump to increase the probability that the guard will move up (towards Horace). | ||
6484 | CP $01 | Are we considering 'right' at the moment? | ||
6486 | JR NZ,$6494 | Jump if not. | ||
6488 | LD HL,($7C7A) | Pick up Horace's screen x- and y-coordinates. | ||
648B | LD A,L | A=Horace's screen x-coordinate. | ||
648C | LD HL,($6DB0) | Pick up the guard's screen x- and y-coordinates. | ||
648F | SUB L | Is the guard's x-coordinate greater than Horace's? | ||
6490 | JR C,$64C3 | Jump if so. | ||
6492 | JR $64AE | Otherwise jump to increase the probability that the guard will move right (towards Horace). | ||
6494 | CP $02 | Are we considering 'down' at the moment? | ||
6496 | JR NZ,$64A4 | Jump if not. | ||
6498 | LD HL,($7C7A) | Pick up Horace's screen x- and y-coordinates. | ||
649B | LD A,H | A=Horace's screen y-coordinate. | ||
649C | LD HL,($6DB0) | Pick up the guard's screen x- and y-coordinates. | ||
649F | SUB H | Is the guard's y-coordinate greater than Horace's? | ||
64A0 | JR C,$64C3 | Jump if so. | ||
64A2 | JR $64AE | Otherwise jump to increase the probability that the guard will move down (towards Horace). | ||
64A4 | LD HL,($6DB0) | Pick up the guard's screen x- and y-coordinates. | ||
64A7 | LD A,L | A=guard's screen x-coordinate. | ||
64A8 | LD HL,($7C7A) | Pick up Horace's screen x- and y-coordinates. | ||
64AB | SUB L | Is Horace's x-coordinate greater than the guard's? | ||
64AC | JR C,$64C3 | Jump if so. | ||
64AE | AND A | This instruction is redundant. | ||
64AF | ADD A,$0A | 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). | ||
64B1 | PUSH AF | Save this probability modifier briefly. | ||
64B2 | PUSH HL | Save HL (unnecessarily). | ||
64B3 | LD HL,($6DAE) | Pick up the guard panic timer. | ||
64B6 | LD A,H | Set the zero flag unless the guards are panicking. | ||
64B7 | OR L | |||
64B8 | POP HL | Restore HL. | ||
64B9 | JR Z,$64C0 | Jump unless the guards are panicking. | ||
64BB | POP AF | Restore the probability modifier to A. | ||
64BC | NEG | Negate A, making it less likely that the guard will move in the direction indicated by B (towards Horace). | ||
64BE | JR $64C1 | |||
64C0 | POP AF | Restore the probability modifier to A. | ||
64C1 | ADD A,C | Now C holds the probability parameter for the direction indicated by B. | ||
64C2 | LD C,A | |||
64C3 | PUSH BC | Save the direction indicator briefly. | ||
64C4 | LD HL,$6DB2 | Point HL at one of the four slots at 6DB2. | ||
64C7 | LD C,B | |||
64C8 | LD B,$00 | |||
64CA | ADD HL,BC | |||
64CB | POP BC | Restore the direction indicator to B. | ||
64CC | LD A,C | Save the direction probability parameter in the appropriate slot. | ||
64CD | LD (HL),A | |||
64CE | INC B | Have we considered every direction yet? | ||
64CF | DEC B | |||
64D0 | JP NZ,$641F | Jump back if not. | ||
Having computed a direction probability parameter for each of the four slots at 6DB2, we now use those values to determine the guard's next animation frame (and therefore direction of travel).
|
||||
64D3 | XOR A | Compute in C the index of the slot that holds the largest number (0, 1, 2 or 3). | ||
64D4 | LD HL,$6DB6 | |||
64D7 | LD B,$04 | |||
64D9 | DEC B | |||
64DA | DEC HL | |||
64DB | CP (HL) | |||
64DC | JR NC,$64E0 | |||
64DE | LD A,(HL) | |||
64DF | LD C,B | |||
64E0 | INC B | |||
64E1 | DEC B | |||
64E2 | JR NZ,$64D9 | |||
64E4 | LD A,C | Update the guard's animation frame to this index value. | ||
64E5 | LD ($6DBA),A | |||
64E8 | LD A,($6DBA) | Pick up the guard's animation frame. | ||
64EB | LD HL,($6DB8) | Pick up the guard's current location. | ||
64EE | CALL $6CC2 | Check the tiles in front of the guard. | ||
64F1 | CP $00 | Is there anything in front of the guard? | ||
64F3 | JR Z,$650A | Jump if not. | ||
64F5 | CP $01 | Is the guard facing a tunnel entrance? | ||
64F7 | JR NZ,$6517 | Jump if not. (This jump is never made.) | ||
The guard is about to enter a tunnel.
|
||||
64F9 | LD BC,($6FCF) | Pick up the the tunnel offset. | ||
64FD | LD A,($6DBA) | Pick up the guard's animation frame. | ||
6500 | AND A | Is it 0 (going up)? | ||
6501 | JR Z,$6507 | Jump if so. | ||
6503 | SBC HL,BC | Subtract the tunnel offset from the guard's current location. | ||
6505 | JR $6508 | |||
6507 | ADD HL,BC | Add the tunnel offset to the guard's current location. | ||
6508 | JR $6513 | |||
650A | LD HL,($6DB8) | Pick up the guard's current location. | ||
650D | LD A,($6DBA) | Pick up the guard's animation frame. | ||
6510 | CALL $6D17 | Compute the guard's new location. | ||
6513 | LD ($6DBC),HL | Update the guard's location. | ||
6516 | 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.
|
||||
6517 | LD HL,($6DB8) | Pick up the guard's current location. | ||
651A | LD ($6DBC),HL | Set the guard's new location. | ||
651D | RET |
Prev: 6337 | Up: Map | Next: 651E |