mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-01-10 06:30:41 +00:00
Rogue demo
This commit is contained in:
parent
a7dfaf1b53
commit
9884bd925b
348
src/samplesrc/rogue.pla
Executable file
348
src/samplesrc/rogue.pla
Executable file
@ -0,0 +1,348 @@
|
||||
const FALSE = 0
|
||||
const TRUE = not FALSE
|
||||
//
|
||||
// Octant beam parameters
|
||||
//
|
||||
const beamdepth = 10
|
||||
const octpts = 52
|
||||
//
|
||||
// X offsets
|
||||
//
|
||||
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[] 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[] 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
|
||||
|
||||
const maprows = 21
|
||||
const mapcols = 32
|
||||
|
||||
byte[] map
|
||||
byte = "###############################"
|
||||
byte = "#.................#...........#"
|
||||
byte = "#.............###.#.........#.#"
|
||||
byte = "#......##.......#.#.........#.#"
|
||||
byte = "#......##.......#.#.........#.#"
|
||||
byte = "#...............#...........#.#"
|
||||
byte = "#...............#...........#.#"
|
||||
byte = "#......##.......#.#.........#.#"
|
||||
byte = "#......##.......#.#.........#.#"
|
||||
byte = "#...............#.#.........#.#"
|
||||
byte = "#...............#.###########.#"
|
||||
byte = "#......##.......#.#...........#"
|
||||
byte = "#......##.......#.#......######"
|
||||
byte = "#...............#.#......#....#"
|
||||
byte = "#...............#.#......#....#"
|
||||
byte = "#......##.......#.#......#....#"
|
||||
byte = "#......##.......#.#......#....#"
|
||||
byte = "#.#.............#.#......#....#"
|
||||
byte = "#.###############.#......###..#"
|
||||
byte = "#.................#...........#"
|
||||
byte = "######################################"
|
||||
|
||||
const xcentr = 20
|
||||
const ycentr = 12
|
||||
|
||||
word[] screen
|
||||
word = $400, $480, $500, $580, $600, $680, $700, $780
|
||||
word = $428, $4A8, $528, $5A8, $628, $6A8, $728, $7A8
|
||||
word = $450, $4D0, $550, $5D0, $650, $6D0, $750, $7D0
|
||||
|
||||
word xdir = 0, 1, 1, 1, 0, -1, -1, -1
|
||||
word ydir = -1, -1, 0, 1, 1, 1, 0, -1
|
||||
word xplayer = 5
|
||||
word yplayer = 5
|
||||
byte aplayer = 0
|
||||
byte lamp = 10
|
||||
byte fov = 1
|
||||
byte vplayer = '^', '\\', '>', '/', 'v', '\\', '<', '/'
|
||||
|
||||
def drawmap(xorg, yorg, dir, light)
|
||||
byte[octpts] vispix
|
||||
byte o, l, tile, occlude
|
||||
word ymap, xmap
|
||||
byte yscr, xscr
|
||||
home
|
||||
//
|
||||
// Draw background map
|
||||
//
|
||||
for yscr = 0 to 23
|
||||
ymap = yscr - ycentr + yorg
|
||||
if ymap >= 0 and ymap < maprows
|
||||
for xscr = 0 to 39
|
||||
xmap = xscr - xcentr + xorg
|
||||
if xmap >= 0 and xmap < mapcols - 1
|
||||
screen.[yscr, xscr] = map[(ymap << 5) + xmap + 1] | $80
|
||||
fin
|
||||
next
|
||||
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]]
|
||||
tile = map[((yorg - ybeam[l]) << 5) + xorg + xbeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg - ybeam[l]) << 5) + xorg + xbeam[l] + 2] == '#'
|
||||
screen.[ycentr - ybeam[l], xcentr + xbeam[l] + 1] = '#'
|
||||
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]]
|
||||
tile = map[((yorg - xbeam[l]) << 5) + xorg + ybeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg - xbeam[l] - 1) << 5) + xorg + ybeam[l] + 1] == '#'
|
||||
screen.[ycentr - xbeam[l] - 1, xcentr + ybeam[l]] = '#'
|
||||
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]]
|
||||
tile = map[((yorg + xbeam[l]) << 5) + xorg + ybeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg - xbeam[l] + 1) << 5) + xorg + ybeam[l] + 1] == '#'
|
||||
screen.[ycentr - xbeam[l] + 1, xcentr + ybeam[l]] = '#'
|
||||
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]]
|
||||
tile = map[((yorg + ybeam[l]) << 5) + xorg + xbeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg + ybeam[l]) << 5) + xorg + xbeam[l] + 2] == '#'
|
||||
screen.[ycentr + ybeam[l], xcentr + xbeam[l] + 1] = '#'
|
||||
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]]
|
||||
tile = map[((yorg + ybeam[l]) << 5) + xorg - xbeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg + ybeam[l]) << 5) + xorg - xbeam[l]] == '#'
|
||||
screen.[ycentr + ybeam[l], xcentr - xbeam[l] - 1] = '#'
|
||||
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]]
|
||||
tile = map[((yorg + xbeam[l]) << 5) + xorg - ybeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg + xbeam[l] + 1) << 5) + xorg - ybeam[l] + 1] == '#'
|
||||
screen.[ycentr + xbeam[l] + 1, xcentr - ybeam[l]] = '#'
|
||||
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]]
|
||||
tile = map[((yorg - xbeam[l]) << 5) + xorg - ybeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg - xbeam[l] - 1) << 5) + xorg - ybeam[l] + 1] == '#'
|
||||
screen.[ycentr - xbeam[l] - 1, xcentr - ybeam[l]] = '#'
|
||||
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]]
|
||||
tile = map[((yorg - ybeam[l]) << 5) + xorg - xbeam[l] + 1]
|
||||
if tile <> '.'
|
||||
vispix[l] = FALSE
|
||||
else
|
||||
if map[((yorg - ybeam[l]) << 5) + xorg - xbeam[l]] == '#'
|
||||
screen.[ycentr - ybeam[l], xcentr - xbeam[l] - 1] = '#'
|
||||
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])
|
||||
gotoxy(xcentr, ycentr)
|
||||
end
|
||||
|
||||
def moveplayer(dir)
|
||||
xplayer = xplayer + dir * xdir[aplayer]
|
||||
yplayer = yplayer + dir * ydir[aplayer]
|
||||
if map[yplayer * mapcols + xplayer + 1] <> '.'
|
||||
xplayer = xplayer - dir * xdir[aplayer]
|
||||
yplayer = yplayer - dir * ydir[aplayer]
|
||||
fin
|
||||
end
|
||||
|
||||
while TRUE
|
||||
drawmap(xplayer, yplayer, aplayer, lamp)
|
||||
when getc()
|
||||
is ','
|
||||
is '<'
|
||||
if fov > 0
|
||||
fov = fov - 1
|
||||
fin
|
||||
break
|
||||
is '.'
|
||||
is '>'
|
||||
if fov < 4
|
||||
fov = fov + 1
|
||||
fin
|
||||
break
|
||||
is '-'
|
||||
if lamp > 1
|
||||
lamp = lamp - 1
|
||||
fin
|
||||
break
|
||||
is '+'
|
||||
if lamp < 9
|
||||
lamp = lamp + 1
|
||||
fin
|
||||
break
|
||||
is 'i'
|
||||
is 'I'
|
||||
aplayer = 0
|
||||
moveplayer(1)
|
||||
break
|
||||
is 'j'
|
||||
is 'J'
|
||||
aplayer = 6
|
||||
moveplayer(1)
|
||||
break
|
||||
is 'k'
|
||||
is 'K'
|
||||
aplayer = 2
|
||||
moveplayer(1)
|
||||
break
|
||||
is 'm'
|
||||
is 'M'
|
||||
aplayer = 4
|
||||
moveplayer(1)
|
||||
break
|
||||
is 'q'
|
||||
is 'Q'
|
||||
moveplayer(1)
|
||||
is 'a'
|
||||
is 'A'
|
||||
is $0B
|
||||
moveplayer(1)
|
||||
break
|
||||
is 'z'
|
||||
is 'Z'
|
||||
is $0A
|
||||
moveplayer(-1)
|
||||
break
|
||||
is $08
|
||||
aplayer = (aplayer - 1) & 7
|
||||
break
|
||||
is $15
|
||||
aplayer = (aplayer + 1) & 7
|
||||
break
|
||||
is 'x'
|
||||
is 'X'
|
||||
return
|
||||
wend
|
||||
loop
|
||||
done
|
Loading…
x
Reference in New Issue
Block a user