mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-04-07 16:41:59 +00:00
read/write sprite files and flip h/v
This commit is contained in:
parent
57f6e85d3c
commit
a2d8d22c3d
@ -1,89 +1,288 @@
|
||||
include "inc/cmdsys.plh"
|
||||
include "inc/fileio.plh"
|
||||
include "inc/args.plh"
|
||||
include "inc/grlib.plh"
|
||||
include "inc/dcgrlib.plh"
|
||||
|
||||
sysflags restxt1|restxt2|resxtxt1|reshgr1|resxhgr1 // Reserve all the pages
|
||||
|
||||
byte[8] sprite1 = $85,$85,$00,$00,$00,$00,$85,$85
|
||||
byte[8] = $85,$00,$0A,$0A,$0A,$0A,$00,$85
|
||||
byte[8] sprinit = $05,$05,$00,$00,$00,$00,$05,$05
|
||||
byte[8] = $05,$00,$0A,$0A,$0A,$0A,$00,$05
|
||||
byte[8] = $00,$0A,$0F,$0F,$0F,$0F,$0A,$00
|
||||
byte[8] = $00,$0A,$0F,$85,$85,$0F,$0A,$00
|
||||
byte[8] = $00,$0A,$0F,$85,$85,$0F,$0A,$00
|
||||
byte[8] = $00,$0A,$0F,$05,$05,$0F,$0A,$00
|
||||
byte[8] = $00,$0A,$0F,$05,$05,$0F,$0A,$00
|
||||
byte[8] = $00,$0A,$0F,$0F,$0F,$0F,$0A,$00
|
||||
byte[8] = $85,$00,$0A,$0A,$0A,$0A,$00,$85
|
||||
byte[8] = $85,$85,$00,$00,$00,$00,$85,$85
|
||||
byte[40*40] grSprite
|
||||
byte[40*20] dcgrSprite
|
||||
byte[8*4] tile
|
||||
|
||||
byte quit = 0
|
||||
byte[8] = $05,$00,$0A,$0A,$0A,$0A,$00,$05
|
||||
byte[8] = $05,$05,$00,$00,$00,$00,$05,$05
|
||||
byte[40*48] grSprite
|
||||
byte[40*24] dcgrSprite
|
||||
char[64] filename = "Untitled"
|
||||
var arg
|
||||
byte quit = FALSE
|
||||
byte modified = TRUE
|
||||
byte xCursor = 20
|
||||
byte yCursor = 20
|
||||
byte yCursor = 24
|
||||
byte clrCursor = 0
|
||||
byte bgTileOfst = 0
|
||||
|
||||
def grViewClr#0
|
||||
word c
|
||||
byte[5] str
|
||||
def spriteRead(filestr)#5
|
||||
var sprptr, sprsize, xorg, yorg
|
||||
byte refnum, width, height
|
||||
|
||||
c = clrCursor | (clrCursor << 4)
|
||||
c = c | (c << 8)
|
||||
memset(@tile, c, 8*4)
|
||||
str[0] = 0
|
||||
grTileStr(0, 40, @str, 1, @tile)
|
||||
width = 0
|
||||
height = 0
|
||||
sprptr = 0
|
||||
refnum = fileio:open(filestr)
|
||||
if refnum
|
||||
fileio:read(refnum, @xorg, 1); xorg = sext(xorg)
|
||||
fileio:read(refnum, @yorg, 1); yorg = sext(yorg)
|
||||
fileio:read(refnum, @width, 1)
|
||||
fileio:read(refnum, @height, 1)
|
||||
puts("Sprite width, height = "); puti(width); puts(", "); puti(height); putln
|
||||
if width > 40 or height > 48
|
||||
fileio:close(refnum)
|
||||
return 0, 0, 0, 0, 0
|
||||
fin
|
||||
sprsize = (width + 1) / 2 * height
|
||||
sprptr = heapalloc(sprsize)
|
||||
if not sprptr
|
||||
fileio:close(refnum)
|
||||
return 0, 0, 0, 0, 0
|
||||
fin
|
||||
if fileio:read(refnum, sprptr, sprsize) <> sprsize
|
||||
fileio:close(refnum)
|
||||
return 0, 0, 0, 0, 0
|
||||
fin
|
||||
fileio:close(refnum)
|
||||
fin
|
||||
return xorg, yorg, width, height, sprptr
|
||||
end
|
||||
|
||||
def spriteWrite(filestr, xorg, yorg, width, height, sprptr, sprspan)#1
|
||||
var sprsize, result
|
||||
byte refnum, i
|
||||
|
||||
sprsize = (width + 1) / 2 * height
|
||||
result = FALSE
|
||||
fileio:destroy(filestr)
|
||||
if fileio:create(filestr, $06, $0000) == FILE_ERR_OK
|
||||
refnum = fileio:open(filestr)
|
||||
if refnum
|
||||
fileio:write(refnum, @xorg, 1)
|
||||
fileio:write(refnum, @yorg, 1)
|
||||
fileio:write(refnum, @width, 1)
|
||||
fileio:write(refnum, @height, 1)
|
||||
width = (width + 1) / 2
|
||||
while height
|
||||
if fileio:write(refnum, sprptr, width) <> width
|
||||
result = TRUE
|
||||
break
|
||||
fin
|
||||
sprptr = sprptr + sprspan
|
||||
height--
|
||||
loop
|
||||
fileio:close(refnum)
|
||||
fin
|
||||
fin
|
||||
return result
|
||||
end
|
||||
|
||||
def dcgr2gr(width, height, pdcgrSpr)#0
|
||||
var pgrSpr
|
||||
byte i, cl, ch
|
||||
|
||||
memset(@grSprite, $0505, 40*48)
|
||||
pgrSpr = @grSprite + (24 - height / 2) * 40
|
||||
pgrSpr = pgrSpr + 20 - width / 2
|
||||
while height
|
||||
for i = 0 to width-1 step 2
|
||||
cl = ^pdcgrSpr & $0F
|
||||
ch = ^pdcgrSpr >> 4
|
||||
*(pgrSpr + i) = cl | (ch << 8)
|
||||
pdcgrSpr++
|
||||
next
|
||||
pgrSpr = pgrSpr + 40
|
||||
height--
|
||||
loop
|
||||
end
|
||||
|
||||
def gr2dcgr#6
|
||||
word pgrSpr, pdcgrSpr
|
||||
byte xmin, xmax, ymin, ymax
|
||||
byte cl, ch, i, j
|
||||
|
||||
xmin = 39; xmax = 0
|
||||
ymin = 47; ymax = 0
|
||||
pgrSpr = @grSprite
|
||||
pdcgrSpr = @dcgrSprite
|
||||
for j = 0 to 47
|
||||
for i = 0 to 39 step 2
|
||||
cl = ^pgrSpr & $0F
|
||||
pgrSpr++
|
||||
if cl <> $05 // Transparent
|
||||
if xmin > i; xmin = i; fin
|
||||
if xmax < i; xmax = i; fin
|
||||
if ymin > j; ymin = j; fin
|
||||
if ymax < j; ymax = j; fin
|
||||
fin
|
||||
ch = ^pgrSpr & $0F
|
||||
pgrSpr++
|
||||
if ch <> $05 // Transparent
|
||||
if xmin > i + 1; xmin = i + 1; fin
|
||||
if xmax < i + 1; xmax = i + 1; fin
|
||||
if ymin > j; ymin = j; fin
|
||||
if ymax < j; ymax = j; fin
|
||||
fin
|
||||
^pdcgrSpr = cl | (ch << 4)
|
||||
pdcgrSpr++
|
||||
next
|
||||
next
|
||||
pdcgrSpr = @dcgrSprite + ymin * 20 + (xmin + 1) / 2
|
||||
return xCursor - xmin, yCursor - ymin, xmax - xmin + 1, ymax - ymin + 1, pdcgrSpr, 20
|
||||
end
|
||||
|
||||
def readFile#1
|
||||
var xorg, yorg, width, height, sprptr
|
||||
|
||||
xorg, yorg, width, height, sprptr = spriteRead(@filename)
|
||||
if sprptr
|
||||
heaprelease(sprptr)
|
||||
dcgr2gr(width, height, sprptr)
|
||||
fin
|
||||
return sprptr == NULL
|
||||
end
|
||||
|
||||
def writeFile#1
|
||||
var xorg, yorg, width, height, sprptr, sprspan
|
||||
|
||||
xorg, yorg, width, height, sprptr, sprspan = gr2dcgr
|
||||
return spriteWrite(@filename, xorg, yorg, width, height, sprptr, sprspan)
|
||||
end
|
||||
|
||||
def getCmd#1
|
||||
var cmdstr, xorg, yorg, width, height, sprptr, sprspan, grspr
|
||||
byte cl, ch
|
||||
|
||||
while 1
|
||||
if modified; putc('*'); fin
|
||||
puts(@filename)
|
||||
cmdstr = gets(':'|$80)
|
||||
if ^cmdstr
|
||||
when toupper(^(cmdstr + 1))
|
||||
is 'R'
|
||||
if modified
|
||||
puts("Lose changes (Y/N)?")
|
||||
if toupper(getc) <> 'Y'
|
||||
break
|
||||
fin
|
||||
putln
|
||||
fin
|
||||
repeat // Skip to filename
|
||||
^cmdstr--
|
||||
memcpy(cmdstr + 1, cmdstr + 2, ^cmdstr)
|
||||
until ^cmdstr == 0 or ^(cmdstr + 1) <> ' '
|
||||
if ^cmdstr
|
||||
memcpy(@filename, cmdstr, ^cmdstr + 1)
|
||||
fin
|
||||
modified = readFile
|
||||
break
|
||||
is 'W'
|
||||
repeat // Skip to filename
|
||||
^cmdstr--
|
||||
memcpy(cmdstr + 1, cmdstr + 2, ^cmdstr)
|
||||
until ^cmdstr == 0 or ^(cmdstr + 1) <> ' '
|
||||
if ^cmdstr
|
||||
memcpy(@filename, cmdstr, ^cmdstr + 1)
|
||||
fin
|
||||
modified = writeFile
|
||||
break
|
||||
is 'Q'
|
||||
if modified
|
||||
puts("Lose changes (Y/N)?")
|
||||
if toupper(getc) == 'Y'
|
||||
return TRUE
|
||||
fin
|
||||
putln
|
||||
else
|
||||
return TRUE
|
||||
fin
|
||||
break
|
||||
otherwise
|
||||
puts("?\n")
|
||||
wend
|
||||
else
|
||||
return FALSE
|
||||
fin
|
||||
loop
|
||||
return FALSE
|
||||
end
|
||||
|
||||
def flipV#0
|
||||
byte[40] tmpRow
|
||||
byte j
|
||||
|
||||
for j = 0 to 23
|
||||
memcpy(@tmpRow, @grSprite + j * 40, 40)
|
||||
memcpy(@grSprite + j * 40, @grSprite + (47 - j) * 40, 40)
|
||||
memcpy(@grSprite + (47 - j) * 40, @tmpRow, 40)
|
||||
next
|
||||
end
|
||||
|
||||
def flipH#0
|
||||
byte i, j, tmpPix
|
||||
|
||||
for i = 0 to 19
|
||||
for j = 0 to 47
|
||||
tmpPix = grSprite[j * 40 + i]
|
||||
grSprite[j * 40 + i] = grSprite[j * 40 + 39 - i]
|
||||
grSprite[j * 40 + 39 - i] = tmpPix
|
||||
next
|
||||
next
|
||||
end
|
||||
|
||||
def grView#0
|
||||
grClear(5)
|
||||
grBLT(0, 0, 40, 40, @grSprite)
|
||||
grViewClr
|
||||
grBLT(0, 0, 40, 48, @grSprite)
|
||||
end
|
||||
|
||||
def grGetKey#1
|
||||
byte c
|
||||
byte f, c
|
||||
|
||||
^$C010
|
||||
c = 0
|
||||
c = grSprite[yCursor * 40 + xCursor] & $0F
|
||||
f = 0
|
||||
while ^$C000 < 128
|
||||
grColor(c)
|
||||
grPlot(xCursor, yCursor)
|
||||
c++
|
||||
when f
|
||||
is 0
|
||||
grColor(clrCursor)
|
||||
grPlot(xCursor, yCursor)
|
||||
break
|
||||
is 128
|
||||
grColor(c)
|
||||
grPlot(xCursor, yCursor)
|
||||
break
|
||||
wend
|
||||
f++
|
||||
loop
|
||||
grColor(grSprite[yCursor * 40 + xCursor] & $0F)
|
||||
grColor(c)
|
||||
grPlot(xCursor, yCursor)
|
||||
return ^$C010 & $7F
|
||||
end
|
||||
|
||||
def dcgrTestView(bounce)#0
|
||||
byte cl, ch, i, j, inci, incj
|
||||
word pgrSpr, pdcgrSpr
|
||||
byte i, j, inci, incj
|
||||
|
||||
pgrSpr = @grSprite
|
||||
pdcgrSpr = @dcgrSprite
|
||||
for j = 0 to 39
|
||||
for i = 0 to 39 step 2
|
||||
cl = ^pgrSpr & $0F
|
||||
pgrSpr++
|
||||
ch = ^pgrSpr & $0F
|
||||
pgrSpr++
|
||||
^pdcgrSpr = cl | (ch << 4)
|
||||
pdcgrSpr++
|
||||
next
|
||||
next
|
||||
i = 70-20; inci = 0
|
||||
j = 96-20; incj = 0
|
||||
if bounce
|
||||
inci = 1
|
||||
incj = 1
|
||||
fin
|
||||
gr2dcgr
|
||||
i = 70-20; inci = bounce
|
||||
j = 96-24; incj = bounce
|
||||
grMode(grOff)
|
||||
dcgrMode(0)
|
||||
while ^$C000 < 128
|
||||
dcgrPixMap(i, j, 40, 40, @dcgrSprite)
|
||||
dcgrPixMap(i, j, 40, 48, @dcgrSprite)
|
||||
i = i + inci
|
||||
if i < 1 or i > 139-40; inci = -inci; fin
|
||||
j = j + incj
|
||||
if j < 1 or j > 191-40; incj = -incj; fin
|
||||
if j < 1 or j > 191-48; incj = -incj; fin
|
||||
loop
|
||||
^$C010
|
||||
dcgrMode(-1)
|
||||
@ -92,49 +291,71 @@ def dcgrTestView(bounce)#0
|
||||
grView
|
||||
end
|
||||
|
||||
memset(@grSprite, $8585, 40*40)
|
||||
for quit = 0 to 8
|
||||
memcpy(@grSprite + quit*40 + 16*40 + 16, @sprite1 + quit*8, 8)
|
||||
next
|
||||
quit = 0
|
||||
memset(@grSprite, $0505, 40*48)
|
||||
arg = argNext(argFirst)
|
||||
if ^arg
|
||||
memcpy(@filename, arg, ^arg + 1)
|
||||
modified = readFile
|
||||
fin
|
||||
if modified
|
||||
for modified = 0 to 8
|
||||
memcpy(@grSprite + modified*40 + 20*40 + 16, @sprinit + modified*8, 8)
|
||||
next
|
||||
modified = 0
|
||||
fin
|
||||
grMode(grPage1)
|
||||
grDrawBuf(grPage1)
|
||||
grView
|
||||
while not quit
|
||||
when grGetKey
|
||||
is 'i'
|
||||
is $0B // Up arrow
|
||||
if yCursor > 0; yCursor--; fin
|
||||
break
|
||||
is 'm'
|
||||
if yCursor < 39; yCursor++; fin
|
||||
is $0A // Down arrow
|
||||
if yCursor < 47; yCursor++; fin
|
||||
break
|
||||
is 'j'
|
||||
is $08 // Left arrow
|
||||
if xCursor > 0; xCursor--; fin
|
||||
break
|
||||
is 'k'
|
||||
is $15 // Right arrow
|
||||
if xCursor < 39; xCursor++; fin
|
||||
break
|
||||
is ' '
|
||||
grSprite[yCursor*40 + xCursor] = clrCursor == 5 ?? $85 :: clrCursor
|
||||
modified = 1
|
||||
grSprite[yCursor*40 + xCursor] = clrCursor
|
||||
grView
|
||||
break
|
||||
is '+'
|
||||
is '='
|
||||
if clrCursor < 15; clrCursor++; fin
|
||||
grViewClr
|
||||
clrCursor = (clrCursor + 1) & $0F
|
||||
break
|
||||
is '-'
|
||||
if clrCursor > 0; clrCursor--; fin
|
||||
grViewClr
|
||||
break
|
||||
is 'v'
|
||||
dcgrTestView(FALSE)
|
||||
clrCursor = (clrCursor - 1) & $0F
|
||||
break
|
||||
is 't'
|
||||
dcgrTestView(TRUE)
|
||||
dcgrTestView(0)
|
||||
break
|
||||
is 'q'
|
||||
quit = 1
|
||||
is 'b'
|
||||
dcgrTestView(1)
|
||||
break
|
||||
is 'v'
|
||||
modified = 1
|
||||
flipV
|
||||
grView
|
||||
break
|
||||
is 'h'
|
||||
modified = 1
|
||||
flipH
|
||||
grView
|
||||
break
|
||||
is $1B // Escape
|
||||
grMode(grOff)
|
||||
quit = getCmd
|
||||
if not quit
|
||||
grMode(grPage1)
|
||||
grDrawBuf(grPage1)
|
||||
grView
|
||||
fin
|
||||
break
|
||||
wend
|
||||
loop
|
||||
|
@ -217,32 +217,32 @@ def dcgrRect(x, y, w, h)#0
|
||||
dcgrHLin(x, x2, v)
|
||||
next
|
||||
end
|
||||
def dcgrCompSprite#0
|
||||
def dcgrCompSprite(offset)#0
|
||||
byte i
|
||||
|
||||
for i = 0 to 6
|
||||
sprite7[i], sprite7span = dcgrAllocBl7Mem(SPRW, SPRH)
|
||||
sprite7[i], sprite7span = dcgrAllocBl7Mem(SPRW + offset, SPRH)
|
||||
sprite7w = sprite7span >> 2
|
||||
dcgrSurfMem(OP_SRC, SPRH, sprite7[i], sprite7span)
|
||||
dcgrColor(CLR_BLACK)
|
||||
dcgrClearBl7(0, 0, sprite7w, SPRH)
|
||||
dcgrPixMap(i + 2, 0, SPRW, SPRH, @sprite)
|
||||
dcgrPixMap(i + offset, 0, SPRW, SPRH, @sprite)
|
||||
dcgrSurfScr(OP_SRC)
|
||||
dcgrMemBl7(0, i * SPRH, sprite7w, SPRH, sprite7[i], sprite7span)
|
||||
next
|
||||
end
|
||||
def dcgrCompMask#0
|
||||
def dcgrCompMask(offset)#0
|
||||
byte i
|
||||
|
||||
for i = 0 to 6
|
||||
sprite7msk[i], sprite7span = dcgrAllocBl7Mem(SPRW, SPRH)
|
||||
sprite7msk[i], sprite7span = dcgrAllocBl7Mem(SPRW + offset, SPRH)
|
||||
sprite7w = sprite7span >> 2
|
||||
dcgrSurfMem(OP_SRC, SPRH, sprite7msk[i], sprite7span)
|
||||
dcgrColor(CLR_WHITE)
|
||||
dcgrClearBl7(0, 0, sprite7w, SPRH)
|
||||
dcgrPixMap(i + 2, 0, SPRW, SPRH, @sprite)
|
||||
dcgrPixMap(i + offset, 0, SPRW, SPRH, @sprite)
|
||||
dcgrOp(OP_XOR)
|
||||
dcgrPixMap(i + 2, 0, SPRW, SPRH, @sprite)
|
||||
dcgrPixMap(i + offset, 0, SPRW, SPRH, @sprite)
|
||||
dcgrSurfScr(OP_SRC)
|
||||
dcgrMemBl7(sprite7w, i * SPRH, sprite7w, SPRH, sprite7msk[i], sprite7span)
|
||||
next
|
||||
@ -476,8 +476,8 @@ def dcgrTest#0
|
||||
getc
|
||||
end
|
||||
dcgrMode(0)
|
||||
dcgrCompSprite
|
||||
dcgrCompMask
|
||||
dcgrCompSprite(2)
|
||||
dcgrCompMask(2)
|
||||
dcgrTest
|
||||
dcgrMode(-1)
|
||||
done
|
||||
|
Loading…
x
Reference in New Issue
Block a user