Prev: 27352 Up: Map Next: 27508
27357: Handle Magic Knight's falls
Used by the routine at 27136.
27357 XOR A Set A to zero
This entry point is used by the routine at 27352.
27358 LD (27393),A Prepare to set Magic Knight's x-velocity to A
27361 LD HL,37087 Point HL at end of table of y-velocities sequence for jumping and falling
27364 LD (37072),HL Store current position at 37072
27367 LD A,(23474) If Magic Knight's movement flags are reset...
27370 OR A ...
27371 JR Z,27377 ...then skip ahead to 27377
27373 XOR A Prepare to set Magic Knight's x-velocity to zero...
27374 LD (27393),A ...
27377 LD HL,(37072) Load current position in y-velocities table into HL
27380 LD A,(HL) Load current y-velocity from table into A
27381 CP 7 If velocity is 7...
27383 JR Z,27389 ...then skip ahead to 27389
27385 DEC HL Step pointer back one byte in y-velocities table
27386 LD (37072),HL Store pointer
27389 LD (25161),A Load last y-velocity read from table into Magic Knight's y-velocity
The operand of the instruction at 27392 represents the x-velocity value stored previously. This is modified by the instructions at 27358, 27374 and 27502.
27392 LD A,0 Set Magic Knight's x-velocity...
27394 LD (25160),A ...
27397 LD A,(25156) Load A with Magic Knight's current x-coordinate (pixels)
27400 ADD A,4 Add 4 to x-coordinate
27402 CALL 28625 Divide x-coordinate by eight, rounding down to nearest integer
27405 LD C,A Load result (Magic Knight's x-coordinate in characters) into C, setting B to zero...
27406 LD B,0 ...
27408 LD A,(25157) Load A with Magic Knight's current y-coordinate (pixels)
27411 AND 7 If y-coordinate is a multiple of eight...
27413 JR Z,27417 ...then skip ahead to 27417
y-coordinate is not a multiple of eight
27415 LD B,8 Set B to 8, as we need to look one character block lower due to Magic Knight spanning five, rather than four, characters
27417 LD A,(25157) Load A with Magic Knight's current y-coordinate (pixels)
27420 ADD A,B Add B to current y-coordinate (i.e. y-coordinate of highest full character block spanned by Magic Knight)
27421 ADD A,32 Add 32 (as Magic Knight is 32 pixels high, so now y-coordinate of highest full character block not occupied by Magic Knight)
27423 CALL 28625 Divide A by eight, rounding down to nearest integer
27426 LD B,A Load result (y-coordinate in characters) into B
27427 CALL 54162 Point HL at terrain interaction data for character coordinates x=C, y=B (block that Magic Knight is "falling through")
27430 LD A,(HL) If this block, or the one to the right of it cannot be passed vertically (downwards)...
27431 INC HL ...(i.e. Magic Knight has landed)...
27432 OR (HL) ...
27433 BIT 7,A ...
27435 JR NZ,27476 ...then skip ahead to 27476
27437 CALL 27508 Kill Magic Knight's x-velocity if he cannot horizontally pass through a block beside him
27440 LD A,(25160) Load Magic Knight's x-velocity into B...
27443 LD B,A ...
27444 LD A,(23474) Load Magic Knight's movement flags into A
27447 XOR B Check:
27448 CP 255 If x-velocity is -2 (left), and Magic Knight can't move left...
27450 JP Z,27498 ...then jump ahead to 27498
27453 CP 253 If x-velocity is -2 (left), and Magic Knight can't move left or right...
27455 JP Z,27498 ...then jump ahead to 27498
27458 CP 1 If x-velocity is +2 (right), and Magic Knight can't move left or right...
27460 JP Z,27498 ...then jump ahead to 27498
27463 OR A If x-velocity is +2 (right), and Magic Knight can't move right...
27464 JP Z,27498 ...then jump ahead to 27498
27467 CALL 53115 Erase Magic Knight from display, advance his current position then redraw
27470 CALL 28457 Set Magic Knight's velocity to zero, if appropriate move to new room, execute room-specific routine
27473 JP 27367 Loop back to 27367
27476 LD A,(25157) Load A with Magic Knight's current y-coordinate (pixels)
27479 AND 7 Retain only pixel-within-character component (e.g. 5 pixels down the pair of character blocks)
27481 NEG Negate (i.e. -5 pixels)
27483 AND 7 Retain only pixel-within-character component (e.g. 3 pixels up the pair of character blocks, or 3 pixels down to the ground)
27485 LD (25161),A Set Magic Knight's y-velocity so that it will take his feet to the ground
27488 CALL 53115 Erase Magic Knight from display, advance his current position then redraw
27491 LD HL,0 Set Magic Knight's x- and y-velocities to zero...
27494 LD (25160),HL ...
27497 RET Return (Magic Knight has landed)
27498 XOR A Set Magic Knight's x-velocity to zero...
27499 LD (25160),A ...
27502 LD (27393),A Prepare to set Magic Knight's x-velocity to zero
27505 JP 27467 Loop back to 27467
Prev: 27352 Up: Map Next: 27508