1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-06-26 06:29:28 +00:00

Pre-compile sprites and more animations and audio

This commit is contained in:
David Schmenk 2020-01-07 16:08:48 -08:00
parent 09d861e5a5
commit 0c57570d4a
7 changed files with 289 additions and 263 deletions

View File

@ -137,8 +137,8 @@ export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1
sprtptr->s_height = h
sprtptr->s_xcenter = xcenter
sprtptr->s_ycenter = ycenter
sprtptr=>s_under[0] = 0//heapalloc(spritesize)
sprtptr=>s_under[1] = 0//heapalloc(spritesize)
sprtptr=>s_under[0] = 0
sprtptr=>s_under[1] = 0
for i = 0 to 13
sprtptr=>s_map[i] = heapalloc(spritesize)
sprtptr=>s_mask[i] = heapalloc(spritesize)
@ -158,15 +158,14 @@ export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1
return sprtptr
end
export def spriteDup(sprtsrc)#1
var sprtdup, spritesize
var sprtdup
byte i
sprtdup = heapalloc(t_sprite)
if not sprtdup; return 0; fin
memcpy(sprtdup, sprtsrc, t_sprite)
//spritesize = sprtdup=>s_size
sprtdup=>s_under[0] = 0//heapalloc(spritesize)
sprtdup=>s_under[1] = 0//heapalloc(spritesize)
sprtdup=>s_under[0] = 0
sprtdup=>s_under[1] = 0
return sprtdup
end
export def spriteRead(filestr)#1
@ -175,20 +174,20 @@ export def spriteRead(filestr)#1
sprtptr = heapalloc(t_sprite)
if not sprtptr; return 0; fin
refnum = fileio:open(@filestr)
refnum = fileio:open(filestr)
if refnum
if fileio:read(refnum, sprtptr, t_sprite) == t_sprite
spritesize = sprtptr=>s_size
sprtptr=>s_under[0] = heapalloc(spritesize)
sprtptr=>s_under[1] = heapalloc(spritesize)
if not sprtptr=>s_under[0] or not sprtptr=>s_under[1]
heaprelease(sprtptr)
fileio:close(refnum)
return 0
fin
sprtptr=>s_under[0] = 0
sprtptr=>s_under[1] = 0
for i = 0 to 13
sprtptr=>s_map[i] = 0//heapalloc(spritesize)
sprtptr=>s_mask[i] = 0//heapalloc(spritesize)
sprtptr=>s_map[i] = heapalloc(spritesize)
sprtptr=>s_mask[i] = heapalloc(spritesize)
if not sprtptr=>s_map[i] or not sprtptr=>s_mask[i]
heaprelease(sprtptr)
fileio:close(refnum)
return 0
fin
fileio:read(refnum, sprtptr=>s_map[i], spritesize)
fileio:read(refnum, sprtptr=>s_mask[i], spritesize)
next
@ -207,9 +206,9 @@ export def spriteSave(filestr, sprtptr)#1
var spritesize
byte refnum, i
fileio:destroy(@filestr)
if fileio:create(@filestr, $06, $0000) == FILE_ERR_OK
refnum = fileio:open(@filestr)
fileio:destroy(filestr)
if fileio:create(filestr, $06, $0000) == FILE_ERR_OK
refnum = fileio:open(filestr)
if refnum
if fileio:write(refnum, sprtptr, t_sprite) == t_sprite
spritesize = sprtptr=>s_size

View File

@ -305,7 +305,7 @@ TONELP SBC #$01 ; 2
;+4 = 11 (from BNE above)
+++ BIT $C000 ; 4
BMI TONEXIT ; 2
NOP ; 2
BPL TONELP ; 3
;---
;+9 = 20

View File

@ -66,6 +66,7 @@ HGRSPRITE = rel/apple/HGRSPRITE\#FE1000
LINES = rel/LINES\#FE1000
GRAFIX = rel/apple/GRAFIX\#FE1000
SFM = rel/apple/SFM\#FE1000
SFMSPRT = rel/apple/SFMSPRT\#FE1000
GFXDEMO = rel/apple/GFXDEMO\#FE1000
JOYBUZZ = rel/apple/JOYBUZZ\#FE1000
PORTIO = rel/apple/PORTIO\#FE1000
@ -105,7 +106,7 @@ TXTTYPE = .TXT
#SYSTYPE = \#FF2000
#TXTTYPE = \#040000
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ZIP) $(MATCHFILES) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ZIP) $(MATCHFILES) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
-rm vmsrc/plvmzp.inc
@ -263,6 +264,10 @@ $(SFM): samplesrc/sfm.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/sfm.pla > samplesrc/sfm.a
acme --setpc 4094 -o $(SFM) samplesrc/sfm.a
$(SFMSPRT): samplesrc/sfmsprt.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/sfmsprt.pla > samplesrc/sfmsprt.a
acme --setpc 4094 -o $(SFMSPRT) samplesrc/sfmsprt.a
$(ROGUE): samplesrc/rogue.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/rogue.pla > samplesrc/rogue.a
acme --setpc 4094 -o $(ROGUE) samplesrc/rogue.a

View File

@ -75,12 +75,15 @@ cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL
cp rel/apple/GRTEST#FE1000 prodos/demos/GRTEST.REL
cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL
cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL
cp rel/apple/SFM#FE1000 prodos/demos/SFM.REL
cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL
cp rel/RPNCALC#FE1000 prodos/demos/RPNCALC.REL
cp rel/LZ4CAT#FE1000 prodos/demos/LZ4CAT.REL
cp rel/PRIMEGAP#FE1000 prodos/demos/PRIMEGAP.REL
mkdir prodos/demos/spiders
cp rel/apple/SFM#FE1000 prodos/demos/spiders/SFM.REL
cp rel/apple/SFMSPRT#FE1000 prodos/demos/spiders/SFMSPRT.REL
mkdir prodos/demos/rogue
cp rel/ROGUE#FE1000 prodos/demos/rogue/ROGUE.REL
cp rel/ROGUECOMBAT#FE1000 prodos/demos/rogue/ROGUECOMBAT.REL
@ -134,6 +137,7 @@ cp samplesrc/fatcat.pla prodos/bld/samples/FATCAT.PLA.TXT
cp samplesrc/gfxdemo.pla prodos/bld/samples/GFXDEMO.PLA.TXT
cp samplesrc/lz4cat.pla prodos/bld/samples/Z4CAT.PLA.TXT
cp samplesrc/sfm.pla prodos/bld/samples/SFM.PLA.TXT
cp samplesrc/sfmsprt.pla prodos/bld/samples/SFMSPRT.PLA.TXT
#mkdir prodos/bld/examples
#cp samplesrc/examples/ex.1.pla prodos/bld/examples/EX.1.PLA.TXT

View File

@ -1,3 +1,6 @@
//
// Ziggy Stardust and the Spiders from Mars
//
include "inc/cmdsys.plh"
include "inc/hgrlib.plh"
include "inc/hgrsprite.plh"
@ -9,185 +12,93 @@ const SHIP_SPRTNUM = 0
const MISSLE_SPRTNUM = 1
const WEB_SPRTBASE = 2
const SPIDER_SPRTEBASE = 8
const FULL_CHARGE = 20
const LASER_RECHARGE = 20
const MISSLE_RELOAD = 10
const ATTACK_SPEED = 12
const SWARM_LIMIT = 52
const FASTMOVE_LIMIT = 120
const WEB_LIMIT = 152
const YSHIP = 180
const LASER_BUZZ = 20
const ATTACK_BUZZ = 5
const WEB1_BUZZ = 10
const WEB2_BUZZ = 12
const WEB3_BUZZ = 14
const SPLAT_BUZZ = 40
byte egg3 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$11,$33,$38,$88
byte = $83,$31,$11,$11,$11,$13,$38
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $33,$11,$11,$11,$11,$11,$33
byte = $83,$31,$11,$11,$11,$13,$38
byte = $88,$83,$33,$11,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte egg2 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$11,$33,$38,$88
byte = $83,$30,$11,$00,$11,$13,$38
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $33,$11,$00,$11,$00,$11,$33
byte = $33,$00,$11,$00,$11,$00,$33
byte = $83,$31,$00,$11,$00,$13,$38
byte = $88,$83,$33,$00,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte egg1 = $88,$88,$83,$33,$38,$88,$88
byte = $88,$83,$33,$00,$33,$38,$88
byte = $83,$30,$00,$00,$00,$03,$38
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $33,$00,$00,$00,$00,$00,$33
byte = $83,$30,$00,$00,$00,$03,$38
byte = $88,$83,$33,$11,$33,$38,$88
byte = $88,$88,$83,$33,$38,$88,$88
byte spider3 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$32,$22,$22,$23,$38,$88,$33
byte = $83,$38,$83,$32,$22,$22,$23,$38,$83,$38
byte = $88,$83,$33,$22,$22,$22,$22,$33,$38,$88
byte = $33,$88,$33,$22,$22,$22,$22,$33,$88,$33
byte = $88,$33,$38,$33,$22,$22,$33,$83,$33,$88
byte = $88,$88,$83,$33,$22,$22,$33,$38,$88,$88
byte = $88,$33,$33,$33,$22,$22,$33,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$33,$22,$22,$33,$33,$88,$88
byte = $88,$33,$88,$33,$22,$22,$33,$88,$33,$88
byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte spider2 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$30,$02,$20,$03,$38,$88,$33
byte = $83,$38,$83,$32,$20,$02,$23,$38,$83,$38
byte = $88,$83,$33,$20,$02,$20,$02,$33,$38,$88
byte = $33,$88,$33,$02,$20,$02,$20,$33,$88,$33
byte = $88,$33,$38,$30,$02,$20,$03,$83,$33,$88
byte = $88,$88,$83,$33,$20,$02,$33,$38,$88,$88
byte = $88,$33,$33,$30,$02,$20,$03,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$30,$02,$20,$03,$33,$88,$88
byte = $88,$33,$88,$33,$20,$02,$33,$88,$33,$88
byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte spider1 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33
byte = $33,$88,$83,$30,$00,$00,$03,$38,$88,$33
byte = $83,$38,$83,$30,$00,$00,$03,$38,$83,$38
byte = $88,$83,$33,$00,$00,$00,$00,$33,$38,$88
byte = $33,$88,$33,$00,$00,$00,$00,$33,$88,$33
byte = $88,$33,$38,$33,$00,$00,$33,$83,$33,$88
byte = $88,$88,$83,$33,$00,$00,$33,$38,$88,$88
byte = $88,$33,$33,$30,$00,$00,$03,$33,$33,$88
byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33
byte = $88,$88,$33,$30,$00,$00,$03,$33,$88,$88
byte = $88,$33,$88,$33,$00,$00,$33,$88,$33,$88
byte = $33,$88,$88,$83,$30,$03,$38,$88,$88,$33
byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88
byte web1 = $88,$83,$38,$88
byte = $88,$38,$83,$88
byte = $88,$38,$83,$88
byte = $88,$33,$33,$88
byte = $83,$38,$83,$38
byte = $83,$38,$83,$38
byte = $83,$38,$83,$38
byte = $33,$33,$33,$33
byte web2 = $88,$33,$83,$38,$33,$88
byte = $88,$38,$83,$38,$83,$88
byte = $83,$38,$83,$38,$83,$38
byte = $83,$33,$33,$33,$33,$38
byte = $83,$38,$83,$38,$83,$38
byte = $83,$38,$83,$38,$83,$38
byte = $33,$88,$83,$38,$88,$33
byte = $33,$33,$33,$33,$33,$33
byte web3 = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88
byte = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88
byte = $88,$33,$88,$33,$88,$88,$33,$88,$33,$88
byte = $88,$33,$33,$33,$33,$33,$33,$33,$33,$88
byte = $83,$38,$88,$33,$83,$38,$33,$88,$83,$38
byte = $83,$38,$83,$38,$83,$38,$83,$38,$83,$38
byte = $33,$88,$83,$38,$83,$38,$83,$38,$88,$33
byte = $33,$38,$33,$33,$33,$33,$33,$33,$33,$33
byte ship = $CC,$CC,$CC,$77,$CC,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $CC,$CC,$C7,$77,$7C,$CC,$CC
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$66,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$CC,$77,$77,$77,$CC,$77
byte = $77,$C7,$77,$77,$77,$7C,$77
byte = $77,$77,$75,$55,$57,$77,$77
byte = $77,$77,$75,$55,$57,$77,$77
byte missle = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $CC,$55,$CC
byte = $C5,$55,$5C
byte = $55,$55,$55
byte dummy = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
byte = $88,$88,$88,$88
var sprtEgg1, sprtEgg2, sprtEgg3
var sprtSpider1, sprtSpider2, sprtSpider3
var sprtEgg1, sprtEgg2, sprtEgg3, sprtEgg
var sprtSpider1, sprtSpider2, sprtSpider3, sprtSpider
var sprtSplat1, sprtSplat2
var sprtWeb1, sprtWeb2, sprtWeb3
var sprtShip, sprtMissle, sprtDummy
var[NUMSTARS] xstar
byte[NUMSTARS] ystar
byte won, curstar
def initStars#0
byte k
xstar[0] = 99
ystar[0] = 10
hgrColor(3)
hgrXorPlot(xstar[0], ystar[0])
for k = 1 to NUMSTARS-1
xstar[k] = (xstar[k - 1] + 97 - k) % 280
ystar[k] = (ystar[k - 1] + 19 + k) % YSHIP
hgrXorPlot(xstar[k], ystar[k])
next
curstar = 0
end
def updateStars#0
hgrColor(3)
hgrXorPlot(xstar[curstar], ystar[curstar])
ystar[curstar]++
if ystar[curstar] > YSHIP
ystar[curstar] = 0
fin
hgrXorPlot(xstar[curstar], ystar[curstar])
curstar++
if curstar >= NUMSTARS; curstar = 0; fin
end
byte curstar, buzz
//
// Apple II speaker tone generator routine
//
//asm spkrTone(pitch, duration)#0
byte _spkrTone[]
byte = $86, $E5 // STX ESP
byte = $B4, $C0 // LDY ESTKH,X
byte = $B5, $D0 // LDA ESTKL,X
byte = $F0, $01 // BEQ +1
byte = $C8 // INY
byte = $85, $08 // STA DSTL
byte = $84, $09 // STY DSTH
byte = $B4, $C1 // LDY ESTKL+1,X
byte = $B5, $D1 // LDA ESTKL+1,X
byte = $F0, $01 // BEQ +1
byte = $C8 // INY
byte = $85, $E7 // STA TMPL
byte = $84, $E8 // STY TMPH
byte = $AA // TAX
byte = $A9, $FF // LDA #$FF
byte = $08 // PHP
byte = $78 // SEI
byte = $EA // NOP
byte = $EA // NOP
byte = $B0, $00 // BCS +0
byte = $38 // SEC
byte = $CA // DEX
byte = $D0, $18 // BNE +18
byte = $88 // DEY
byte = $D0, $17 // BNE +17
byte = $2C, $30, $C0 // BIT $C030
byte = $A6, $E7 // LDX TMPL
byte = $A4, $E8 // LDY TMPH
byte = $E9, $01 // SBC #$01
byte = $B0, $EA // BCS -EA
byte = $C6, $08 // DEC DSTL
byte = $D0, $EA // BNE -EA
byte = $C6, $09 // DEC DSTH
byte = $D0, $E6 // BNE -E6
byte = $F0, $07 // BEQ +8
byte = $EA // NOP
byte = $EA // NOP
byte = $EA, $EA // BIT $C000 (nope)
byte = $EA // NOP
byte = $D0, $EB // BNE -EA
byte = $28 // PLP
byte = $A6, $E5 // LDX ESP
byte = $E8 // INX
byte = $E8 // INX
byte = $60 // RTS
def game(spdrcnt)#1
var[8] xspdr, yspdr, ixspdr, iyspdr, hatch
var xship, xmissle, leftxlaser, rightxlaser, attack
byte[8] life
byte lasercharge, misslecnt, ymissle, leftylaser, rightylaser, lefthit, righthit, width
byte[8] life, death
byte lasercharging, missleloading, misslecnt, ymissle
byte leftylaser, rightylaser, lefthit, righthit, sprtnum[], width
byte spdrnum, k, xdelta, ydelta, btn0, btn1, webstate
xship = 140
ymissle = 255 // Not active value
misslecnt = 6
lasercharge = FULL_CHARGE
xship = 140
ymissle = 255 // Not active value
misslecnt = 6
missleloading = FALSE
lasercharging = FALSE
//
// Initialize the spiders (first is special)
//
@ -197,6 +108,7 @@ def game(spdrcnt)#1
iyspdr[0] = -1
hatch[0] = 1
life[0] = 3
death[0] = 0
attack = -1
webstate = 0
//
@ -211,6 +123,7 @@ def game(spdrcnt)#1
iyspdr[k] = -iyspdr[k - 1]
hatch[k] = k / 2 + 1//hatch[k - 1] + 1
life[k] = 3
death[k] = 0
next
//
// Initialize missle display
@ -222,7 +135,7 @@ def game(spdrcnt)#1
spriteDrawXor(sprtMissle)
next
hgrColor(1)
hgrRect(4, YSHIP+6, FULL_CHARGE * 4 + 4, 188)
hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188)
//
// Main game loop
//
@ -278,11 +191,13 @@ def game(spdrcnt)#1
iyspdr[k] = 0
spriteAdd(2, sprtWeb1)
spritePosIndex(xspdr[k], WEB_LIMIT+7, 2)
buzz = WEB1_BUZZ
webstate = 1
break
is 1
spriteAdd(3, sprtWeb2)
spritePosIndex(xspdr[k], WEB_LIMIT+15, 3)
buzz = WEB2_BUZZ
webstate = 2
break
is 2
@ -299,6 +214,7 @@ def game(spdrcnt)#1
//
return FALSE
fin
buzz = WEB3_BUZZ
webstate++
wend
else
@ -306,7 +222,9 @@ def game(spdrcnt)#1
//
// Move towards player during attack, but not too fast
//
xspdr[k] = xspdr[k] + (xship - xspdr[k]) / (yspdr[k] > FASTMOVE_LIMIT ?? 2 :: 4)
xdelta = yspdr[k] > FASTMOVE_LIMIT ?? 2 :: 4
xspdr[k] = xspdr[k] + (xship - xspdr[k]) / xdelta
buzz = ATTACK_BUZZ
else
//
// Retreat at a progressively faster rate
@ -351,21 +269,47 @@ def game(spdrcnt)#1
fin
fin
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
elsif death[k]
//
// Splat sequence
//
death[k]--
if death[k]
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat2))
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
else
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtDummy))
spritePosIndex(0, 0, k+SPIDER_SPRTEBASE)
spdrcnt--
if not spdrcnt
return TRUE
fin
buzz = SPLAT_BUZZ
fin
fin
next
//
// Move ship
//
xdelta, ydelta, btn0, btn1 = joypos(ymissle/4)
xdelta, ydelta, btn0, btn1 = joypos(buzz)
buzz = spdrcnt * 4
xship = xship + ((xdelta + 4) / 8 - 5)
if xship < 0; xship = 0; fin
if xship > 279; xship = 279; fin
if btn0 and misslecnt and ymissle == 255
spritePosIndex(xship, YSHIP, SHIP_SPRTNUM)
//
// Missle
//
if misslecnt and missleloading
missleloading--
fin
if btn0 and not missleloading
//
// Fire missle
//
xmissle = xship
ymissle = YSHIP-15
xmissle = xship
ymissle = YSHIP-15
missleloading = MISSLE_RELOAD
misslecnt--
spritePos(misslecnt * 16 + 160, 184, sprtMissle) // Erase from armory
spriteDrawXor(sprtMissle)
@ -396,9 +340,10 @@ def game(spdrcnt)#1
//
// Hit & kill spider
//
life[k] = 0
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtDummy))
spritePosIndex(0, 0, k+SPIDER_SPRTEBASE)
life[k] = 0
death[k] = 2
spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat1))
spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE)
if attack == k // Was it attacking?
attack = -1
spriteDel(2)
@ -406,10 +351,6 @@ def game(spdrcnt)#1
spriteDel(4)
webstate = 0
fin
spdrcnt--
if not spdrcnt
return TRUE
fin
//
// Remove missle
//
@ -419,26 +360,30 @@ def game(spdrcnt)#1
fin
fin
next
buzz = ymissle/4
fin
fin
if lasercharge < FULL_CHARGE
lasercharge++
//
// Lasers
//
if lasercharging
lasercharging--
hgrColor(1)
hgrRect((lasercharge - 1) * 4 + 5, YSHIP+6, lasercharge * 4 + 4, 188)
hgrRect(81 - lasercharging*4, YSHIP+6, 84 - lasercharging*4, 188)
fin
if btn1 and lasercharge == FULL_CHARGE
if btn1 and not lasercharging
//
// Fire laser
//
hgrColor(0)
hgrRect(4, YSHIP+6, FULL_CHARGE * 4 + 4, 188)
lasercharge = 0
leftxlaser = xship - 7
rightxlaser = xship + 7
leftylaser = 0
rightylaser = 0
lefthit = 255
righthit = 255
hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188)
lasercharging = LASER_RECHARGE
leftxlaser = xship - 7
rightxlaser = xship + 7
leftylaser = 0
rightylaser = 0
lefthit = 255
righthit = 255
for k = 0 to spdrnum
if life[k]
//
@ -449,13 +394,13 @@ def game(spdrcnt)#1
else
width = 10 // Spider width
fin
if leftxlaser >= xspdr[k] - width and leftxlaser <= xspdr[k] + width
if leftxlaser >= xspdr[k]-width and leftxlaser <= xspdr[k]+width
if yspdr[k] > leftylaser
lefthit = k
leftylaser = yspdr[k]
fin
fin
if rightxlaser >= xspdr[k] - width and rightxlaser <= xspdr[k] + width
if rightxlaser >= xspdr[k]-width and rightxlaser <= xspdr[k]+width
if yspdr[k] > rightylaser
righthit = k
rightylaser = yspdr[k]
@ -467,10 +412,6 @@ def game(spdrcnt)#1
// Draw Laser beams
//
hgrColor(3)
//for k=0 to 1
// if leftxlaser + k >= 0; hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+k); fin
// if rightxlaser + k < 280;hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-k); fin
//next
if leftxlaser >= 0
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser)
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1)
@ -479,7 +420,10 @@ def game(spdrcnt)#1
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser)
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1)
fin
buzz = LASER_BUZZ
(@_spkrTone)(15, 1)#0
if lefthit <> 255
sprtnum = lefthit + SPIDER_SPRTEBASE
//
// Hit
//
@ -488,8 +432,9 @@ def game(spdrcnt)#1
//
// Kill spider
//
spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(sprtDummy))
spritePosIndex(0, 0, lefthit + SPIDER_SPRTEBASE)
death[lefthit] = 2
spriteAdd(sprtnum, spriteDup(sprtSplat1))
spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum)
if attack == lefthit // Was it attacking?
spriteDel(2)
spriteDel(3)
@ -497,23 +442,22 @@ def game(spdrcnt)#1
webstate = 0
attack = -1
fin
spdrcnt--
if not spdrcnt
return TRUE
fin
else
//
// Dim color to show life status
//
if hatch[lefthit]
spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(life[lefthit] == 2 ?? sprtEgg2 :: sprtEgg1))
sprtEgg = life[lefthit] == 2 ?? sprtEgg2 :: sprtEgg1
spriteAdd(sprtnum, spriteDup(sprtEgg))
else
spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(life[lefthit] == 2 ?? sprtSpider2 :: sprtSpider1))
sprtSpider = life[lefthit] == 2 ?? sprtSpider2 :: sprtSpider1
spriteAdd(sprtnum, spriteDup(sprtSpider))
fin
spritePosIndex(xspdr[lefthit], yspdr[lefthit], lefthit+SPIDER_SPRTEBASE)
spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum)
fin
fin
if righthit <> 255 and life[righthit]
sprtnum = righthit + SPIDER_SPRTEBASE
//
// Hit
//
@ -522,8 +466,9 @@ def game(spdrcnt)#1
//
// Kill spider
//
spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(sprtDummy))
spritePosIndex(0, 0, righthit + SPIDER_SPRTEBASE)
death[righthit] = 2
spriteAdd(sprtnum, spriteDup(sprtSplat1))
spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum)
if attack == righthit // Was it attacking?
spriteDel(2)
spriteDel(3)
@ -531,30 +476,24 @@ def game(spdrcnt)#1
webstate = 0
attack = -1
fin
spdrcnt--
if not spdrcnt
return TRUE
fin
else
//
// Dim color to show life status
//
if hatch[righthit]
spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(life[righthit] == 2 ?? sprtEgg2 :: sprtEgg1))
sprtEgg = life[righthit] == 2 ?? sprtEgg2 :: sprtEgg1
spriteAdd(sprtnum, spriteDup(sprtEgg))
else
spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(life[righthit] == 2 ?? sprtSpider2 :: sprtSpider1))
sprtSpider = life[righthit] == 2 ?? sprtSpider2 :: sprtSpider1
spriteAdd(sprtnum, spriteDup(sprtSpider))
fin
spritePosIndex(xspdr[righthit], yspdr[righthit], righthit+SPIDER_SPRTEBASE)
spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum)
fin
fin
//
// Undraw lasers
//
hgrColor(3)
//for k=0 to 1
// if leftxlaser + k >= 0; hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+k); fin
// if rightxlaser + k < 280;hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-k); fin
//next
if leftxlaser >= 0
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser)
hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1)
@ -564,35 +503,110 @@ def game(spdrcnt)#1
hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1)
fin
fin
spritePosIndex(xship, YSHIP, SHIP_SPRTNUM)
spriteDrawXorList()
updateStars
until ^$C000 == $9B
//
// Update stars
//
hgrColor(3)
hgrXorPlot(xstar[curstar], ystar[curstar])
ystar[curstar]++
if ystar[curstar] > YSHIP
ystar[curstar] = 0
fin
hgrXorPlot(xstar[curstar], ystar[curstar])
curstar++
if curstar >= NUMSTARS; curstar = 0; fin
until ^$C000 == $9B // ESCape key pressed
getc
return FALSE
end
//
// Initialization
//
puts("Loading");
putc('.')
sprtShip = spriteRead("SHIP")
if not sprtShip
cmdsys:modexec("SFMSPRT")
sprtShip = spriteRead("SHIP")
if not sprtShip
puts("\nError: Unable to compile sprites.\n")
return -1
fin
fin
putc('.')
sprtMissle = spriteRead("MISSLE")
putc('.')
sprtEgg3 = spriteRead("EGG3")
putc('.')
sprtEgg2 = spriteRead("EGG2")
putc('.')
sprtEgg1 = spriteRead("EGG1")
putc('.')
sprtSpider3= spriteRead("SPIDER3")
putc('.')
sprtSpider2= spriteRead("SPIDER2")
putc('.')
sprtSpider1= spriteRead("SPIDER1")
putc('.')
sprtWeb1 = spriteRead("WEB1")
putc('.')
sprtWeb2 = spriteRead("WEB2")
putc('.')
sprtWeb3 = spriteRead("WEB3")
putc('.')
sprtSplat1 = spriteRead("SPLAT1")
putc('.')
sprtSplat2 = spriteRead("SPLAT2")
putc('.')
sprtDummy = spriteRead("DUMMY")
//
// Heat up JIT compiler
//
spriteAdd(0, sprtDummy)
for curstar = 0 to 50
putc('.')
spriteDrawXorList()
next
hgrMode
spriteDrawBuf(hgrDrawBuf(0)) // So we can see the compile process
sprtShip = spriteCompile(14, 14, 7, 13, @ship)
sprtMissle = spriteCompile( 6, 8, 3, 0, @missle)
sprtEgg3 = spriteCompile(14, 12, 7, 6, @egg3)
sprtEgg2 = spriteCompile(14, 12, 7, 6, @egg2)
sprtEgg1 = spriteCompile(14, 12, 7, 6, @egg1)
sprtSpider3= spriteCompile(20, 13, 10, 6, @spider3)
sprtSpider2= spriteCompile(20, 13, 10, 6, @spider2)
sprtSpider1= spriteCompile(20, 13, 10, 6, @spider1)
sprtWeb1 = spriteCompile( 8, 8, 4, 0, @web1)
sprtWeb2 = spriteCompile(12, 8, 6, 0, @web2)
sprtWeb3 = spriteCompile(20, 8, 10, 0, @web3)
sprtDummy = spriteCompile( 7, 8, 0, 0, @dummy)
hgrColor(0)
hgrClear()
spriteDrawBuf(hgrDrawBuf(0)) // Single buffered
spriteAdd(SHIP_SPRTNUM, sprtShip)
spriteAdd(SPIDER_SPRTEBASE, sprtEgg3)
initStars
won = game(8)
//
// Init stars
//
xstar[0] = 99
ystar[0] = 10
hgrColor(3)
hgrXorPlot(xstar[0], ystar[0])
for curstar = 1 to NUMSTARS-1
xstar[curstar] = (xstar[curstar - 1] + 97 - curstar) % 280
ystar[curstar] = (ystar[curstar - 1] + 19 + curstar) % YSHIP
hgrXorPlot(xstar[curstar], ystar[curstar])
next
curstar = 0
if game(8)
//
// Won
//
spriteDrawXorList()
(@_spkrTone)(100, 20)#0
(@_spkrTone)(75, 20)#0
(@_spkrTone)(15, 20)#0
(@_spkrTone)(25, 100)#0
else
//
// Lost
//
spriteDrawXorList()
(@_spkrTone)(100, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(150, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(100, 50)#0
spriteDrawXor(sprtShip)
(@_spkrTone)(150, 50)#0
fin
txtMode
puts(won ?? "You won!\n" :: "You lost.\n")
puts("Available memory: "); puti(heapavail()); putln
puts("\nAvailable memory: "); puti(heapavail()); putln
done

View File

@ -53,5 +53,6 @@ echo "BLD/SAMPLES/FATCAT.PLA"; atftp $1 --put -l samplesrc/fatcat.pla -r $
echo "BLD/SAMPLES/GFXDEMO.PLA"; atftp $1 --put -l samplesrc/gfxdemo.pla -r $2/BLD/SAMPLES/GFXDEMO.PLA#040000
echo "BLD/SAMPLES/LZ4CAT.PLA"; atftp $1 --put -l samplesrc/lz4cat.pla -r $2/BLD/SAMPLES/LZ4CAT.PLA#040000
echo "BLD/SAMPLES/SFM.PLA"; atftp $1 --put -l samplesrc/sfm.pla -r $2/BLD/SAMPLES/SFM.PLA#040000
echo "BLD/SAMPLES/SFMSPRT.PLA"; atftp $1 --put -l samplesrc/sfmsprt.pla -r $2/BLD/SAMPLES/SFMSPRT.PLA#040000
echo "BLD/SAMPLES/MON.PLA"; atftp $1 --put -l utilsrc/apple/mon.pla -r $2/BLD/SAMPLES/MON.PLA#040000

View File

@ -9,7 +9,10 @@ echo "DEMOS/HGRTEST"; atftp $1 --put -l rel/apple/HGRTEST#FE1000
echo "DEMOS/GRTEST"; atftp $1 --put -l rel/apple/GRTEST#FE1000 -r $2/DEMOS/GRTEST#FE1000
echo "DEMOS/INT32TEST"; atftp $1 --put -l rel/INT32TEST#FE1000 -r $2/DEMOS/INT32TEST#FE1000
echo "DEMOS/DGRTEST"; atftp $1 --put -l rel/apple/DGRTEST#FE1000 -r $2/DEMOS/DGRTEST#FE1000
echo "DEMOS/SFM"; atftp $1 --put -l rel/apple/SFM#FE1000 -r $2/DEMOS/SFM#FE1000
# Spiders from Mars
echo "DEMOS/SPIDERS/SFM"; atftp $1 --put -l rel/apple/SFM#FE1000 -r $2/DEMOS/SPIDERS/SFM#FE1000
echo "DEMOS/SPIDERS/SFMSPRT"; atftp $1 --put -l rel/apple/SFMSPRT#FE1000 -r $2/DEMOS/SPIDERS/SFMSPRT#FE1000
# Music demo
echo "DEMOS/MUSIC/PLAYSEQ"; atftp $1 --put -l rel/apple/PLAYSEQ#FE1000 -r $2/DEMOS/MUSIC/PLAYSEQ#FE1000