Add event system for coordinating tasks

This commit is contained in:
David Schmenk committed 2026-06-24 20:21:42 -07:00
1 parent 45e03894e6
commit 53353d0273
5 files changed
+456 -204

No files matched your search

+115
View File
@@ -0,0 +1,115 @@
//
// Events
//
include "../../inc/cmdsys.plh"
include "event.plh"
const MAX_EVENTS = 20
res[MAX_EVENTS*t_event] eventTable
var eventFreeList = @eventTable
var eventQueue
//
// Event implementation
//
export def eventInit#0
eventQueue = NULL
eventFreeList = @eventTable + (MAX_EVENTS-1) * t_event
eventFreeList=>evNext = NULL
repeat
eventFreeList = eventFreeList - t_event
eventFreeList=>evNext = eventFreeList + t_event
until eventFreeList == @eventTable
end
export def eventFree(event)#0
event=>evNext = eventFreeList
eventFreeList = event
end
export def eventNew#1
var event
event = eventFreeList
eventFreeList = eventFreeList=>evNext
event=>evNext = NULL
return event
end
export def doEvents#0
var event
if eventQueue
eventQueue=>evDelta--
while eventQueue and eventQueue=>evDelta == 0
event = eventQueue
eventQueue = eventQueue=>evNext
event=>evAction(event)#0
loop
fin
end
export def addEvent(time, event)#0
var search
if time < 1; time = 1; fin
if eventQueue
if eventQueue=>evDelta >= time
//
// Insert at head of queue
//
eventQueue=>evDelta = eventQueue=>evDelta - time
event=>evNext = eventQueue
eventQueue = event
else
search = eventQueue
time = time - search=>evDelta
while search=>evNext
if search=>evNext=>evDelta < time
//
// Keep searching while time > evDelta
//
search = search=>evNext
time = time - search=>evDelta
else
event=>evDelta = time
event=>evNext = search=>evNext
search=>evNext = event
search = event=>evNext
search=>evDelta = search=>evDelta - time
return
fin
loop
if not search=>evNext
search=>evNext = event
event=>evNext = NULL
fin
fin
else
eventQueue = event
event=>evNext = NULL
fin
event=>evDelta = time
end
export def addAction(time, action, param)#0
var event, search
event = eventNew
event=>evAction = action
event=>evParam = param
addEvent(time, event)
end
export def dumpEvents#0
var event
event = eventQueue
while event
puts("Event: "); puti(event=>evDelta); putc(','); puti(event=>evParam); putln
event = event=>evNext
loop
puts("End of events.\n")
end
//
// Go ahead and initialize for now
//
eventInit
//
// Keep module in memory
//
return modkeep
done
+15
View File
@@ -0,0 +1,15 @@
import event
struc t_event
var evDelta
var evAction
var evParam
var evNext
end
predef eventInit#0
predef eventFree(event)#0
predef eventNew#1
predef doEvents#0
predef addEvent(time, event)#0
predef addAction(time, action, param)#0
predef dumpEvents#0
end
+7 -1
View File
@@ -3,11 +3,13 @@ AFLAGS = -o $@
IMPORT = IMPORT.REL
SEAN = SEAN.REL
EVENT = EVENT.REL
ARTIFACT = ARTIFACT.REL
gg: $(SEAN) $(IMPORT) $(ARTIFACT)
gg: $(SEAN) $(EVENT) $(IMPORT) $(ARTIFACT)
-mkdir ../../prodos/dhgr.tk/gg/
cp $(SEAN) ../../prodos/dhgr.tk/gg
cp $(EVENT) ../../prodos/dhgr.tk/gg
cp $(IMPORT) ../../prodos/dhgr.tk/gg
cp $(ARTIFACT) ../../prodos/dhgr.tk/gg
@@ -20,6 +22,10 @@ $(SEAN): sean.pla sean.plh
../../xplasm -AMOW sean.pla
acme --setpc 4094 -o $(SEAN) sean.a
$(EVENT): event.pla event.plh
../../xplasm -AMOW event.pla
acme --setpc 4094 -o $(EVENT) event.a
$(IMPORT): import.pla sean.plh
../../xplasm -AMOW import.pla
acme --setpc 4094 -o $(IMPORT) import.a
+318 -203
View File
@@ -1,6 +1,5 @@
include "../../inc/cmdsys.plh"
include "../../inc/args.plh"
include "../../inc/matchfiles.plh"
include "../../inc/fileio.plh"
include "../../inc/conio.plh"
include "../../inc/vblank.plh"
@@ -8,6 +7,7 @@ include "../../inc/sndseq.plh"
include "../../inc/joybuzz.plh"
include "../inc/dhgrlib.plh"
include "../inc/dhgrutils.plh"
include "event.plh"
include "sean.plh"
sysflags resxtxt1|reshgr1|resxhgr1|nojitc
@@ -25,7 +25,18 @@ byte tileRow6 = 8, 9, 9, 16, 17, 17, 17, 18, 9, 9
byte tileRow7 = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
byte tileRow8 = 8, 9, 9, 9, 9, 9, 9, 9, 9, 9
var tileMap = @tileRow1, @tileRow2, @tileRow3, @tileRow4
var = @tileRow5, @tileRow6, @tileRow7, @tileRow8
var = @tileRow5, @tileRow6, @tileRow7, @tileRow8
//
// Hoard
//
const HOARD_ACTION_MASK = $01FF
const HOARD_POS = 12
byte[HOARD_POS] tablePosX = 3, 4, 5, 6, 7, 3, 7, 3, 4, 5, 6, 7
byte[HOARD_POS] tablePosY = 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5
byte[HOARD_POS] hoardType
byte hoardAvailable // Available to be picked up
byte hoardActive // Active equipment in play
byte hoardRemaining // Equipment remaining
//
// Sprites
//
@@ -49,12 +60,29 @@ byte[NUM_NERDS] nerdClr = CLR_GREEN, CLR_BROWN, CLR_GREY, CLR_ORANGE
byte[NUM_NERDS] nerdX = 2, 3, 4, 5
byte[NUM_NERDS] nerdY = 2, 2, 2, 2
byte[NUM_NERDS] nerdDir = LOOK_LEFT, LOOK_FORWARD, LOOK_FORWARD, LOOK_RIGHT
byte[NUM_NERDS] nerdBooty, nerdScore
byte[NUM_NERDS] nerdHoard, nerdScore
//
// Joystick values
//
byte joyX, joyY, btn0, btn1, buzz
byte joyLeft, joyRight, joyUp, joyDown
//
// Levels
//
const LEVEL_SCALE = 10
byte level, game, hoard // Equipment
byte level
//
// Sound F/X
//
const SFX_BUMP = 0
const SFX_PICKUP = 1
const SFX_SCORE = 2
const SFX_JACKPOT = 3
byte sfxBump = 20, 20, 20, 20, 0
byte sfxPickup = 8, 9, 10, 0
byte sfxScore = 5, 10, 5, 10, 0
byte sfxJackpot = 5, 10, 15, 20, 15, 10, 5, 10, 15, 20, 15, 10, 5,0
var sfxList = @sfxBump, @sfxPickup, @sfxScore, @sfxJackpot
//
// This fixes the Virtual ][ bug with outstanding Mockingboard interrupts
//
@@ -108,6 +136,25 @@ def loadSprites#0
fileio:close(refnum)
fin
end
//
// Sound F/X Action
//
def actionSFX(event)#0
byte sfxTable, sfxIndex
sfxIndex = event->evParam.1
sfxTable = event->evParam.0
buzz = sfxList.[sfxTable, sfxIndex]
if buzz
event->evParam.1 = sfxIndex + 1
addEvent(1, event)
else
eventFree(event)
fin
end
//
// Drawing utilites
//
def drawFrame(x, y, w, h)#0
byte r, b
@@ -206,17 +253,24 @@ def drawMenu#0
dcgrStr(104, 190, "2026")
for i = 0 to 4; drawItem(i); next
end
def drawMessage(msg)#0
byte extX, extY
dhgrMemBl7(4*TILE_WIDTH7, 4*TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_TABLEMID-1)*TILE_SIZE, TILE_SPAN)
dhgrMemBl7(5*TILE_WIDTH7, 4*TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_TABLEMID-1)*TILE_SIZE, TILE_SPAN)
dhgrMemBl7(6*TILE_WIDTH7, 4*TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_TABLEMID-1)*TILE_SIZE, TILE_SPAN)
if msg
dcgrColor(CLR_WHITE)
extX, extY = dcgrStrExtents(msg)
dcgrStr((140 + TILE_WIDTH/2 - extX)/2, 5*TILE_HEIGHT - extY, msg)
fin
end
def drawStatus#0
char[4] str
var chalkboard
itoa(@str, hoard)
chalkboard = tileList+(TILE_CHALKBOARD-1)*TILE_SIZE
itoa(@str, hoardRemaining)
dcgrColor(CLR_WHITE)
//dhgrMemBl7(4*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, chalkboard, TILE_SPAN)
//dhgrMemBl7(5*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, chalkboard, TILE_SPAN)
dhgrMemBl7(6*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, chalkboard, TILE_SPAN)
dcgrStr(46, 15, "Remaining:")
dhgrMemBl7(6*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_CHALKBOARD-1)*TILE_SIZE, TILE_SPAN)
dcgrStr(86, 15, @str)
end
def drawScore(nerd)#0
@@ -240,6 +294,13 @@ def drawMap#0
dhgrMemBl7(l*TILE_WIDTH7, k*TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, tileList+(tileMap.[k,l]-1)*TILE_SIZE, TILE_SPAN)
next
next
dcgrColor(CLR_WHITE)
dcgrStr(46, 15, "Remaining")
end
def actionSean(event)#0
dhgrMemBl7(8*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_SEAN1-1)*TILE_SIZE, TILE_SPAN)
dhgrMemBl7(9*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_SEAN2-1)*TILE_SIZE, TILE_SPAN)
eventFree(event)
end
def hitCheck(nerd, x, y)
byte i
@@ -250,20 +311,22 @@ def hitCheck(nerd, x, y)
// Check for other nerds
//
for i = 0 to NUM_NERDS-1
if x == nerdX[i] and y == nerdY[i]; return TRUE; fin
if x == nerdX[i] and y == nerdY[i]
addAction(1, @actionSFX, SFX_BUMP)
return TRUE
fin
next
return FALSE
is TILE_BOX
//
// Drop off booty?
// Drop off hoard?
//
if y == nerd * 2 + 1 and nerdBooty[nerd]
nerdBooty[nerd] = 0
if y == nerd * 2 + 1 and nerdHoard[nerd]
hoardActive--
nerdHoard[nerd] = 0
nerdScore[nerd]++
drawScore(nerd)
if hoard == 0
game = FALSE
fin
addAction(1, @actionSFX, SFX_SCORE)
fin
break
is TILE_SEAN1
@@ -271,15 +334,41 @@ def hitCheck(nerd, x, y)
//
// Jackpot?
//
if nerdBooty[nerd] == JACKPOT
nerdBooty[nerd] = 0
if nerdHoard[nerd] == JACKPOT
hoardActive--
nerdHoard[nerd] = 0
nerdScore[nerd] = nerdScore[nerd] + 3
drawScore(nerd)
if hoard == 0
game = FALSE
fin
addAction(1, @actionSFX, SFX_JACKPOT)
addAction(100, @actionSean, 0)
dhgrMemBl7(8*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_BOX-1)*TILE_SIZE, TILE_SPAN)
dhgrMemBl7(9*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_BOX-1)*TILE_SIZE, TILE_SPAN)
fin
break
is TILE_TABLE1
is TILE_TABLE2
is TILE_TABLE3
is TILE_TABLE4
is TILE_TABLE5
is TILE_TABLE6
is TILE_TABLE7
is TILE_TABLE8
for i = 0 to HOARD_POS-1
if tablePosX[i] == x and tablePosY[i] == y; break; fin
next
if hoardType[i] // Pick up HW
dhgrMemBl7(x*TILE_WIDTH7, y*TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, tileList+(tileMap.[y,x]-1)*TILE_SIZE, TILE_SPAN)
nerdHoard[nerd], hoardType[i] = hoardType[i], nerdHoard[nerd] // Swap goods
if hoardType[i]
dcgrPixMap(tablePosX[i] * TILE_WIDTH, \
tablePosY[i] * TILE_HEIGHT + 2, \
SPRITE_WIDTH, SPRITE_HEIGHT, \
spriteList + (hoardType[i] - 1) * SPRITE_SIZE)
else
hoardAvailable--
fin
addAction(1, @actionSFX, SFX_PICKUP)
fin
wend
return TRUE
end
@@ -290,210 +379,237 @@ def moveNerd(nerd, dir)
oldX = nerdX[nerd]
oldY = nerdY[nerd]
moved = TRUE
moved = FALSE
when dir
is MOVE_UP
if hitCheck(nerd, nerdX[nerd], nerdY[nerd] - 1)
moved = FALSE
else
if not hitCheck(nerd, nerdX[nerd], nerdY[nerd] - 1)
nerdY[nerd]--
moved = TRUE
fin
nerdDir[nerd] = LOOK_AWAY
break
is MOVE_LEFT
if nerdX[nerd] < 1 or hitCheck(nerd, nerdX[nerd] - 1, nerdY[nerd])
moved = FALSE
else
if nerdX[nerd] > 0 and not hitCheck(nerd, nerdX[nerd] - 1, nerdY[nerd])
nerdX[nerd]--
moved = TRUE
fin
nerdDir[nerd] = LOOK_LEFT
break
is MOVE_RIGHT
if nerdX[nerd] >= 9 or hitCheck(nerd, nerdX[nerd] + 1, nerdY[nerd])
moved = FALSE
else
if nerdX[nerd] < 9 and not hitCheck(nerd, nerdX[nerd] + 1, nerdY[nerd])
nerdX[nerd]++
moved = TRUE
fin
nerdDir[nerd] = LOOK_RIGHT
break
is MOVE_DOWN
if nerdY[nerd] >= 7 or hitCheck(nerd, nerdX[nerd], nerdY[nerd] + 1)
moved = FALSE
else
if nerdY[nerd] < 7 and not hitCheck(nerd, nerdX[nerd], nerdY[nerd] + 1)
nerdY[nerd]++
moved = TRUE
fin
nerdDir[nerd] = LOOK_FORWARD
break
wend
//
// Draw nerd + any hoard to memory surface the size of a tile
//
dhgrSurfMem(OP_SRC, TILE_HEIGHT, @tileNerd, TILE_SPAN)
dcgrColor(CLR_LTBLUE)
dhgrClearBl7(0, 0, TILE_WIDTH7, TILE_HEIGHT)
dcgrPixMap(0, 2, SPRITE_WIDTH, SPRITE_HEIGHT, spriteList + (HORDE_BASE + nerd*NUM_NERDS + nerdDir[nerd])*SPRITE_SIZE)
if nerdBooty[nerd]
dcgrPixMap(0, 0, SPRITE_WIDTH, SPRITE_HEIGHT, spriteList + (nerdBooty[nerd] + HOARD_BASE)*SPRITE_SIZE)
if nerdHoard[nerd]
dcgrPixMap(0, 0, SPRITE_WIDTH, SPRITE_HEIGHT, spriteList + (nerdHoard[nerd] + HOARD_BASE)*SPRITE_SIZE)
fin
dhgrSurfScr(OP_SRC)
if oldX <> nerdX[nerd] or oldY <> nerdY[nerd]
if moved
//
// Erase previous position
//
dcgrColor(CLR_LTBLUE)
dhgrClearBl7(oldX * TILE_WIDTH7, oldY * TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT)
fin
dhgrMemBl7(nerdX[nerd] * TILE_WIDTH7, \
nerdY[nerd] * TILE_HEIGHT, \
TILE_WIDTH7, \
TILE_HEIGHT, \
@tileNerd, \
TILE_SPAN)
//dhgrMemBl7(oldX * TILE_WIDTH7, \
// oldY * TILE_HEIGHT, \
// TILE_WIDTH7, \
// TILE_HEIGHT, \
// tileList + (tileMap.[oldY, oldX] - 1)*TILE_SIZE, \
// TILE_SPAN)
//dcgrPixMap(nerdX[nerd] * TILE_WIDTH, \
// nerdY[nerd] * TILE_HEIGHT + 2, \
// SPRITE_WIDTH, \
// SPRITE_HEIGHT, \
// spriteList + (HORDE_BASE + nerd*NUM_NERDS + nerdDir[nerd])*SPRITE_SIZE)
//if nerdBooty[nerd]
// dcgrPixMap(nerdX[nerd] * TILE_WIDTH, \
// nerdY[nerd] * TILE_HEIGHT + 6, \
// SPRITE_WIDTH, \
// SPRITE_HEIGHT, \
// spriteList + (nerdBooty[nerd] + HOARD_BASE)*SPRITE_SIZE)
//fin
//
// Update nerd on screen
//
dhgrMemBl7(nerdX[nerd] * TILE_WIDTH7, nerdY[nerd] * TILE_HEIGHT, TILE_WIDTH7, TILE_HEIGHT, @tileNerd, TILE_SPAN)
return moved
end
def playGG#0
byte nerd, moveDir, try
byte joyEn, joyX, joyY, btn0, btn1, buzz
byte joyLeft, joyRight, joyUp, joyDown
var[NUM_NERDS] update
def addHoard#0
byte pos
if hoardRemaining and hoardAvailable < HOARD_POS
pos = conio:rnd() % HOARD_POS
while hoardType[pos]
pos++; if pos >= HOARD_POS; pos = 0; fin
loop
hoardType[pos] = ((conio:rnd() & 255) < 25) ?? JACKPOT :: (conio:rnd() & HOARD_NUM-2) + 1
hoardActive++
hoardAvailable++
hoardRemaining--
dcgrPixMap(tablePosX[pos] * TILE_WIDTH, tablePosY[pos]*TILE_HEIGHT+2, SPRITE_WIDTH, SPRITE_HEIGHT, spriteList + (hoardType[pos] - 1) * SPRITE_SIZE)
drawStatus
fin
end
//
// Actions
//
def actionUpdateHoard(event)#0
//
// Add hoard to table at random time
//
addHoard
if hoardRemaining
addEvent(conio:rnd() & HOARD_ACTION_MASK, event)
else
eventFree(event)
fin
end
def actionUpdateNerd(event)#0
//
// Move NPC
//
moveNerd(event=>evParam, conio:rnd() & MOVE_MASK)
addEvent(level * LEVEL_SCALE, event)
end
def joyCalibrate#4
byte x, y
x, y, drop, drop = joyPos(0)
if x < MAX_JOY and y < MAX_JOY
return x / 2, (x + MAX_JOY) / 2, y / 2, (y + MAX_JOY) / 2
fin
return 0, 0, MAX_JOY, MAX_JOY
end
def actionUpdatePlayer(event)#0
byte moveDir
moveDir = MOVE_NONE
if joyX < joyLeft
moveDir = MOVE_LEFT
elsif joyX > joyRight
moveDir = MOVE_RIGHT
fin
if joyY < joyUp
moveDir = MOVE_UP
elsif joyY > joyDown
moveDir = MOVE_DOWN
fin
if conio:keypressed()
when toupper(conio:getkey())
is keyArrowUp
moveDir = MOVE_UP
break
is keyArrowLeft
moveDir = MOVE_LEFT
break
is keyArrowRight
moveDir = MOVE_RIGHT
break
is keyArrowDown
moveDir = MOVE_DOWN
break
is 'C' // Recalibrate joystick on the fly
joyLeft, joyRight, joyUp, joyDown = joyCalibrate
break
is '1'
level = 9
break
is '2'
level = 8
break
is '3'
level = 7
break
is '4'
level = 6
break
is '5'
level = 5
break
is '6'
level = 4
break
is '7'
level = 3
break
is '8'
level = 2
break
is '9'
level = 1
break
is '0'
level = 0
break
is 'X'
dhgrMode(DHGR_TEXT_MODE)
dumpEvents
is keyEscape
hoardActive = 0; hoardRemaining = 0
wend
moveNerd(nerdPlayer, moveDir)
fin
addEvent(level, event)
end
def playGG#0
//
// Automatic joystick enable/calibration
//
joyEn = FALSE
joyX, joyY, btn0, btn1 = joyPos(0)
if joyX < MAX_JOY and joyY < MAX_JOY
joyEn = TRUE
joyLeft = joyX / 2
joyRight = (joyX + MAX_JOY) / 2
joyUp = joyY / 2
joyDown = (joyY + MAX_JOY) / 2
fin
joyLeft, joyRight, joyUp, joyDown = joyCalibrate
//
// Intitialize level
// Initialize event system
//
for nerd = 0 to NUM_NERDS-1
nerdX[nerd] = 1
nerdY[nerd] = nerd * 2 + 1
nerdBooty[nerd] = 0
nerdScore[nerd] = 0
drawScore(nerd)
update[nerd] = conio:rnd() % (level * LEVEL_SCALE)
moveNerd(nerd, MOVE_NONE)
eventInit
//
// Intitialize nerds
//
for buzz = 0 to NUM_NERDS-1
nerdX[buzz] = 1
nerdY[buzz] = buzz * 2 + 1
nerdHoard[buzz] = 0
nerdScore[buzz] = 0
drawScore(buzz)
moveNerd(buzz, MOVE_NONE)
if buzz == nerdPlayer
addAction(level, @actionUpdatePlayer, buzz)
else
addAction(conio:rnd() % (level * LEVEL_SCALE), @actionUpdateNerd, buzz)
fin
next
update[nerdPlayer] = level
hoard = 12
drawStatus
buzz = 0
game = TRUE
while game
if buzz; buzz = ((buzz + 1) & 63) + 1; fin
//
// Initialize hoard
//
hoardRemaining = 20
hoardActive = 0
addHoard
addHoard
addHoard
addHoard
addAction(conio:rnd() & HOARD_ACTION_MASK, @actionUpdateHoard, 0)
//
// Go!
//
drawMessage("Ready...")
conio:tone(50, 40)
drawMessage("Set...")
conio:tone(50, 40)
drawMessage("Go!")
conio:tone(60, 10)
drawMessage(NULL)
buzz = 0
while hoardActive or hoardRemaining
//
// Sound/joystick
//
joyX, joyY, btn0, btn1 = joyPos(buzz)
for nerd = 0 to NUM_NERDS-1
if update[nerd]
update[nerd]--
else
if nerd == nerdPlayer
moveDir = MOVE_NONE
if joyEn
if joyX < joyLeft
moveDir = MOVE_LEFT
elsif joyX > joyRight
moveDir = MOVE_RIGHT
fin
if joyY < joyUp
moveDir = MOVE_UP
elsif joyY > joyDown
moveDir = MOVE_DOWN
fin
fin
if conio:keypressed()
when toupper(conio:getkey())
is 'I'
is keyArrowUp
moveDir = MOVE_UP
break
is 'J'
is keyArrowLeft
moveDir = MOVE_LEFT
break
is 'K'
is keyArrowRight
moveDir = MOVE_RIGHT
break
is 'M'
is keyArrowDown
moveDir = MOVE_DOWN
break
is 'B'
hoard--
drawStatus
nerdBooty[nerdPlayer]++
if nerdBooty[nerdPlayer] > HOARD_NUM; nerdBooty[nerdPlayer] = 0; fin
moveNerd(nerdPlayer, MOVE_NONE)
break
is 'P'
nerdPlayer++
if nerdPlayer >= NUM_NERDS; nerdPlayer = 0; fin
break
is 'S'
if buzz; buzz = 0; else buzz = 1; fin
break
is '1'
level = 9
break
is '2'
level = 8
break
is '3'
level = 7
break
is '4'
level = 6
break
is '5'
level = 5
break
is '6'
level = 4
break
is '7'
level = 3
break
is '8'
level = 2
break
is '9'
level = 1
break
is '0'
level = 0
break
is keyEscape
game = FALSE
wend
moveNerd(nerdPlayer, moveDir)
fin
update[nerdPlayer] = level
else // Move NPC
moveNerd(nerd, conio:rnd() & MOVE_MASK)
update[nerd] = (level * LEVEL_SCALE)
fin
fin
next
//
// Check event queue
//
doEvents
loop
drawMessage("Finished!")
conio:tone(30, 20)
conio:tone(200, 10)
end
def info#0
screenRead("GG.DHGR")
@@ -579,34 +695,33 @@ def randomize#0
conio:rnd()
end
//
// Import test harness
//
arg = argNext(argFirst)
while ^arg
arg = argNext(arg)
loop
dhgrMode(DHGR_COLOR_MODE)
//screenRead("SPLASH.DHGR")
//
// Hook CYA IRQ handler into ProDOS IRQ chain
//
params.0 = 2
params.1 = 3
params:2 = @serviceCYA
syscall($40, @params)
//
// Play opening sequence
//
//arg = musicRead("GG.SEQ")
//musicPlay(arg, FALSE)
//musicGetKey(8, @randomize)
//heaprelease(arg)
dhgrMode(DHGR_COLOR_MODE)
arg = argNext(argFirst)
while ^arg and ^(arg + 1) == '-'
when toupper(^(arg + 2))
is 'S' // Splash screen
//
// Play opening sequence
//
screenRead("SPLASH.DHGR")
spriteList = musicRead("GG.SEQ")
musicPlay(spriteList, FALSE)
musicGetKey(8, @randomize)
heaprelease(spriteList)
spriteList = NULL
wend
arg = argNext(arg)
loop
dcgrFont(FONT_DEF_THIN)
loadTiles
loadSprites
if tileList <> NULL and spriteList <> NULL
//screenRead("MENU.DHGR")
//getc
level = 9
while menu
drawMap
+1
View File
@@ -24,6 +24,7 @@ const TILE_TABLE5 = 15
const TILE_TABLE6 = 16
const TILE_TABLE7 = 17
const TILE_TABLE8 = 18
const TILE_TABLEMID = 14
const TILE_SEAN1 = 19
const TILE_SEAN2 = 20
//