Prev: 6337 Up: Map Next: 651E
63DA: Move a guard
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