mirror of
https://github.com/dschmenk/PLASMA.git
synced 2026-10-25 00:02:27 +00:00
A real game. Version 0.2
This commit is contained in:
1 parent
6ccb0f8076
commit
f346996d65
6 files changed
+263
-205
No files matched your search
@@ -49,7 +49,7 @@ export def addEvent(time, event)#0
|
||||
|
||||
if time < 1; time = 1; fin
|
||||
if eventQueue
|
||||
if eventQueue=>evDelta >= time
|
||||
if eventQueue=>evDelta > time
|
||||
//
|
||||
// Insert at head of queue
|
||||
//
|
||||
@@ -60,7 +60,7 @@ export def addEvent(time, event)#0
|
||||
search = eventQueue
|
||||
time = time - search=>evDelta
|
||||
while search=>evNext
|
||||
if search=>evNext=>evDelta < time
|
||||
if search=>evNext=>evDelta <= time
|
||||
//
|
||||
// Keep searching while time > evDelta
|
||||
//
|
||||
|
||||
@@ -14,8 +14,8 @@ var arg
|
||||
// Tiles
|
||||
//
|
||||
var tileList = NULL
|
||||
byte tileRow1 = 1, 2, 3, 4, 5, 5, 5, 6, 3, 7
|
||||
byte tileRow2 = 8, 9, 9, 9, 9, 9, 9, 9, 9, 9
|
||||
byte tileRow1 = 1, 2, 3, 4, 5, 5, 5, 6, 19, 20
|
||||
byte tileRow2 = 8, 9, 9, 9, 9, 9, 9, 9, 21, 22
|
||||
byte tileRow3 = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
|
||||
byte tileRow4 = 8, 9, 9, 10, 11, 11, 11, 12, 9, 9
|
||||
byte tileRow5 = 9, 9, 9, 13, 14, 14, 14, 15, 9, 9
|
||||
@@ -254,6 +254,7 @@ importSprites
|
||||
if tileList <> NULL and spriteList <> NULL
|
||||
dhgrMode(DHGR_COLOR_MODE)
|
||||
drawMap
|
||||
getc
|
||||
//dcgrColor(CLR_WHITE)
|
||||
//dhgrClearBl7(0, 0, SCR_WIDTH7, SCR_HEIGHT)
|
||||
drawSprites
|
||||
|
||||
+243
-192
@@ -28,14 +28,15 @@ var = @tileRow5, @tileRow6, @tileRow7, @tileRow8
|
||||
//
|
||||
// Hoard
|
||||
//
|
||||
const HOARD_ACTION_MASK = $01FF
|
||||
const TABLE_POSITIONS = 8
|
||||
byte[TABLE_POSITIONS] tablePosX = 4, 5, 6, 3, 7, 4, 5, 6
|
||||
byte[TABLE_POSITIONS] tablePosY = 3, 3, 3, 4, 4, 5, 5, 5
|
||||
byte[TABLE_POSITIONS] hoardType
|
||||
const HOARD_SIZE = 20
|
||||
byte hoardAvailable // Available to be picked up
|
||||
byte hoardActive // Active equipment in play
|
||||
byte hoardRemaining // Equipment remaining
|
||||
byte hoardJackpots // Number of jackpots per level
|
||||
//
|
||||
// Sprites
|
||||
//
|
||||
@@ -55,6 +56,11 @@ const MOVE_UP = 3
|
||||
const MOVE_NONE = 4
|
||||
const MOVE_MASK = 3
|
||||
byte nerdPlayer = 0
|
||||
char nerdDaniel = "Daniel"
|
||||
char nerdBecky = "Becky"
|
||||
char nerdHarriet = "Harriet"
|
||||
char nerdJavier = "Jav Master"
|
||||
var nerdName = @nerdDaniel, @nerdBecky, @nerdHarriet, @nerdJavier
|
||||
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
|
||||
@@ -85,8 +91,14 @@ byte joyLeft, joyRight, joyUp, joyDown
|
||||
//
|
||||
// Levels
|
||||
//
|
||||
const LEVEL_SCALE = 10
|
||||
byte level
|
||||
const HORDE_SCALE = 5
|
||||
const HORDE_EQ = 4
|
||||
const HOARD_SCALE = HORDE_SCALE * 10
|
||||
const PLAYER_EQ = HORDE_EQ + 1
|
||||
byte level = 9
|
||||
byte totalScore = 0
|
||||
byte exit
|
||||
var seqSplash
|
||||
//
|
||||
// Sound F/X
|
||||
//
|
||||
@@ -108,6 +120,16 @@ asm serviceCYA#0
|
||||
RTS
|
||||
end
|
||||
//
|
||||
// Debug
|
||||
//
|
||||
def assert(val, msg)#0
|
||||
if not val
|
||||
dhgrMode(DHGR_TEXT_MODE)
|
||||
puts(msg)
|
||||
getc
|
||||
fin
|
||||
end
|
||||
//
|
||||
// String utilities
|
||||
//
|
||||
def strcati(str, i)#0
|
||||
@@ -184,35 +206,49 @@ end
|
||||
def drawItem(item)#0
|
||||
when item
|
||||
is 0
|
||||
dcgrStr(96, 84, "[P]lay")
|
||||
dcgrStr(96, 76, "[P]lay")
|
||||
break
|
||||
is 1
|
||||
dcgrStr(96, 104, "[I]nfo")
|
||||
dcgrStr(96, 96, "[I]nfo")
|
||||
break
|
||||
is 2
|
||||
dcgrStr(96, 124, "[N]erd")
|
||||
dcgrStr(96, 116, "[N]erd")
|
||||
break
|
||||
is 3
|
||||
dcgrStr(96, 144, "[S]cores")
|
||||
dcgrStr(96, 136, "[S]cores")
|
||||
break
|
||||
is 4
|
||||
dcgrStr(96, 164, "[Q]uit")
|
||||
dcgrStr(96, 156, "[Q]uit")
|
||||
wend
|
||||
end
|
||||
def drawSelect#0
|
||||
drawFrame(nerdPlayer*TILE_WIDTH + nerdPlayer + 71, 31, SPRITE_WIDTH + 2, SPRITE_HEIGHT + 2)
|
||||
end
|
||||
def drawName#0
|
||||
var nameSurf
|
||||
|
||||
nameSurf = heapAlloc(9*4*10)
|
||||
dhgrSurfMem(OP_SRC, 10, nameSurf, 9*4)
|
||||
dcgrColor(CLR_PINK)
|
||||
dhgrClearBl7(0, 0, 9, 10)
|
||||
dcgrColor(CLR_BLACK)
|
||||
dcgrBoldStr(nerdClr[nerdPlayer], 30 - ^nerdName[nerdPlayer] * 2, 9, nerdName[nerdPlayer])
|
||||
dhgrSurfScr(OP_SRC)
|
||||
dhgrMemBl7(10, 16, 9, 10, nameSurf, 9*4)
|
||||
heapRelease(nameSurf)
|
||||
end
|
||||
def drawMenu#0
|
||||
byte i
|
||||
char[5] str
|
||||
|
||||
dcgrColor(CLR_PINK)
|
||||
dhgrClearBl7(0, 0, SCR_WIDTH7, SCR_HEIGHT)
|
||||
dcgrColor(CLR_BLACK)
|
||||
dhgrClearBl7(1, 12, 7, 110)
|
||||
dhgrClearBl7(8, 76, 5, 46)
|
||||
dhgrClearBl7(8, 66, 5, 56)
|
||||
dcgrColor(CLR_YELLOW)
|
||||
dhgrClearBl7(1, 122, 12, 63)
|
||||
dcgrRect(57, 78, 32, 12)
|
||||
dcgrRect(57, 68, 32, 12)
|
||||
dcgrColor(CLR_BROWN)
|
||||
dhgrClearBl7(6, 123, 2, 8)
|
||||
dhgrClearBl7(3, 144, 8, 28)
|
||||
@@ -247,10 +283,10 @@ def drawMenu#0
|
||||
dcgrHLin(8, 54, 29)
|
||||
dcgrHLin(8, 54, 116)
|
||||
dcgrRect(11, 98, 40, 10)
|
||||
drawFrame(57, 92, 32, 25)
|
||||
dcgrRect(63, 102, 21, 4)
|
||||
dcgrRect(70, 100, 7, 2)
|
||||
dcgrRect(70, 106, 7, 2)
|
||||
drawFrame(57, 82, 32, 35)
|
||||
dcgrRect(63, 97, 21, 4)
|
||||
dcgrRect(70, 95, 7, 2)
|
||||
dcgrRect(70, 101, 7, 2)
|
||||
drawFrame(10, 141, 78, 41)
|
||||
dcgrVLin(122, 184, 7)
|
||||
dcgrVLin(122, 184, 90)
|
||||
@@ -266,19 +302,21 @@ def drawMenu#0
|
||||
dcgrStr(15, 71, "GIVEAWAY")
|
||||
dcgrStr(15, 80, ">")
|
||||
dcgrStr(92, 180, "8 bit shack")
|
||||
dcgrStr(104, 190, "2026")
|
||||
dcgrStr(96, 190, "2026 v0.2")
|
||||
dcgrColor(CLR_WHITE)
|
||||
dcgrBoldStr(CLR_BLACK, 70-24, 10, "Score:")
|
||||
dcgrColor(CLR_WHITE)
|
||||
dcgrBoldStr(CLR_BLACK, 74, 10, itoa(@str, totalScore))
|
||||
for i = 0 to 4; drawItem(i); next
|
||||
drawName
|
||||
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)
|
||||
dcgrStr(5*TILE_WIDTH+TILE_WIDTH/2 - ^msg * 2, 5*TILE_HEIGHT - 10, msg)
|
||||
fin
|
||||
end
|
||||
def drawStatus#0
|
||||
@@ -286,8 +324,8 @@ def drawStatus#0
|
||||
|
||||
itoa(@str, hoardRemaining)
|
||||
dcgrColor(CLR_WHITE)
|
||||
dhgrMemBl7(6*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_CHALKBOARD-1)*TILE_SIZE, TILE_SPAN)
|
||||
dcgrStr(86, 15, @str)
|
||||
dhgrMemBl7(7*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_RIGHTBOARD-1)*TILE_SIZE, TILE_SPAN)
|
||||
dcgrStr(7*TILE_WIDTH, 15, @str)
|
||||
end
|
||||
def drawScore(nerd)#0
|
||||
char[4] str
|
||||
@@ -299,6 +337,7 @@ def drawScore(nerd)#0
|
||||
end
|
||||
def drawMap#0
|
||||
var i, j, k, l
|
||||
char[4] lvlStr
|
||||
|
||||
for j = TILEMAP_HEIGHT/2-1 downto 0
|
||||
for i = TILEMAP_WIDTH/2-1 downto 0
|
||||
@@ -311,7 +350,9 @@ def drawMap#0
|
||||
next
|
||||
next
|
||||
dcgrColor(CLR_WHITE)
|
||||
dcgrStr(46, 15, "Remaining")
|
||||
dcgrStr(46, 15, "Level")
|
||||
dcgrStr(46+24, 15, itoa(@lvlStr, 10 - level))
|
||||
dcgrStr(46+32, 15, "Left")
|
||||
end
|
||||
def actionSean(event)#0
|
||||
dhgrMemBl7(8*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_SEAN1-1)*TILE_SIZE, TILE_SPAN)
|
||||
@@ -321,6 +362,7 @@ end
|
||||
def hitCheck(nerd, x, y)
|
||||
byte i
|
||||
|
||||
if x < 0 or x > TILEMAP_WIDTH-1 or y > TILEMAP_HEIGHT-1; return HIT_TILE; fin // Quick test for edges
|
||||
when tileMap.[y, x]
|
||||
is TILE_FLOOR
|
||||
//
|
||||
@@ -357,8 +399,8 @@ def hitCheck(nerd, x, y)
|
||||
drawScore(nerd)
|
||||
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)
|
||||
dhgrMemBl7(8*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_SEAN3-1)*TILE_SIZE, TILE_SPAN)
|
||||
dhgrMemBl7(9*TILE_WIDTH7, 0, TILE_WIDTH7, TILE_HEIGHT, tileList+(TILE_SEAN4-1)*TILE_SIZE, TILE_SPAN)
|
||||
fin
|
||||
break
|
||||
is TILE_TABLE1
|
||||
@@ -400,7 +442,6 @@ def mapZone(x, y)#1
|
||||
fin
|
||||
return zone
|
||||
end
|
||||
|
||||
def moveNerd(nerd, dir)
|
||||
byte oldX, oldY
|
||||
var moved
|
||||
@@ -471,7 +512,18 @@ def addHoard#0
|
||||
while hoardType[pos]
|
||||
pos++; if pos >= TABLE_POSITIONS; pos = 0; fin
|
||||
loop
|
||||
hoardType[pos] = ((conio:rnd() & 255) < 25) ?? JACKPOT :: (conio:rnd() & HOARD_NUM-2) + 1
|
||||
if hoardJackpots
|
||||
if hoardJackpots >= hoardRemaining
|
||||
hoardType[pos] = JACKPOT
|
||||
else
|
||||
hoardType[pos] = ((conio:rnd() & 255) < 25) ?? JACKPOT :: (conio:rnd() & HOARD_NUM-2) + 1
|
||||
fin
|
||||
if hoardType[pos] == JACKPOT
|
||||
hoardJackpots--
|
||||
fin
|
||||
else
|
||||
hoardType[pos] = (conio:rnd() & HOARD_NUM-2) + 1
|
||||
fin
|
||||
hoardActive++
|
||||
hoardAvailable++
|
||||
hoardRemaining--
|
||||
@@ -488,7 +540,7 @@ def actionUpdateHoard(event)#0
|
||||
//
|
||||
addHoard
|
||||
if hoardRemaining
|
||||
addEvent(conio:rnd() & HOARD_ACTION_MASK, event)
|
||||
addEvent(conio:rnd() % ((level + 1) * HOARD_SCALE), event)
|
||||
else
|
||||
eventFree(event)
|
||||
fin
|
||||
@@ -551,62 +603,47 @@ def actionUpdateNerd(event)#0
|
||||
distY = targetY - nerdY[nerd]
|
||||
nerdZone = mapZone(nerdX[nerd], nerdY[nerd])
|
||||
targetZone = mapZone(targetX, targetY)
|
||||
if nerdZone == targetZone
|
||||
//
|
||||
// Head directly to target
|
||||
//
|
||||
if distY == 0
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
elsif distX == 0
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
elsif distX * distX > distY * distY
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
else
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
fin
|
||||
else
|
||||
when nerdZone & targetZone
|
||||
is ZONE_EAST
|
||||
is ZONE_WEST
|
||||
//
|
||||
// Both on same side - prioritize up/down
|
||||
//
|
||||
if distY == 0
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
else
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
fin
|
||||
break
|
||||
is ZONE_NORTH
|
||||
is ZONE_SOUTH
|
||||
//
|
||||
// Both on same side - prioritize left/right
|
||||
//
|
||||
if distX == 0
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
else
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
fin
|
||||
break
|
||||
otherwise
|
||||
//
|
||||
// Have to move around table
|
||||
//
|
||||
if nerdZone == ZONE_EAST or nerdZone == ZONE_WEST
|
||||
moveDir = targetY < TILEMAP_HEIGHT/2 ?? MOVE_UP :: MOVE_DOWN
|
||||
elsif nerdZone == ZONE_NORTH or nerdZone == ZONE_SOUTH
|
||||
moveDir = targetX < TILEMAP_WIDTH/2 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
elsif distX * distX > distY * distY
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
else
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
fin
|
||||
wend
|
||||
fin
|
||||
if not moveNerd(nerd, moveDir)
|
||||
when nerdZone & targetZone
|
||||
is ZONE_EAST
|
||||
is ZONE_WEST
|
||||
//
|
||||
// Both on same side - prioritize up/down
|
||||
//
|
||||
if distY == 0
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
else
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
fin
|
||||
break
|
||||
is ZONE_NORTH
|
||||
is ZONE_SOUTH
|
||||
//
|
||||
// Both on same side - prioritize left/right
|
||||
//
|
||||
if distX == 0
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
else
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
fin
|
||||
break
|
||||
otherwise
|
||||
//
|
||||
// Have to move around table
|
||||
//
|
||||
if nerdZone == ZONE_EAST or nerdZone == ZONE_WEST
|
||||
moveDir = targetY < TILEMAP_HEIGHT/2 ?? MOVE_UP :: MOVE_DOWN
|
||||
elsif nerdZone == ZONE_NORTH or nerdZone == ZONE_SOUTH
|
||||
moveDir = targetX < TILEMAP_WIDTH/2 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
elsif distX * distX > distY * distY
|
||||
moveDir = distX < 0 ?? MOVE_LEFT :: MOVE_RIGHT
|
||||
else
|
||||
moveDir = distY < 0 ?? MOVE_UP :: MOVE_DOWN
|
||||
fin
|
||||
wend
|
||||
if not moveNerd(nerd, moveDir) and (distX * distX * distY * distY) > 1
|
||||
moveNerd(nerd, conio:rnd() & MOVE_MASK) // Help get unstuck
|
||||
fin
|
||||
addEvent(level * LEVEL_SCALE, event)
|
||||
addEvent(level * HORDE_SCALE + HORDE_EQ, event)
|
||||
end
|
||||
def joyCalibrate#4
|
||||
byte x, y
|
||||
@@ -648,57 +685,24 @@ def actionUpdatePlayer(event)#0
|
||||
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
|
||||
hoardActive = 0; hoardRemaining = 0; exit = TRUE
|
||||
wend
|
||||
moveNerd(nerdPlayer, moveDir)
|
||||
fin
|
||||
addEvent(level, event)
|
||||
moveNerd(nerdPlayer, moveDir)
|
||||
addEvent(PLAYER_EQ, event)
|
||||
end
|
||||
def playGG#0
|
||||
//
|
||||
// Automatic joystick enable/calibration
|
||||
//
|
||||
joyLeft, joyRight, joyUp, joyDown = joyCalibrate
|
||||
//
|
||||
// Initialize event system
|
||||
//
|
||||
eventInit
|
||||
//
|
||||
// Intitialize nerds
|
||||
// Show playing field
|
||||
//
|
||||
drawMap
|
||||
//
|
||||
// Intitialize horde
|
||||
//
|
||||
for buzz = 0 to NUM_NERDS-1
|
||||
nerdX[buzz] = 1
|
||||
@@ -708,9 +712,9 @@ def playGG#0
|
||||
drawScore(buzz)
|
||||
moveNerd(buzz, MOVE_NONE)
|
||||
if buzz == nerdPlayer
|
||||
addAction(level, @actionUpdatePlayer, buzz)
|
||||
addAction(PLAYER_EQ, @actionUpdatePlayer, buzz)
|
||||
else
|
||||
addAction(conio:rnd() % (level * LEVEL_SCALE), @actionUpdateNerd, buzz)
|
||||
addAction(conio:rnd() % (level * HORDE_SCALE + HORDE_EQ), @actionUpdateNerd, buzz)
|
||||
fin
|
||||
next
|
||||
//
|
||||
@@ -719,14 +723,15 @@ def playGG#0
|
||||
for buzz = 0 to TABLE_POSITIONS-1
|
||||
hoardType[buzz] = 0
|
||||
next
|
||||
hoardRemaining = 20
|
||||
hoardAvailable = 0
|
||||
hoardActive = 0
|
||||
hoardAvailable = 0
|
||||
hoardRemaining = HOARD_SIZE
|
||||
hoardJackpots = hoardRemaining / 10
|
||||
addHoard
|
||||
addHoard
|
||||
addHoard
|
||||
addHoard
|
||||
addAction(conio:rnd() & HOARD_ACTION_MASK, @actionUpdateHoard, 0)
|
||||
addAction((level + 1) * HOARD_SCALE, @actionUpdateHoard, 0)
|
||||
//
|
||||
// Go!
|
||||
//
|
||||
@@ -748,9 +753,25 @@ def playGG#0
|
||||
//
|
||||
doEvents
|
||||
loop
|
||||
drawMessage("Finished!")
|
||||
totalScore = totalScore + nerdScore[nerdPlayer] // Add to total score
|
||||
drawMessage(exit ?? "Quitter!" :: level == 1 ?? "Finished!" :: "Next Level!")
|
||||
conio:tone(30, 20)
|
||||
conio:tone(200, 10)
|
||||
for hoardActive = 255 downto 0
|
||||
for hoardAvailable = 7 downto 0
|
||||
if conio:keypressed(); conio:getkey(); return ;fin
|
||||
next
|
||||
next
|
||||
end
|
||||
//
|
||||
// Menu interface
|
||||
//
|
||||
def randomize#0
|
||||
conio:rnd()
|
||||
if (^$C061 | ^$C062) & $80 // Look for joystick button pushed
|
||||
getc
|
||||
musicStop
|
||||
fin
|
||||
end
|
||||
def info#0
|
||||
screenRead("GG.DHGR")
|
||||
@@ -761,80 +782,93 @@ def nerdNext#0
|
||||
dcgrColor(CLR_AQUA)
|
||||
drawSelect
|
||||
nerdPlayer = (nerdPlayer + 1) & (NUM_NERDS - 1)
|
||||
drawName
|
||||
end
|
||||
def menu
|
||||
byte item, pulse
|
||||
byte item, pulse, key
|
||||
|
||||
drawMenu
|
||||
item = 0
|
||||
while TRUE
|
||||
dcgrColor(pulse)
|
||||
dcgrColor(pulse >> 1)
|
||||
drawItem(item)
|
||||
drawSelect
|
||||
//
|
||||
// Handle user input
|
||||
//
|
||||
key = 0
|
||||
if conio:keypressed()
|
||||
when toupper(getc)
|
||||
is 'P'
|
||||
return TRUE
|
||||
is 'Q'
|
||||
return FALSE
|
||||
is 'I'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 1
|
||||
info
|
||||
break
|
||||
is keyArrowLeft
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 2
|
||||
dcgrColor(CLR_AQUA)
|
||||
drawSelect
|
||||
nerdPlayer = (nerdPlayer - 1) & (NUM_NERDS - 1)
|
||||
break
|
||||
is keyArrowRight
|
||||
is 'N'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 2
|
||||
nerdNext
|
||||
break
|
||||
is 'S'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 3
|
||||
break
|
||||
is keyArrowDown
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item++; if item > 4; item = 0; fin
|
||||
break
|
||||
is keyArrowUp
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
if item == 0; item = 4; else item--; fin
|
||||
break
|
||||
is keyEnter
|
||||
when item
|
||||
is 0
|
||||
return TRUE
|
||||
is 1
|
||||
info
|
||||
break
|
||||
is 2
|
||||
nerdNext
|
||||
break
|
||||
is 4
|
||||
return FALSE
|
||||
wend
|
||||
wend
|
||||
key = toupper(getc)
|
||||
else
|
||||
joyX, joyY, btn0, btn1 = joyPos(0)
|
||||
if joyX < joyLeft
|
||||
key = keyArrowLeft
|
||||
elsif joyX > joyRight
|
||||
key = keyArrowRight
|
||||
fin
|
||||
if joyY < joyUp
|
||||
key = keyArrowUp
|
||||
elsif joyY > joyDown
|
||||
key = keyArrowDown
|
||||
fin
|
||||
if btn0 or btn1
|
||||
key = keyEnter
|
||||
fin
|
||||
fin
|
||||
when key
|
||||
is 'P'
|
||||
return TRUE
|
||||
is 'Q'
|
||||
return FALSE
|
||||
is 'I'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 1
|
||||
info
|
||||
break
|
||||
is keyArrowLeft
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 2
|
||||
dcgrColor(CLR_AQUA)
|
||||
drawSelect
|
||||
nerdPlayer = (nerdPlayer - 1) & (NUM_NERDS - 1)
|
||||
drawName
|
||||
break
|
||||
is keyArrowRight
|
||||
is 'N'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 2
|
||||
nerdNext
|
||||
break
|
||||
is 'S'
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item = 3
|
||||
break
|
||||
is keyArrowDown
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
item++; if item > 4; item = 0; fin
|
||||
break
|
||||
is keyArrowUp
|
||||
dcgrColor(CLR_BLACK)
|
||||
drawItem(item)
|
||||
if item == 0; item = 4; else item--; fin
|
||||
break
|
||||
is keyEnter
|
||||
when item
|
||||
is 0; return TRUE
|
||||
is 1; info; break
|
||||
is 2; nerdNext; break
|
||||
is 4; return FALSE
|
||||
wend
|
||||
wend
|
||||
pulse++
|
||||
loop
|
||||
return FALSE
|
||||
end
|
||||
def randomize#0
|
||||
conio:rnd()
|
||||
end
|
||||
//
|
||||
// Hook CYA IRQ handler into ProDOS IRQ chain
|
||||
//
|
||||
@@ -854,8 +888,16 @@ while ^arg and ^(arg + 1) == '-'
|
||||
spriteList = musicRead("GG.SEQ")
|
||||
musicPlay(spriteList, FALSE)
|
||||
musicGetKey(8, @randomize)
|
||||
heaprelease(spriteList)
|
||||
heapRelease(spriteList)
|
||||
spriteList = NULL
|
||||
break
|
||||
is 'L'
|
||||
//
|
||||
// Override level
|
||||
//
|
||||
level = 10 - (^(arg + 3) - '0')
|
||||
if level > 9; level = 0; fin
|
||||
break
|
||||
wend
|
||||
arg = argNext(arg)
|
||||
loop
|
||||
@@ -863,10 +905,19 @@ dcgrFont(FONT_DEF_THIN)
|
||||
loadTiles
|
||||
loadSprites
|
||||
if tileList <> NULL and spriteList <> NULL
|
||||
level = 9
|
||||
//
|
||||
// Automatic joystick enable/calibration
|
||||
//
|
||||
joyLeft, joyRight, joyUp, joyDown = joyCalibrate
|
||||
//
|
||||
// Run, Rinse, Repeat
|
||||
//
|
||||
while menu
|
||||
drawMap
|
||||
playGG
|
||||
exit = FALSE
|
||||
while level and not exit
|
||||
playGG
|
||||
level--
|
||||
loop
|
||||
loop
|
||||
fin
|
||||
dhgrMode(DHGR_TEXT_MODE)
|
||||
|
||||
@@ -8,8 +8,10 @@ const TILE_HEIGHT = 24
|
||||
const TILE_SIZE = TILE_SPAN*TILE_HEIGHT
|
||||
const TILEMAP_WIDTH = 10
|
||||
const TILEMAP_HEIGHT = 8
|
||||
const NUM_TILES = 20
|
||||
const NUM_TILES = 22
|
||||
const TILE_LEFTBOARD = 4
|
||||
const TILE_CHALKBOARD = 5
|
||||
const TILE_RIGHTBOARD = 6
|
||||
const TILE_FLOOR = 9
|
||||
const TILE_BOX = 8
|
||||
const TILE_BOX1 = 8
|
||||
@@ -23,6 +25,8 @@ const TILE_TABLE4 = 17
|
||||
const TILE_TABLEMID = 14
|
||||
const TILE_SEAN1 = 19
|
||||
const TILE_SEAN2 = 20
|
||||
const TILE_SEAN3 = 21
|
||||
const TILE_SEAN4 = 22
|
||||
//
|
||||
// Sprites
|
||||
//
|
||||
|
||||
@@ -814,7 +814,7 @@ def a2tone(duration, delay)
|
||||
return 0
|
||||
end
|
||||
def a2rnd
|
||||
*a2rndnum = ^a2rndh ^ ^a2rndl ^ (*a2rndnum << 1) + 125
|
||||
*a2rndnum = ^a2rndh ^ ^a2rndl ^ (*a2rndnum << 1) + 125*256
|
||||
return *a2rndnum & $7FFF
|
||||
end
|
||||
//
|
||||
|
||||
@@ -78,7 +78,7 @@ word keypressed = @a2keypressed
|
||||
|
||||
word instr[] // Overlay with other variables
|
||||
word seqTrack, seqEvent, seqTime, eventTime, updateTime
|
||||
byte numNotes, seqRepeat
|
||||
byte numNotes, seqRepeat, seqQuit
|
||||
byte indexA[2], indexB[2], indexC[2]
|
||||
byte noteA[2], noteB[2], noteC[2]
|
||||
word notes1[MAX_MBCH_NOTES], notes2[MAX_MBCH_NOTES]
|
||||
@@ -471,7 +471,7 @@ end
|
||||
//
|
||||
def mbSequence(yield, func)#0
|
||||
word period, n, yieldTime
|
||||
byte note, volume, channel, i, overflow, status, quit
|
||||
byte note, volume, channel, i, overflow, status
|
||||
|
||||
//
|
||||
// Reset oscillator table
|
||||
@@ -500,7 +500,6 @@ def mbSequence(yield, func)#0
|
||||
yieldTime = $7FFF
|
||||
fin
|
||||
updateTime = seqTime
|
||||
quit = FALSE
|
||||
repeat
|
||||
while eventTime == seqTime
|
||||
note = seqEvent->percnote
|
||||
@@ -581,7 +580,7 @@ def mbSequence(yield, func)#0
|
||||
musicStop
|
||||
fin
|
||||
seqTime = -1 // Offset seqTime++ later
|
||||
quit = TRUE // Exit out
|
||||
seqQuit = TRUE // Exit out
|
||||
break
|
||||
fin
|
||||
fin
|
||||
@@ -654,10 +653,10 @@ def mbSequence(yield, func)#0
|
||||
seqTime++
|
||||
if yieldTime <= seqTime; func()#0; yieldTime = seqTime + yield; fin
|
||||
while !(mbVIA1->IFR & $40) // Wait for T1 interrupt
|
||||
if a2keypressed(); quit = TRUE; break; fin
|
||||
if a2keypressed(); seqQuit = TRUE; break; fin
|
||||
loop
|
||||
mbVIA1->T1C // Read T1C-L, clear interrupt
|
||||
until quit
|
||||
until seqQuit
|
||||
mbVIA1->IER = $7F // Mask all interrupts
|
||||
psgWrite(mbVIA1, MIXER, $FF) // Turn everything off
|
||||
psgWrite(mbVIA1, AENVAMP, $00)
|
||||
@@ -779,8 +778,9 @@ def spkrSequence(yield, func)#0
|
||||
seqTime = duration + seqTime
|
||||
tonePlay(period, DUR16TH * duration)#0
|
||||
fin
|
||||
seqQuit = keypressed()
|
||||
if yieldTime <= seqTime; func()#0; yieldTime = seqTime + yield; fin
|
||||
until keypressed()
|
||||
until seqQuit
|
||||
end
|
||||
//
|
||||
// No sequence, just waste time and yield
|
||||
@@ -839,6 +839,8 @@ end
|
||||
//
|
||||
export def musicStop#0
|
||||
musicSequence = @noSequence
|
||||
seqQuit = TRUE
|
||||
seqRepeat = FALSE
|
||||
end
|
||||
//
|
||||
// Play until keystroke
|
||||
|
||||
Reference in new issue
Block a user