Prev: C497 Up: Map Next: C535
C4E6: Shorten dV against the other objects
Used by the routine at ADJ_FOR_OUT_OF_BOUNDS.
ADJ_DU_FOR_OBJ_INTERSECT for V: an object has to overlap in U, after the accepted dU, and in Z to be in the way. Stopping sets bit 1 of +$0C; harm passes the same way, and a pushable obstacle takes on the mover's dV.
Input
IX the moving object
L dV
C dU as accepted
H dZ as accepted
Output
L dV, shortened
ADJ_DV_FOR_OBJ_INTERSECT C4E6 LD IY,OBJECTS IY = the first record; 56 of them
C4EA LD B,$38
ADJ_DV_FOR_OBJ_INTERSECT_0 C4EC CALL IS_OBJECT_NOT_IGNORED Empty, or out of the collision tests
C4EF JR Z,DV_OBJ_NEXT
C4F1 CALL DO_OBJS_INTERSECT_ON_U Not overlapping in U, or not in Z
C4F4 JR NC,DV_OBJ_NEXT
C4F6 CALL DO_OBJS_INTERSECT_ON_Z
C4F9 JR NC,DV_OBJ_NEXT
DV_OBJ_HIT_TEST C4FB CALL DO_OBJS_INTERSECT_ON_V No overlap in V after the move: the next object
C4FE JR NC,DV_OBJ_NEXT
C500 SET 1,(IX+$0C) Stopped in V
C504 LD A,(IX+$0D) Harm passes both ways, as in U
C507 RRCA
C508 AND $40
C50A OR (IY+$0D)
C50D LD (IY+$0D),A
C510 RLCA
C511 AND $40
C513 OR (IX+$0D)
C516 LD (IX+$0D),A
C519 BIT 2,(IY+$07) A pushable obstacle takes on our dV
C51D JR Z,ADJ_DV_FOR_OBJ_INTERSECT_1
C51F LD A,(IX+$0A)
C522 LD (IY+$0A),A
ADJ_DV_FOR_OBJ_INTERSECT_1 C525 LD A,L A unit shorter; none left, done; else the same object again
C526 CALL SHORTEN_DELTA
C529 LD L,A
C52A RET Z
C52B JR DV_OBJ_HIT_TEST
DV_OBJ_NEXT C52D LD DE,$0020 The next of 56
C530 ADD IY,DE
C532 DJNZ ADJ_DV_FOR_OBJ_INTERSECT_0
C534 RET
Prev: C497 Up: Map Next: C535