RayCast: ld (Ray),a call Tan and %11000000 cp %11000000 jp z,down_right cp %10000000 jp z,down_left cp %01000000 jp z,up_left ;=== UP - RIGHT ==================================== up_right: VertIntersections0: ld (RowInc0),de ld a,(ColWorld) cpl call Mult ld hl,(RowWorld) add hl,de ld a,(ColTable) ld d,a VertInterRight0: inc d ld e,h push hl call GetMap pop hl VertInterDoorMistake0: ld bc,0 RowInc0 = $-2 jr c,VertInterInfinite0 jr nz,VertInterDist0 add hl,bc jr nc,VertInterRight0 VertInterInfinite0: ld hl,$FFFF jr VertInterEnd0 VertInterDoorIsOpen0: sbc hl,bc xor a jr VertInterDoorMistake0 VertInterDoor0: ex af,af' ld a,h srl b rr c add hl,bc cp h jr nz,VertInterInfinite0 ;VertInterNoDoor0 call GetDoorTexShift add a,l jr c,VertInterDoorIsOpen0 ld (VertTexCol),a ex af,af' ld (VertNb),a ld l,$7F jr VertInterDoorFound0 VertInterDist0: cp DoorTile jr nc,VertInterDoor0 ld (VertNb),a ld a,l ld (VertTexCol),a ld l,0 VertInterDoorFound0: ld h,d ld de,(ColWorld) sbc hl,de ld a,(Ray) call CosInv ; call mul VertInterEnd0: ld (VertDist),hl HorzIntersections0: ld a,(Ray) call TanInv ld (ColInc0),de ld a,(RowWorld) cpl call Mult ld hl,(ColWorld) add hl,de ld a,(RowTable) ld e,a HorzInterUp0: inc e ld d,h push hl call GetMap pop hl HorzInterDoorMistake0: ld bc,0 ColInc0 = $-2 jr c,HorzInterInfinite0 jr nz,HorzInterDist0 add hl,bc jr nc,HorzInterUp0 HorzInterInfinite0: ld hl,$FFFF ld (HorzDist),hl jp FindWallDist HorzInterDoorIsOpen0: sbc hl,bc xor a jr HorzInterDoorMistake0 HorzInterDoor0: ex af,af' ld a,h srl b rr c add hl,bc cp h jr nz,HorzInterInfinite0 ;HorzInterNoDoor0 call GetDoorTexShift add a,l jr c,HorzInterDoorIsOpen0 ld (HorzTexCol),a ex af,af' ld (HorzNb),a ; ld h,e ld l,$7F jr HorzInterDoorFound0 HorzInterDist0: cp DoorTile jr nc,HorzInterDoor0 ld (HorzNb),a ld a,l ld (HorzTexCol),a ld l,0 HorzInterDoorFound0: ld h,e ld de,(RowWorld) ;or a sbc hl,de ld a,(Ray) call SinInv ; call mul ld (HorzDist),hl jp FindWallDist ;=== UP - LEFT ===================================== up_left: VertIntersections1: ld (RowInc1),de ld a,(ColWorld) call Mult ld hl,(RowWorld) add hl,de ld a,(ColTable) ld d,a VertInterLeft1: dec d ld e,h push hl call GetMap pop hl VertInterDoorMistake1: ld bc,0 RowInc1 = $-2 jr c,VertInterInfinite1 jr nz,VertInterDist1 add hl,bc jr nc,VertInterLeft1 VertInterInfinite1: ld hl,$FFFF jr VertInterEnd1 VertInterDoorIsOpen1: sbc hl,bc xor a jr VertInterDoorMistake1 VertInterDoor1: ex af,af' ld a,h srl b rr c add hl,bc cp h jr nz,VertInterInfinite1;VertInterNoDoor1 call GetDoorTexShift ; or a add a,l jr c,VertInterDoorIsOpen1 ld (VertTexCol),a ex af,af' ld (VertNb),a ld e,$7F jr VertInterDoorFound1 VertInterDist1: cp DoorTile jr nc,VertInterDoor1 ld (VertNb),a ld a,l ld (VertTexCol),a ld e,$FF VertInterDoorFound1: ld hl,(ColWorld) sbc hl,de ld a,(Ray) call CosInv ; call mul VertInterEnd1: ld (VertDist),hl HorzIntersections1: ld a,(Ray) call TanInv ld (ColInc1),de ld a,(RowWorld) cpl call Mult ld hl,(ColWorld) or a sbc hl,de ld a,(RowTable) ld e,a HorzInterUp1: inc e ld d,h push hl call GetMap pop hl HorzInterDoorMistake1: ld bc,0 ColInc1 = $-2 jr c,HorzInterInfinite1 jr nz,HorzInterEnd1 sbc hl,bc jr nc,HorzInterUp1 HorzInterInfinite1: ld hl,$FFFF ld (HorzDist),hl jp FindWallDist HorzInterDoorIsOpen1: add hl,bc xor a jr HorzInterDoorMistake1 HorzInterDoor1: ex af,af' ld a,h srl b rr c sbc hl,bc cp h jr nz,HorzInterInfinite1 ;HorzInterNoDoor1 call GetDoorTexShift add a,l jr c,HorzInterDoorIsOpen1 ld (HorzTexCol),a ex af,af' ld (HorzNb),a ld l,$7F jr HorzInterDoorFound1 HorzInterEnd1: cp DoorTile jr nc,HorzInterDoor1 ld (HorzNb),a ld a,l ld (HorzTexCol),a ld l,0 HorzInterDoorFound1: ld h,e ld de,(RowWorld) sbc hl,de ld a,(Ray) call SinInv ; call mul ld (HorzDist),hl jp FindWallDist ;=== DOWN - LEFT =================================== down_left: VertIntersections2: ld (RowInc2),de ld a,(ColWorld) call Mult ld hl,(RowWorld) or a sbc hl,de ld a,(ColTable) ld d,a VertInterLeft2: dec d ld e,h push hl call GetMap pop hl VertInterDoorMistake2: ld bc,0 RowInc2 = $-2 jr c,VertInterInfinite2 jr nz,VertInterDist2 sbc hl,bc jr nc,VertInterLeft2 VertInterInfinite2: ld hl,$FFFF ld (VertDist),hl jr VertInterEnd2 VertInterDoorIsOpen2: add hl,bc xor a jr VertInterDoorMistake2 VertInterDoor2: ex af,af' ld a,h srl b rr c sbc hl,bc cp h jr nz,VertInterInfinite2 ;VertInterNoDoor2 call GetDoorTexShift add a,l jr c,VertInterDoorIsOpen2 ld (VertTexCol),a ex af,af' ld (VertNb),a ld e,$7F jr VertInterDoorFound2 VertInterDist2: cp DoorTile jr nc,VertInterDoor2 ld (VertNb),a ld a,l ld (VertTexCol),a ld e,$FF VertInterDoorFound2: ld hl,(ColWorld) sbc hl,de ld a,(Ray) call CosInv ; call mul VertInterEnd2: ld (VertDist),hl HorzIntersections2: ld a,(Ray) call TanInv ld (ColInc2),de ld a,(RowWorld) call Mult ld hl,(ColWorld) or a sbc hl,de ld a,(RowTable) ld e,a HorzInterDown2: dec e ld d,h push hl call GetMap pop hl HorzInterDoorMistake2: ld bc,0 ColInc2 = $-2 jr c,HorzInterInfinite2 jr nz,HorzInterDist2 sbc hl,bc jr nc,HorzInterDown2 HorzInterInfinite2: ld hl,$FFFF ld (HorzDist),hl jp FindWallDist HorzInterDoorIsOpen2: add hl,bc xor a jr HorzInterDoorMistake2 HorzInterDoor2: ex af,af' ld a,h srl b rr c sbc hl,bc cp h jr nz,HorzInterInfinite2 ;HorzInterNoDoor2 call GetDoorTexShift add a,l jr c,HorzInterDoorIsOpen2 ld (HorzTexCol),a ex af,af' ld (HorzNb),a ld d,e ld e,$7F jr HorzInterDoorFound2 HorzInterDist2: cp DoorTile jr nc,HorzInterDoor2 ld (HorzNb),a ld a,l ld (HorzTexCol),a ld d,e ld e,$FF HorzInterDoorFound2: ld hl,(RowWorld) sbc hl,de ld a,(Ray) call SinInv ; call mul ld (HorzDist),hl jp FindWallDist ;=== DOWN - RIGHT ================================== down_right: VertIntersections3: ld (RowInc3),de ld a,(ColWorld) cpl call Mult ld hl,(RowWorld) or a sbc hl,de ld a,(ColTable) ld d,a VertInterRight3: inc d ld e,h push hl call GetMap pop hl VertInterDoorMistake3: ld bc,0 RowInc3 = $-2 jr c,VertInterInfinite3 jr nz,VertInterDist3 sbc hl,bc jr nc,VertInterRight3 VertInterInfinite3: ld hl,$FFFF jr VertInterEnd3 VertInterDoorIsOpen3: add hl,bc xor a jr VertInterDoorMistake3 VertInterDoor3: ex af,af' ld a,h srl b rr c sbc hl,bc cp h jr nz,VertInterInfinite3 ;VertInterNoDoor3 call GetDoorTexShift add a,l jr c,VertInterDoorIsOpen3 ld (VertTexCol),a ex af,af' ld (VertNb),a ld l,$7F jr VertInterDoorFound3 VertInterDist3: cp DoorTile jr nc,VertInterDoor3 ld (VertNb),a ld a,l ld (VertTexCol),a ld l,0 VertInterDoorFound3: ld h,d ld de,(ColWorld) sbc hl,de ld a,(Ray) call CosInv ; call mul VertInterEnd3: ld (VertDist),hl HorzIntersections3: ld a,(Ray) call TanInv ld (ColInc3),de ld a,(RowWorld) call Mult ld hl,(ColWorld) add hl,de ld a,(RowTable) ld e,a HorzInterDown3: dec e ld d,h push hl call GetMap pop hl HorzInterDoorMistake3: ld bc,0 ColInc3 = $-2 jr c,HorzInterInfinite3 jr nz,HorzInterDist3 add hl,bc jr nc,HorzInterDown3 HorzInterInfinite3: ld hl,$FFFF ld (HorzDist),hl jr FindWallDist HorzInterDoorIsOpen3: sbc hl,bc xor a jr HorzInterDoorMistake3 HorzInterDoor3: ex af,af' ld a,h srl b rr c add hl,bc cp h jr nz,HorzInterInfinite3 ;HorzInterNoDoor3 call GetDoorTexShift add a,l jr c,HorzInterDoorIsOpen3 ld (HorzTexCol),a ex af,af' ld (HorzNb),a ld d,e ld e,$7F jr HorzInterDoorFound3 HorzInterDist3: cp DoorTile jr nc,HorzInterDoor3 ld (HorzNb),a ld a,l ld (HorzTexCol),a ld d,e ld e,$FF HorzInterDoorFound3: ld hl,(RowWorld) sbc hl,de ld a,(Ray) call SinInv ; call mul ld (HorzDist),hl ;=== FIND DISTANCE TO WALL ========================= FindWallDist: ld de,0 Col = $-2 ld hl,FishbowlTable add hl,de ld a,(hl) ld hl,0 HorzDist = $-2 ld de,0 VertDist = $-2 or a sbc hl,de jr c,HorzInfVert VertInfHorz: call DivSlice ld c,a ld b,0 VertTexCol = $-1 ld a,0 VertNb = $-1 ret HorzInfVert: ld de,(HorzDist) call DivSlice ld c,a ld b,0 HorzTexCol = $-1 ld a,0 HorzNb = $-1 ret DivSlice: call Mult ;A x DE ld hl,Hoehe ld a,d cp 20 jr nc,DivSliceTooFar sra d rr e sra d rr e sra d rr e sra d rr e add hl,de ld a,(hl) ret DivSliceTooFar: xor a ret GetDoorTexShift: ;input: de = coord. push de exx pop de ;coord call ActorGetMap ; returns hl = *-> map aber für diesen zweck unoptimiert! ex de,hl GetDoorSpecialForOpenDoor: ld hl,CloseDoorBuffer ;timer GetDoorTexShiftLoop: ld a,(hl) or a jr z,GDTS_Exit inc hl ;tex inc hl ;pos1 ld a,(hl) inc hl ; position2 cp d jr nz,SkipGDTS ld a,(hl) cp e jr z,GDTS_Found SkipGDTS: inc hl ; door type inc hl ; timer jr GetDoorTexShiftLoop GDTS_Found: dec hl ;position 1 dec hl ;texadd ld a,(hl) GDTS_Exit: ; kommt nur mit 0 hierher exx ret .end