Prev: 38434 Up: Map Next: 38724
38585: Kill Magic Knight's x-velocity if he cannot horizontally pass through a block beside him
Used by the routines at 38205 and 38434.
38585 LD A,(23451) Load B with Magic Knight's temporary store movement flags...
38588 LD B,A ...
38589 LD A,(24840) Load Magic Knight's x-coordinate into A
38592 CP 5 If x-coordinate is less than 5...
38594 JP C,38604 ...then jump ahead to 38604
38597 CP 230 If x-coordinate is 230 or greater...
38599 JP NC,38604 ...then jump ahead to 38604
Magic Knight is not at the outer edges of his current room, so can move both left and right
38602 LD B,0 Set B (Magic Knight's temporary store movement flags) to zero
38604 LD A,B Load Magic Knight's temporary store movement flags into A
38605 LD (23474),A Set Magic Knight's movement flags
38608 LD A,(24841) Load Magic Knight's y-coordinate into B
38611 LD B,A ...
38612 LD A,(24845) Add Magic Knight's y-velocity to y-coordinate in A...
38615 ADD A,B ...
38616 LD (23483),A Store this new (predicted) y-coordinate at 23483
38619 LD C,4 Set C to 4 (as Magic Knight is normally four characters tall)
38621 AND 7 If predicted y-coordinate is divisible by eight...
38623 JR Z,38626 ...then skip ahead to 38626...
38625 INC C ...else Magic Knight must be airborne and at non-integer y-coordinate, and so spans five character blocks rather than four
38626 LD A,C Load A with number of vertical characters spanned by Magic Knight...
38627 LD (38659),A ...and update instructions at 38658...
38630 LD (38698),A ...and 38697 with this value
38633 LD A,(24840) Load Magic Knight's current x-coordinate into C...
38636 LD C,A ...
38637 LD A,(24844) Add Magic Knight's x-velocity to x-coordinate in A...
38640 ADD A,C ...
38641 LD (23482),A Store this new (predicted) x-coordinate at 23482
38644 CALL 40658 Divide predicted x-coordinate by eight, rounding down to nearest integer...
38647 LD C,A ...and load into C
38648 LD A,(23483) Load predicted y-coordinate into A...
38651 CALL 40658 ...divide it by eight, rounding down to nearest integer...
38654 LD (23483),A ...store back at 23483...
38657 LD B,A ...and load into B
The operand of the instruction at 38658 represents number of characters spanned by Magic Knight, vertically. This is modified by the instruction at 38627.
38658 LD A,0 Load number of characters (vertically) to check for impassibility
38660 PUSH AF Store remaining number of character blocks spanned by Magic Knight vertically to check
38661 CALL 63233 Point HL at terrain interaction data for character coordinates x=C, y=B
38664 BIT 6,(HL) If bit 6 of terrain data is set (i.e. Magic Knight cannot pass block horizontally)...
38666 JR NZ,38675 ...then jump ahead to 38675
38668 INC B Advance check to next character down
38669 POP AF Restore remaining number of character blocks spanned by Magic Knight vertically to check
38670 DEC A Decrease count of remaining character blocks by one
38671 JR NZ,38660 Loop back to 38660 to check next block down
38673 JR 38684 Skip over setting Magic Knight's can't-move-left flag as there are no obstructions to the left
38675 POP AF Restore AF
38676 LD A,(23474) Set Magic-Knight-can't-move-left flag...
38679 OR 1 ...
38681 LD (23474),A ...
38684 LD A,(23482) Load Magic Knight's predicted x-coordinate (pixels) into A...
38687 ADD A,15 ...and add 15...
38689 CALL 40658 ...divide by eight, rounding down to nearest integer...
38692 LD C,A ...and load into C
38693 LD A,(23483) Load Magic Knight's predicted y-coordinate (chars) into B...
38696 LD B,A ...
The operand of the instruction at 38697 represents number of characters spanned by Magic Knight, vertically. This is modified by the instruction at 38630.
38697 LD A,0 Load number of characters (vertically) to check for impassibility
38699 PUSH AF Store AF (remaining number of vertical characters to check for impassibility)
38700 CALL 63233 Point HL at terrain interaction data for character coordinates x=C, y=B
38703 BIT 6,(HL) If bit 6 is set (i.e. Magic Knight cannot pass block horizontally)...
38705 JR NZ,38714 ...jump ahead to 38714
38707 INC B Increase y-coordinate by one character
38708 POP AF Restore AF
38709 DEC A Decrease number of remaining blocks to check
38710 JR NZ,38699 If number of remaining blocks to check is not zero then loop back to 38699
38712 JR 38723 Exit routine
38714 POP AF Restore AF
38715 LD A,(23474) Set Magic-Knight-can't-move-right flag...
38718 OR 2 ...
38720 LD (23474),A ...
38723 RET Return
Prev: 38434 Up: Map Next: 38724