diff --git a/src/dhgr.tk/gg/event.pla b/src/dhgr.tk/gg/event.pla index 4466a113..feef8013 100644 --- a/src/dhgr.tk/gg/event.pla +++ b/src/dhgr.tk/gg/event.pla @@ -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 // diff --git a/src/dhgr.tk/gg/import.pla b/src/dhgr.tk/gg/import.pla index 774ca82c..cf4ef40b 100644 --- a/src/dhgr.tk/gg/import.pla +++ b/src/dhgr.tk/gg/import.pla @@ -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 diff --git a/src/dhgr.tk/gg/sean.pla b/src/dhgr.tk/gg/sean.pla index 64f8490b..1ded81a1 100644 --- a/src/dhgr.tk/gg/sean.pla +++ b/src/dhgr.tk/gg/sean.pla @@ -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) diff --git a/src/dhgr.tk/gg/sean.plh b/src/dhgr.tk/gg/sean.plh index 13e5fc82..1297eba3 100644 --- a/src/dhgr.tk/gg/sean.plh +++ b/src/dhgr.tk/gg/sean.plh @@ -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 // diff --git a/src/libsrc/apple/conio.pla b/src/libsrc/apple/conio.pla index 2fedaca2..42c150aa 100644 --- a/src/libsrc/apple/conio.pla +++ b/src/libsrc/apple/conio.pla @@ -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 // diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index bb325608..50020a05 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -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