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 |