SHOW:
|
|
- or go back to the newest paste.
| 1 | #define renderDistance 10 ; adjust this to change the render distance | |
| 2 | #define priorAngle rcStack+2 ; 1 byte | |
| 3 | ||
| 4 | ||
| 5 | engine_raycaster_Init: | |
| 6 | ld de,SlendMapPtr | |
| 7 | _raycaster_loopobject | |
| 8 | push de | |
| 9 | inc de | |
| 10 | ld a,(de) | |
| 11 | ld hl,playerPosY | |
| 12 | sub (hl) | |
| 13 | ld c,a | |
| 14 | dec de | |
| 15 | ld a,(de) | |
| 16 | ld hl,playerPosX | |
| 17 | sub (hl) | |
| 18 | call _getDistance | |
| 19 | ld de,(renderDistance) | |
| 20 | sbc hl,de \ add hl,de | |
| 21 | - | cpHL |
| 21 | + | |
| 22 | ld a,l | |
| 23 | push af ; distance | |
| 24 | ld a,(de) | |
| 25 | ld hl,playerPosX | |
| 26 | sub (hl) | |
| 27 | ld b,a | |
| 28 | inc de | |
| 29 | ld a,(de) | |
| 30 | ld hl,playerPoxY | |
| 31 | sub (hl) | |
| 32 | call a_div_b | |
| 33 | call arctan_88 | |
| 34 | ld hl,playerDirection | |
| 35 | sub (hl) \ add a,5 \ cp 11 \ jr nc,_raycaster_nextobject | |
| 36 | push af ; angle | |
| 37 | inc de | |
| 38 | ld a,(de) ; a = object type id, use to pull sprite | |
| 39 | ld hl,spriteLUT \ add a,a \ ld c,a \ ld b,0 | |
| 40 | add hl,bc | |
| 41 | ld c,(hl) \ inc hl \ ld b,(hl) \ ld hl,spriteStart \ add hl,bc ; hl = PTR to sprite layers | |
| 42 | - | ld hl,(hl) \ ld bc,spriteStart \ add hl,bc ; hl = PTR to sprite layers |
| 42 | + | |
| 43 | rla \ rla \ rla | |
| 44 | ld d,a ; we got our x-coord | |
| 45 | ld b,a \ ld a,20 \ add a,b \ ld e,a ; we got our y-coord | |
| 46 | pop af ; distance back out | |
| 47 | ;fixed from "ld a,c" | |
| 48 | - | ld a,c \ ld b,0 |
| 48 | + | ld c,a \ ld b,0 |
| 49 | ld hl,distanceLUT | |
| 50 | add hl,bc | |
| 51 | ld a,(hl) ; distance -> scale factor, out a | |
| 52 | call render_ScaledSprite | |
| 53 | _raycaster_nextobject | |
| 54 | pop de | |
| 55 | - | ld hl,3 |
| 55 | + | inc de |
| 56 | - | add hl,de |
| 56 | + | inc de |
| 57 | - | ex de,hl |
| 57 | + | inc de |
| 58 | ld a,(de) | |
| 59 | - | cp $ff |
| 59 | + | inc a |
| 60 | - | ret z |
| 60 | + | jr nz_raycaster_loopobject |
| 61 | - | jr _raycaster_loopobject |
| 61 | + | ret |
| 62 | ||
| 63 | spriteLUT: | |
| 64 | ; pretend there is data here | |
| 65 | distanceLUT: | |
| 66 | .db $00,$F2,$E5,$D8,$CC,$BF,$B2,$A5,$99,$8C,$7F | |
| 67 | ||
| 68 | ||
| 69 | render_ScaledSprite: | |
| 70 | ; in: hl = ptr to sprite, de = coords of sprite, a = scale factor | |
| 71 | ; scalespr.inc | |
| 72 | ; putScaledSprite reqs: hl=sprite PTR, de=(x,y), bc=(height,width/8), a=scale factor ($01 to $00 <=> 0.4% to 100%) | |
| 73 | ; in the original routine, it wrote to plotsscreen (ld de,plotSScreen). I changed its write-to to iy, so that I could call the routine twice (ld de,iy). | |
| 74 | - | ; in the original routine, it wrote to plotsscreen (ld de,plotSScreen). I changed its write-to to (iy), so that I could call the routine twice (ld de,(iy)). |
| 74 | + | |
| 75 | inc hl | |
| 76 | ld c,(hl) | |
| 77 | inc hl | |
| 78 | ld iy,frontBuffer1 | |
| 79 | - | ld (iy),frontBuffer1 |
| 79 | + | |
| 80 | push af | |
| 81 | push hl | |
| 82 | push bc | |
| 83 | call putScaledSprite | |
| 84 | pop bc | |
| 85 | pop hl | |
| 86 | ; jump hl to start of back buffer sprite | |
| 87 | ld e,c ; bc: c is width (in bytes), b is height | |
| 88 | ld d,0 | |
| 89 | push bc | |
| 90 | __get2ndLayer_loop: | |
| 91 | add hl,de | |
| 92 | djnz __get2ndLayer_loop | |
| 93 | pop bc | |
| 94 | pop af | |
| 95 | pop de | |
| 96 | ld iy,frontBuffer2 | |
| 97 | - | ld (iy),frontBuffer2 |
| 97 | + | |
| 98 | ret |