1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-20 18:31:13 +00:00

Use calculated octant beam from octbeam.bas

This commit is contained in:
David Schmenk 2014-12-13 15:02:31 -08:00
parent 22a9965951
commit 292847898d
2 changed files with 310 additions and 223 deletions

47
src/samplesrc/octbeam.bas Normal file
View File

@ -0,0 +1,47 @@
NEW
10 GR: COLOR=15: PLOT 0, 0
20 RI = 24: P = 1: DIM DB(RI): DIM XB(500): DIM YB(500):DIM VB(500)
30 PRINT "const beamdepth = "; RI: PRINT: PRINT "byte dbeam = 0";: FOR R = 1 TO RI
50 X = R * .7071: Y = R * .7071
60 SX = INT(X): SY = INT(Y + .25): IF SCRN(SX,SY) <> 0 THEN 80
70 PLOT SX,SY: XB(P) = SX: YB(P) = SY: P = P + 1
80 X = X - .25
90 Y = SQR(R * R - X * X)
100 IF X > 0 THEN 60
110 DB(R) = P - 1
120 PRINT ","; DB(R);
130 NEXT
140 PRINT: PRINT "const beampts = "; P: PRINT
200 PRINT "byte[] xbeam": PRINT "byte = 0": FOR R = 1 TO RI
210 PRINT "byte = ";
220 FOR L = DB(R-1)+1 TO DB(R)
230 PRINT XB(L);: IF L <> DB(R) THEN PRINT ",";
240 NEXT: PRINT
250 NEXT
260 PRINT
300 PRINT "byte[] ybeam": PRINT "byte = 0": FOR R = 1 TO RI
310 PRINT "byte = ";
320 FOR L = DB(R-1)+1 TO DB(R)
330 PRINT YB(L);: IF L <> DB(R) THEN PRINT ",";
340 NEXT: PRINT
350 NEXT
360 PRINT
400 PRINT "byte[] vbeam": PRINT "byte = 0": FOR R = 1 TO RI
410 PRINT "byte = ";: FOR L = DB(R-1)+1 TO DB(R)
420 M = 0: IF YB(L) <> 0 THEN M = XB(L)/YB(L)
430 SY = INT(YB(L) - 1): SX = INT(XB(L) - M + .5)
440 FOR P = 0 TO L
450 IF SY = YB(P) AND SX = XB(P) THEN VB(L) = P: P = L
460 NEXT
470 PRINT VB(L);: IF L <> DB(R) THEN PRINT ",";
480 NEXT: PRINT
490 NEXT
500 PRINT
999 END
RUN
]

View File

@ -7,60 +7,100 @@ end
const FALSE = 0
const TRUE = not FALSE
//
// Octant beam parameters
//
const beamdepth = 10
const octpts = 52
//
// X offsets
//
const beamdepth = 24
const beampts = 249
byte dbeam = 0,1,3,7,10,15,20,25,33,40,50,59,68,80,90,103,117,131,145
byte = 159,178,195,213,231,248
byte[] xbeam
byte = 0
byte = 0, 1
byte = 0, 1
byte = 0, 1, 2
byte = 0, 1, 2, 3
byte = 0, 1, 2, 2, 3
byte = 0, 1, 2, 3, 4
byte = 0, 1, 2, 3, 4, 5
byte = 0, 1, 2, 3, 4, 4, 5
byte = 0, 1, 2, 3, 4, 5, 6, 6
byte = 0, 1, 2, 3, 3, 4, 5, 5, 6, 7
//
// Y offest
//
byte = 0
byte = 1,0
byte = 2,1,1,0
byte = 2,1,0
byte = 3,3,2,1,0
byte = 4,3,2,1,0
byte = 4,3,2,1,0
byte = 5,5,4,4,3,2,1,0
byte = 6,5,4,3,2,1,0
byte = 7,6,6,5,4,3,2,2,1,0
byte = 7,6,5,5,4,3,2,1,0
byte = 8,7,6,5,4,3,2,1,0
byte = 9,8,8,7,7,6,5,4,3,2,1,0
byte = 9,8,7,6,5,4,3,2,1,0
byte = 10,10,9,9,8,7,6,5,4,3,2,1,0
byte = 11,10,9,8,8,7,6,6,5,4,3,2,1,0
byte = 12,11,11,10,9,8,7,6,5,4,3,2,1,0
byte = 12,11,10,10,9,8,7,6,5,4,3,2,1,0
byte = 13,12,11,10,9,8,7,6,5,4,3,2,1,0
byte = 14,13,13,12,12,11,10,9,9,8,7,6,5,4,3,3,2,1,0
byte = 14,13,12,11,11,10,9,8,7,7,6,5,4,3,2,1,0
byte = 15,15,14,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
byte = 16,15,14,13,13,12,11,10,9,8,7,6,5,4,3,2,1,0
byte = 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
byte[] ybeam
byte = 0
byte = 1, 1
byte = 2, 2
byte = 3, 3, 2
byte = 4, 4, 3, 3
byte = 5, 5, 5, 4, 4
byte = 6, 6, 6, 5, 4
byte = 7, 7, 7, 6, 5, 5
byte = 8, 8, 8, 7, 7, 6, 6
byte = 9, 9, 9, 8, 8, 7, 7, 6
byte = 10, 10, 10, 10, 9, 9, 9, 8, 8, 7
//
// Visibilty parent indeces
//
byte = 1
byte = 1,2
byte = 2,2,3,3
byte = 3,4,4
byte = 3,4,4,5,5
byte = 4,5,5,6,6
byte = 5,6,6,7,7
byte = 5,6,6,7,7,7,8,8
byte = 6,7,8,8,8,9,9
byte = 7,7,8,8,9,9,9,10,10,10
byte = 8,9,9,10,10,10,11,11,11
byte = 8,9,10,11,11,11,12,12,12
byte = 9,9,10,10,11,11,12,12,12,13,13,13
byte = 10,11,12,12,13,13,13,14,14,14
byte = 10,11,11,12,12,13,13,14,14,14,15,15,15
byte = 11,12,13,13,14,14,14,15,15,15,15,16,16,16
byte = 12,12,13,13,14,15,15,16,16,16,16,17,17,17
byte = 13,14,14,15,15,16,16,17,17,17,17,18,18,18
byte = 13,14,15,16,16,17,17,18,18,18,18,19,19,19
byte = 14,14,15,15,16,16,17,17,18,18,18,19,19,19,19,20,20,20,20
byte = 15,16,17,17,18,18,19,19,19,20,20,20,20,21,21,21,21
byte = 15,16,16,17,17,18,19,19,20,20,21,21,21,21,22,22,22,22
byte = 16,17,18,18,19,19,20,20,21,21,22,22,22,22,23,23,23,23
byte = 17,18,19,20,20,21,21,22,22,23,23,23,23,24,24,24,24
byte[] vbeam
byte = 0
byte = 0, 0
byte = 1, 1
byte = 3, 4, 2
byte = 5, 6, 4, 7
byte = 8, 9, 9, 6, 10
byte = 12, 13, 14, 15, 11
byte = 17, 18, 19, 14, 16, 21
byte = 22, 23, 24, 19, 25, 20, 26
byte = 28, 29, 30, 24, 31, 33, 34, 27
byte = 35, 36, 37, 37, 38, 38, 39, 32, 40, 42
//
// Depth level indeces
//
byte dbeam = 0, 2, 4, 7, 11, 16, 21, 27, 34, 42, 52
byte = 0
byte = 0,1
byte = 2,2,5,3
byte = 5,6,7
byte = 4,8,8,9,10
byte = 11,13,13,14,15
byte = 12,17,18,19,20
byte = 16,21,17,22,22,23,24,25
byte = 26,28,29,30,31,32,33
byte = 34,27,35,29,36,37,38,47,39,40
byte = 42,44,36,53,45,46,48,49,50
byte = 41,43,53,54,55,56,57,58,59
byte = 60,51,61,52,62,54,63,64,65,66,67,68
byte = 70,72,74,74,75,76,77,78,79,80
byte = 69,81,71,82,73,84,84,85,86,87,88,89,90
byte = 91,93,95,83,96,96,97,110,98,99,100,101,102,103
byte = 104,92,105,94,107,109,109,111,112,113,114,115,116,117
byte = 119,121,106,122,108,123,124,125,126,127,128,129,130,131
byte = 118,120,134,136,123,137,138,139,140,141,142,143,144,145
byte = 146,132,147,133,148,135,150,137,167,151,152,153,154,155,156,174,157,158
byte = 159
byte = 161,163,165,149,166,167,168,169,170,187,171,172,173,175,176,177,178
byte = 160,179,162,180,164,182,184,168,185,186,188,189,190,191,192,193,194,195
byte = 196,198,200,181,201,183,203,203,204,205,206,207,208,209,210,211,212,213
byte = 197,199,217,219,202,221,221,222,223,224,225,226,227,228,229,230,231
byte[beampts] vispix
const maprows = 21
const mapcols = 32
@ -103,6 +143,7 @@ word = $450, $4D0, $550, $5D0, $650, $6D0, $750, $7D0
const SPEAKER = $C030
const maxlight = 10
word xdir = 0, 1, 1, 1, 0, -1, -1, -1
word ydir = -1, -1, 0, 1, 1, 1, 0, -1
word xplayer = 5
@ -132,8 +173,7 @@ def ouch
end
def drawmap(xorg, yorg, dir, light)
byte[octpts] vispix
byte o, l, tile, occlude
byte o, l, dist, tile, occlude
word ymap, xmap, imap
byte yscr, xscr
@ -145,197 +185,197 @@ def drawmap(xorg, yorg, dir, light)
// Draw background map
//
if light
xmap = xorg - xcentr
if xmap < 0
l = mapcols + xmap
xscr = -xmap
xmap = 0
else
l = mapcols - xmap - 1
xscr = 0
fin
if xscr + l > 40
l = 40 - xscr
fin
for yscr = 0 to 23
ymap = yscr - ycentr + yorg
if ymap >= 0 and ymap < maprows
memcpy(screen[yscr] + xscr, vismap + (ymap << 5) + xmap + 1, l)
xmap = xorg - xcentr
if xmap < 0
l = mapcols + xmap
xscr = -xmap
xmap = 0
else
l = mapcols - xmap - 1
xscr = 0
fin
next
//
// Draw visible octants
//
for o = dir - fov - 1 to dir + fov
memset(@vispix, dbeam[light], TRUE)
when o & 7
is 0
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - ybeam[l]) << 5) + xorg + xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + 1] == WALL
^(vismap + imap + 1) = VISWALL
screen.[ycentr - ybeam[l], xcentr + xbeam[l] + 1] = WALL
if xscr + l > 40
l = 40 - xscr
fin
for yscr = 0 to 23
ymap = yscr - ycentr + yorg
if ymap >= 0 and ymap < maprows
memcpy(screen[yscr] + xscr, vismap + (ymap << 5) + xmap + 1, l)
fin
next
//
// Draw visible octants
//
for o = dir - fov - 1 to dir + fov
memset(@vispix, dbeam[light], TRUE)
when o & 7
is 0
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - ybeam[l]) << 5) + xorg + xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + 1] == WALL
^(vismap + imap + 1) = VISWALL
screen.[ycentr - ybeam[l], xcentr + xbeam[l] + 1] = WALL
fin
fin
fin
screen.[ycentr - ybeam[l], xcentr + xbeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 1
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - xbeam[l]) << 5) + xorg + ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
screen.[ycentr - ybeam[l], xcentr + xbeam[l]] = tile
else
if map[imap - mapcols] == WALL
^(vismap + imap - mapcols) = VISWALL
screen.[ycentr - xbeam[l] - 1, xcentr + ybeam[l]] = WALL
fin
fin
screen.[ycentr - xbeam[l], xcentr + ybeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 2
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + xbeam[l]) << 5) + xorg + ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + mapcols] == WALL
^(vismap + imap + mapcols) = VISWALL
screen.[ycentr + xbeam[l] + 1, xcentr + ybeam[l]] = WALL
fin
fin
screen.[ycentr + xbeam[l], xcentr + ybeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 3
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + ybeam[l]) << 5) + xorg + xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
next
break
is 1
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - xbeam[l]) << 5) + xorg + ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap - mapcols] == WALL
^(vismap + imap - mapcols) = VISWALL
screen.[ycentr - xbeam[l] - 1, xcentr + ybeam[l]] = WALL
fin
fin
screen.[ycentr - xbeam[l], xcentr + ybeam[l]] = tile
else
vispix[l] = FALSE
else
if map[imap + 1] == WALL
^(vismap + imap + 1) = VISWALL
screen.[ycentr + ybeam[l], xcentr + xbeam[l] + 1] = WALL
fin
fin
screen.[ycentr + ybeam[l], xcentr + xbeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 4
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + ybeam[l]) << 5) + xorg - xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
next
break
is 2
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + xbeam[l]) << 5) + xorg + ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + mapcols] == WALL
^(vismap + imap + mapcols) = VISWALL
screen.[ycentr + xbeam[l] + 1, xcentr + ybeam[l]] = WALL
fin
fin
screen.[ycentr + xbeam[l], xcentr + ybeam[l]] = tile
else
vispix[l] = FALSE
else
if map[imap - 1] == WALL
^(vismap + imap - 1) = VISWALL
screen.[ycentr + ybeam[l], xcentr - xbeam[l] - 1] = WALL
fin
fin
screen.[ycentr + ybeam[l], xcentr - xbeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 5
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + xbeam[l]) << 5) + xorg - ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
next
break
is 3
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + ybeam[l]) << 5) + xorg + xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + 1] == WALL
^(vismap + imap + 1) = VISWALL
screen.[ycentr + ybeam[l], xcentr + xbeam[l] + 1] = WALL
fin
fin
screen.[ycentr + ybeam[l], xcentr + xbeam[l]] = tile
else
vispix[l] = FALSE
else
if map[imap + mapcols] == WALL
^(vismap + imap + mapcols) = VISWALL
screen.[ycentr + xbeam[l] + 1, xcentr - ybeam[l]] = WALL
fin
fin
screen.[ycentr + xbeam[l], xcentr - ybeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 6
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - xbeam[l]) << 5) + xorg - ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
next
break
is 4
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + ybeam[l]) << 5) + xorg - xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap - 1] == WALL
^(vismap + imap - 1) = VISWALL
screen.[ycentr + ybeam[l], xcentr - xbeam[l] - 1] = WALL
fin
fin
screen.[ycentr + ybeam[l], xcentr - xbeam[l]] = tile
else
vispix[l] = FALSE
else
if map[imap - mapcols] == WALL
^(vismap + imap - mapcols) = VISWALL
screen.[ycentr - xbeam[l] - 1, xcentr - ybeam[l]] = WALL
fin
fin
screen.[ycentr - xbeam[l], xcentr - ybeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 7
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - ybeam[l]) << 5) + xorg - xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
next
break
is 5
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg + xbeam[l]) << 5) + xorg - ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap + mapcols] == WALL
^(vismap + imap + mapcols) = VISWALL
screen.[ycentr + xbeam[l] + 1, xcentr - ybeam[l]] = WALL
fin
fin
screen.[ycentr + xbeam[l], xcentr - ybeam[l]] = tile
else
vispix[l] = FALSE
else
if map[imap - 1] == WALL
^(vismap + imap - 1) = VISWALL
screen.[ycentr - ybeam[l], xcentr - xbeam[l] - 1] = WALL
fin
fin
screen.[ycentr - ybeam[l], xcentr - xbeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
wend
next
gotoxy(xcentr, ycentr)
putc(vplayer[dir])
next
break
is 6
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - xbeam[l]) << 5) + xorg - ybeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap - mapcols] == WALL
^(vismap + imap - mapcols) = VISWALL
screen.[ycentr - xbeam[l] - 1, xcentr - ybeam[l]] = WALL
fin
fin
screen.[ycentr - xbeam[l], xcentr - ybeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
is 7
for l = 1 to dbeam[light]
if vispix[vbeam[l]]
imap = ((yorg - ybeam[l]) << 5) + xorg - xbeam[l] + 1
tile = map[imap]
^(vismap + imap) = tile | $80
if tile <> FLOOR
vispix[l] = FALSE
else
if map[imap - 1] == WALL
^(vismap + imap - 1) = VISWALL
screen.[ycentr - ybeam[l], xcentr - xbeam[l] - 1] = WALL
fin
fin
screen.[ycentr - ybeam[l], xcentr - xbeam[l]] = tile
else
vispix[l] = FALSE
fin
next
break
wend
next
gotoxy(xcentr, ycentr)
putc(vplayer[dir])
else
gotoxy(xcentr, ycentr)
putc('@')
gotoxy(xcentr, ycentr)
putc('@')
fin
gotoxy(xcentr, ycentr)
end
@ -373,7 +413,7 @@ while TRUE
fin
break
is '+'
if lamp < beamdepth - 1
if lamp < maxlight - 1
lamp = lamp + 1
fin
break