\r
DECLARE SUB DisplayGameStatistics ()\r
DECLARE SUB LoadCurrentLevel (y%)\r
-DECLARE SUB DrawSprite (p%, o%, m%, fr%, teler%)\r
\r
DEFINT A-Z\r
-DIM SHARED graphicsMode\r
+DIM SHARED GraphicsDisplayMode\r
DIM SHARED asciiLevelData(1 TO 20) AS STRING * 31\r
DIM SHARED Companion1PositionY%, Companion1PositionX%, Companion2PositionY%, Companion2PositionX%\r
DIM SHARED LivesRemaining%, CoinsCollected%\r
\r
' Capture sprite images from screen drawing operations\r
GET (1, 1)-(20, 20), EmptySpaceSprite\r
-DrawSprite 0, 0, 1, 1, 1\r
+RenderSpriteFromFile 0, 0, 1, 1, 1\r
GET (1, 1)-(20, 20), SolidTerrainSprite\r
-DrawSprite 0, 0, 4, 1, 1\r
+RenderSpriteFromFile 0, 0, 4, 1, 1\r
GET (1, 1)-(20, 20), kast\r
PUT (1, 180), SolidTerrainSprite, PSET\r
PUT (300, 1), SolidTerrainSprite, PSET\r
PUT (300, 180), SolidTerrainSprite, PSET\r
-DrawSprite 30, 50, 2, 1, 1\r
+RenderSpriteFromFile 30, 50, 2, 1, 1\r
GET (31, 51)-(91, 76), pilv\r
PUT (160, 10), pilv, PSET\r
-DrawSprite 20, 100, 3, 1, 1\r
+RenderSpriteFromFile 20, 100, 3, 1, 1\r
GET (21, 101)-(31, 114), taht\r
CLS\r
-DrawSprite 0, 0, 5, 1, 1\r
+RenderSpriteFromFile 0, 0, 5, 1, 1\r
GET (1, 1)-(11, 8), siil\r
CLS\r
-DrawSprite 0, 0, 6, 1, 1\r
+RenderSpriteFromFile 0, 0, 6, 1, 1\r
GET (1, 1)-(8, 10), CoinSprite\r
CLS\r
-DrawSprite 0, 0, 7, 1, 1\r
+RenderSpriteFromFile 0, 0, 7, 1, 1\r
GET (1, 1)-(31, 11), poosas\r
CLS\r
-DrawSprite 0, 0, 8, 1, 1\r
+RenderSpriteFromFile 0, 0, 8, 1, 1\r
GET (1, 1)-(26, 21), WindowSprite\r
CLS\r
-DrawSprite 0, 0, 9, 1, 1\r
+RenderSpriteFromFile 0, 0, 9, 1, 1\r
GET (1, 1)-(21, 11), TrampolineSprite\r
CLS\r
-DrawSprite 0, 0, 11, 1, 1\r
+RenderSpriteFromFile 0, 0, 11, 1, 1\r
GET (1, 1)-(51, 81), TreeSprite\r
CLS\r
-DrawSprite 0, 0, 12, 1, 1\r
+RenderSpriteFromFile 0, 0, 12, 1, 1\r
GET (1, 1)-(20, 20), noolt\r
CLS\r
-DrawSprite 0, 0, 12, 50, 1\r
+RenderSpriteFromFile 0, 0, 12, 50, 1\r
GET (1, 1)-(20, 20), noolt1\r
CLS\r
-DrawSprite 0, 0, 13, 1, 1\r
+RenderSpriteFromFile 0, 0, 13, 1, 1\r
GET (1, 1)-(20, 20), HoleSprite\r
CLS\r
-DrawSprite 0, 0, 14, 1, 1\r
+RenderSpriteFromFile 0, 0, 14, 1, 1\r
GET (1, 1)-(20, 20), sipp1\r
CLS\r
-DrawSprite 0, 0, 15, 1, 1\r
+RenderSpriteFromFile 0, 0, 15, 1, 1\r
GET (1, 1)-(20, 20), sipp2\r
CLS\r
-DrawSprite 0, 0, 14, 50, 1\r
+RenderSpriteFromFile 0, 0, 14, 50, 1\r
GET (1, 1)-(20, 20), sipp10\r
CLS\r
-DrawSprite 0, 0, 15, 50, 1\r
+RenderSpriteFromFile 0, 0, 15, 50, 1\r
GET (1, 1)-(20, 20), sipp20\r
CLS\r
-DrawSprite 0, 0, 16, 1, 1\r
+RenderSpriteFromFile 0, 0, 16, 1, 1\r
GET (1, 1)-(20, 20), sipp3\r
CLS\r
\r
\r
' Capture small scale versions of sprites\r
GET (1, 1)-(10, 10), EmptySpaceSpriteSmall\r
-DrawSprite 0, 0, 1, 1, 2\r
+RenderSpriteFromFile 0, 0, 1, 1, 2\r
GET (1, 1)-(10, 10), SolidTerrainSpriteSmall\r
-DrawSprite 0, 0, 4, 1, 2\r
+RenderSpriteFromFile 0, 0, 4, 1, 2\r
GET (1, 1)-(10, 10), kastm\r
PUT (1, 180), SolidTerrainSprite, PSET\r
PUT (300, 1), SolidTerrainSprite, PSET\r
PUT (300, 180), SolidTerrainSprite, PSET\r
-DrawSprite 30, 50, 2, 1, 2\r
+RenderSpriteFromFile 30, 50, 2, 1, 2\r
GET (16, 26)-(46, 38), pilvm\r
-DrawSprite 20, 100, 3, 1, 2\r
+RenderSpriteFromFile 20, 100, 3, 1, 2\r
GET (11, 51)-(16, 72), tahtm\r
CLS\r
-DrawSprite 0, 0, 5, 1, 2\r
+RenderSpriteFromFile 0, 0, 5, 1, 2\r
GET (1, 1)-(6, 4), siilm\r
CLS\r
-DrawSprite 0, 0, 6, 1, 2\r
+RenderSpriteFromFile 0, 0, 6, 1, 2\r
GET (1, 1)-(4, 5), CoinSpriteSmall\r
CLS\r
-DrawSprite 0, 0, 7, 1, 2\r
+RenderSpriteFromFile 0, 0, 7, 1, 2\r
GET (1, 1)-(16, 6), poosasm\r
CLS\r
-DrawSprite 0, 0, 8, 1, 2\r
+RenderSpriteFromFile 0, 0, 8, 1, 2\r
GET (1, 1)-(13, 11), WindowSpriteSmall\r
CLS\r
-DrawSprite 0, 0, 9, 1, 2\r
+RenderSpriteFromFile 0, 0, 9, 1, 2\r
GET (1, 1)-(11, 6), TrampolineSpriteSmall\r
CLS\r
-DrawSprite 0, 0, 11, 1, 2\r
+RenderSpriteFromFile 0, 0, 11, 1, 2\r
GET (1, 1)-(26, 41), TreeSpriteSmall\r
CLS\r
-DrawSprite 0, 0, 12, 1, 2\r
+RenderSpriteFromFile 0, 0, 12, 1, 2\r
GET (1, 1)-(10, 10), nooltm\r
CLS\r
-DrawSprite 0, 0, 12, 50, 2\r
+RenderSpriteFromFile 0, 0, 12, 50, 2\r
GET (1, 1)-(10, 10), nooltm1\r
CLS\r
-DrawSprite 0, 0, 13, 1, 2\r
+RenderSpriteFromFile 0, 0, 13, 1, 2\r
GET (1, 1)-(10, 10), HoleSpriteSmall\r
CLS\r
-DrawSprite 0, 0, 14, 1, 2\r
+RenderSpriteFromFile 0, 0, 14, 1, 2\r
GET (1, 1)-(10, 10), sippm1\r
CLS\r
-DrawSprite 0, 0, 15, 1, 2\r
+RenderSpriteFromFile 0, 0, 15, 1, 2\r
GET (1, 1)-(10, 10), sippm2\r
CLS\r
-DrawSprite 0, 0, 14, 50, 2\r
+RenderSpriteFromFile 0, 0, 14, 50, 2\r
GET (1, 1)-(10, 10), sippm10\r
CLS\r
-DrawSprite 0, 0, 15, 50, 2\r
+RenderSpriteFromFile 0, 0, 15, 50, 2\r
GET (1, 1)-(10, 10), sippm20\r
CLS\r
-DrawSprite 0, 0, 16, 1, 2\r
+RenderSpriteFromFile 0, 0, 16, 1, 2\r
GET (1, 1)-(10, 10), sippm3\r
CLS\r
-DrawSprite 0, 0, 17, 1, 1\r
+RenderSpriteFromFile 0, 0, 17, 1, 1\r
GET (1, 1)-(21, 31), DoorSprite\r
CLS\r
-DrawSprite 0, 0, 17, 1, 2\r
+RenderSpriteFromFile 0, 0, 17, 1, 2\r
GET (1, 1)-(11, 16), IntroScreen\r
CLS\r
\r
-DrawSprite -1, -1, 10, 4, 1\r
+RenderSpriteFromFile -1, -1, 10, 4, 1\r
GET (1, 1)-(318, 124), IntroScreen\r
\r
key$ = INPUT$(1)\r
siie = 1\r
siie1 = 1\r
MainGameLoop:\r
-kbd$ = INKEY$\r
-IF graphicsMode = 2 THEN b = b * 2: GOTO mainLoopSmallScale\r
+keyboardInput$ = INKEY$\r
+IF GraphicsDisplayMode = 2 THEN b = b * 2: GOTO mainLoopSmallScale\r
IF b > 0 THEN GET (a, b)-(a + 20, b + 20), mar1\r
IF b > 0 THEN IF sipp = 1 THEN PUT (a, b), sipp1, OR\r
IF b > 0 THEN IF sipp = 2 THEN PUT (a, b), sipp2, OR\r
IF a > 297 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
\r
' Level transition when reaching left edge\r
-IF a < 1 THEN a = 296: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF graphicsMode = 2 THEN a = 594\r
+IF a < 1 THEN a = 296: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode = 2 THEN a = 594\r
\r
' Player falls off bottom of screen\r
IF b > 179 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: b = 100: a = 2: DisplayGameStatistics\r
IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = DoorExitX% + 10: b = DoorExitY%: eda = 0\r
IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = DoorEntryX% + 10: b = DoorEntryY%: eda = 0\r
\r
-IF kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
-IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
-IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
-IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
-IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
-IF kbd$ = downArrowKey$ THEN all = all + 1\r
-IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "q" THEN END\r
+IF keyboardInput$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF keyboardInput$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
+IF keyboardInput$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
+IF keyboardInput$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF keyboardInput$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF keyboardInput$ = downArrowKey$ THEN all = all + 1\r
+IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "q" THEN END\r
sipa = sipa + 1\r
IF sipa = 3 THEN sipa = 1\r
GOTO MainGameLoop\r
\r
\r
mainLoopSmallScale:\r
-kbd$ = INKEY$\r
-IF graphicsMode = 1 THEN b = b / 2: GOTO MainGameLoop\r
+keyboardInput$ = INKEY$\r
+IF GraphicsDisplayMode = 1 THEN b = b / 2: GOTO MainGameLoop\r
IF b > 0 THEN GET (a \ 2, b \ 2)-((a + 20) \ 2, (b + 20) \ 2), marm1\r
IF b > 0 THEN IF sipp = 1 THEN PUT (a \ 2, b \ 2), sippm1, OR\r
IF b > 0 THEN IF sipp = 2 THEN PUT (a \ 2, b \ 2), sippm2, OR\r
IF a > 594 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
\r
' Level transition when reaching left edge\r
-IF a < 1 THEN a = 594: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF graphicsMode = 1 THEN a = 297\r
+IF a < 1 THEN a = 594: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode = 1 THEN a = 297\r
\r
' Player falls off bottom of screen\r
IF b > 358 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: b = 100: a = 2: DisplayGameStatistics\r
IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = DoorExitX% + 5: b = DoorExitY%: eda = 0\r
IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = DoorEntryX% + 5: b = DoorEntryY%: eda = 0\r
\r
-IF kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
-IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
-IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
-IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
-IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
-IF kbd$ = downArrowKey$ THEN all = all + 1\r
-IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "q" THEN END\r
+IF keyboardInput$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF keyboardInput$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
+IF keyboardInput$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
+IF keyboardInput$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF keyboardInput$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF keyboardInput$ = downArrowKey$ THEN all = all + 1\r
+IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "q" THEN END\r
\r
sipa = sipa + 1\r
IF sipa = 3 THEN sipa = 1\r
\r
SUB DisplayGameStatistics\r
'\r
-' Updates and displays the game's status information (coins collected, lives remaining)\r
+' Updates and displays the game's status information (coins, lives)\r
' Handles game over condition when lives reach zero.\r
'\r
-' This subroutine is called whenever the game state changes that affects statistics:\r
-' - When a coin is collected\r
-' - When the player loses a life\r
-' - Periodically during gameplay\r
+' This subroutine is called whenever:\r
+' - A coin is collected\r
+' - The player loses a life (from hazards or falling)\r
+' - Periodically during gameplay for live updates\r
\r
LOCATE 1, 1\r
-IF GraphicsMode% = 2 THEN GOTO SkipTextDisplay\r
+IF GraphicsDisplayMode% = 2 THEN GOTO SkipTextDisplay\r
\r
-' Clear previous stats display\r
+' Clear previous stats display to prevent text overlap\r
PRINT " "\r
\r
' Award extra life every 10 coins collected\r
IF LivesRemaining% < 0 THEN END\r
END SUB\r
\r
-SUB DrawSprite (p, o, m, fr, teler)\r
+SUB RenderSpriteFromFile (p, o, m, fr, teler)\r
' Renders a sprite on screen loaded from file "img/<m>.i01"\r
'\r
' File format: First line = height (number of rows)\r
IF y >= 1 AND y <= 18 THEN\r
fileName$ = "lvl/" + LTRIM$(STR$(y)) + ".lvl"\r
OPEN fileName$ FOR INPUT AS #1\r
- INPUT #1, graphicsMode, increment\r
+ INPUT #1, GraphicsDisplayMode, increment\r
i% = 1\r
WHILE NOT EOF(1)\r
LINE INPUT #1, asciiLevelData(i%)\r
SELECT CASE y\r
CASE 19\r
CLS\r
- DrawSprite 1, 1, 10, 3, 1\r
+ RenderSpriteFromFile 1, 1, 10, 3, 1\r
LOCATE 20, 1\r
PRINT "end"\r
FOR a = 1 TO 50\r
asciiLevelData(17) = " "\r
asciiLevelData(18) = " "\r
asciiLevelData(19) = " "\r
- graphicsMode = 2\r
+ GraphicsDisplayMode = 2\r
END SELECT\r
END IF\r
-IF graphicsMode = 2 THEN GOTO 124\r
+IF GraphicsDisplayMode = 2 THEN GOTO 124\r
FOR e = 0 TO 9\r
FOR D = 0 TO 15\r
q$ = RIGHT$(LEFT$(asciiLevelData(e + 1), D + 1), 1)\r