--- /dev/null
+DECLARE SUB RenderSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, SpriteName$)\r
+DECLARE SUB RenderFlippedSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, Filename$)\r
+' Pomppu Paavo 2\r
+'\r
+' This program is free software: released under Creative Commons Zero (CC0) license\r
+' by Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 1999, Initial version\r
+' 2025, Improved program readability\r
+\r
+DECLARE SUB UpdateLoadingScreen ()\r
+DECLARE SUB HandleEscapeKey ()\r
+DECLARE SUB PlayHurtSound ()\r
+DECLARE SUB GameOverSequence ()\r
+\r
+DECLARE SUB HandlePlayerDeath ()\r
+DEFINT A-Z\r
+DECLARE SUB InitializeAllLevelData ()\r
+DECLARE SUB UpdateHUD (coinIncrementAmount%)\r
+DECLARE SUB LoadCurrentLevel ()\r
+DECLARE SUB ShowIntroScreen ()\r
+DECLARE SUB WaitForUserInput ()\r
+\r
+DIM SHARED userInput$\r
+\r
+' Grid representing solid level elements (m = block, o = breakable, etc.)\r
+DIM SHARED levelGrid(-5 TO 20, -5 TO 20) AS STRING\r
+\r
+' Tracks interactive objects like breakable blocks separately from main grid\r
+DIM SHARED interactiveObjectsGrid(-5 TO 20, -5 TO 20) AS STRING\r
+\r
+' Stores raw text-based level layouts for all worlds\r
+DIM SHARED levelData(1 TO 11, 1 TO 10) AS STRING * 15\r
+\r
+' Background color index for each world's sky\r
+DIM SHARED levelSkyColor(1 TO 10) AS INTEGER\r
+\r
+' Current active level number (1-10)\r
+DIM SHARED currentLevelNumber AS INTEGER\r
+\r
+' Previously played level number (for backtracking after death)\r
+DIM SHARED previousLevelNumber AS INTEGER\r
+\r
+' Temporary storage for current level's row data during loading\r
+DIM SHARED levelRowData(1 TO 15) AS STRING * 15\r
+\r
+' Buffer to store cloud sprite image data\r
+DIM SHARED cloudSpriteBuffer(2100)\r
+\r
+' Buffer for solid block sprite images\r
+DIM SHARED solidBlockSpriteBuffer(202)\r
+\r
+' Buffer for brick/block sprite images\r
+DIM SHARED brickSpriteBuffer(202)\r
+\r
+' Buffer for power-up item sprites (like mushrooms)\r
+DIM SHARED powerUpSpriteBuffer(1000)\r
+\r
+' Buffer for tree sprite images\r
+DIM SHARED treeSpriteBuffer(2000)\r
+\r
+' Buffer for empty space sprite (used when clearing coins/breakables)\r
+DIM SHARED emptySpaceSpriteBuffer(202)\r
+\r
+' Main coin sprite buffer\r
+DIM SHARED coinSpriteBuffer(202)\r
+\r
+' Larger coin variant sprite buffer\r
+DIM SHARED largeCoinSpriteBuffer(400)\r
+\r
+' Smaller coin variant sprite buffer\r
+DIM SHARED smallCoinSpriteBuffer(200)\r
+\r
+' Player character animation frames (base + walking variants)\r
+DIM SHARED playerAnimationFrames(402)\r
+\r
+' Primary player sprite animation frames array\r
+DIM SHARED playerWalkingFrames(202, 1 TO 5)\r
+\r
+' Enemy base sprite buffers (stores background under enemies for erasing)\r
+DIM SHARED enemyBackgroundBuffers(1 TO 230, 1 TO 10)\r
+\r
+' Enemy walking animation frames\r
+DIM SHARED enemyWalkingFrames(1 TO 202, 1 TO 5)\r
+\r
+' X positions of all enemies (max 10 per level)\r
+DIM SHARED enemyXPositions(1 TO 10)\r
+\r
+' Y positions of all enemies\r
+DIM SHARED enemyYPositions(1 TO 10)\r
+\r
+' Vertical movement speeds for enemies (positive = down)\r
+DIM SHARED enemyVerticalSpeeds(1 TO 10)\r
+\r
+' Horizontal movement speeds for enemies (positive = right)\r
+DIM SHARED enemyHorizontalSpeeds(1 TO 10)\r
+\r
+' Array storing individual digits of coin counter (index 1=ones, 2=tens)\r
+DIM SHARED CoinDigits(1 TO 5)\r
+\r
+' Pre-loaded digit images for HUD display (0-9)\r
+DIM SHARED digitImages(100, 0 TO 11)\r
+\r
+' Number of remaining player lives\r
+DIM SHARED lives\r
+\r
+' Total coins collected by player\r
+DIM SHARED coinsCollected\r
+\r
+' Flag: set when a coin needs to be cleared from grid\r
+DIM SHARED shouldClearCoinFlag\r
+\r
+' Grid X position where coin needs clearing\r
+DIM SHARED clearCoinGridX\r
+\r
+' Grid Y position where coin needs clearing\r
+DIM SHARED clearCoinGridY\r
+\r
+' Player's current X coordinate on screen\r
+DIM SHARED playerX\r
+\r
+' Player's current Y coordinate on screen\r
+DIM SHARED playerY\r
+\r
+' Counter tracking loading progress dots\r
+DIM SHARED loadingProgressDotCount\r
+\r
+loadingProgressDotCount = 1\r
+SCREEN 13\r
+currentLevelNumber = 1\r
+previousLevelNumber = 1\r
+InitializeAllLevelData\r
+1\r
+\r
+' Reset entire VGA palette to black (0-254)\r
+FOR colorIndex = 0 TO 254\r
+OUT &H3C8, colorIndex\r
+OUT &H3C9, 0\r
+OUT &H3C9, 0\r
+OUT &H3C9, 0\r
+NEXT colorIndex\r
+\r
+' Set color 255 to bright white (60/63 intensity)\r
+OUT &H3C8, 255\r
+OUT &H3C9, 60\r
+OUT &H3C9, 60\r
+OUT &H3C9, 60\r
+LOCATE 20, 3\r
+COLOR 255\r
+PRINT "LOADING "\r
+\r
+' Load all game assets sequentially with visual feedback\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "pilv"\r
+GET (1, 1)-(109, 35), cloudSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "kast"\r
+GET (1, 2)-(20, 21), solidBlockSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "tellis"\r
+GET (1, 2)-(20, 21), brickSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+GET (1, 2)-(20, 21), emptySpaceSpriteBuffer\r
+\r
+RenderSpriteFromFile 0, 0, 1, 1, "paavo1"\r
+GET (1, 2)-(20, 21), playerWalkingFrames(202, 1)\r
+\r
+UpdateLoadingScreen\r
+RenderFlippedSpriteFromFile 0, 0, 1, 1, "paavo1"\r
+GET (3, 2)-(22, 21), playerWalkingFrames(202, 2)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "paavo2"\r
+GET (1, 2)-(20, 21), playerWalkingFrames(202, 3)\r
+\r
+UpdateLoadingScreen\r
+RenderFlippedSpriteFromFile 0, 0, 1, 1, "paavo2"\r
+GET (3, 2)-(22, 21), playerWalkingFrames(202, 4)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "poosas"\r
+GET (1, 1)-(60, 21), powerUpSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "puu"\r
+GET (1, 1)-(40, 60), treeSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "munt"\r
+GET (1, 1)-(10, 11), coinSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "munt1"\r
+GET (0, 2)-(20, 11), largeCoinSpriteBuffer\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "munt2"\r
+GET (0, 2)-(20, 11), smallCoinSpriteBuffer\r
+\r
+' Load all numeric digit sprites for HUD display\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "0"\r
+GET (0, 2)-(10, 11), digitImages(100, 0)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "1"\r
+GET (0, 2)-(10, 11), digitImages(100, 1)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "2"\r
+GET (0, 2)-(10, 11), digitImages(100, 2)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "3"\r
+GET (0, 2)-(10, 11), digitImages(100, 3)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "4"\r
+GET (0, 2)-(10, 11), digitImages(100, 4)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "5"\r
+GET (0, 2)-(10, 11), digitImages(100, 5)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "6"\r
+GET (0, 2)-(10, 11), digitImages(100, 6)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "7"\r
+GET (0, 2)-(10, 11), digitImages(100, 7)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "8"\r
+GET (0, 2)-(10, 11), digitImages(100, 8)\r
+\r
+UpdateLoadingScreen\r
+GET (0, 2)-(10, 11), digitImages(100, 10)\r
+RenderSpriteFromFile 0, 0, 1, 1, "9"\r
+GET (0, 2)-(10, 11), digitImages(100, 9)\r
+\r
+' Load enemy sprite frames\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "tigu"\r
+GET (1, 2)-(20, 21), enemyWalkingFrames(202, 1)\r
+\r
+UpdateLoadingScreen\r
+RenderSpriteFromFile 0, 0, 1, 1, "tigu1"\r
+GET (3, 2)-(22, 21), enemyWalkingFrames(202, 2)\r
+\r
+UpdateLoadingScreen\r
+RenderFlippedSpriteFromFile 0, 0, 1, 1, "tigu"\r
+GET (1, 2)-(20, 21), enemyWalkingFrames(202, 3)\r
+\r
+UpdateLoadingScreen\r
+RenderFlippedSpriteFromFile 0, 0, 1, 1, "tigu1"\r
+GET (3, 2)-(22, 21), enemyWalkingFrames(202, 4)\r
+\r
+SCREEN 0\r
+SCREEN 13\r
+LoadCurrentLevel\r
+playerX = 50\r
+playerY = 50\r
+horizontalMovementSpeed = 0\r
+currentWalkFrameIndex = 1\r
+leftWalkFrameIndex = 1\r
+rightWalkFrameIndex = 2\r
+coinsCollected = 0\r
+lives = 3\r
+animationFrameCounter = 1\r
+UpdateHUD 0\r
+12\r
+' Save current player position background before drawing character\r
+IF playerY > 0 THEN GET (playerX, playerY)-(playerX + 20, playerY + 20), playerAnimationFrames: PUT (playerX, playerY), playerWalkingFrames(202, currentWalkFrameIndex), OR\r
+\r
+' Process all enemies (max 10)\r
+FOR enemyIndex = 1 TO 10\r
+ ' Only update visible enemies above bottom of screen\r
+ IF enemyYPositions(enemyIndex) < 170 AND animationFrameCounter = 1 THEN\r
+ ' Apply vertical and horizontal movement\r
+ enemyYPositions(enemyIndex) = enemyYPositions(enemyIndex) + enemyVerticalSpeeds(enemyIndex)\r
+ enemyXPositions(enemyIndex) = enemyXPositions(enemyIndex) + enemyHorizontalSpeeds(enemyIndex)\r
+ ' Save background under enemy for later erasing\r
+ GET (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex))-(enemyXPositions(enemyIndex) + 20, enemyYPositions(enemyIndex) + 20), enemyBackgroundBuffers(202, enemyIndex)\r
+\r
+ ' Determine which walking animation frame to show\r
+ IF enemyHorizontalSpeeds(enemyIndex) <= 0 THEN walkAnimationPhase = 1 ELSE walkAnimationPhase = 3\r
+ IF enemyAnimationFrameCounter > 2 THEN walkAnimationPhase = walkAnimationPhase + 1: IF enemyAnimationFrameCounter = 3 THEN enemyVerticalSpeeds(enemyIndex) = enemyVerticalSpeeds(enemyIndex) + 1\r
+\r
+ ' Draw enemy with correct animation frame\r
+ PUT (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex)), enemyWalkingFrames(202, walkAnimationPhase)\r
+ END IF\r
+NEXT enemyIndex\r
+\r
+' Create short delay using silent sound (QBasic lacks proper delay function)\r
+SOUND 0, .5\r
+\r
+' Cycle through animation frames\r
+animationFrameCounter = animationFrameCounter + 1\r
+IF animationFrameCounter > 3 THEN animationFrameCounter = 1\r
+\r
+' Every third frame, process physics and input\r
+IF animationFrameCounter = 1 THEN\r
+ enemyAnimationFrameCounter = enemyAnimationFrameCounter + 1\r
+ IF enemyAnimationFrameCounter > 5 THEN enemyAnimationFrameCounter = 0\r
+\r
+ ' Apply gravity to player (increases downward speed each frame)\r
+ verticalMovementSpeed = verticalMovementSpeed + 1\r
+\r
+ ' Gradually reduce horizontal movement (friction effect)\r
+ IF horizontalMovementSpeed > 0 THEN horizontalMovementSpeed = horizontalMovementSpeed - 1: walkAnimationPhaseCounter = walkAnimationPhaseCounter + 1\r
+ IF horizontalMovementSpeed < 0 THEN horizontalMovementSpeed = horizontalMovementSpeed + 1: walkAnimationPhaseCounter = walkAnimationPhaseCounter + 1\r
+\r
+ ' Alternate between walk animation phases every 2 frames\r
+ IF walkAnimationPhaseCounter > 2 THEN walkAnimationPhaseCounter = 1\r
+ IF walkAnimationPhaseCounter = 2 THEN leftWalkFrameIndex = 1: rightWalkFrameIndex = 2\r
+ IF walkAnimationPhaseCounter = 1 THEN leftWalkFrameIndex = 3: rightWalkFrameIndex = 4\r
+\r
+ ' Process enemy collisions and movements\r
+ FOR enemyIndex = 1 TO 10\r
+ IF enemyYPositions(enemyIndex) < 170 THEN\r
+ ' Reverse vertical direction when hitting ceiling block\r
+ IF levelGrid((enemyXPositions(enemyIndex) + 20) / 20, (enemyYPositions(enemyIndex) + 9) / 20) = "m" THEN enemyVerticalSpeeds(enemyIndex) = -1\r
+\r
+ ' Reverse horizontal direction at screen edges\r
+ IF enemyXPositions(enemyIndex) > 270 THEN enemyHorizontalSpeeds(enemyIndex) = -1\r
+ IF enemyXPositions(enemyIndex) < 2 THEN enemyHorizontalSpeeds(enemyIndex) = 1\r
+\r
+ ' Reverse horizontal direction when hitting wall blocks\r
+ IF levelGrid((enemyXPositions(enemyIndex) + 28) / 20, enemyYPositions(enemyIndex) / 20) = "m" THEN enemyHorizontalSpeeds(enemyIndex) = -1\r
+ IF levelGrid((enemyXPositions(enemyIndex) + 10) / 20, enemyYPositions(enemyIndex) / 20) = "m" THEN enemyHorizontalSpeeds(enemyIndex) = 1\r
+\r
+ ' Check for collision with player (trigger death)\r
+ IF enemyXPositions(enemyIndex) - 20 < playerX AND enemyXPositions(enemyIndex) + 20 > playerX AND enemyYPositions(enemyIndex) - 5 < playerY AND enemyYPositions(enemyIndex) + 20 > playerY THEN PlayHurtSound: HandlePlayerDeath: GOTO 12\r
+ END IF\r
+ NEXT enemyIndex\r
+END IF\r
+\r
+' Check for player collisions with level geometry:\r
+\r
+' Ceiling collision (reverse gravity)\r
+IF levelGrid((playerX + 15) / 20, (playerY + 9) / 20) = "m" THEN verticalMovementSpeed = -1: airTimeCounter = 0\r
+\r
+' Right wall collision\r
+IF levelGrid((playerX + 25) / 20, (playerY + 9) / 20) = "m" THEN verticalMovementSpeed = -1: airTimeCounter = 0\r
+\r
+' Floor collision (stop falling)\r
+IF levelGrid((playerX + 20) / 20, (playerY - 8) / 20) = "m" THEN verticalMovementSpeed = 1: airTimeCounter = 20\r
+\r
+' Right wall collision\r
+IF levelGrid((playerX + 28) / 20, (playerY) / 20) = "m" THEN horizontalMovementSpeed = -1: wallCollisionLock = 1\r
+\r
+' Left wall collision\r
+IF levelGrid((playerX + 10) / 20, (playerY) / 20) = "m" THEN horizontalMovementSpeed = 1: wallCollisionLock = 1\r
+\r
+' Breakable block collision (turn into empty space)\r
+IF interactiveObjectsGrid((playerX + 20) / 20, (playerY - 8) / 20) = "o" THEN verticalMovementSpeed = 1: interactiveObjectsGrid((playerX + 20) / 20, (playerY - 8) / 20) = "": levelGrid((playerX + 20) / 20, (playerY - 8) / 20) = "2": clearCoinGridX _\r
+= ((playerX + 20) / 20) - 1: clearCoinGridY = (playerY - 8) / 20: shouldClearCoinFlag = 1: SOUND 50, .5\r
+\r
+' Coin collection\r
+IF levelGrid((playerX + 20) / 20, (playerY) / 20) = "1" THEN levelGrid((playerX + 20) / 20, (playerY) / 20) = "2": clearCoinGridX = ((playerX + 21) / 20) - 1: clearCoinGridY = (playerY) / 20: shouldClearCoinFlag = 1: coinsCollected = coinsCollected _\r
++ 1: UpdateHUD 1: SOUND 1000, 1: SOUND 2000, 1\r
+\r
+' Track time in air for jump control\r
+airTimeCounter = airTimeCounter + 1\r
+\r
+' Process keyboard input:\r
+userInput$ = INKEY$\r
+' Jump when up arrow pressed (only if not already high in air)\r
+IF userInput$ = CHR$(0) + "H" AND airTimeCounter < 10 THEN verticalMovementSpeed = -6\r
+' Move right with right arrow\r
+IF userInput$ = CHR$(0) + "M" AND wallCollisionLock = 0 THEN horizontalMovementSpeed = horizontalMovementSpeed + 3: currentWalkFrameIndex = leftWalkFrameIndex\r
+' Move left with left arrow\r
+IF userInput$ = CHR$(0) + "K" AND wallCollisionLock = 0 THEN horizontalMovementSpeed = horizontalMovementSpeed - 3: currentWalkFrameIndex = rightWalkFrameIndex\r
+' Escape key handler\r
+IF userInput$ = CHR$(27) THEN HandleEscapeKey\r
+' Level skip (debug only - plus key)\r
+IF userInput$ = "+" AND wallCollisionLock = 0 THEN currentLevelNumber = currentLevelNumber + 1: LoadCurrentLevel: GOTO 12\r
+' Reset wall collision lock each frame\r
+IF wallCollisionLock <> 0 THEN wallCollisionLock = 0\r
+\r
+' Cap movement speeds to prevent excessive speed\r
+IF horizontalMovementSpeed > 5 THEN horizontalMovementSpeed = 3\r
+IF horizontalMovementSpeed < -5 THEN horizontalMovementSpeed = -3\r
+IF verticalMovementSpeed > 3 THEN verticalMovementSpeed = 3\r
+\r
+' Restore background where player was previously drawn\r
+IF playerY > 0 THEN PUT (playerX, playerY), playerAnimationFrames, PSET\r
+\r
+' Redraw enemies on this animation frame\r
+IF animationFrameCounter = 1 THEN\r
+ FOR enemyIndex = 10 TO 1 STEP -1\r
+ IF enemyYPositions(enemyIndex) < 170 THEN PUT (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex)), enemyBackgroundBuffers(202, enemyIndex), PSET\r
+ NEXT enemyIndex\r
+END IF\r
+\r
+' Apply physics to player position\r
+playerY = playerY + verticalMovementSpeed\r
+playerX = playerX + horizontalMovementSpeed\r
+\r
+' Clear collected coin/block from screen\r
+IF shouldClearCoinFlag > 0 THEN shouldClearCoinFlag = 0: PUT (clearCoinGridX * 20, clearCoinGridY * 20), emptySpaceSpriteBuffer, PSET\r
+\r
+' Level transition when reaching screen edges\r
+IF playerX > 280 THEN currentLevelNumber = currentLevelNumber + 1: LoadCurrentLevel: playerX = 3\r
+IF playerX < 2 THEN currentLevelNumber = currentLevelNumber - 1: LoadCurrentLevel: playerX = 279\r
+\r
+' Player death when falling off bottom of screen\r
+IF playerY > 170 THEN FOR tone = 3000 TO 500 STEP -100: SOUND tone, .3: NEXT tone: HandlePlayerDeath\r
+GOTO 12\r
+\r
+SUB GameOverSequence\r
+' Shows game over screen with animated death effect.\r
+' First displays "You are killed!" text, then pixelates the screen,\r
+' adds flying debris animation, waits for keypress, then fades to black.\r
+\r
+DIM deathScreenBuffer(1 TO 2000)\r
+GET (0, 0)-(150, 20), deathScreenBuffer\r
+LOCATE 1, 1\r
+PRINT "You are "\r
+LOCATE 2, 1\r
+PRINT " killed! "\r
+\r
+' Create pixelated death effect by scaling up screen area\r
+FOR x = 0 TO 80\r
+ FOR y = 0 TO 16\r
+ ' Only process non-background pixels\r
+ IF POINT(x, y) > 0 THEN\r
+ ' Draw 5x5 block for each original pixel (magnification effect)\r
+ LINE (x * 5, y * 5 + 50)-(x * 5 + 4, y * 5 + 54), 4, BF\r
+ END IF\r
+ NEXT y\r
+NEXT x\r
+PUT (0, 0), deathScreenBuffer, PSET\r
+\r
+' Add random flying debris particles\r
+FOR particle = 1 TO 100\r
+ x = RND * 290 + 4\r
+ y = RND * 170 + 4\r
+ GET (x, y)-(x + 20, y + 20), deathScreenBuffer\r
+ x = x + RND * 4 - 2\r
+ y = y + RND * 4 - 1\r
+ PUT (x, y), deathScreenBuffer, PSET\r
+NEXT particle\r
+\r
+' Wait briefly before requiring keypress\r
+FOR waitCount = 1 TO 50\r
+ userInput$ = INKEY$\r
+NEXT waitCount\r
+userInput$ = INPUT$(1)\r
+\r
+' Draw closing red lines from top and bottom\r
+FOR lineIndex = 0 TO 10\r
+ SOUND 0, .05\r
+ LINE (0, lineIndex)-(320, lineIndex), 4\r
+ LINE (0, 200 - lineIndex)-(320, 200 - lineIndex), 4\r
+NEXT lineIndex\r
+\r
+' Fade out red color channel to black\r
+FOR fadeStep = 32 TO 0 STEP -1\r
+ SOUND 0, .5\r
+ OUT &H3C8, 4\r
+ OUT &H3C9, fadeStep\r
+ OUT &H3C9, 0\r
+ OUT &H3C9, 0\r
+NEXT fadeStep\r
+END\r
+\r
+END SUB\r
+\r
+SUB HandleEscapeKey\r
+' Handles ESC key press: performs smooth screen fadeout then exits to DOS.\r
+\r
+' Fade screen to black in vertical bands\r
+FOR band = 0 TO 20\r
+ FOR lineIndex = band TO 200 STEP 20\r
+ LINE (0, lineIndex)-(320, lineIndex), 0\r
+ NEXT lineIndex\r
+ SOUND 0, .5\r
+NEXT band\r
+SYSTEM\r
+\r
+END SUB\r
+\r
+SUB HandlePlayerDeath\r
+' Processes player death: moves back one level, resets player position,\r
+' decreases remaining lives, and updates HUD display.\r
+' Does not end game - continues playing from previous level.\r
+\r
+IF currentLevelNumber > 1 THEN currentLevelNumber = currentLevelNumber - 1\r
+\r
+LoadCurrentLevel\r
+playerX = 20\r
+playerY = 100\r
+lives = lives - 1\r
+UpdateHUD 0\r
+END SUB\r
+\r
+SUB InitializeAllLevelData\r
+' Sets up all level layouts as text-based grids.\r
+' Each character represents a game element:\r
+' m = solid block\r
+' o = breakable block\r
+' $ = coin\r
+' . = power-up item\r
+' + = tree/decoration\r
+' numbers 1-9 = enemy spawn points\r
+\r
+levelSkyColor(1) = 1\r
+levelData(1, 1) = "m "\r
+levelData(2, 1) = "m - - "\r
+levelData(3, 1) = "m "\r
+levelData(4, 1) = "m $ $ $ $ "\r
+levelData(5, 1) = "m $ $ $ $ "\r
+levelData(6, 1) = "m + momom "\r
+levelData(7, 1) = "m "\r
+levelData(8, 1) = "m . . "\r
+levelData(9, 1) = "mmmmmmmmmmmmmmm"\r
+\r
+levelSkyColor(2) = 1\r
+levelData(1, 2) = " $2- "\r
+levelData(2, 2) = " o$ "\r
+levelData(3, 2) = " o$ - "\r
+levelData(4, 2) = " o$ 3 "\r
+levelData(5, 2) = " o o1 "\r
+levelData(6, 2) = " + mmom"\r
+levelData(7, 2) = " omom m "\r
+levelData(8, 2) = " $ $ $ $ m "\r
+levelData(9, 2) = "mmmm mm"\r
+\r
+levelSkyColor(3) = 1\r
+levelData(1, 3) = " mmmmm"\r
+levelData(2, 3) = "- $ $ mmmmm"\r
+levelData(3, 3) = " $ $ $ mmmmm"\r
+levelData(4, 3) = " $ $ mmmmm"\r
+levelData(5, 3) = " . mmmmm"\r
+levelData(6, 3) = "mmmm 1 mmmm"\r
+levelData(7, 3) = " mm m"\r
+levelData(8, 3) = " mmm "\r
+levelData(9, 3) = "mmm mmmmm"\r
+\r
+levelSkyColor(4) = 0\r
+levelData(1, 4) = "mmmmmmmmmmmmmmm"\r
+levelData(2, 4) = "m$ $ $ $ $ "\r
+levelData(3, 4) = "mm $m $4$ $ $ "\r
+levelData(4, 4) = "m$m mmmmmommmm"\r
+levelData(5, 4) = "m$ 3 2 m"\r
+levelData(6, 4) = "m1 ooooooomo m"\r
+levelData(7, 4) = "mooo$$$$$$$m m"\r
+levelData(8, 4) = " m"\r
+levelData(9, 4) = "mmmmmmmmmmmmmmm"\r
+\r
+levelSkyColor(5) = 0\r
+levelData(1, 5) = "mmmmmmmmmmmmmmm"\r
+levelData(2, 5) = " m "\r
+levelData(3, 5) = "m m 1 3 mmmm"\r
+levelData(4, 5) = "m m mmm o m"\r
+levelData(5, 5) = "m m4567892o m"\r
+levelData(6, 5) = "m mooooommo m"\r
+levelData(7, 5) = "m mm"\r
+levelData(8, 5) = "m mmm"\r
+levelData(9, 5) = "mmmm mmm mmmm"\r
+\r
+levelSkyColor(6) = 1\r
+levelData(1, 6) = "m "\r
+levelData(2, 6) = " - $ - "\r
+levelData(3, 6) = "m $ $ "\r
+levelData(4, 6) = "m o o $ "\r
+levelData(5, 6) = "m o o "\r
+levelData(6, 6) = "m + "\r
+levelData(7, 6) = "m "\r
+levelData(8, 6) = "mm 1 m 2 m "\r
+levelData(9, 6) = "mmmmmmmmmmmmmmm"\r
+\r
+levelSkyColor(7) = 1\r
+levelData(1, 7) = " - "\r
+levelData(2, 7) = " - "\r
+levelData(3, 7) = " 1m"\r
+levelData(4, 7) = " 2mm"\r
+levelData(5, 7) = " 3mmm"\r
+levelData(6, 7) = " o + 4mmmm"\r
+levelData(7, 7) = " ooo 5mmmmm"\r
+levelData(8, 7) = " 6mmmmmm"\r
+levelData(9, 7) = "mmmmmmmmmmmmmmm"\r
+\r
+levelSkyColor(8) = 1\r
+levelData(1, 8) = " mmmmmmmmmmmmm"\r
+levelData(2, 8) = " m123m456m789 "\r
+levelData(3, 8) = " mm$mmm$mmm$mm"\r
+levelData(4, 8) = " mm$$$$$$$$$$m"\r
+levelData(5, 8) = " mmom$mmm$mmmm"\r
+levelData(6, 8) = " o$$$$$$$$$ o"\r
+levelData(7, 8) = " omooooooo o"\r
+levelData(8, 8) = " - m "\r
+levelData(9, 8) = "mmmmmmmmmmmmmmm"\r
+\r
+levelSkyColor(9) = 0\r
+levelData(1, 9) = " 12345"\r
+levelData(2, 9) = " 6789 "\r
+levelData(3, 9) = " mm"\r
+levelData(4, 9) = " m "\r
+levelData(5, 9) = " m "\r
+levelData(6, 9) = " m "\r
+levelData(7, 9) = " m "\r
+levelData(8, 9) = " m "\r
+levelData(9, 9) = "mm "\r
+\r
+levelSkyColor(10) = 1\r
+levelData(1, 10) = "m "\r
+levelData(2, 10) = " - "\r
+levelData(3, 10) = "m - "\r
+levelData(4, 10) = "m + "\r
+levelData(5, 10) = "m "\r
+levelData(6, 10) = "m + 2 "\r
+levelData(7, 10) = "m mmm "\r
+levelData(8, 10) = "m . 1 "\r
+levelData(9, 10) = "mmmmmmmmmmm mm"\r
+END SUB\r
+\r
+SUB LoadCurrentLevel\r
+' Loads and renders the currently selected level:\r
+' 1. Validates level number (ends game at level 11)\r
+' 2. Copies level data into working arrays\r
+' 3. Resets interactive object grid\r
+' 4. Clears enemy positions\r
+' 5. Renders all level elements based on character codes\r
+\r
+IF currentLevelNumber > 10 THEN\r
+ CLS\r
+ PRINT "Mission complete!"\r
+ PRINT "Game over"\r
+ END\r
+END IF\r
+\r
+' Copy level rows into temporary storage\r
+FOR rowIndex = 1 TO 10\r
+ levelRowData(rowIndex + 1) = levelData(rowIndex, currentLevelNumber)\r
+NEXT rowIndex\r
+\r
+' Clear breakable blocks from previous level\r
+FOR rowIndex = 1 TO 10\r
+ FOR columnIndex = 1 TO 15\r
+ IF levelGrid(columnIndex, rowIndex - 2) = "2" THEN MID$(levelData(rowIndex, previousLevelNumber), columnIndex) = " "\r
+ NEXT columnIndex\r
+NEXT rowIndex\r
+previousLevelNumber = currentLevelNumber\r
+\r
+' Reset entire level grids to empty\r
+FOR x = -3 TO 20\r
+ FOR y = -3 TO 20\r
+ levelGrid(x, y) = ""\r
+ interactiveObjectsGrid(x, y) = ""\r
+ NEXT y\r
+NEXT x\r
+\r
+' Reset all enemies to off-screen positions\r
+FOR enemyIndex = 1 TO 10\r
+ enemyYPositions(enemyIndex) = 1000\r
+ enemyHorizontalSpeeds(enemyIndex) = 1\r
+ enemyVerticalSpeeds(enemyIndex) = 0\r
+NEXT enemyIndex\r
+\r
+' Set background color and clear screen\r
+CLS\r
+PAINT (1, 1), levelSkyColor(currentLevelNumber)\r
+GET (1, 2)-(20, 21), emptySpaceSpriteBuffer\r
+\r
+' Process each character in level data to render elements\r
+FOR rowIndex = 2 TO 10\r
+ FOR columnIndex = 1 TO 15\r
+ ' Extract single character from level data row\r
+ character$ = RIGHT$(LEFT$(levelRowData(rowIndex), columnIndex), 1)\r
+\r
+ ' Render different elements based on character code\r
+ IF character$ = "-" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), cloudSpriteBuffer, OR\r
+ IF character$ = "." THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), powerUpSpriteBuffer, OR\r
+ IF character$ = "+" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), treeSpriteBuffer, OR\r
+ IF character$ = "$" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), coinSpriteBuffer, OR: levelGrid(columnIndex, rowIndex - 2) = "1"\r
+ IF character$ = "m" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), solidBlockSpriteBuffer, PSET: levelGrid(columnIndex, rowIndex - 2) = "m"\r
+ IF character$ = "o" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), brickSpriteBuffer, PSET: levelGrid(columnIndex, rowIndex - 2) = "m": interactiveObjectsGrid(columnIndex, rowIndex - 2) = "o"\r
+ IF character$ = " " THEN levelGrid(columnIndex, rowIndex) = " "\r
+\r
+ ' Place enemies based on numeric character codes (1-9,0)\r
+ IF character$ = "1" THEN enemyXPositions(1) = (columnIndex - 1) * 20: enemyYPositions(1) = (rowIndex - 2) * 20: GET (enemyXPositions(1), enemyYPositions(1))-(enemyXPositions(1) + 20, enemyYPositions(1) + 20), enemyBackgroundBuffers(202, 1)\r
+ IF character$ = "2" THEN enemyXPositions(2) = (columnIndex - 1) * 20: enemyYPositions(2) = (rowIndex - 2) * 20: GET (enemyXPositions(2), enemyYPositions(2))-(enemyXPositions(2) + 20, enemyYPositions(2) + 20), enemyBackgroundBuffers(202, 2)\r
+ IF character$ = "3" THEN enemyXPositions(3) = (columnIndex - 1) * 20: enemyYPositions(3) = (rowIndex - 2) * 20: GET (enemyXPositions(3), enemyYPositions(3))-(enemyXPositions(3) + 20, enemyYPositions(3) + 20), enemyBackgroundBuffers(202, 3)\r
+ IF character$ = "4" THEN enemyXPositions(4) = (columnIndex - 1) * 20: enemyYPositions(4) = (rowIndex - 2) * 20: GET (enemyXPositions(4), enemyYPositions(4))-(enemyXPositions(4) + 20, enemyYPositions(4) + 20), enemyBackgroundBuffers(202, 4)\r
+ IF character$ = "5" THEN enemyXPositions(5) = (columnIndex - 1) * 20: enemyYPositions(5) = (rowIndex - 2) * 20: GET (enemyXPositions(5), enemyYPositions(5))-(enemyXPositions(5) + 20, enemyYPositions(5) + 20), enemyBackgroundBuffers(202, 5)\r
+ IF character$ = "6" THEN enemyXPositions(6) = (columnIndex - 1) * 20: enemyYPositions(6) = (rowIndex - 2) * 20: GET (enemyXPositions(6), enemyYPositions(6))-(enemyXPositions(6) + 20, enemyYPositions(6) + 20), enemyBackgroundBuffers(202, 6)\r
+ IF character$ = "7" THEN enemyXPositions(7) = (columnIndex - 1) * 20: enemyYPositions(7) = (rowIndex - 2) * 20: GET (enemyXPositions(7), enemyYPositions(7))-(enemyXPositions(7) + 20, enemyYPositions(7) + 20), enemyBackgroundBuffers(202, 7)\r
+ IF character$ = "8" THEN enemyXPositions(8) = (columnIndex - 1) * 20: enemyYPositions(8) = (rowIndex - 2) * 20: GET (enemyXPositions(8), enemyYPositions(8))-(enemyXPositions(8) + 20, enemyYPositions(8) + 20), enemyBackgroundBuffers(202, 8)\r
+ IF character$ = "9" THEN enemyXPositions(9) = (columnIndex - 1) * 20: enemyYPositions(9) = (rowIndex - 2) * 20: GET (enemyXPositions(9), enemyYPositions(9))-(enemyXPositions(9) + 20, enemyYPositions(9) + 20), enemyBackgroundBuffers(202, 9)\r
+ IF character$ = "0" THEN enemyXPositions(10) = (columnIndex - 1) * 20: enemyYPositions(10) = (rowIndex - 2) * 20: GET (enemyXPositions(10), enemyYPositions(10))-(enemyXPositions(10) + 20, enemyYPositions(10) + 20), enemyBackgroundBuffers(202 _\r
+, 10)\r
+ NEXT columnIndex\r
+NEXT rowIndex\r
+UpdateHUD 0\r
+END SUB\r
+\r
+SUB PlayHurtSound\r
+' Plays distinctive "hurt" sound effect with descending pitch.\r
+' Creates two converging tones that slide downward in frequency.\r
+\r
+startFrequency = 1700\r
+endFrequency = 1900\r
+FOR toneStep = 1 TO 50\r
+ startFrequency = startFrequency + 3\r
+ endFrequency = endFrequency - 5\r
+ SOUND startFrequency, .2\r
+ SOUND endFrequency, .2\r
+NEXT toneStep\r
+END SUB\r
+\r
+SUB RenderFlippedSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, Filename$)\r
+' Renders sprite from text file but flips horizontally during rendering.\r
+' File format: first line = height, subsequent lines contain ASCII art\r
+' where each character's ASCII value determines color (offset by 40).\r
+\r
+x = x * 8\r
+y = y * 8\r
+spriteWidth = widthMultiplier - x\r
+spriteHeight = heightMultiplier - y\r
+OPEN "IMG/" + Filename$ + ".i01" FOR INPUT AS #1\r
+INPUT #1, spriteHeight\r
+FOR row = 1 TO spriteHeight\r
+ LINE INPUT #1, rowText$\r
+ FOR column = LEN(rowText$) TO 1 STEP -1\r
+ ' Calculate screen coordinates and color from ASCII value\r
+ currentColor = ASC(LEFT$(RIGHT$(rowText$, column), 1)) - 40\r
+ ' Draw filled rectangle for each pixel (scaled by multipliers)\r
+ LINE (x + (column * widthMultiplier), (y + (row * heightMultiplier)) + 1)-(x + ((column + 1) * widthMultiplier), y + ((row + 1) * heightMultiplier)), currentColor, BF\r
+ NEXT column\r
+NEXT row\r
+CLOSE\r
+END SUB\r
+\r
+SUB RenderSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, SpriteName$)\r
+' Renders sprite from text file in normal orientation.\r
+' File format and rendering identical to RenderFlippedSpriteFromFile\r
+' but processes characters left-to-right instead of right-to-left.\r
+\r
+spriteWidth = widthMultiplier - x\r
+spriteHeight = heightMultiplier - y\r
+OPEN "IMG/" + SpriteName$ + ".i01" FOR INPUT AS #1\r
+INPUT #1, spriteHeight\r
+FOR row = 1 TO spriteHeight\r
+ LINE INPUT #1, rowText$\r
+ FOR column = 1 TO LEN(rowText$)\r
+ ' Calculate color from ASCII value (offset by 40)\r
+ currentColor = ASC(RIGHT$(LEFT$(rowText$, column), 1)) - 40\r
+ ' Draw scaled pixel block\r
+ LINE (x + (column * widthMultiplier), (y + (row * heightMultiplier)) + 1)-(x + ((column + 1) * widthMultiplier) - 1, y + ((row + 1) * heightMultiplier)), currentColor, BF\r
+ NEXT column\r
+NEXT row\r
+CLOSE\r
+END SUB\r
+\r
+SUB ShowIntroScreen\r
+' Displays introductory splash screen using sprite rendering.\r
+\r
+CLS\r
+RenderSpriteFromFile 2, 2, 10, 1, "win.i01"\r
+END SUB\r
+\r
+SUB UpdateHUD (coinIncrementAmount%)\r
+' Updates Heads-Up Display showing coins and lives:\r
+' - Processes coin counter (with 100-coin bonus life)\r
+' - Draws coin counter digits\r
+' - Shows remaining lives\r
+\r
+' End game if no lives remain\r
+IF lives < 0 THEN GameOverSequence\r
+\r
+' Draw coin icon at left of HUD\r
+PUT (0, 180), largeCoinSpriteBuffer, PSET\r
+\r
+' Add new coins to counter\r
+CoinDigits(1) = CoinDigits(1) + coinIncrementAmount%\r
+\r
+' Handle decimal carry-over for coin counter\r
+FOR digitPosition = 1 TO 3\r
+ ' Carry from ones place to tens place\r
+ IF CoinDigits(1) > 9 THEN\r
+ CoinDigits(1) = CoinDigits(1) - 10\r
+ CoinDigits(2) = CoinDigits(2) + 1\r
+ END IF\r
+\r
+ ' Convert 100 coins to extra life\r
+ IF CoinDigits(2) > 9 THEN\r
+ CoinDigits(1) = 0\r
+ CoinDigits(2) = 0\r
+ lives = lives + 1\r
+ END IF\r
+NEXT digitPosition\r
+\r
+LOCATE 1, 1\r
+digitPosition = 3\r
+' Draw both digits of coin counter\r
+FOR hudElement = 1 TO 2\r
+ digitPosition = digitPosition - 1\r
+ PUT ((hudElement * 11) + 10, 180), digitImages(100, CoinDigits(digitPosition)), PSET\r
+NEXT hudElement\r
+\r
+' Cap maximum lives at 10\r
+IF lives > 10 THEN lives = 10\r
+\r
+' Draw "X" before lives counter\r
+PUT (43, 180), digitImages(100, 10), PSET\r
+' Draw small coin icon next to lives counter\r
+PUT (53, 180), smallCoinSpriteBuffer, PSET\r
+' Draw current lives count\r
+PUT (73, 180), digitImages(100, lives), PSET\r
+END SUB\r
+\r
+SUB UpdateLoadingScreen\r
+' Visual progress indicator during asset loading.\r
+' Draws black screen with incremental dots on bottom row.\r
+\r
+LINE (0, 0)-(319, 150), 0, BF\r
+LOCATE 20, 10 + loadingProgressDotCount\r
+loadingProgressDotCount = loadingProgressDotCount + 1\r
+PRINT "."\r
+END SUB\r
+\r
+SUB WaitForUserInput\r
+' Waits for any keyboard input before continuing.\r
+' Clears userInput$ variable first, then polls INKEY$ until non-empty.\r
+\r
+userInput$ = ""\r
+WHILE userInput$ = ""\r
+ userInput$ = INKEY$\r
+WEND\r
+END SUB\r
+\r
--- /dev/null
+ 10 \r
+((]]]]]]((\r
+(]]]]]]]](\r
+]]]]((]]]]\r
+]]]((((]]]\r
+]]]((((]]]\r
+]]]((((]]]\r
+]]]((((]]]\r
+]]]]((]]]]\r
+(]]]]]]]](\r
+((]]]]]]((\r
--- /dev/null
+ 10 \r
+((((]]](((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+(((]]]]]((\r
+((((]]](((\r
--- /dev/null
+ 10 \r
+(]]]]]]]((\r
+]]]]]]]]](\r
+]]]]((]]]]\r
+(]](((]]]]\r
+((((]]]]](\r
+(((]]]]]((\r
+(]]]](((((\r
+]]]](((]](\r
+]]]]]]]]]]\r
+(]]]]]]]](\r
--- /dev/null
+ 10 \r
+(]]]]]]]](\r
+]]]]]]]]]]\r
+(]](((]]]]\r
+(((((((]]]\r
+(((((]]]](\r
+(((((]]]](\r
+(((((((]]]\r
+(]](((]]]]\r
+]]]]]]]]]]\r
+(]]]]]]]](\r
--- /dev/null
+ 10 \r
+(((]](((](\r
+((]]](((]]\r
+((]]]((]]]\r
+(]]](((]]]\r
+(]]]((]]]]\r
+]]]]]]]]]]\r
+(]]]]]]]]]\r
+(((((]]]](\r
+(((((]]]](\r
+((((]]]]((\r
--- /dev/null
+ 10 \r
+((]]]]]]((\r
+(]]]]]](((\r
+(]](((((((\r
+(]](((((((\r
+(]]]]]]]](\r
+((]]]]]]]]\r
+(((((((]]]\r
+]]](((]]]]\r
+]]]]]]]]](\r
+(]]]]]]]((\r
--- /dev/null
+ 10 \r
+((]]]]]]((\r
+]]]]]]]]](\r
+]]](((]]](\r
+]]](((((((\r
+]]]]]]]]](\r
+]]]]]]]]]]\r
+]]]((((]]]\r
+]]](((]]]]\r
+]]]]]]]]](\r
+(]]]]]]]((\r
--- /dev/null
+ 10 \r
+(]]]]]]]](\r
+]]]]]]]]]]\r
+]]]((((]]]\r
+(](((((]]]\r
+((((]]]]]]\r
+((]]]]]]](\r
+((((((]]](\r
+(((((]]]((\r
+((((]]](((\r
+((((]]](((\r
--- /dev/null
+ 10 \r
+((]]]]]]((\r
+(]]]((]]](\r
+(]]((((]](\r
+((]]((]]((\r
+(]]]]]]]](\r
+]]]]((]]]]\r
+]]]((((]]]\r
+]]]]((]]]]\r
+(]]]]]]]](\r
+((]]]]]]((\r
--- /dev/null
+ 10 \r
+(]]]]]]]((\r
+]]]]]]]]](\r
+]]](((]]]]\r
+]](((((]]]\r
+]]](((]]]]\r
+(]]]]]]]]]\r
+((]]]((]]]\r
+((((((]]]]\r
+((]]]]]]](\r
+((]]]]]]((\r
--- /dev/null
+ 20 \r
+(DDDDDDDDDDDDDDDDDD(\r
+D(EEEEEEEEEEEEEEEE(=\r
+DE(EEEEEEEEEEEEEE(>=\r
+DEE@@@@@@@@@@@@@@?>=\r
+DEE@???????????D@?>=\r
+DEE@??CCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@?CCCCCCCCCCD@?>=\r
+DEE@DDDDDDDDDDDD@?>=\r
+DEE@@@@@@@@@@@@@@?>=\r
+DE=??????????????(>=\r
+D(>>>>>>>>>>>>>>>>(=\r
+(==================(\r
--- /dev/null
+ 10 \r
+(((TTTT(((\r
+(TTTSSSSR(\r
+TTSSSSSSSR\r
+TSSS\\SSSR\r
+TSSS\]SSSR\r
+TSSS\]SSSR\r
+TSSS\]SSSR\r
+TSSS\]SSSR\r
+(SRSSSSRR(\r
+(((RRRR(((\r
--- /dev/null
+ 10 \r
+(((TTTT(((((((((((((\r
+(TTTSSSSR((FF((((FC(\r
+TTSSSSSSSR(FCC((FC@(\r
+TSSS\\SSSR((CCCFC@((\r
+TSSS\]SSSR(((CCC@(((\r
+TSSS\]SSSR(((FCC@(((\r
+TSSS\]SSSR((FCC@C@((\r
+TSSS\]SSSR(FC@((@C@(\r
+(SRSSSSRR((C@((((@@(\r
+(((RRRR(((((((((((((\r
--- /dev/null
+ 10 \r
+((QQQQ((((((((((((((\r
+(QQQQQQ((((FF((((FC(\r
+((jjjj(((((FCC((FC@(\r
+((jjjj((((((CCCFC@((\r
+(c(jj(c((((((CCC@(((\r
+c]]]]]]c(((((FCC@(((\r
+((]]]]((((((FCC@C@((\r
+(]]]]]]((((FC@((@C@(\r
+XX]((]XX(((C@((((@@(\r
+XXX((XXX((((((((((((\r
--- /dev/null
+ 20 \r
+(RRRRRQQQQ((((((((((\r
+RRQQQQQQQQQ(RRRR((((\r
+RQQQQQQQQQQRRQQQQ(((\r
+RQQQQQQQQQQQQQQQ((((\r
+QQQQQQQQQQQQQ(((((((\r
+QQQQQQQQQ((\81((((((((\r
+(QQQQQQQ\81\81\81\81\81\81((((((\r
+((\81\81\81\81\81\81\81\81\81\81\81\81\81(((((\r
+((\81\81\81\81\81\81\81\81\81\81\81\81((((((\r
+(((\81\81\81\81\81\81(\81(((((((((\r
+(((((\81\81\81\81\81((((((((((\r
+((((((JJJJJ(((((((((\r
+((((((JJJJJJ((((((((\r
+(((((JJJJJIJ((((((((\r
+(((((JIIIIJJ((((((((\r
+((((IIIIIIIJ((((((((\r
+((((IIIIIIJJJ(((((((\r
+((XXXIII(JJJJXXX((((\r
+(XXXXXXX((JXXXXXXX((\r
+((XXXXX((((XXXXXX(((\r
--- /dev/null
+ 20 \r
+(RRRRQQQQ(((((((((((\r
+RQQQQQQQQQ((((((((((\r
+QQQQQQQQQQRRRRR(((((\r
+QQQQQQQQQQQQQQQQ((((\r
+QQQQQQQQQQQQQQQ(((((\r
+QQQQQQQQ((\81(((((((((\r
+QQQQQQQ\81\81\81\81\81\81(((((((\r
+(\81\81\81\81\81\81\81\81\81\81\81\81\81((((((\r
+(\81\81\81\81\81\81\81\81\81\81\81\81(((((((\r
+((\81\81\81\81\81\81(\81((((((((((\r
+((((\81\81\81\81\81(((((((((((\r
+(((((JJJJJ((((((((((\r
+(((((JJJJJJ(((((((((\r
+((((JJJJJIJ(((((((((\r
+((((JIIIIJJ(((((((((\r
+(((((IIIIIJ(((((((((\r
+(((((IIIII((((((((((\r
+((((XXXXXXXX((((((((\r
+(((XXXXXXXXXX(((((((\r
+((((XXXXXXXX((((((((\r
--- /dev/null
+ 30 \r
+(((((((((((((((((((((((((\\(\((((((((((((((((((((((((](((((((((]((((]((((]](((((((((((((((((((((((((\r
+((((((((((((((((((((((((\((((((((\\(((((((((\(((((((((]]((\(((\(((\((]](]]((((((((((((((((((((((((((\r
+((((((((((((((((\((\((\(\]\\((\(\(((((((]((((((((](((\((\]((((\(]\(\(]]]]]](((((((((((((((((((((((((\r
+(((((((((((((((((((]t\\(]]]\\\](](((\((]((](](((((((]((((\(\]](\((]\(((((\\(](](\]\(((((((((](((((((\r
+((((((((((t((\8fwt\8f\8f\\\t](tt\(]\\((\(](\\t\t((((]\t(](((\((\]\](\(\]](]]((]\(]](((]`\`\(\\](((((((((((\r
+(((((t((((((tttttt\8ft(t\\(\\((\(]]]\t((\\]\]((((\(](\((\\(]\(](`\\`]](\]\\]\(t\\\`\\t(t\]((](((((((((\r
+((((t(tt(t((t\8fttt\8ftt]t\\(](\\(t(t\\ttt\]tt]t\\(]\tt]](\((t]\](\t]((t]\t(]`\t(]]tt\\(tt\\]](]((((((((\r
+((((((\(ttt(tt\8f\8f\8ft\8f\tt]tt\\\\t\]\tt\(\t]((\\\tt\((]](\\t]tt(\\\(tt(t\(`]\`]]\\\\\(\`tt``^```(`((((((\r
+((((tt(tttt\8f\8ftttttt\\t]\tt]ttt(]\\\\\t\\t(\\((\\t\]t\\]]`\\\](\`]\\(\\]\`(t\\\t\\tt\\^(``]\(\]((]`((\r
+(((t\(t\ttt\]\8ft\8ftt\t\8ft]]]\\t]ttt]]t\t\\]ttt\]](tt\(]t\\\]t\t`t\\]\\tt]\^\t]\\\\\tt\\`t\t`^`(\`\]]]((\r
+(((((tt]]t\\twt\\8f\\t\8f\]tt]]t(]\t\tt]\tttt\tt]\((t(\\\t\`]t(\]t\\`\t\\(\\\t\t]^\\t\\\tt\t\\^```(`(]((\r
+((t(](\ttttwttw]t\\tt(^t\(t]\]tt\(\t]t\\t(]]\]ttt\\tttt\]\^]\tt\]``\t`(\tt\`^\\\\\ttt\tt\\`]\\^((\((\r
+]t(]]]]tt]t\t^t\tt\t(\](tt]\tt]\t\\\\\]t\tt`t\\`^]\]t\]]]tt\`(`(]`\tt\\`\t\t]\\tt\ttt^t\\`\`]``(\]((\r
+(]t]t\\t\\t\^t\^t\](\]]\]]t\(ttttt\]t\t\`\t\t\t\\\\`^t`(t(]]t]t`]]t]\\\^tt\]`\t\\t\\``t\\`\``\]t``\(\r
+(]t(tt\\\\\\\\\]^t]]t^t]tt\t^\\]]]]`t\]\t`]\t^```\^^]`\tt^t]`\`]^^\\\\\\\\]^(`\^`\\\\\\^``\```]`\`(]\r
+(](t^^]\\]\\\]t^\]]^]]\^^\]]t\`\^^``]t`^\\`\\`^`]\^\`t]\^^^`^]\\^^^\\\\\]]\`\^````\\]^`\`^`\```]``](\r
+]]]]](t]`t]^\]^]]^]^]^^]^^]`\^\]`]\]`\\\\``]`\`t\\`^]```^`]^^^^^]\^^\t\``]`\\``]\\^\^^^\\\```````]]]\r
+((^((]](`]]`]^^`^^]^`]]\]``\\(\(\`]``\```]`^^^````^````t(]`^t]^^t`\\]^^\^\^`^\^``\]\\````^`\`]```(](\r
+](^]((]\`(``]]]^``^t]^^]]t]``t`]``(`````\``\``\\`\```t`^t^(^^^^^]]t^`(\\^\^`(`^^^`\^```\````\]````](\r
+]((^^]]`]^]^\`]``t^```````\`^`\`\``\^t```````]`````]^`^]]^^t^(^(^]``^```\\\`^]]]^^^^]``^````t]``]``(\r
+(((^((]``^^`^^``^^^^^^]]t`t````^`^`^`^\^`]````````````^`````^^^`]`]^^^^^((]``^^`^]]^^`````]``^^(t`(]\r
+(]^(^(`(`^]]`]`^^^`]^```^^`````t`\^`^`````````^`(`^t^`t^`^^^(```t(`^]]^^^^```^]`]``]^`(```(^(`tttt((\r
+^(^(^(((t](((`]]`^`t``t```^``^``````^````(^`(````^^^``^`(```^]``]^(]`^```]````````(]^``]t]`^`](^(`((\r
+(((tt^(^((((]`^`^```t````^```^^^]``````](`tt``]``^```(^^`]``(``t````t```(``]`^]^t`]^`(`^^^^``tt]`(((\r
+(((((((]^](((``]`(`^`]^^^``]`]]((```(`(^```]((]^`^`````````(`((t``^`````]`^(^^```(`^`](`t]^((^(`((((\r
+(((((((((]((t(^`(`^``((``(^(``^(((((((((``((^``````^(^`t`(`^t``````^]((^^^`](^```((`]((`(]^`((^]((((\r
+(((((((((((t(^``(`(t^(^(`^(^^^((^(`((^(`]((((](((````^(`((((``((``((``(^`]`(]]]]``]``]````(`(``(`(((\r
+(((((((((((((^(^((((((^^(((^(((^(((^^`((`((]`((((^`((`(^``((```^`((((^(((t`(^`((`^(`(]`^`(((`^((((((\r
+((((((((((((((((((((^(((^(((((^(((((((((((((((((^(`^^`^(((^((^((``(((`((((`](((((((^(``(((`(((((((((\r
+(((((((((((((((((((^(((((((^((^(((((((((((((((((((((^(`(^^(`((((((^^(^((`((((](`((((((((((((((((((((\r
--- /dev/null
+ 20 \r
+((((((((((((((((((((((((((((((q((((q(q((((((((((((((((((((((\r
+((((((((((q((q(((q(((qq(((((((qq\8aqqqq(((((((qq((((((((((((((\r
+((((((((((q(q(((q(qq((qq((q((qqq(((q(qq(qq;(qq(q((((((((((((\r
+(((((((((qq(q(\8a(((q(q(q(q((((q2qqq(qqq(q(;((;q(q((((((((((((\r
+(((((qqq(q(q(((222\8aqqq(((\8aq(qqqq\8aq2qqqq2((;\8a((q(((q?q(((((((\r
+((((qq(nq(((q((2(qq2q2q(((nn(\8aq(qqq(nqq2n2;(qnq?(;???(((((((\r
+((((((qqqq2q(qqq2\8a(22\8a(qqq(\8aqq2n(2nqq2qqq(nq?q?\8a2;;;?(((((((\r
+(((((qn(qqqq\8a(\8a(qXn22X\8a(nq\8a\8aq2(22qq22(22(2?Y??2q;?q;22((((((\r
+((((q((qq2qq\8aqqnq2nX\8aX\8aqq2\8a\8aqq\8aqX2q22((qq;(Yq???;;2;;2q(((((\r
+((((((q(22(2q2(((nqqXX\8a(XX2Xq(q2\8a22nq22q?qY((?(?qqqq;???((((\r
+(((q(qq(qqqYYXq((YXXY\8aX2\8a2\8aX2\8aq;?2???2q;;q;X?2???;?;Y;??q(((\r
+(((q(q(q22222YYX2(XX?X2q2?qX2q?YYYn2q;Y;X2???X?;?;;;??;;((((\r
+(((n(qq(\8a2\8a22XYqXY?XY;2;???qq?;?Y;?2Y;2;;Y;?XX9X9;;(9;??;(((\r
+((((qnX\8a?YY22\9f\9f???YYqqX?;qXqqq;;???;@;;;;??X\9d;;?X?q;;;9?;(?(\r
+(nnn\8aX2?2??YX\9f\9fX2q?X;2;;?qq;;;q;?;;;;;;;\9f;X\9d;9;?X;;@;@;;?99(\r
+qqqnq\8aq222\8aX\9f\9f?Y(\9fY??;qq?2;?;q?;?;;?@X;;;?\9f;9999;9@;;;;;9n?9\r
+nqnqqn2??Y??(X?Y\9f\9fX?;?;?X?;Xq;;\9fX;n\9f@;\9f;;;;\9f9;;2;;@;;?;;9((9\r
+nnqqq2(?\9fn?n\9f\9f\9f?\9fY22X;X?q;;;;;qqq;;q;\9f;;;q9X\9d;;99;@;\9d;9;;;??\r
+qnq(qqnqq???\9f\9fX(?n\9fqX(XXqq2;nqq;;;\9f\9fq\9f\9f;\9f\9f;Xq;q;\9d\9d9n;\9d;??n?9\r
+((nn((q\9f(\9fnXn\9f(n\9fXn\9fn(XqqX2\9f\9f;q\9f(qq;(\9f\9fq\9f(9\9d9\9fq\9d\9d\9d?\9d;\9f\9f?????\r
--- /dev/null
+ 60 \r
+(((((((((((((((X(((((X((T(((((((((((((((\r
+(((((((((((((((X((T((X(X((((((((((((((((\r
+((((((((((((X(((((X(X((((((X(X((((((((((\r
+(((((((((((((XX((X(((((((((T((((((((((((\r
+((((((XX((((XX(XTT(X(TXXT(((((X(((((((((\r
+((((((((((((((X((X(TXXT\9f\9f(XXXX((((((((((\r
+((((((X(X((XXX(XXXTTT(XXXTX(X(((((((((((\r
+(((((((XX((X(XX((T((XXXX(T((XXX(X(X(((((\r
+((((X(X((XXXT((XX(XXX(TXXT\9fXX(X\9f(X((((((\r
+((((XXX((((XT(X(XXXTTT(XX\9fX\9f\9f\9f\9fX((X(((((\r
+(((((X((((XT((XX((XT(XTX((XX(\9fX((((\9f\9f(((\r
+(((X((X(((TX((XXXXTXX(TT\9f(((((\9fX\9f((\9fX(((\r
+((((X(XX((X(XX(X(TX(((TTT\9fX\9f(\9fXX\9f(((((((\r
+((((X(XXXXXX((XXTTXX(TXTTT(T(X\9fX(\9f(XX(((\r
+(((((X(XX(TXXTTT(TXXT(X((X((((X\9f(X(XX(((\r
+((((((X((X(XXXXXT(XXX(TT((T(X(((((((X(((\r
+(((XX((XX(((X(TXXX(TX(TTTTXT(\9f(((\9f((\9f(((\r
+(X(((X(((X(T((X(X(XX(T(XXTX(T\9fX((\9f\9fX((((\r
+((XX(X((((((XTX(TTTXTXT(XX((XX(\9f(\9f\9f(((X(\r
+((((((XXXX((X(XXTTXT(XX\9fTT(T(((X\9f((XX(((\r
+(((XXXX(X(((X(T(TTTTXXXXTX(X(XXXX(X(\9f(X(\r
+(((((((((X(XXXXX(XT(X(X((X(XXX(XXX((\9f(((\r
+X(((((X((X(X(X((XTT(((((XX\9f(XXXX\9f(\9f((X\9f(\r
+(((XXX(XXX((X(((XTXX(T(X((\9f(((\9fX(XXXX(X(\r
+(((X(((TTX((TTXTT(XXXT(X\9f\9f(XXX((XX\9f((X(\9f\r
+((X((((XTX(((X(XX(XTT(XXXX((XX(XX\9f(X((\9fX\r
+(((((TX(((X((T(XTTXXXTXX(XX\9fX(X((\9f((((((\r
+((X(X(TXTX(XX((XTTXX(X(X\9fXX\9fT\9fXXXX(\9f(\9f((\r
+((((X(X(X((TXTTT(((X\9f\9fX(XT((XXXXX(\9f(((\9f(\r
+((((X((X((T((X(TXXXXXXX\9f(T\9fX(XX\9f\9f((\9f\9f(((\r
+((((X(((TXTXX(XXX(((XXX(\9fX\9f\9f(X\9f\9f(\9f\9f\9f\9f\9f((\r
+((XX((XXXX((XX(((XX(XXX(T\9f\9f\9fX\9f(XXX\9f\9f((((\r
+((((((X((XTXXTTTXXXXXX\9a\9a\9a\9f(TXT\9f(\9f((((X((\r
+(((X(((XXXTTXTT(T(TX(\9f\9a\9f\9aX\9f\9f\9f(X(\9f\9f(X((((\r
+((X(((((XXT(TTT(X((T(\9aX\9aXXT\9f\9f\9f(\9f\9f\9f((((((\r
+(X(XXXX(X((X((TXTT(TT\9f\9aXX\9f\9f\9fXX(X(\9f(XX(((\r
+((((X(((XXXXTXXX(((T\9f\9a\9fXX\9fX\9fX\9fX\9f(\9fX(((((\r
+(((((((XX(XXX(XXTX((\9f\9a\9a\9aT\9f\9f(\9fTXX(TX(\9f(((\r
+(((((XXXXXXX((X(X(\9f\9f\9f\9a\9a\9a\9fX\9f\9f\9fXT(X((X((((\r
+(((X(((XXXXX(XT(TT(X\9f\9a\9a\9aX\9f\9f\9fTT\9fX\9f((((\9f((\r
+((((((XX(XX((X(XTX\9f\9f\9a\9a\9aX((XXXXTX(((\9f((((\r
+(((((X(XXXXXXXXX\9f(\9f(\9f\9aX\9a(X\9fXTXX((X((((((\r
+(((((((X(X\9fX(XX((T\9f\9f\9fXX\9f\9f(XX\9fXXXX(((((\9f(\r
+((((((XX(XX((XXTX(X(\9a\9a\9a\9fX(XXXX(XXX(X((((\r
+((((((((((XXX\9fX\9a\9a\9f(\9a\9a\9aX\9f(X(TXXX((X((((((\r
+((((((((((X(\9fX(\9a\9f\9aX\9f\9a\9aXX(X(XXX(X((((((((\r
+(((((((((XXX(X\9f\9a\9a\9fX\9f\9aXX\9f\9fX(((X(((((\9f((((\r
+(((((((((((X((X\9a\9a\9f\9f\9f\9f\9aXXX(X(\9fX(\9f\9f(((((((\r
+((((((((((XXX\9f(\9a\9a\9f\9f\9f\9f\9fX\9f\9f(X(((\9f(\9f\9f((((((\r
+(((((((((((((XXX(\9a\9a\9f\9a\9aXX(((((X((((((((((\r
+(((((((((((\9f(X((T\9a\9f\9aXX\9f\9f((((X(\9f(((((((((\r
+((((((((((X(((XX(\9a\9aX\9a\9a\9f\9f((((((((((((((((\r
+((((((((((((((((\9fX\9aXX\9aX(\9f(((((\9f(((((((((\r
+((((((((((((((X(XX\9a\9f\9f\9f((\9f(((((((((((((((\r
+(((((((((((\9f(((XX(\9a\9a\9a\9a(\9f((((((((((((((((\r
+((((((((((((((((((\9a\9a\9a\9aX(((\9f(((((((((((((\r
+((((((((((((((\9f(((\9a\9a\9a\9a((((((((((((((((((\r
+((((((((((((((((((\9a\9a\9a\9a((((((((((((((((((\r
+(((((((((((((((\9f((\9a\9a\9a\9a((((((((((((((((((\r
+((((((((((((((((((\9a\9a\9a(((((((((((((((((((\r
--- /dev/null
+ 20 \r
+00000000000000000000\r
+0@@//@/////////////0\r
+0@//////////@//////0\r
+0//@///////////////0\r
+0@//@//////////////0\r
+00000000000000000000\r
+/////////00@/@/@////\r
+/@///////00@////////\r
+@@///////00//@//////\r
+@////////00/////////\r
+00000000000000000000\r
+0@@////////////////0\r
+0/////@///@////////0\r
+0@///////////@/////0\r
+0//@/////////@@////0\r
+00000000000000000000\r
+/////////00@@///////\r
+/////////00@////////\r
+/////////00/////////\r
+/////////00/////////\r
--- /dev/null
+ 20 \r
+((((((((((((((((((((\r
+((((((((((((((((((((\r
+<(((((((((((((((((((\r
+?((((((((<((((((((((\r
+??((((((??((((((((((\r
+(?(((((??(((((((((((\r
+(??((???((((((((((((\r
+((????((((((((((((((\r
+(((??(((((((((((((((\r
+((<<<(((((((((((((((\r
+<<???<((((((((((((((\r
+<(???<<(((\9b\9b\9b\9b\9b\9b((((\r
+((????((\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
+((????(\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((\r
+((?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((\r
+((?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
+((??????\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
+(((??????\9b\9b\9b\9b\9b\9b\9b((((\r
+((((???????????????(\r
+((((((??????????????\r
--- /dev/null
+ 20 \r
+((((((((((((((((((((\r
+((((((((((((((((((((\r
+((((((((((((((((((((\r
+((((((((((((((((((((\r
+(((((??<((((((((((((\r
+((((??((((((((((((((\r
+(<((?((((?<(((((((((\r
+(<(??????(((((((((((\r
+(<<??(((((((((((((((\r
+((<<<<<<((((((((((((\r
+((???(((((((((((((((\r
+((????((\9b\9b\9b\9b\9b\9b\9b(((((\r
+(?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
+(????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
+?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
+?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
+??????\9b\9b\9b\9b\9b\9b\9b\9b\9b(((((\r
+(??????\9b\9b\9b\9b\9b\9b\9b((((((\r
+((????????????????((\r
+((((????????????????\r
--- /dev/null
+' Pomppu Paavo, 1998\r
+' By: Svjatoslav Agejenko\r
+' at least 8 MHz 8086 CPU\r
+' & CGA video card is required\r
+\r
+DECLARE SUB norm (nrm%)\r
+DECLARE SUB elud ()\r
+DEFINT A-Z\r
+DECLARE SUB level (y%)\r
+DECLARE SUB pildid (p%, o%, m%, fr%, teler%)\r
+DECLARE SUB wiew (r$, a%, b%)\r
+DECLARE SUB joonist ()\r
+DECLARE SUB save (y$)\r
+DIM SHARED voolual\r
+DIM SHARED uun(1 TO 20) AS STRING * 31\r
+DIM SHARED siib, siia, siib1, siia1\r
+DIM SHARED elu, raha\r
+DIM SHARED uks1, uks2, uks3, uks4\r
+DIM SHARED maa\r
+DIM SHARED text$(1 TO 1000)\r
+DIM SHARED pikkus\r
+DIM SHARED asend(0 TO 34, -10 TO 20) AS STRING * 1\r
+DIM SHARED asend1(0 TO 34, -10 TO 20) AS STRING * 1\r
+DIM SHARED ruut(51)\r
+DIM SHARED tuhi(51)\r
+DIM SHARED kast(51)\r
+DIM SHARED mar1(70)\r
+DIM SHARED pilv(209)\r
+DIM SHARED taht(50)\r
+DIM SHARED siil(30)\r
+DIM SHARED siil1(30)\r
+DIM SHARED siil2(30)\r
+DIM SHARED munt(30)\r
+DIM SHARED poosas(100)\r
+DIM SHARED aken(100)\r
+DIM SHARED vedru(50)\r
+DIM SHARED intro(6000)\r
+DIM SHARED puu(3000)\r
+DIM SHARED noolt(51)\r
+DIM SHARED noolt1(51)\r
+DIM SHARED auk(51)\r
+DIM SHARED sipp1(51)\r
+DIM SHARED sipp2(51)\r
+DIM SHARED sipp10(51)\r
+DIM SHARED sipp20(51)\r
+DIM SHARED sipp3(51)\r
+DIM SHARED uks(120)\r
+\r
+DIM SHARED ruutm(51)\r
+DIM SHARED tuhim(51)\r
+DIM SHARED kastm(51)\r
+DIM SHARED marm1(70)\r
+DIM SHARED pilvm(209)\r
+DIM SHARED tahtm(50)\r
+DIM SHARED siilm(30)\r
+DIM SHARED siilm1(30)\r
+DIM SHARED siilm2(30)\r
+DIM SHARED muntm(30)\r
+DIM SHARED poosasm(100)\r
+DIM SHARED akenm(100)\r
+DIM SHARED vedrum(50)\r
+DIM SHARED puum(3000)\r
+DIM SHARED nooltm(51)\r
+DIM SHARED nooltm1(51)\r
+DIM SHARED aukm(51)\r
+DIM SHARED sippm1(51)\r
+DIM SHARED sippm2(51)\r
+DIM SHARED sippm10(51)\r
+DIM SHARED sippm20(51)\r
+DIM SHARED sippm3(51)\r
+DIM SHARED uksm(50)\r
+DIM SHARED kuikiir\r
+DIM SHARED vas7$\r
+DIM SHARED par7$\r
+DIM SHARED ule7$\r
+DIM SHARED all7$\r
+vas7$ = CHR$(0) + "K"\r
+par7$ = CHR$(0) + "M"\r
+ule7$ = CHR$(0) + "H"\r
+all7$ = CHR$(0) + "P"\r
+elu = 10\r
+SCREEN 1\r
+maa = 1\r
+REM joonist\r
+REM END\r
+GET (1, 1)-(20, 20), tuhi\r
+pildid 0, 0, 1, 1, 1\r
+GET (1, 1)-(20, 20), ruut\r
+pildid 0, 0, 4, 1, 1\r
+GET (1, 1)-(20, 20), kast\r
+PUT (1, 180), ruut, PSET\r
+PUT (300, 1), ruut, PSET\r
+PUT (300, 180), ruut, PSET\r
+pildid 30, 50, 2, 1, 1\r
+GET (31, 51)-(91, 76), pilv\r
+PUT (160, 10), pilv, PSET\r
+pildid 20, 100, 3, 1, 1\r
+GET (21, 101)-(31, 114), taht\r
+CLS\r
+pildid 0, 0, 5, 1, 1\r
+GET (1, 1)-(11, 8), siil\r
+CLS\r
+pildid 0, 0, 6, 1, 1\r
+GET (1, 1)-(8, 10), munt\r
+CLS\r
+pildid 0, 0, 7, 1, 1\r
+GET (1, 1)-(31, 11), poosas\r
+CLS\r
+pildid 0, 0, 8, 1, 1\r
+GET (1, 1)-(26, 21), aken\r
+CLS\r
+pildid 0, 0, 9, 1, 1\r
+GET (1, 1)-(21, 11), vedru\r
+CLS\r
+pildid 0, 0, 11, 1, 1\r
+GET (1, 1)-(51, 81), puu\r
+CLS\r
+pildid 0, 0, 12, 1, 1\r
+GET (1, 1)-(20, 20), noolt\r
+CLS\r
+pildid 0, 0, 12, 50, 1\r
+GET (1, 1)-(20, 20), noolt1\r
+CLS\r
+pildid 0, 0, 13, 1, 1\r
+GET (1, 1)-(20, 20), auk\r
+CLS\r
+pildid 0, 0, 14, 1, 1\r
+GET (1, 1)-(20, 20), sipp1\r
+CLS\r
+pildid 0, 0, 15, 1, 1\r
+GET (1, 1)-(20, 20), sipp2\r
+CLS\r
+pildid 0, 0, 14, 50, 1\r
+GET (1, 1)-(20, 20), sipp10\r
+CLS\r
+pildid 0, 0, 15, 50, 1\r
+GET (1, 1)-(20, 20), sipp20\r
+CLS\r
+pildid 0, 0, 16, 1, 1\r
+GET (1, 1)-(20, 20), sipp3\r
+CLS\r
+GET (1, 1)-(10, 10), tuhim\r
+pildid 0, 0, 1, 1, 2\r
+GET (1, 1)-(10, 10), ruutm\r
+pildid 0, 0, 4, 1, 2\r
+GET (1, 1)-(10, 10), kastm\r
+PUT (1, 180), ruut, PSET\r
+PUT (300, 1), ruut, PSET\r
+PUT (300, 180), ruut, PSET\r
+pildid 30, 50, 2, 1, 2\r
+GET (16, 26)-(46, 38), pilvm\r
+pildid 20, 100, 3, 1, 2\r
+GET (11, 51)-(16, 72), tahtm\r
+CLS\r
+pildid 0, 0, 5, 1, 2\r
+GET (1, 1)-(6, 4), siilm\r
+CLS\r
+pildid 0, 0, 6, 1, 2\r
+GET (1, 1)-(4, 5), muntm\r
+CLS\r
+pildid 0, 0, 7, 1, 2\r
+GET (1, 1)-(16, 6), poosasm\r
+CLS\r
+pildid 0, 0, 8, 1, 2\r
+GET (1, 1)-(13, 11), akenm\r
+CLS\r
+pildid 0, 0, 9, 1, 2\r
+GET (1, 1)-(11, 6), vedrum\r
+CLS\r
+pildid 0, 0, 11, 1, 2\r
+GET (1, 1)-(26, 41), puum\r
+CLS\r
+pildid 0, 0, 12, 1, 2\r
+GET (1, 1)-(10, 10), nooltm\r
+CLS\r
+pildid 0, 0, 12, 50, 2\r
+GET (1, 1)-(10, 10), nooltm1\r
+CLS\r
+pildid 0, 0, 13, 1, 2\r
+GET (1, 1)-(10, 10), aukm\r
+CLS\r
+pildid 0, 0, 14, 1, 2\r
+GET (1, 1)-(10, 10), sippm1\r
+CLS\r
+pildid 0, 0, 15, 1, 2\r
+GET (1, 1)-(10, 10), sippm2\r
+CLS\r
+pildid 0, 0, 14, 50, 2\r
+GET (1, 1)-(10, 10), sippm10\r
+CLS\r
+pildid 0, 0, 15, 50, 2\r
+GET (1, 1)-(10, 10), sippm20\r
+CLS\r
+pildid 0, 0, 16, 1, 2\r
+GET (1, 1)-(10, 10), sippm3\r
+CLS\r
+pildid 0, 0, 17, 1, 1\r
+GET (1, 1)-(21, 31), uks\r
+CLS\r
+pildid 0, 0, 17, 1, 2\r
+GET (1, 1)-(11, 16), intro\r
+CLS\r
+GOTO 7\r
+pildid -1, -1, 10, 4, 1\r
+GET (1, 1)-(318, 124), intro\r
+CLS\r
+SLEEP 1\r
+PUT (1, 1), intro, PSET\r
+SLEEP 100\r
+7\r
+level 1\r
+a = 50\r
+b = 50\r
+siie = 1\r
+siie1 = 1\r
+6\r
+WHILE kbd$ = ""\r
+kbd$ = INKEY$\r
+IF voolual = 2 THEN b = b * 2: GOTO 106\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 b > 0 THEN IF sipp = 10 THEN PUT (a, b), sipp10, OR\r
+IF b > 0 THEN IF sipp = 20 THEN PUT (a, b), sipp20, OR\r
+IF b > 0 THEN IF sipp = 3 THEN PUT (a, b), sipp3, OR\r
+\r
+GET (siia, siib)-(siia + 10, siib + 10), siil1\r
+PUT (siia, siib), siil, OR\r
+GET (siia1, siib1)-(siia1 + 10, siib1 + 10), siil2\r
+PUT (siia1, siib1), siil, OR\r
+SOUND 0, .8\r
+IF asend((a + 38) \ 20, (b + 37) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
+IF asend((a + 38) \ 20, (b + 22) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
+\r
+IF asend((a + 21) \ 20, (b + 22) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
+IF asend((a + 21) \ 20, (b + 37) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
+\r
+IF asend((a + 22) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
+IF asend((a + 37) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
+\r
+IF asend((a + 22) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
+IF asend((a + 37) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
+\r
+qwer = qwer + 1: IF asend1((a + 30) \ 20, (b + 30) \ 20) = "q" AND qwer > 20 THEN qwer = 1: elu = elu - 1: eda = -10: all = -5: elud\r
+IF qwer > 100 THEN qwer = 50\r
+ IF asend((a + 30) \ 20, (b + 30) \ 20) = "1" THEN raha = raha + 1: kustuta1 = 1: elud: asend((a + 30) \ 20, (b + 30) \ 20) = ""\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "v" THEN all = -8: sipp = 3\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = ">" THEN eda = 3\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = "<" THEN eda = -3\r
+lke = lke + 1\r
+r = r + 1: IF r > 10 THEN r = 0: IF eda > 0 THEN eda = eda - 1: ELSE IF eda < 0 THEN eda = eda + 1\r
+r1 = r1 + 1: IF r1 > 3 THEN r1 = 0: all = all + 1\r
+lk = lk + 1: cd = cd - 1\r
+IF asend1((a + 30) \ 20, (b + 21) \ 20) = "o" THEN asend((a + 30) \ 20, (b + 21) \ 20) = "": asend1((a + 30) \ 20, (b + 21) \ 20) = "": kustuta = 1\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = "a" THEN asend((a + 30) \ 20, (b + 38) \ 20) = "": asend1((a + 30) \ 20, (b + 38) \ 20) = "": kustuta2 = 1\r
+IF asend((siia + 25) \ 20, (siib + 25) \ 20) = "z" THEN siiall = -1\r
+IF asend((siia + 30) \ 20, (siib + 10) \ 20) = "z" THEN siie = -1\r
+IF asend((siia + 20) \ 20, (siib + 10) \ 20) = "z" THEN siie = 1\r
+IF asend((siia1 + 25) \ 20, (siib1 + 25) \ 20) = "z" THEN siiall1 = -1\r
+IF asend((siia1 + 30) \ 20, (siib1 + 10) \ 20) = "z" THEN siie1 = -1\r
+IF asend((siia1 + 20) \ 20, (siib1 + 10) \ 20) = "z" THEN siie1 = 1\r
+IF siia > 300 THEN siie = -1\r
+IF siia < 3 THEN siie = 1\r
+IF siia1 > 300 THEN siie1 = -1\r
+IF siia1 < 3 THEN siie1 = 1\r
+PUT (siia1, siib1), siil2, PSET\r
+PUT (siia, siib), siil1, PSET\r
+IF b > 0 THEN PUT (a, b), mar1, PSET\r
+IF kustuta = 1 THEN kustuta = 0: PUT (((a + 10) \ 20) * 20, (b \ 20) * 20), tuhi, PSET\r
+IF kustuta1 = 1 THEN kustuta1 = 0: PUT (((a + 10) \ 20) * 20, ((b + 10) \ 20) * 20), tuhi, PSET\r
+IF kustuta2 = 1 THEN kustuta2 = 0: PUT (((a + 10) \ 20) * 20, ((b + 28) \ 20) * 20), tuhi, PSET\r
+IF makk = 1 THEN makk = 0: a = a - 20\r
+asend1((siia1 + 25) \ 20, (siib1 + 8) \ 20) = "": asend1((siia + 25) \ 20, (siib + 8) \ 20) = ""\r
+siia = siia + siie\r
+siib = siib + siiall\r
+siia1 = siia1 + siie1\r
+siib1 = siib1 + siiall1\r
+asend1((siia1 + 25) \ 20, (siib1 + 8) \ 20) = "q": asend1((siia + 25) \ 20, (siib + 8) \ 20) = "q"\r
+siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
+siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 2\r
+a = a + eda\r
+b = b + all\r
+IF a > 297 THEN a = 2: maa = maa + 1: level maa: siie = 1: siie1 = 1\r
+IF a < 1 THEN a = 296: IF maa = 1 THEN level maa: ELSE maa = maa - 1: level maa: IF voolual = 2 THEN a = 594\r
+IF b > 179 THEN elu = elu - 1: elud: maa = maa - 1: level maa: b = 100: a = 2: elud\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = uks3 + 10: b = uks4: eda = 0\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = uks1 + 10: b = uks2: eda = 0\r
+WEND\r
+a$ = kbd$: kbd$ = ""\r
+IF a$ = par7$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF a$ = par7$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
+IF a$ = vas7$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
+IF a$ = vas7$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF a$ = ule7$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF a$ = all7$ THEN all = all + 1\r
+IF a$ = "/" THEN a = 2: b = 50: maa = maa + 1: level maa: siie = 1: siie1 = 1\r
+IF a$ = "+" THEN a = 2: b = 50: maa = maa + 5: level maa: siie = 1: siie1 = 1\r
+IF a$ = "q" THEN END\r
+sipa = sipa + 1\r
+IF sipa = 3 THEN sipa = 1\r
+GOTO 6\r
+\r
+\r
+106\r
+WHILE kbd$ = ""\r
+kbd$ = INKEY$\r
+IF voolual = 1 THEN b = b / 2: GOTO 6\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 b > 0 THEN IF sipp = 10 THEN PUT (a \ 2, b \ 2), sippm10, OR\r
+IF b > 0 THEN IF sipp = 20 THEN PUT (a \ 2, b \ 2), sippm20, OR\r
+IF b > 0 THEN IF sipp = 3 THEN PUT (a \ 2, b \ 2), sippm3, OR\r
+\r
+GET (siia \ 2, siib \ 2)-((siia + 10) \ 2, (siib + 10) \ 2), siilm1\r
+PUT (siia \ 2, siib \ 2), siilm, OR\r
+GET (siia1 \ 2, siib1 \ 2)-((siia1 + 10) \ 2, (siib1 + 10) \ 2), siilm2\r
+PUT (siia1 \ 2, siib1 \ 2), siilm, OR\r
+SOUND 0, .8\r
+IF asend((a + 38) \ 20, (b + 37) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
+IF asend((a + 38) \ 20, (b + 22) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
+\r
+IF asend((a + 21) \ 20, (b + 22) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
+IF asend((a + 21) \ 20, (b + 37) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
+\r
+IF asend((a + 22) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
+IF asend((a + 37) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
+\r
+IF asend((a + 22) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
+IF asend((a + 37) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
+\r
+qwer = qwer + 1: IF asend1((a + 30) \ 20, (b + 30) \ 20) = "q" AND qwer > 20 THEN qwer = 1: elu = elu - 1: eda = -5: all = -3: elud\r
+IF qwer > 100 THEN qwer = 50\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "1" THEN raha = raha + 1: kustuta1 = 1: elud: asend((a + 30) \ 20, (b + 30) \ 20) = ""\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "v" THEN all = -8: sipp = 3\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = ">" THEN eda = 3\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = "<" THEN eda = -3\r
+lke = lke + 1\r
+r = r + 1: IF r > 10 THEN r = 0: IF eda > 0 THEN eda = eda - 1: ELSE IF eda < 0 THEN eda = eda + 1\r
+r1 = r1 + 1: IF r1 > 3 THEN r1 = 0: all = all + 1\r
+lk = lk + 1: cd = cd - 1\r
+IF asend1((a + 30) \ 20, (b + 21) \ 20) = "o" THEN asend((a + 30) \ 20, (b + 21) \ 20) = "": asend1((a + 30) \ 20, (b + 21) \ 20) = "": kustuta = 1\r
+IF asend1((a + 30) \ 20, (b + 38) \ 20) = "a" THEN asend((a + 30) \ 20, (b + 38) \ 20) = "": asend1((a + 30) \ 20, (b + 38) \ 20) = "": kustuta2 = 1\r
+IF asend((siia + 25) \ 20, (siib + 25) \ 20) = "z" THEN siiall = -1\r
+IF asend((siia + 30) \ 20, (siib + 10) \ 20) = "z" THEN siie = -1\r
+IF asend((siia + 20) \ 20, (siib + 10) \ 20) = "z" THEN siie = 1\r
+IF asend((siia1 + 25) \ 20, (siib1 + 25) \ 20) = "z" THEN siiall1 = -1\r
+IF asend((siia1 + 30) \ 20, (siib1 + 10) \ 20) = "z" THEN siie1 = -1\r
+IF asend((siia1 + 20) \ 20, (siib1 + 10) \ 20) = "z" THEN siie1 = 1\r
+IF siia > 600 THEN siie = -1\r
+IF siia < 3 THEN siie = 1\r
+IF siia1 > 600 THEN siie1 = -1\r
+IF siia1 < 3 THEN siie1 = 1\r
+PUT (siia1 \ 2, siib1 \ 2), siilm2, PSET\r
+PUT (siia \ 2, siib \ 2), siilm1, PSET\r
+IF b > 0 THEN PUT (a \ 2, b \ 2), marm1, PSET\r
+IF kustuta = 1 THEN kustuta = 0: PUT (((a + 10) \ 20) * 10, (b \ 20) * 10), tuhim, PSET\r
+IF kustuta1 = 1 THEN kustuta1 = 0: PUT (((a + 10) \ 20) * 10, ((b + 10) \ 20) * 10), tuhim, PSET\r
+IF kustuta2 = 1 THEN kustuta2 = 0: PUT (((a + 10) \ 20) * 10, ((b + 28) \ 20) * 10), tuhim, PSET\r
+IF makk = 1 THEN makk = 0: a = a - 20\r
+asend1((siia1 + 25) \ 20, (siib1 + 8) \ 20) = "": asend1((siia + 25) \ 20, (siib + 8) \ 20) = ""\r
+siia = siia + siie\r
+siib = siib + siiall\r
+siia1 = siia1 + siie1\r
+siib1 = siib1 + siiall1\r
+asend1((siia1 + 25) \ 20, (siib1 + 8) \ 20) = "q": asend1((siia + 25) \ 20, (siib + 8) \ 20) = "q"\r
+siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
+siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 2\r
+a = a + eda\r
+b = b + all\r
+IF a > 594 THEN a = 2: maa = maa + 1: level maa: siie = 1: siie1 = 1\r
+IF a < 1 THEN a = 594: IF maa = 1 THEN level maa: ELSE maa = maa - 1: level maa: IF voolual = 1 THEN a = 297\r
+IF b > 358 THEN elu = elu - 1: elud: maa = maa - 1: level maa: b = 100: a = 2: elud\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = uks3 + 5: b = uks4: eda = 0\r
+IF asend((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = uks1 + 5: b = uks2: eda = 0\r
+WEND\r
+a$ = kbd$: kbd$ = ""\r
+IF a$ = par7$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF a$ = par7$ THEN IF sipa = 1 THEN sipp = 1: ELSE sipp = 2\r
+IF a$ = vas7$ THEN IF sipa = 1 THEN sipp = 10: ELSE sipp = 20\r
+IF a$ = vas7$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF a$ = ule7$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF a$ = all7$ THEN all = all + 1\r
+IF a$ = "/" THEN a = 2: b = 50: maa = maa + 1: level maa: siie = 1: siie1 = 1\r
+IF a$ = "+" THEN a = 2: b = 50: maa = maa + 5: level maa: siie = 1: siie1 = 1\r
+IF a$ = "q" THEN END\r
+sipa = sipa + 1\r
+IF sipa = 3 THEN sipa = 1\r
+GOTO 106\r
+\r
+SUB elud\r
+LOCATE 1, 1\r
+IF voolual = 2 THEN GOTO 12\r
+PRINT " "\r
+IF raha > 9 THEN raha = 0: elu = elu + 1\r
+LOCATE 1, 1\r
+PRINT "o "; raha; " Elu "; elu\r
+12\r
+IF elu < 0 THEN END\r
+END SUB\r
+\r
+SUB joonist\r
+tuhi$ = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"\r
+CLS\r
+INPUT "laius", laius\r
+INPUT "pikkus", pikkus\r
+FOR a = 1 TO pikkus\r
+text$(a) = RIGHT$(tuhi$, laius)\r
+NEXT a\r
+CLS\r
+a = 1\r
+b = 1\r
+z = 3\r
+zx = 1\r
+2\r
+a$ = INPUT$(1)\r
+IF zx = 1 THEN CIRCLE (a * 2, b * 2), 1, z\r
+po = ASC(RIGHT$(LEFT$(text$(b), a), 1)) - 1\r
+IF zx = -1 THEN CIRCLE (a * 2, b * 2), 1, po\r
+IF a$ = "6" THEN a = a + 1\r
+IF a$ = "4" THEN a = a - 1\r
+IF a$ = "8" THEN b = b - 1\r
+IF a$ = "2" THEN b = b + 1\r
+IF a$ = " " THEN zx = zx * -1\r
+IF a$ = "e" THEN GOTO 5\r
+IF a$ = "s" THEN GOTO 3\r
+IF a$ = "z" THEN z = 0\r
+IF a$ = "x" THEN z = 1\r
+IF a$ = "c" THEN z = 2\r
+IF a$ = "v" THEN z = 3\r
+\r
+IF a < 1 THEN a = 1\r
+IF b < 1 THEN b = 1\r
+IF b > pikkus THEN b = pikkus\r
+IF a > laius THEN a = laius\r
+IF z > 3 THEN z = 3\r
+IF z < 0 THEN z = 0\r
+IF zx = 1 THEN MID$(text$(b), a) = CHR$(z + 1)\r
+IF zx = 1 THEN CIRCLE (a * 2, b * 2), 1, z\r
+IF zx = 1 THEN PAINT (a * 2, b * 2), z\r
+o = 0\r
+IF zx = 1 THEN IF z = 0 THEN o = 3\r
+po = ASC(RIGHT$(LEFT$(text$(b), a), 1)) - 1\r
+IF zx = -1 THEN IF po = 0 THEN o = 3\r
+CIRCLE (a * 2, b * 2), 1, o\r
+GOTO 2\r
+3\r
+INPUT "fail", a$\r
+save a$\r
+5\r
+END SUB\r
+\r
+SUB level (y)\r
+125\r
+siia = 0\r
+siib = 0\r
+aiia1 = 0\r
+siib1 = 0\r
+FOR a1 = 1 TO 32\r
+FOR b1 = 1 TO 20\r
+asend(a1, b1) = ""\r
+asend1(a1, b1) = ""\r
+NEXT b1\r
+NEXT a1\r
+FOR a = 1 TO 10\r
+uun(a) = ""\r
+NEXT a\r
+CLS\r
+LOCATE 3, 10\r
+SELECT CASE y\r
+CASE 1\r
+uun(1) = " mmm"\r
+uun(2) = " - m mm"\r
+uun(3) = " . - mmm"\r
+uun(4) = "o . . mymm"\r
+uun(5) = "o -mmm"\r
+uun(6) = "o t mxmm"\r
+uun(7) = "o mmm"\r
+uun(8) = "o 1 1 "\r
+uun(9) = "o p p 1 1 1"\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+voolual = 1\r
+CASE 2\r
+uun(1) = "mmmmmmmmmmmmmmmm"\r
+uun(2) = "mm h h "\r
+uun(3) = "mmx m mmmymmm"\r
+uun(4) = "mmommmmmm mom m"\r
+uun(5) = "mo 1 1 1 o1m1m"\r
+uun(6) = "momm m m m m111m"\r
+uun(7) = "m h mmmmoom"\r
+uun(8) = " mm h m"\r
+uun(9) = " v mmm mm"\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 3\r
+uun(1) = "mmmmmmmmmmmmmmmm"\r
+uun(2) = " h h h h h ym11"\r
+uun(3) = "mm mmmmmmmmmmm1m"\r
+uun(4) = "m h m xm "\r
+uun(5) = "mm m m mmmmmmmmm"\r
+uun(6) = "mmmm m1m "\r
+uun(7) = "m h m1moo m"\r
+uun(8) = "m mmmmmm m1moomm"\r
+uun(9) = "m 11111m h h "\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 4\r
+uun(1) = "mmmmmmmmmmmmmmmm"\r
+uun(2) = " h1 h1 m"\r
+uun(3) = "mmm 1 11 1 o1m"\r
+uun(4) = " m 1 oo 1o1m"\r
+uun(5) = "m moo oo1m"\r
+uun(6) = " m h o "\r
+uun(7) = "mmm h o "\r
+uun(8) = "m o "\r
+uun(9) = " x oy "\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 5\r
+uun(1) = "m . y - "\r
+uun(2) = "m m moo"\r
+uun(3) = "m. mxm mmo"\r
+uun(4) = "m - m mmmmmm"\r
+uun(5) = "m . m mm "\r
+uun(6) = "mt o o m "\r
+uun(7) = "m o om o ooo "\r
+uun(8) = "m ooooooooooo "\r
+uun(9) = " v o "\r
+uun(10) = "oooooooooooooooo"\r
+CASE 6\r
+PRINT "1-2 Maailm . Kood: teine": elud\r
+a$ = INPUT$(1)\r
+CLS\r
+uun(1) = " - "\r
+uun(2) = " . "\r
+uun(3) = " oo- oo "\r
+uun(4) = " - 11 11 ."\r
+uun(5) = " oo oo "\r
+uun(6) = " m ym11 11 "\r
+uun(7) = " m m "\r
+uun(8) = " ooom <> <> "\r
+uun(9) = " xmmm mmm"\r
+uun(10) = "mmmmmmmmmmm mmm"\r
+CASE 7\r
+uun(1) = " oooo "\r
+uun(2) = " o111 . "\r
+uun(3) = " oooo> >>>>>>"\r
+uun(4) = " . x v m"\r
+uun(5) = " mym m"\r
+uun(6) = " m m"\r
+uun(7) = " 111m"\r
+uun(8) = " 111m"\r
+uun(9) = " v p "\r
+uun(10) = "oooaaaaaaaaaoooo"\r
+CASE 8\r
+uun(1) = " . o"\r
+uun(2) = " . mm o"\r
+uun(3) = ". ommm t o"\r
+uun(4) = " mom mm o"\r
+uun(5) = " pmmoyxmmm o"\r
+uun(6) = " mmmomammmm m"\r
+uun(7) = "p mmmmv mmmm "\r
+uun(8) = "mmmmmmmmm mmmmmm"\r
+uun(9) = " "\r
+uun(10) = ">>>>>>>>>>>>>>>>"\r
+maa = maa + 1\r
+CASE 10\r
+uun(1) = "m. - m"\r
+uun(2) = "m . m"\r
+uun(3) = "m 111 - m"\r
+uun(4) = "mmmmm>>> ammm"\r
+uun(5) = "a a m"\r
+uun(6) = "mmm t a m"\r
+uun(7) = " ma m"\r
+uun(8) = ">>> a m"\r
+uun(9) = " m yx m m"\r
+uun(10) = ">>>mmmmmmmmmmm m"\r
+CASE 9\r
+uun(1) = "mammmmmmmmmmmmm "\r
+uun(2) = "m1m y xmo "\r
+uun(3) = "mamooo>>>a>am om"\r
+uun(4) = "m1m m1mamo m"\r
+uun(5) = "mamm m1mam om"\r
+uun(6) = "m1m mm1mamo m"\r
+uun(7) = "mammm m1ma om"\r
+uun(8) = "m1m mmm1ma o m"\r
+uun(9) = "m amam om"\r
+uun(10) = "mmmmmmmm<mmammmm"\r
+maa = maa + 2\r
+CASE 11\r
+uun(1) = ">>>>>>>>>>>>>>><"\r
+uun(2) = "> <x <"\r
+uun(3) = "> < >> <"\r
+uun(4) = "> <y>>>>>>> <"\r
+uun(5) = "> < < <<<"\r
+uun(6) = "> <<<<a<< << < >"\r
+uun(7) = "> < < < "\r
+uun(8) = "> <m >m>>m < >"\r
+uun(9) = "> <"\r
+uun(10) = ">>>>m<<<<<<<<mm<"\r
+maa = maa + 2\r
+CASE 12\r
+uun(1) = "m aaaaaaaaam"\r
+uun(2) = "m - xmm"\r
+uun(3) = "m t. ym 1"\r
+uun(4) = "m . moom"\r
+uun(5) = "m am 1"\r
+uun(6) = "m mamomm"\r
+uun(7) = "m - mmam 1"\r
+uun(8) = "m mmmamomm"\r
+uun(9) = "m p p mm 1"\r
+uun(10) = "mmmmmmmmmammmm<<"\r
+CASE 13\r
+uun(1) = "mmmmmmmmmmmmmmmm"\r
+uun(2) = "m m m"\r
+uun(3) = " ma 1a1a1a m"\r
+uun(4) = "mmma aaaaaaaam m"\r
+uun(5) = "11maaaaaaaaaam m"\r
+uun(6) = "mmmaaaaaaaaaam m"\r
+uun(7) = "11x ym m"\r
+uun(8) = "mmmmmmmmmmmmmm m"\r
+uun(9) = " m"\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 14\r
+uun(1) = "mmmmmmmmm- "\r
+uun(2) = "mm mmmmmmm - "\r
+uun(3) = "mm m "\r
+uun(4) = "mm >>>>> m - "\r
+uun(5) = "mmv m m ."\r
+uun(6) = ">><< m <<m - "\r
+uun(7) = "11 m m m . "\r
+uun(8) = ">> m m m xy "\r
+uun(9) = "mm vm v "\r
+uun(10) = "mm>><m>>>>>mmmmm"\r
+CASE 15\r
+PRINT "1-3 Maailm . Kood: Sven Risto": elud\r
+a$ = INPUT$(1)\r
+CLS\r
+uun(1) = " m m"\r
+uun(2) = "mm ymmmmmmmmmaaa"\r
+uun(3) = "<<oo 1111maaa"\r
+uun(4) = " <<111maaa"\r
+uun(5) = "<<m< m11maaa"\r
+uun(6) = " t oomm aaa"\r
+uun(7) = " vo mm1m"\r
+uun(8) = " mm<<<mm1m"\r
+uun(9) = " m x <<mmmmm11"\r
+uun(10) = "mmmmmmmmmmmmmmmm"\r
+voolual = 1\r
+CASE 16\r
+uun(1) = "m11 aa m 11111 m"\r
+uun(2) = "m11 a a a < m"\r
+uun(3) = "m11 >aam v t a m"\r
+uun(4) = "m11om y o a am"\r
+uun(5) = "m11 oooo t m"\r
+uun(6) = ">>>om p p m m"\r
+uun(7) = "m mmm mamamom mm m"\r
+uun(8) = "m v mmmmm mam 11m mmmmmm m"\r
+uun(9) = "m mmmmmmmmm mam 1mm mm m"\r
+uun(10) = "mm m1 m mam111m m m"\r
+uun(11) = "m m o m mam vm m"\r
+uun(12) = "m m m1111m vmammmmm m m"\r
+uun(13) = "m m mmmmm 11 "\r
+uun(14) = "mmmmmm m mamammmmm mm"\r
+uun(15) = "m m mam1111m m >m"\r
+uun(16) = "m m m1m111m m m"\r
+uun(17) = " m mammmm mm>>> <<<>>m"\r
+uun(18) = " m m x m m m "\r
+uun(19) = "mmmmm mmmmmmm mmm mm"\r
+voolual = 2\r
+CASE 17\r
+uun(1) = "mu 1111 m"\r
+uun(2) = "mmmmmmm <<<<am"\r
+uun(3) = "m m a mam"\r
+uun(4) = "m m y m1m"\r
+uun(5) = "m mm <xmam"\r
+uun(6) = " m <<<<m1m"\r
+uun(7) = " m ma1"\r
+uun(8) = "mmmm m <<mmm"\r
+uun(9) = "m111 vU m "\r
+uun(10) = "mmmmmmmaamaaam "\r
+voolual = 1\r
+CASE 18\r
+uun(1) = "oo m "\r
+uun(2) = "oo h h m "\r
+uun(3) = "oo x m h m>>>>>"\r
+uun(4) = "oo m11111111m m mm m"\r
+uun(5) = "oo m11111111m m mm h m m"\r
+uun(6) = "oo mmmmmmmmmm m m vm m"\r
+uun(7) = "oo mm mmmmmmm m"\r
+uun(8) = " v m"\r
+uun(9) = "mom mmmmmm v m"\r
+uun(10) = "m m m mmmmmm mm h h m"\r
+uun(11) = "m m"\r
+uun(12) = "m <<<<<<<<<<<<<<<<<<<<<<<<<<< m"\r
+uun(13) = "mam m"\r
+uun(14) = "mammooooommaaammm maaaaavm"\r
+uun(15) = "mam oo a ma m111111m"\r
+uun(16) = "mam oo <<< h mh h mma<>amm"\r
+uun(17) = "mam moom << m"\r
+uun(18) = "my mm m m m"\r
+uun(19) = "mmmmmmmmmmmm<<mmmaaaaammmmmmmmm"\r
+voolual = 2\r
+CASE 19\r
+CLS\r
+pildid 1, 1, 10, 3, 1\r
+LOCATE 20, 1\r
+PRINT "end"\r
+FOR a = 1 TO 50\r
+a$ = INKEY$\r
+NEXT a\r
+a$ = INPUT$(1)\r
+CLS\r
+SCREEN 2\r
+PRINT " Programmi koostasid:"\r
+PRINT "Svjatoslav Agejenko, Risto Ipsperg ja Fred Freimann"\r
+a$ = INPUT$(1)\r
+END\r
+END\r
+CASE 100\r
+uun(1) = " "\r
+uun(2) = " "\r
+uun(3) = " "\r
+uun(4) = " "\r
+uun(5) = " "\r
+uun(6) = " "\r
+uun(7) = " "\r
+uun(8) = " "\r
+uun(9) = " "\r
+uun(10) = " "\r
+CASE 101\r
+uun(1) = " "\r
+uun(2) = " "\r
+uun(3) = " "\r
+uun(4) = " "\r
+uun(5) = " "\r
+uun(6) = " "\r
+uun(7) = " "\r
+uun(8) = " "\r
+uun(9) = " "\r
+uun(10) = " "\r
+uun(11) = " "\r
+uun(12) = " "\r
+uun(13) = " "\r
+uun(14) = " "\r
+uun(15) = " "\r
+uun(16) = " "\r
+uun(17) = " "\r
+uun(18) = " "\r
+uun(19) = " "\r
+voolual = 2\r
+\r
+END SELECT\r
+IF voolual = 2 THEN GOTO 124\r
+FOR e = 0 TO 9\r
+FOR D = 0 TO 15\r
+q$ = RIGHT$(LEFT$(uun(e + 1), D + 1), 1)\r
+IF q$ = "m" THEN PUT (D * 20, e * 20), ruut, PSET: asend(D + 1, e + 1) = "z"\r
+IF q$ = "o" THEN PUT (D * 20, e * 20), kast, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "o"\r
+IF q$ = "." THEN PUT (D * 20, e * 20), taht, PSET\r
+IF q$ = "-" THEN PUT (D * 20, e * 20), pilv, PSET\r
+IF q$ = "x" THEN siia = D * 20: siib = (e + 1) * 20\r
+IF q$ = "y" THEN siia1 = D * 20: siib1 = (e + 1) * 20\r
+IF q$ = "1" THEN PUT (D * 20, e * 20), munt, PSET: asend(D + 1, e + 1) = "1"\r
+IF q$ = "p" THEN PUT (D * 20, (e * 20) + 10), poosas, PSET\r
+IF q$ = "h" THEN PUT (D * 20, e * 20), aken, PSET\r
+IF q$ = "v" THEN PUT (D * 20, (e * 20) + 10), vedru, PSET: asend(D + 1, e + 1) = "v"\r
+IF q$ = "t" THEN PUT (D * 20, e * 20), puu, PSET\r
+IF q$ = ">" THEN PUT (D * 20, e * 20), noolt, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = ">"\r
+IF q$ = "<" THEN PUT (D * 20, e * 20), noolt1, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "<"\r
+IF q$ = "a" THEN PUT (D * 20, e * 20), auk, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "a"\r
+IF q$ = "u" THEN PUT (D * 20, e * 20), uks, PSET: asend(D + 1, e + 1) = "u": uks1 = D * 20: uks2 = e * 20\r
+IF q$ = "U" THEN PUT (D * 20, e * 20), uks, PSET: asend(D + 1, e + 1) = "U": uks3 = D * 20: uks4 = e * 20\r
+NEXT D\r
+NEXT e\r
+GOTO 123\r
+124\r
+FOR e = 0 TO 19\r
+FOR D = 0 TO 30\r
+q$ = RIGHT$(LEFT$(uun(e + 1), D + 1), 1)\r
+IF q$ = "m" THEN PUT (D * 10, e * 10), ruutm, PSET: asend(D + 1, e + 1) = "z"\r
+IF q$ = "o" THEN PUT (D * 10, e * 10), kastm, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "o"\r
+IF q$ = "." THEN PUT (D * 10, e * 10), tahtm, PSET\r
+IF q$ = "-" THEN PUT (D * 10, e * 10), pilvm, PSET\r
+IF q$ = "x" THEN siia = D * 20: siib = (e + 1) * 20\r
+IF q$ = "y" THEN siia1 = D * 20: siib1 = (e + 1) * 20\r
+IF q$ = "1" THEN PUT (D * 10, e * 10), muntm, PSET: asend(D + 1, e + 1) = "1"\r
+IF q$ = "p" THEN PUT (D * 10, (e * 10) + 5), poosasm, PSET\r
+IF q$ = "h" THEN PUT (D * 10, e * 10), akenm, PSET\r
+IF q$ = "v" THEN PUT (D * 10, (e * 10) + 5), vedrum, PSET: asend(D + 1, e + 1) = "v"\r
+IF q$ = "t" THEN PUT (D * 10, e * 10), puum, PSET\r
+IF q$ = ">" THEN PUT (D * 10, e * 10), nooltm, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = ">"\r
+IF q$ = "<" THEN PUT (D * 10, e * 10), nooltm1, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "<"\r
+IF q$ = "a" THEN PUT (D * 10, e * 10), aukm, PSET: asend(D + 1, e + 1) = "z": asend1(D + 1, e + 1) = "a"\r
+IF q$ = "u" THEN PUT (D * 10, e * 10), uksm, PSET: asend(D + 1, e + 1) = "u": uks1 = D * 20: uks2 = e * 20\r
+IF q$ = "U" THEN PUT (D * 10, e * 10), uksm, PSET: asend(D + 1, e + 1) = "U": uks3 = D * 20: uks4 = e * 20\r
+NEXT D\r
+NEXT e\r
+123\r
+END SUB\r
+\r
+SUB pildid (p, o, m, fr, teler)\r
+DIM ao(1 TO 100) AS STRING\r
+SELECT CASE m\r
+CASE 1\r
+ao(1) = "00000000000000000000"\r
+ao(2) = "00111111111111111100"\r
+ao(3) = "01222222222222222210"\r
+ao(4) = "01233333333333333210"\r
+ao(5) = "01232222222222223210"\r
+ao(6) = "01232111111111123210"\r
+ao(7) = "01232111111111123210"\r
+ao(8) = "01232111111111123210"\r
+ao(9) = "01232111111111123210"\r
+ao(10) = "01232111111111123210"\r
+ao(11) = "01232111111111123210"\r
+ao(12) = "01232111111111123210"\r
+ao(13) = "01232111111111123210"\r
+ao(14) = "01232111111111123210"\r
+ao(15) = "01232111111111123210"\r
+ao(16) = "01232222222222223210"\r
+ao(17) = "01233333333333333210"\r
+ao(18) = "01222222222222222210"\r
+ao(19) = "00111111111111111100"\r
+ao(20) = "00000000000000000000"\r
+CASE 2\r
+ao(1) = "000000022200000222220000002222222200000000000222222000000000"\r
+ao(2) = "000000022222002222222000222222222222000000222222222220000000"\r
+ao(3) = "000000222222222222222202222222222222222222222222222222200000"\r
+ao(4) = "000000222222222222222222222333333222220222222222222221110000"\r
+ao(5) = "000000222222233333322222223333333322222222222222222221111000"\r
+ao(6) = "000000022333333333333222233333333333222233322222222221111000"\r
+ao(7) = "000002222333333333333322233333333333333333333222222221111100"\r
+ao(8) = "000222222333333333333333333333333333333333333322222221111100"\r
+ao(9) = "002222223333333333333333333333333333333333333333222221111100"\r
+ao(10) = "022223333333333333333333333333333333333333333333222221111110"\r
+ao(11) = "022233333333333333333333333333333333333333333333322222111110"\r
+ao(12) = "222333333333333333333333333333333333333333333333322222111110"\r
+ao(13) = "222333333333333333333333323333333323131113333333221221111110"\r
+ao(14) = "223333333333333333333331112233331121111133333322112211111110"\r
+ao(15) = "213333333333333333333331111133111111111111111112222111111110"\r
+ao(16) = "111333313333333333333111111122111111111111111111221111111110"\r
+ao(17) = "111333311111111333111111111111111111111111111111111111111100"\r
+ao(18) = "011111111111111111111111111111111111111111111111111111111100"\r
+ao(19) = "011111111111111111111111111111111111111111111111111111111100"\r
+ao(20) = "011111111111111111111111111111111111111111111111111111111000"\r
+ao(21) = "001111111111111111111111111111111111111111111111110111100000"\r
+ao(22) = "001111111111111100111111111111111111111111111111100000000000"\r
+ao(23) = "000111111111110000011111111111100011111111111111000000000000"\r
+ao(24) = "000011111111100000000111111111000000011111111100000000000000"\r
+ao(25) = "000001111110000000000001111110000000000000000000000000000000"\r
+CASE 3\r
+ao(1) = "0000010000"\r
+ao(2) = "0000010000"\r
+ao(3) = "0000121000"\r
+ao(4) = "0000131000"\r
+ao(5) = "1111232111"\r
+ao(6) = "0123333210"\r
+ao(7) = "0123333210"\r
+ao(8) = "0012332100"\r
+ao(9) = "0001221000"\r
+ao(10) = "0012112100"\r
+ao(11) = "0121001210"\r
+ao(12) = "0110000110"\r
+ao(13) = "1100000011"\r
+CASE 4\r
+ao(1) = "01111111110111111111"\r
+ao(2) = "01222222210122222221"\r
+ao(3) = "01233333210123333321"\r
+ao(4) = "01233333210123333321"\r
+ao(5) = "01233333210123333321"\r
+ao(6) = "01233333210123333321"\r
+ao(7) = "01233333210123333321"\r
+ao(8) = "01222222210122222221"\r
+ao(9) = "01111111110111111111"\r
+ao(10) = "00000000000000000000"\r
+ao(11) = "01111111110111111111"\r
+ao(12) = "01222222210122222221"\r
+ao(13) = "01233333210123333321"\r
+ao(14) = "01233333210123333321"\r
+ao(15) = "01233333210123333321"\r
+ao(16) = "01233333210123333321"\r
+ao(17) = "01233333210123333321"\r
+ao(18) = "01222222210122222221"\r
+ao(19) = "01111111110111111111"\r
+ao(20) = "00000000000000000000"\r
+CASE 5\r
+ao(1) = "0000333000"\r
+ao(2) = "0033333300"\r
+ao(3) = "0332222220"\r
+ao(4) = "3322222222"\r
+ao(5) = "3222111112"\r
+ao(6) = "3111111111"\r
+ao(7) = "1111111111"\r
+CASE 6\r
+ao(1) = "00111100"\r
+ao(2) = "01222210"\r
+ao(3) = "12233221"\r
+ao(4) = "12233221"\r
+ao(5) = "12233221"\r
+ao(6) = "12233221"\r
+ao(7) = "12233221"\r
+ao(8) = "12233221"\r
+ao(9) = "01222210"\r
+ao(10) = "00111100"\r
+CASE 7\r
+ao(1) = "000000000000000033333300000000"\r
+ao(2) = "000000000000000333333333000000"\r
+ao(3) = "000000333300003332222222300000"\r
+ao(4) = "000003333330333322232222220000"\r
+ao(5) = "000033322333333222222222222000"\r
+ao(6) = "003332222223332222322212222200"\r
+ao(7) = "033222232222222222111211122200"\r
+ao(8) = "033222222232111111111111112220"\r
+ao(9) = "332223222111121121111111111222"\r
+ao(10) = "322222111111111111121111111111"\r
+CASE 8\r
+ao(1) = "0000000002222222000000000"\r
+ao(2) = "0000000222111112220000000"\r
+ao(3) = "0000002211131311122000000"\r
+ao(4) = "0000022113331133112200000"\r
+ao(5) = "0000022133331333312200000"\r
+ao(6) = "0000221133331333311220000"\r
+ao(7) = "0000221333331333331220000"\r
+ao(8) = "0000221333331333331220000"\r
+ao(9) = "0000221111111111111220000"\r
+ao(10) = "0000221333331333331220000"\r
+ao(11) = "0002211333331333331122000"\r
+ao(12) = "0002213333331333333122000"\r
+ao(13) = "0002213333331333333122000"\r
+ao(14) = "0002213333331333333122000"\r
+ao(15) = "0002213333331333333122000"\r
+ao(16) = "0002213333331333333122000"\r
+ao(17) = "0002213333331333333122000"\r
+ao(18) = "0002211111111111111122000"\r
+ao(19) = "2222222222222222222222222"\r
+ao(20) = "0222222222222222222222220"\r
+CASE 9\r
+ao(1) = "00000001112220000000"\r
+ao(2) = "00001112222111120000"\r
+ao(3) = "00112222111122221100"\r
+ao(4) = "02222111122221111110"\r
+ao(5) = "01111122221111122220"\r
+ao(6) = "11122221111122221111"\r
+ao(7) = "22221111122221111111"\r
+ao(8) = "21111122221111112222"\r
+ao(9) = "11222221111112222111"\r
+ao(10) = "22221111112222111111"\r
+CASE 10\r
+ao(1) = "33333333333333333333333333333333333333333333333333333333333333333333333333333333"\r
+ao(2) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(3) = "30000110000111001110011111100011111110011111100000000000000000000000000000000003"\r
+ao(4) = "30001111100111001110011111110011111110011111110000000000000000002222000000000003"\r
+ao(5) = "30011001100011001100011100110011100110011100111000000000000000222222220000000003"\r
+ao(6) = "30011000000011001100011111110011100000011100111000000000000000222222222222000003"\r
+ao(7) = "30011000000011001100011111100011100110011111110000000000000000330330330002200003"\r
+ao(8) = "30011111000011001100011100000011111110011111100000000000000000333333330000000003"\r
+ao(9) = "30001111100011001100011100000011111110011100100000000000000000332222330000000003"\r
+ao(10) = "30000001100011001100011100000011100000011100110000000000000000033333300000000003"\r
+ao(11) = "30110001100011001100011100000011100110011100111000000000000030000111000000000003"\r
+ao(12) = "30111011100011111100011100000011111110011100111000000000000331111111111000000003"\r
+ao(13) = "30111111000001111000011100000011111110011100111000000000000331111111111100000003"\r
+ao(14) = "30000000000000000000000000000000000000000000000000000000000000001111101100000003"\r
+ao(15) = "30000000000000000000000000000000000000000000000000000000000000001111101100000003"\r
+ao(16) = "30000000000000000000000000000000000000000000000000000000000000001101100000000003"\r
+ao(17) = "30000000000000000000000000000000000000000000000000000000000000011101110000000003"\r
+ao(18) = "30000000000000000000000000000000000000000000000000000000000000011101110000000003"\r
+ao(19) = "30000000000000000000000000000000000000000000000000000000000000333303330000000003"\r
+ao(20) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(21) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(22) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(23) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(24) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(25) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(26) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(27) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(28) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(29) = "30000000000000000000000000000000000000000000000000000000000000000000000000000003"\r
+ao(30) = "33333333333333333333333333333333333333333333333333333333333333333333333333333333"\r
+CASE 11\r
+ao(1) = "00000000000111111110000000000000000000000000000000"\r
+ao(2) = "00000000011111111111000001100000000000000000000000"\r
+ao(3) = "00000000111111111111110011110000000000000000000000"\r
+ao(4) = "00000001101111111111111111111000000000000000000000"\r
+ao(5) = "00000011111111111111111111111111000000000000000000"\r
+ao(6) = "00000111111111111111111111111111000000000000000000"\r
+ao(7) = "00000111111111111111111111111111001100000000000000"\r
+ao(8) = "00000111111111111111111111111111111111100000000000"\r
+ao(9) = "00000111111111111111111111111111111111100000000000"\r
+ao(10) = "00000111111111111111111111111111111111110000000000"\r
+ao(11) = "00000111111111111111111111111111111111111000000000"\r
+ao(12) = "00000111111111111111111111111111111111111100000000"\r
+ao(13) = "00000111111111111111111111111111111111111100000000"\r
+ao(14) = "00000111111111111111111111111111111111111100000000"\r
+ao(15) = "00000111111111111111111111111111111111111100000000"\r
+ao(16) = "00000111111111111111111111111111111111111100000000"\r
+ao(17) = "00011111111111111111111111111111111111111100000000"\r
+ao(18) = "00011111111111111111111111111111111111111100000000"\r
+ao(19) = "00111111110111111111111111111111111111111100000000"\r
+ao(20) = "01110111111111111111111111111111111111111100000000"\r
+ao(21) = "11111111111111111111111111111111111111111111100000"\r
+ao(22) = "11111111111111111111111111111111111111111111100000"\r
+ao(23) = "11111111111111111111111111111111111111111111100000"\r
+ao(24) = "11111111111111111111111111111111111111111111100000"\r
+ao(25) = "11111111111111111111111111111111111111111111111110"\r
+ao(26) = "11111111111111111111111111111111111111111111110111"\r
+ao(27) = "11111111111111111111111111111111111111111111111111"\r
+ao(28) = "11011111111111111111111111111111111111111111111101"\r
+ao(29) = "11111111111111111111111111111111111111111111111111"\r
+ao(30) = "11111111111111111111111111111111111111111111111111"\r
+ao(31) = "11111111111111111111111111111111111111111111111011"\r
+ao(32) = "11111111111111111111111111111111111111111111111100"\r
+ao(33) = "11111111111111111111111111111111111111111111111000"\r
+ao(34) = "01111111111111111111111111111111111111111111110000"\r
+ao(35) = "11111111111111111111111111111111111111111110110000"\r
+ao(36) = "11111111111111111111111111111111111111111110110000"\r
+ao(37) = "11111111111111111111111111111111111111111111110000"\r
+ao(38) = "01111111111111111111111111111111111111111111110000"\r
+ao(39) = "01111111111111111111111111111111111111111111110000"\r
+ao(40) = "00011111111111111111111111111111111111111111100000"\r
+ao(41) = "00111111111111111111111111111111111111111111100000"\r
+ao(42) = "00011111111111111111111111111111111111111111110000"\r
+ao(43) = "00001111111111111111111111111111111111111111110000"\r
+ao(44) = "00001111111111111111111111111111111111111111111000"\r
+ao(45) = "0000110111111111111111111111111111111111111111100"\r
+ao(46) = "0000110011111111111111111111011111111111111100000"\r
+ao(47) = "0000111101101111111111111111111111111110111000000"\r
+ao(48) = "0000000000001111111111111111111111111111110000000"\r
+ao(49) = "0000000000000001111111111111111111110111110000000"\r
+ao(50) = "0000000000000000000011111111111111100111110000000"\r
+ao(51) = "0000000000000000000001111020111000000000000000000"\r
+ao(52) = "0000000000000000000001111222200000000000000000000"\r
+ao(53) = "0000000000000000000000222222220000000000000000000"\r
+ao(54) = "0000000000000000000000222222020000000000000000000"\r
+ao(55) = "0000000000000000000000202222220000000000000000000"\r
+ao(56) = "0000000000000000000000222222220000000000000000000"\r
+ao(57) = "0000000000000000000000220202220000000000000000000"\r
+ao(58) = "0000000000000000000000222222220000000000000000000"\r
+ao(59) = "0000000000000000000000202222220000000000000000000"\r
+ao(60) = "0000000000000000000000222222220000000000000000000"\r
+ao(61) = "000000000000000000000022022220000000000"\r
+ao(62) = "0000000000000000000000222222220000000000000000000"\r
+ao(63) = "0000000000000000000000220222200000000000000000000"\r
+ao(64) = "0000000000000000000000222220200000000000000000000"\r
+ao(65) = "0000000000000000000000220222200000000000000000000"\r
+ao(66) = "0000000000000000000000222222200000000000000000000"\r
+ao(67) = "0000000000000000000000222222200000000000000000000"\r
+ao(68) = "0000000000000000000000202222000000000000000000000"\r
+ao(69) = "0000000000000000002000222222220000000000000000000"\r
+ao(70) = "0000000000000000002200222222000000000000000000000"\r
+ao(71) = "0000000000000000000222222222000000000000000000000"\r
+ao(72) = "0000000000000000000222222222000000000000000000000"\r
+ao(73) = "0000000000000000000022222222000000000000000000000"\r
+ao(74) = "0000000000000000000022222222000000000000000000000"\r
+ao(75) = "0000000000000000000020222222000000000000000000000"\r
+ao(76) = "0000000000000000000222222202000000000000000000000"\r
+ao(77) = "000000000000000000022022222200000000000"\r
+ao(78) = "0000000000000000022222222222200000000000000000000"\r
+ao(79) = "0000000000000000220222222222220000"\r
+ao(80) = "000000000000000022222222222222"\r
+CASE 12\r
+ao(1) = "11111111111111111111"\r
+ao(2) = "11111111111111111111"\r
+ao(3) = "11111111112111111111"\r
+ao(4) = "11111111112211111111"\r
+ao(5) = "11111111112221111111"\r
+ao(6) = "11111111112222111111"\r
+ao(7) = "11111111112222211111"\r
+ao(8) = "11122222222222221111"\r
+ao(9) = "11122222222222222111"\r
+ao(10) = "11122222222222222211"\r
+ao(11) = "11122222222222222211"\r
+ao(12) = "11122222222222222111"\r
+ao(13) = "11122222222222221111"\r
+ao(14) = "11111111112222211111"\r
+ao(15) = "11111111112222111111"\r
+ao(16) = "11111111112221111111"\r
+ao(17) = "11111111112211111111"\r
+ao(18) = "11111111112111111111"\r
+ao(19) = "11111111111111111111"\r
+ao(20) = "11111111111111111111"\r
+CASE 13\r
+ao(1) = "03333333333333333330"\r
+ao(2) = "33333333222233333333"\r
+ao(3) = "33333332222223333333"\r
+ao(4) = "33333332222223333333"\r
+ao(5) = "33333332222223333333"\r
+ao(6) = "33333332222223333333"\r
+ao(7) = "33333332222223333333"\r
+ao(8) = "33333332222223333333"\r
+ao(9) = "33333332222223333333"\r
+ao(10) = "33333332222223333333"\r
+ao(11) = "33333333222233333333"\r
+ao(12) = "33333333333333333333"\r
+ao(13) = "33333333333333333333"\r
+ao(14) = "33333333222233333333"\r
+ao(15) = "33333332222223333333"\r
+ao(16) = "33333332222223333333"\r
+ao(17) = "33333332222223333333"\r
+ao(18) = "33333333222233333333"\r
+ao(19) = "33333333333333333333"\r
+ao(20) = "03333333333333333330"\r
+CASE 14\r
+ao(1) = "00000000000300000000"\r
+ao(2) = "00000000003300000000"\r
+ao(3) = "00000000003330000000"\r
+ao(4) = "00000000033331100000"\r
+ao(5) = "00000000033331100000"\r
+ao(6) = "00000000333333000000"\r
+ao(7) = "00000000331333000000"\r
+ao(8) = "00000000333111000000"\r
+ao(9) = "00033333333333333300"\r
+ao(10) = "03333333333333333333"\r
+ao(11) = "00333333333333333300"\r
+ao(12) = "00000033333333330000"\r
+ao(13) = "00000033333333000000"\r
+ao(14) = "00000333333333300000"\r
+ao(15) = "00000333330333330000"\r
+ao(16) = "00000333300033330000"\r
+ao(17) = "00000330000033333000"\r
+ao(18) = "00003300000000333300"\r
+ao(19) = "00003000000000003330"\r
+ao(20) = "00003000000000000030"\r
+CASE 15\r
+ao(1) = "0000000000300000000"\r
+ao(2) = "0000000003300000000"\r
+ao(3) = "00000000033000000000"\r
+ao(4) = "00000000333300000000"\r
+ao(5) = "00000000333220000000"\r
+ao(6) = "00000000333220000000"\r
+ao(7) = "00000003333320000000"\r
+ao(8) = "00000003313330000000"\r
+ao(9) = "00000003333330000000"\r
+ao(10) = "00000333333333000000"\r
+ao(11) = "00033333333333330000"\r
+ao(12) = "03333333333333333300"\r
+ao(13) = "03333303333333333300"\r
+ao(14) = "33000000333333333333"\r
+ao(15) = "00000000333330000333"\r
+ao(16) = "00000000033300000000"\r
+ao(17) = "00000000033300000000"\r
+ao(18) = "00000000030300000000"\r
+ao(19) = "00000000030300000000"\r
+ao(20) = "00000000030300000000"\r
+CASE 16\r
+ao(1) = "00000000003000000000"\r
+ao(2) = "00000000033300000000"\r
+ao(3) = "00000000333330000000"\r
+ao(4) = "00000000333330000000"\r
+ao(5) = "00000001111111000000"\r
+ao(6) = "00000001133311000000"\r
+ao(7) = "00000003333333000000"\r
+ao(8) = "00000003333333000000"\r
+ao(9) = "00000003322233000000"\r
+ao(10) = "00000003333333000000"\r
+ao(11) = "00000003333333000000"\r
+ao(12) = "00000003333333000000"\r
+ao(13) = "00000003333333000000"\r
+ao(14) = "00000000333330000000"\r
+ao(15) = "00000000333330000000"\r
+ao(16) = "00000000330330000000"\r
+ao(17) = "00000000330330000000"\r
+ao(18) = "00000000000000000000"\r
+ao(19) = "00000000000000000000"\r
+ao(20) = "00000000000000000000"\r
+CASE 17\r
+ao(1) = "00000022222222000000"\r
+ao(2) = "00002222222222220000"\r
+ao(3) = "00022220000000222000"\r
+ao(4) = "00020002222222002000"\r
+ao(5) = "00202222222222222200"\r
+ao(6) = "00202222222222220200"\r
+ao(7) = "00202222222222220200"\r
+ao(8) = "02202222222222220220"\r
+ao(9) = "02022222222222220220"\r
+ao(10) = "02022323232323322020"\r
+ao(11) = "02022323232323222020"\r
+ao(12) = "02022323233223332020"\r
+ao(13) = "22022323232322232022"\r
+ao(14) = "20222323232322232202"\r
+ao(15) = "20222232232323332202"\r
+ao(16) = "20222222222222222202"\r
+ao(17) = "20222222222222112202"\r
+ao(18) = "20222222222222112202"\r
+ao(19) = "20222222222222112202"\r
+ao(20) = "20222222222222222202"\r
+ao(21) = "20222222222222222202"\r
+ao(22) = "20222222222222222202"\r
+ao(23) = "20222222222222222202"\r
+ao(24) = "20222222222222222202"\r
+ao(25) = "20222222222222222202"\r
+ao(26) = "20222222222222222202"\r
+ao(27) = "20222222222222222202"\r
+ao(28) = "20222222222222222202"\r
+ao(29) = "20000000000000000002"\r
+ao(30) = "22222222222222222222"\r
+\r
+END SELECT\r
+IF fr = 50 THEN GOTO 8\r
+IF fr > 1 THEN GOTO 4\r
+FOR a = 1 TO 100\r
+IF ao(a) = "" THEN GOTO 1\r
+FOR b = 1 TO LEN(ao(a))\r
+PSET ((p + b) \ teler, (o + a) \ teler), ASC(RIGHT$(LEFT$(ao(a), b), 1)) - 48\r
+NEXT b\r
+NEXT a\r
+GOTO 1\r
+4\r
+FOR a = 1 TO 100\r
+IF ao(a) = "" THEN GOTO 1\r
+FOR b = 1 TO LEN(ao(a))\r
+c = ASC(RIGHT$(LEFT$(ao(a), b), 1)) - 48\r
+LINE (p + (b * fr), o + (a * fr))-(p + (b * fr) + fr, o + (a * fr) + fr), c, BF\r
+NEXT b\r
+NEXT a\r
+GOTO 1\r
+8\r
+FOR a = 1 TO 100\r
+IF ao(a) = "" THEN GOTO 1\r
+FOR b = 1 TO LEN(ao(a))\r
+PSET ((p + b) \ teler, (o + a) \ teler), ASC(LEFT$(RIGHT$(ao(a), b), 1)) - 48\r
+NEXT b\r
+NEXT a\r
+\r
+1\r
+ERASE ao\r
+END SUB\r
+\r
+SUB save (y$)\r
+OPEN y$ FOR OUTPUT AS #1\r
+PRINT #1, pikkus\r
+FOR a = 1 TO pikkus\r
+PRINT #1, text$(a)\r
+NEXT a\r
+CLOSE\r
+END SUB\r
+\r
+SUB wiew (r$, a, b)\r
+OPEN r$ FOR INPUT AS #2\r
+INPUT #2, pikkus\r
+FOR e = 1 TO pikkus\r
+INPUT #2, b$\r
+FOR D = 1 TO LEN(b$)\r
+PSET (D + a, b + e), ASC(RIGHT$(LEFT$(b$, D), 1)) - 1\r
+NEXT D\r
+NEXT e\r
+CLOSE\r
+END SUB\r
+++ /dev/null
-DECLARE SUB RenderSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, SpriteName$)\r
-DECLARE SUB RenderFlippedSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, Filename$)\r
-' Pomppu Paavo 2\r
-'\r
-' This program is free software: released under Creative Commons Zero (CC0) license\r
-' by Svjatoslav Agejenko.\r
-' Email: svjatoslav@svjatoslav.eu\r
-' Homepage: http://www.svjatoslav.eu\r
-'\r
-' Changelog:\r
-' 1999, Initial version\r
-' 2025, Improved program readability\r
-\r
-DECLARE SUB UpdateLoadingScreen ()\r
-DECLARE SUB HandleEscapeKey ()\r
-DECLARE SUB PlayHurtSound ()\r
-DECLARE SUB GameOverSequence ()\r
-\r
-DECLARE SUB HandlePlayerDeath ()\r
-DEFINT A-Z\r
-DECLARE SUB InitializeAllLevelData ()\r
-DECLARE SUB UpdateHUD (coinIncrementAmount%)\r
-DECLARE SUB LoadCurrentLevel ()\r
-DECLARE SUB ShowIntroScreen ()\r
-DECLARE SUB WaitForUserInput ()\r
-\r
-DIM SHARED userInput$\r
-\r
-' Grid representing solid level elements (m = block, o = breakable, etc.)\r
-DIM SHARED levelGrid(-5 TO 20, -5 TO 20) AS STRING\r
-\r
-' Tracks interactive objects like breakable blocks separately from main grid\r
-DIM SHARED interactiveObjectsGrid(-5 TO 20, -5 TO 20) AS STRING\r
-\r
-' Stores raw text-based level layouts for all worlds\r
-DIM SHARED levelData(1 TO 11, 1 TO 10) AS STRING * 15\r
-\r
-' Background color index for each world's sky\r
-DIM SHARED levelSkyColor(1 TO 10) AS INTEGER\r
-\r
-' Current active level number (1-10)\r
-DIM SHARED currentLevelNumber AS INTEGER\r
-\r
-' Previously played level number (for backtracking after death)\r
-DIM SHARED previousLevelNumber AS INTEGER\r
-\r
-' Temporary storage for current level's row data during loading\r
-DIM SHARED levelRowData(1 TO 15) AS STRING * 15\r
-\r
-' Buffer to store cloud sprite image data\r
-DIM SHARED cloudSpriteBuffer(2100)\r
-\r
-' Buffer for solid block sprite images\r
-DIM SHARED solidBlockSpriteBuffer(202)\r
-\r
-' Buffer for brick/block sprite images\r
-DIM SHARED brickSpriteBuffer(202)\r
-\r
-' Buffer for power-up item sprites (like mushrooms)\r
-DIM SHARED powerUpSpriteBuffer(1000)\r
-\r
-' Buffer for tree sprite images\r
-DIM SHARED treeSpriteBuffer(2000)\r
-\r
-' Buffer for empty space sprite (used when clearing coins/breakables)\r
-DIM SHARED emptySpaceSpriteBuffer(202)\r
-\r
-' Main coin sprite buffer\r
-DIM SHARED coinSpriteBuffer(202)\r
-\r
-' Larger coin variant sprite buffer\r
-DIM SHARED largeCoinSpriteBuffer(400)\r
-\r
-' Smaller coin variant sprite buffer\r
-DIM SHARED smallCoinSpriteBuffer(200)\r
-\r
-' Player character animation frames (base + walking variants)\r
-DIM SHARED playerAnimationFrames(402)\r
-\r
-' Primary player sprite animation frames array\r
-DIM SHARED playerWalkingFrames(202, 1 TO 5)\r
-\r
-' Enemy base sprite buffers (stores background under enemies for erasing)\r
-DIM SHARED enemyBackgroundBuffers(1 TO 230, 1 TO 10)\r
-\r
-' Enemy walking animation frames\r
-DIM SHARED enemyWalkingFrames(1 TO 202, 1 TO 5)\r
-\r
-' X positions of all enemies (max 10 per level)\r
-DIM SHARED enemyXPositions(1 TO 10)\r
-\r
-' Y positions of all enemies\r
-DIM SHARED enemyYPositions(1 TO 10)\r
-\r
-' Vertical movement speeds for enemies (positive = down)\r
-DIM SHARED enemyVerticalSpeeds(1 TO 10)\r
-\r
-' Horizontal movement speeds for enemies (positive = right)\r
-DIM SHARED enemyHorizontalSpeeds(1 TO 10)\r
-\r
-' Array storing individual digits of coin counter (index 1=ones, 2=tens)\r
-DIM SHARED CoinDigits(1 TO 5)\r
-\r
-' Pre-loaded digit images for HUD display (0-9)\r
-DIM SHARED digitImages(100, 0 TO 11)\r
-\r
-' Number of remaining player lives\r
-DIM SHARED lives\r
-\r
-' Total coins collected by player\r
-DIM SHARED coinsCollected\r
-\r
-' Flag: set when a coin needs to be cleared from grid\r
-DIM SHARED shouldClearCoinFlag\r
-\r
-' Grid X position where coin needs clearing\r
-DIM SHARED clearCoinGridX\r
-\r
-' Grid Y position where coin needs clearing\r
-DIM SHARED clearCoinGridY\r
-\r
-' Player's current X coordinate on screen\r
-DIM SHARED playerX\r
-\r
-' Player's current Y coordinate on screen\r
-DIM SHARED playerY\r
-\r
-' Counter tracking loading progress dots\r
-DIM SHARED loadingProgressDotCount\r
-\r
-loadingProgressDotCount = 1\r
-SCREEN 13\r
-currentLevelNumber = 1\r
-previousLevelNumber = 1\r
-InitializeAllLevelData\r
-1\r
-\r
-' Reset entire VGA palette to black (0-254)\r
-FOR colorIndex = 0 TO 254\r
-OUT &H3C8, colorIndex\r
-OUT &H3C9, 0\r
-OUT &H3C9, 0\r
-OUT &H3C9, 0\r
-NEXT colorIndex\r
-\r
-' Set color 255 to bright white (60/63 intensity)\r
-OUT &H3C8, 255\r
-OUT &H3C9, 60\r
-OUT &H3C9, 60\r
-OUT &H3C9, 60\r
-LOCATE 20, 3\r
-COLOR 255\r
-PRINT "LOADING "\r
-\r
-' Load all game assets sequentially with visual feedback\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "pilv"\r
-GET (1, 1)-(109, 35), cloudSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "kast"\r
-GET (1, 2)-(20, 21), solidBlockSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "tellis"\r
-GET (1, 2)-(20, 21), brickSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-GET (1, 2)-(20, 21), emptySpaceSpriteBuffer\r
-\r
-RenderSpriteFromFile 0, 0, 1, 1, "paavo1"\r
-GET (1, 2)-(20, 21), playerWalkingFrames(202, 1)\r
-\r
-UpdateLoadingScreen\r
-RenderFlippedSpriteFromFile 0, 0, 1, 1, "paavo1"\r
-GET (3, 2)-(22, 21), playerWalkingFrames(202, 2)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "paavo2"\r
-GET (1, 2)-(20, 21), playerWalkingFrames(202, 3)\r
-\r
-UpdateLoadingScreen\r
-RenderFlippedSpriteFromFile 0, 0, 1, 1, "paavo2"\r
-GET (3, 2)-(22, 21), playerWalkingFrames(202, 4)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "poosas"\r
-GET (1, 1)-(60, 21), powerUpSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "puu"\r
-GET (1, 1)-(40, 60), treeSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "munt"\r
-GET (1, 1)-(10, 11), coinSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "munt1"\r
-GET (0, 2)-(20, 11), largeCoinSpriteBuffer\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "munt2"\r
-GET (0, 2)-(20, 11), smallCoinSpriteBuffer\r
-\r
-' Load all numeric digit sprites for HUD display\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "0"\r
-GET (0, 2)-(10, 11), digitImages(100, 0)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "1"\r
-GET (0, 2)-(10, 11), digitImages(100, 1)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "2"\r
-GET (0, 2)-(10, 11), digitImages(100, 2)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "3"\r
-GET (0, 2)-(10, 11), digitImages(100, 3)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "4"\r
-GET (0, 2)-(10, 11), digitImages(100, 4)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "5"\r
-GET (0, 2)-(10, 11), digitImages(100, 5)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "6"\r
-GET (0, 2)-(10, 11), digitImages(100, 6)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "7"\r
-GET (0, 2)-(10, 11), digitImages(100, 7)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "8"\r
-GET (0, 2)-(10, 11), digitImages(100, 8)\r
-\r
-UpdateLoadingScreen\r
-GET (0, 2)-(10, 11), digitImages(100, 10)\r
-RenderSpriteFromFile 0, 0, 1, 1, "9"\r
-GET (0, 2)-(10, 11), digitImages(100, 9)\r
-\r
-' Load enemy sprite frames\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "tigu"\r
-GET (1, 2)-(20, 21), enemyWalkingFrames(202, 1)\r
-\r
-UpdateLoadingScreen\r
-RenderSpriteFromFile 0, 0, 1, 1, "tigu1"\r
-GET (3, 2)-(22, 21), enemyWalkingFrames(202, 2)\r
-\r
-UpdateLoadingScreen\r
-RenderFlippedSpriteFromFile 0, 0, 1, 1, "tigu"\r
-GET (1, 2)-(20, 21), enemyWalkingFrames(202, 3)\r
-\r
-UpdateLoadingScreen\r
-RenderFlippedSpriteFromFile 0, 0, 1, 1, "tigu1"\r
-GET (3, 2)-(22, 21), enemyWalkingFrames(202, 4)\r
-\r
-SCREEN 0\r
-SCREEN 13\r
-LoadCurrentLevel\r
-playerX = 50\r
-playerY = 50\r
-horizontalMovementSpeed = 0\r
-currentWalkFrameIndex = 1\r
-leftWalkFrameIndex = 1\r
-rightWalkFrameIndex = 2\r
-coinsCollected = 0\r
-lives = 3\r
-animationFrameCounter = 1\r
-UpdateHUD 0\r
-12\r
-' Save current player position background before drawing character\r
-IF playerY > 0 THEN GET (playerX, playerY)-(playerX + 20, playerY + 20), playerAnimationFrames: PUT (playerX, playerY), playerWalkingFrames(202, currentWalkFrameIndex), OR\r
-\r
-' Process all enemies (max 10)\r
-FOR enemyIndex = 1 TO 10\r
- ' Only update visible enemies above bottom of screen\r
- IF enemyYPositions(enemyIndex) < 170 AND animationFrameCounter = 1 THEN\r
- ' Apply vertical and horizontal movement\r
- enemyYPositions(enemyIndex) = enemyYPositions(enemyIndex) + enemyVerticalSpeeds(enemyIndex)\r
- enemyXPositions(enemyIndex) = enemyXPositions(enemyIndex) + enemyHorizontalSpeeds(enemyIndex)\r
- ' Save background under enemy for later erasing\r
- GET (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex))-(enemyXPositions(enemyIndex) + 20, enemyYPositions(enemyIndex) + 20), enemyBackgroundBuffers(202, enemyIndex)\r
-\r
- ' Determine which walking animation frame to show\r
- IF enemyHorizontalSpeeds(enemyIndex) <= 0 THEN walkAnimationPhase = 1 ELSE walkAnimationPhase = 3\r
- IF enemyAnimationFrameCounter > 2 THEN walkAnimationPhase = walkAnimationPhase + 1: IF enemyAnimationFrameCounter = 3 THEN enemyVerticalSpeeds(enemyIndex) = enemyVerticalSpeeds(enemyIndex) + 1\r
-\r
- ' Draw enemy with correct animation frame\r
- PUT (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex)), enemyWalkingFrames(202, walkAnimationPhase)\r
- END IF\r
-NEXT enemyIndex\r
-\r
-' Create short delay using silent sound (QBasic lacks proper delay function)\r
-SOUND 0, .5\r
-\r
-' Cycle through animation frames\r
-animationFrameCounter = animationFrameCounter + 1\r
-IF animationFrameCounter > 3 THEN animationFrameCounter = 1\r
-\r
-' Every third frame, process physics and input\r
-IF animationFrameCounter = 1 THEN\r
- enemyAnimationFrameCounter = enemyAnimationFrameCounter + 1\r
- IF enemyAnimationFrameCounter > 5 THEN enemyAnimationFrameCounter = 0\r
-\r
- ' Apply gravity to player (increases downward speed each frame)\r
- verticalMovementSpeed = verticalMovementSpeed + 1\r
-\r
- ' Gradually reduce horizontal movement (friction effect)\r
- IF horizontalMovementSpeed > 0 THEN horizontalMovementSpeed = horizontalMovementSpeed - 1: walkAnimationPhaseCounter = walkAnimationPhaseCounter + 1\r
- IF horizontalMovementSpeed < 0 THEN horizontalMovementSpeed = horizontalMovementSpeed + 1: walkAnimationPhaseCounter = walkAnimationPhaseCounter + 1\r
-\r
- ' Alternate between walk animation phases every 2 frames\r
- IF walkAnimationPhaseCounter > 2 THEN walkAnimationPhaseCounter = 1\r
- IF walkAnimationPhaseCounter = 2 THEN leftWalkFrameIndex = 1: rightWalkFrameIndex = 2\r
- IF walkAnimationPhaseCounter = 1 THEN leftWalkFrameIndex = 3: rightWalkFrameIndex = 4\r
-\r
- ' Process enemy collisions and movements\r
- FOR enemyIndex = 1 TO 10\r
- IF enemyYPositions(enemyIndex) < 170 THEN\r
- ' Reverse vertical direction when hitting ceiling block\r
- IF levelGrid((enemyXPositions(enemyIndex) + 20) / 20, (enemyYPositions(enemyIndex) + 9) / 20) = "m" THEN enemyVerticalSpeeds(enemyIndex) = -1\r
-\r
- ' Reverse horizontal direction at screen edges\r
- IF enemyXPositions(enemyIndex) > 270 THEN enemyHorizontalSpeeds(enemyIndex) = -1\r
- IF enemyXPositions(enemyIndex) < 2 THEN enemyHorizontalSpeeds(enemyIndex) = 1\r
-\r
- ' Reverse horizontal direction when hitting wall blocks\r
- IF levelGrid((enemyXPositions(enemyIndex) + 28) / 20, enemyYPositions(enemyIndex) / 20) = "m" THEN enemyHorizontalSpeeds(enemyIndex) = -1\r
- IF levelGrid((enemyXPositions(enemyIndex) + 10) / 20, enemyYPositions(enemyIndex) / 20) = "m" THEN enemyHorizontalSpeeds(enemyIndex) = 1\r
-\r
- ' Check for collision with player (trigger death)\r
- IF enemyXPositions(enemyIndex) - 20 < playerX AND enemyXPositions(enemyIndex) + 20 > playerX AND enemyYPositions(enemyIndex) - 5 < playerY AND enemyYPositions(enemyIndex) + 20 > playerY THEN PlayHurtSound: HandlePlayerDeath: GOTO 12\r
- END IF\r
- NEXT enemyIndex\r
-END IF\r
-\r
-' Check for player collisions with level geometry:\r
-\r
-' Ceiling collision (reverse gravity)\r
-IF levelGrid((playerX + 15) / 20, (playerY + 9) / 20) = "m" THEN verticalMovementSpeed = -1: airTimeCounter = 0\r
-\r
-' Right wall collision\r
-IF levelGrid((playerX + 25) / 20, (playerY + 9) / 20) = "m" THEN verticalMovementSpeed = -1: airTimeCounter = 0\r
-\r
-' Floor collision (stop falling)\r
-IF levelGrid((playerX + 20) / 20, (playerY - 8) / 20) = "m" THEN verticalMovementSpeed = 1: airTimeCounter = 20\r
-\r
-' Right wall collision\r
-IF levelGrid((playerX + 28) / 20, (playerY) / 20) = "m" THEN horizontalMovementSpeed = -1: wallCollisionLock = 1\r
-\r
-' Left wall collision\r
-IF levelGrid((playerX + 10) / 20, (playerY) / 20) = "m" THEN horizontalMovementSpeed = 1: wallCollisionLock = 1\r
-\r
-' Breakable block collision (turn into empty space)\r
-IF interactiveObjectsGrid((playerX + 20) / 20, (playerY - 8) / 20) = "o" THEN verticalMovementSpeed = 1: interactiveObjectsGrid((playerX + 20) / 20, (playerY - 8) / 20) = "": levelGrid((playerX + 20) / 20, (playerY - 8) / 20) = "2": clearCoinGridX _\r
-= ((playerX + 20) / 20) - 1: clearCoinGridY = (playerY - 8) / 20: shouldClearCoinFlag = 1: SOUND 50, .5\r
-\r
-' Coin collection\r
-IF levelGrid((playerX + 20) / 20, (playerY) / 20) = "1" THEN levelGrid((playerX + 20) / 20, (playerY) / 20) = "2": clearCoinGridX = ((playerX + 21) / 20) - 1: clearCoinGridY = (playerY) / 20: shouldClearCoinFlag = 1: coinsCollected = coinsCollected _\r
-+ 1: UpdateHUD 1: SOUND 1000, 1: SOUND 2000, 1\r
-\r
-' Track time in air for jump control\r
-airTimeCounter = airTimeCounter + 1\r
-\r
-' Process keyboard input:\r
-userInput$ = INKEY$\r
-' Jump when up arrow pressed (only if not already high in air)\r
-IF userInput$ = CHR$(0) + "H" AND airTimeCounter < 10 THEN verticalMovementSpeed = -6\r
-' Move right with right arrow\r
-IF userInput$ = CHR$(0) + "M" AND wallCollisionLock = 0 THEN horizontalMovementSpeed = horizontalMovementSpeed + 3: currentWalkFrameIndex = leftWalkFrameIndex\r
-' Move left with left arrow\r
-IF userInput$ = CHR$(0) + "K" AND wallCollisionLock = 0 THEN horizontalMovementSpeed = horizontalMovementSpeed - 3: currentWalkFrameIndex = rightWalkFrameIndex\r
-' Escape key handler\r
-IF userInput$ = CHR$(27) THEN HandleEscapeKey\r
-' Level skip (debug only - plus key)\r
-IF userInput$ = "+" AND wallCollisionLock = 0 THEN currentLevelNumber = currentLevelNumber + 1: LoadCurrentLevel: GOTO 12\r
-' Reset wall collision lock each frame\r
-IF wallCollisionLock <> 0 THEN wallCollisionLock = 0\r
-\r
-' Cap movement speeds to prevent excessive speed\r
-IF horizontalMovementSpeed > 5 THEN horizontalMovementSpeed = 3\r
-IF horizontalMovementSpeed < -5 THEN horizontalMovementSpeed = -3\r
-IF verticalMovementSpeed > 3 THEN verticalMovementSpeed = 3\r
-\r
-' Restore background where player was previously drawn\r
-IF playerY > 0 THEN PUT (playerX, playerY), playerAnimationFrames, PSET\r
-\r
-' Redraw enemies on this animation frame\r
-IF animationFrameCounter = 1 THEN\r
- FOR enemyIndex = 10 TO 1 STEP -1\r
- IF enemyYPositions(enemyIndex) < 170 THEN PUT (enemyXPositions(enemyIndex), enemyYPositions(enemyIndex)), enemyBackgroundBuffers(202, enemyIndex), PSET\r
- NEXT enemyIndex\r
-END IF\r
-\r
-' Apply physics to player position\r
-playerY = playerY + verticalMovementSpeed\r
-playerX = playerX + horizontalMovementSpeed\r
-\r
-' Clear collected coin/block from screen\r
-IF shouldClearCoinFlag > 0 THEN shouldClearCoinFlag = 0: PUT (clearCoinGridX * 20, clearCoinGridY * 20), emptySpaceSpriteBuffer, PSET\r
-\r
-' Level transition when reaching screen edges\r
-IF playerX > 280 THEN currentLevelNumber = currentLevelNumber + 1: LoadCurrentLevel: playerX = 3\r
-IF playerX < 2 THEN currentLevelNumber = currentLevelNumber - 1: LoadCurrentLevel: playerX = 279\r
-\r
-' Player death when falling off bottom of screen\r
-IF playerY > 170 THEN FOR tone = 3000 TO 500 STEP -100: SOUND tone, .3: NEXT tone: HandlePlayerDeath\r
-GOTO 12\r
-\r
-SUB GameOverSequence\r
-' Shows game over screen with animated death effect.\r
-' First displays "You are killed!" text, then pixelates the screen,\r
-' adds flying debris animation, waits for keypress, then fades to black.\r
-\r
-DIM deathScreenBuffer(1 TO 2000)\r
-GET (0, 0)-(150, 20), deathScreenBuffer\r
-LOCATE 1, 1\r
-PRINT "You are "\r
-LOCATE 2, 1\r
-PRINT " killed! "\r
-\r
-' Create pixelated death effect by scaling up screen area\r
-FOR x = 0 TO 80\r
- FOR y = 0 TO 16\r
- ' Only process non-background pixels\r
- IF POINT(x, y) > 0 THEN\r
- ' Draw 5x5 block for each original pixel (magnification effect)\r
- LINE (x * 5, y * 5 + 50)-(x * 5 + 4, y * 5 + 54), 4, BF\r
- END IF\r
- NEXT y\r
-NEXT x\r
-PUT (0, 0), deathScreenBuffer, PSET\r
-\r
-' Add random flying debris particles\r
-FOR particle = 1 TO 100\r
- x = RND * 290 + 4\r
- y = RND * 170 + 4\r
- GET (x, y)-(x + 20, y + 20), deathScreenBuffer\r
- x = x + RND * 4 - 2\r
- y = y + RND * 4 - 1\r
- PUT (x, y), deathScreenBuffer, PSET\r
-NEXT particle\r
-\r
-' Wait briefly before requiring keypress\r
-FOR waitCount = 1 TO 50\r
- userInput$ = INKEY$\r
-NEXT waitCount\r
-userInput$ = INPUT$(1)\r
-\r
-' Draw closing red lines from top and bottom\r
-FOR lineIndex = 0 TO 10\r
- SOUND 0, .05\r
- LINE (0, lineIndex)-(320, lineIndex), 4\r
- LINE (0, 200 - lineIndex)-(320, 200 - lineIndex), 4\r
-NEXT lineIndex\r
-\r
-' Fade out red color channel to black\r
-FOR fadeStep = 32 TO 0 STEP -1\r
- SOUND 0, .5\r
- OUT &H3C8, 4\r
- OUT &H3C9, fadeStep\r
- OUT &H3C9, 0\r
- OUT &H3C9, 0\r
-NEXT fadeStep\r
-END\r
-\r
-END SUB\r
-\r
-SUB HandleEscapeKey\r
-' Handles ESC key press: performs smooth screen fadeout then exits to DOS.\r
-\r
-' Fade screen to black in vertical bands\r
-FOR band = 0 TO 20\r
- FOR lineIndex = band TO 200 STEP 20\r
- LINE (0, lineIndex)-(320, lineIndex), 0\r
- NEXT lineIndex\r
- SOUND 0, .5\r
-NEXT band\r
-SYSTEM\r
-\r
-END SUB\r
-\r
-SUB HandlePlayerDeath\r
-' Processes player death: moves back one level, resets player position,\r
-' decreases remaining lives, and updates HUD display.\r
-' Does not end game - continues playing from previous level.\r
-\r
-IF currentLevelNumber > 1 THEN currentLevelNumber = currentLevelNumber - 1\r
-\r
-LoadCurrentLevel\r
-playerX = 20\r
-playerY = 100\r
-lives = lives - 1\r
-UpdateHUD 0\r
-END SUB\r
-\r
-SUB InitializeAllLevelData\r
-' Sets up all level layouts as text-based grids.\r
-' Each character represents a game element:\r
-' m = solid block\r
-' o = breakable block\r
-' $ = coin\r
-' . = power-up item\r
-' + = tree/decoration\r
-' numbers 1-9 = enemy spawn points\r
-\r
-levelSkyColor(1) = 1\r
-levelData(1, 1) = "m "\r
-levelData(2, 1) = "m - - "\r
-levelData(3, 1) = "m "\r
-levelData(4, 1) = "m $ $ $ $ "\r
-levelData(5, 1) = "m $ $ $ $ "\r
-levelData(6, 1) = "m + momom "\r
-levelData(7, 1) = "m "\r
-levelData(8, 1) = "m . . "\r
-levelData(9, 1) = "mmmmmmmmmmmmmmm"\r
-\r
-levelSkyColor(2) = 1\r
-levelData(1, 2) = " $2- "\r
-levelData(2, 2) = " o$ "\r
-levelData(3, 2) = " o$ - "\r
-levelData(4, 2) = " o$ 3 "\r
-levelData(5, 2) = " o o1 "\r
-levelData(6, 2) = " + mmom"\r
-levelData(7, 2) = " omom m "\r
-levelData(8, 2) = " $ $ $ $ m "\r
-levelData(9, 2) = "mmmm mm"\r
-\r
-levelSkyColor(3) = 1\r
-levelData(1, 3) = " mmmmm"\r
-levelData(2, 3) = "- $ $ mmmmm"\r
-levelData(3, 3) = " $ $ $ mmmmm"\r
-levelData(4, 3) = " $ $ mmmmm"\r
-levelData(5, 3) = " . mmmmm"\r
-levelData(6, 3) = "mmmm 1 mmmm"\r
-levelData(7, 3) = " mm m"\r
-levelData(8, 3) = " mmm "\r
-levelData(9, 3) = "mmm mmmmm"\r
-\r
-levelSkyColor(4) = 0\r
-levelData(1, 4) = "mmmmmmmmmmmmmmm"\r
-levelData(2, 4) = "m$ $ $ $ $ "\r
-levelData(3, 4) = "mm $m $4$ $ $ "\r
-levelData(4, 4) = "m$m mmmmmommmm"\r
-levelData(5, 4) = "m$ 3 2 m"\r
-levelData(6, 4) = "m1 ooooooomo m"\r
-levelData(7, 4) = "mooo$$$$$$$m m"\r
-levelData(8, 4) = " m"\r
-levelData(9, 4) = "mmmmmmmmmmmmmmm"\r
-\r
-levelSkyColor(5) = 0\r
-levelData(1, 5) = "mmmmmmmmmmmmmmm"\r
-levelData(2, 5) = " m "\r
-levelData(3, 5) = "m m 1 3 mmmm"\r
-levelData(4, 5) = "m m mmm o m"\r
-levelData(5, 5) = "m m4567892o m"\r
-levelData(6, 5) = "m mooooommo m"\r
-levelData(7, 5) = "m mm"\r
-levelData(8, 5) = "m mmm"\r
-levelData(9, 5) = "mmmm mmm mmmm"\r
-\r
-levelSkyColor(6) = 1\r
-levelData(1, 6) = "m "\r
-levelData(2, 6) = " - $ - "\r
-levelData(3, 6) = "m $ $ "\r
-levelData(4, 6) = "m o o $ "\r
-levelData(5, 6) = "m o o "\r
-levelData(6, 6) = "m + "\r
-levelData(7, 6) = "m "\r
-levelData(8, 6) = "mm 1 m 2 m "\r
-levelData(9, 6) = "mmmmmmmmmmmmmmm"\r
-\r
-levelSkyColor(7) = 1\r
-levelData(1, 7) = " - "\r
-levelData(2, 7) = " - "\r
-levelData(3, 7) = " 1m"\r
-levelData(4, 7) = " 2mm"\r
-levelData(5, 7) = " 3mmm"\r
-levelData(6, 7) = " o + 4mmmm"\r
-levelData(7, 7) = " ooo 5mmmmm"\r
-levelData(8, 7) = " 6mmmmmm"\r
-levelData(9, 7) = "mmmmmmmmmmmmmmm"\r
-\r
-levelSkyColor(8) = 1\r
-levelData(1, 8) = " mmmmmmmmmmmmm"\r
-levelData(2, 8) = " m123m456m789 "\r
-levelData(3, 8) = " mm$mmm$mmm$mm"\r
-levelData(4, 8) = " mm$$$$$$$$$$m"\r
-levelData(5, 8) = " mmom$mmm$mmmm"\r
-levelData(6, 8) = " o$$$$$$$$$ o"\r
-levelData(7, 8) = " omooooooo o"\r
-levelData(8, 8) = " - m "\r
-levelData(9, 8) = "mmmmmmmmmmmmmmm"\r
-\r
-levelSkyColor(9) = 0\r
-levelData(1, 9) = " 12345"\r
-levelData(2, 9) = " 6789 "\r
-levelData(3, 9) = " mm"\r
-levelData(4, 9) = " m "\r
-levelData(5, 9) = " m "\r
-levelData(6, 9) = " m "\r
-levelData(7, 9) = " m "\r
-levelData(8, 9) = " m "\r
-levelData(9, 9) = "mm "\r
-\r
-levelSkyColor(10) = 1\r
-levelData(1, 10) = "m "\r
-levelData(2, 10) = " - "\r
-levelData(3, 10) = "m - "\r
-levelData(4, 10) = "m + "\r
-levelData(5, 10) = "m "\r
-levelData(6, 10) = "m + 2 "\r
-levelData(7, 10) = "m mmm "\r
-levelData(8, 10) = "m . 1 "\r
-levelData(9, 10) = "mmmmmmmmmmm mm"\r
-END SUB\r
-\r
-SUB LoadCurrentLevel\r
-' Loads and renders the currently selected level:\r
-' 1. Validates level number (ends game at level 11)\r
-' 2. Copies level data into working arrays\r
-' 3. Resets interactive object grid\r
-' 4. Clears enemy positions\r
-' 5. Renders all level elements based on character codes\r
-\r
-IF currentLevelNumber > 10 THEN\r
- CLS\r
- PRINT "Mission complete!"\r
- PRINT "Game over"\r
- END\r
-END IF\r
-\r
-' Copy level rows into temporary storage\r
-FOR rowIndex = 1 TO 10\r
- levelRowData(rowIndex + 1) = levelData(rowIndex, currentLevelNumber)\r
-NEXT rowIndex\r
-\r
-' Clear breakable blocks from previous level\r
-FOR rowIndex = 1 TO 10\r
- FOR columnIndex = 1 TO 15\r
- IF levelGrid(columnIndex, rowIndex - 2) = "2" THEN MID$(levelData(rowIndex, previousLevelNumber), columnIndex) = " "\r
- NEXT columnIndex\r
-NEXT rowIndex\r
-previousLevelNumber = currentLevelNumber\r
-\r
-' Reset entire level grids to empty\r
-FOR x = -3 TO 20\r
- FOR y = -3 TO 20\r
- levelGrid(x, y) = ""\r
- interactiveObjectsGrid(x, y) = ""\r
- NEXT y\r
-NEXT x\r
-\r
-' Reset all enemies to off-screen positions\r
-FOR enemyIndex = 1 TO 10\r
- enemyYPositions(enemyIndex) = 1000\r
- enemyHorizontalSpeeds(enemyIndex) = 1\r
- enemyVerticalSpeeds(enemyIndex) = 0\r
-NEXT enemyIndex\r
-\r
-' Set background color and clear screen\r
-CLS\r
-PAINT (1, 1), levelSkyColor(currentLevelNumber)\r
-GET (1, 2)-(20, 21), emptySpaceSpriteBuffer\r
-\r
-' Process each character in level data to render elements\r
-FOR rowIndex = 2 TO 10\r
- FOR columnIndex = 1 TO 15\r
- ' Extract single character from level data row\r
- character$ = RIGHT$(LEFT$(levelRowData(rowIndex), columnIndex), 1)\r
-\r
- ' Render different elements based on character code\r
- IF character$ = "-" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), cloudSpriteBuffer, OR\r
- IF character$ = "." THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), powerUpSpriteBuffer, OR\r
- IF character$ = "+" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), treeSpriteBuffer, OR\r
- IF character$ = "$" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), coinSpriteBuffer, OR: levelGrid(columnIndex, rowIndex - 2) = "1"\r
- IF character$ = "m" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), solidBlockSpriteBuffer, PSET: levelGrid(columnIndex, rowIndex - 2) = "m"\r
- IF character$ = "o" THEN PUT ((columnIndex - 1) * 20, (rowIndex - 2) * 20), brickSpriteBuffer, PSET: levelGrid(columnIndex, rowIndex - 2) = "m": interactiveObjectsGrid(columnIndex, rowIndex - 2) = "o"\r
- IF character$ = " " THEN levelGrid(columnIndex, rowIndex) = " "\r
-\r
- ' Place enemies based on numeric character codes (1-9,0)\r
- IF character$ = "1" THEN enemyXPositions(1) = (columnIndex - 1) * 20: enemyYPositions(1) = (rowIndex - 2) * 20: GET (enemyXPositions(1), enemyYPositions(1))-(enemyXPositions(1) + 20, enemyYPositions(1) + 20), enemyBackgroundBuffers(202, 1)\r
- IF character$ = "2" THEN enemyXPositions(2) = (columnIndex - 1) * 20: enemyYPositions(2) = (rowIndex - 2) * 20: GET (enemyXPositions(2), enemyYPositions(2))-(enemyXPositions(2) + 20, enemyYPositions(2) + 20), enemyBackgroundBuffers(202, 2)\r
- IF character$ = "3" THEN enemyXPositions(3) = (columnIndex - 1) * 20: enemyYPositions(3) = (rowIndex - 2) * 20: GET (enemyXPositions(3), enemyYPositions(3))-(enemyXPositions(3) + 20, enemyYPositions(3) + 20), enemyBackgroundBuffers(202, 3)\r
- IF character$ = "4" THEN enemyXPositions(4) = (columnIndex - 1) * 20: enemyYPositions(4) = (rowIndex - 2) * 20: GET (enemyXPositions(4), enemyYPositions(4))-(enemyXPositions(4) + 20, enemyYPositions(4) + 20), enemyBackgroundBuffers(202, 4)\r
- IF character$ = "5" THEN enemyXPositions(5) = (columnIndex - 1) * 20: enemyYPositions(5) = (rowIndex - 2) * 20: GET (enemyXPositions(5), enemyYPositions(5))-(enemyXPositions(5) + 20, enemyYPositions(5) + 20), enemyBackgroundBuffers(202, 5)\r
- IF character$ = "6" THEN enemyXPositions(6) = (columnIndex - 1) * 20: enemyYPositions(6) = (rowIndex - 2) * 20: GET (enemyXPositions(6), enemyYPositions(6))-(enemyXPositions(6) + 20, enemyYPositions(6) + 20), enemyBackgroundBuffers(202, 6)\r
- IF character$ = "7" THEN enemyXPositions(7) = (columnIndex - 1) * 20: enemyYPositions(7) = (rowIndex - 2) * 20: GET (enemyXPositions(7), enemyYPositions(7))-(enemyXPositions(7) + 20, enemyYPositions(7) + 20), enemyBackgroundBuffers(202, 7)\r
- IF character$ = "8" THEN enemyXPositions(8) = (columnIndex - 1) * 20: enemyYPositions(8) = (rowIndex - 2) * 20: GET (enemyXPositions(8), enemyYPositions(8))-(enemyXPositions(8) + 20, enemyYPositions(8) + 20), enemyBackgroundBuffers(202, 8)\r
- IF character$ = "9" THEN enemyXPositions(9) = (columnIndex - 1) * 20: enemyYPositions(9) = (rowIndex - 2) * 20: GET (enemyXPositions(9), enemyYPositions(9))-(enemyXPositions(9) + 20, enemyYPositions(9) + 20), enemyBackgroundBuffers(202, 9)\r
- IF character$ = "0" THEN enemyXPositions(10) = (columnIndex - 1) * 20: enemyYPositions(10) = (rowIndex - 2) * 20: GET (enemyXPositions(10), enemyYPositions(10))-(enemyXPositions(10) + 20, enemyYPositions(10) + 20), enemyBackgroundBuffers(202 _\r
-, 10)\r
- NEXT columnIndex\r
-NEXT rowIndex\r
-UpdateHUD 0\r
-END SUB\r
-\r
-SUB PlayHurtSound\r
-' Plays distinctive "hurt" sound effect with descending pitch.\r
-' Creates two converging tones that slide downward in frequency.\r
-\r
-startFrequency = 1700\r
-endFrequency = 1900\r
-FOR toneStep = 1 TO 50\r
- startFrequency = startFrequency + 3\r
- endFrequency = endFrequency - 5\r
- SOUND startFrequency, .2\r
- SOUND endFrequency, .2\r
-NEXT toneStep\r
-END SUB\r
-\r
-SUB RenderFlippedSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, Filename$)\r
-' Renders sprite from text file but flips horizontally during rendering.\r
-' File format: first line = height, subsequent lines contain ASCII art\r
-' where each character's ASCII value determines color (offset by 40).\r
-\r
-x = x * 8\r
-y = y * 8\r
-spriteWidth = widthMultiplier - x\r
-spriteHeight = heightMultiplier - y\r
-OPEN "IMG/" + Filename$ + ".i01" FOR INPUT AS #1\r
-INPUT #1, spriteHeight\r
-FOR row = 1 TO spriteHeight\r
- LINE INPUT #1, rowText$\r
- FOR column = LEN(rowText$) TO 1 STEP -1\r
- ' Calculate screen coordinates and color from ASCII value\r
- currentColor = ASC(LEFT$(RIGHT$(rowText$, column), 1)) - 40\r
- ' Draw filled rectangle for each pixel (scaled by multipliers)\r
- LINE (x + (column * widthMultiplier), (y + (row * heightMultiplier)) + 1)-(x + ((column + 1) * widthMultiplier), y + ((row + 1) * heightMultiplier)), currentColor, BF\r
- NEXT column\r
-NEXT row\r
-CLOSE\r
-END SUB\r
-\r
-SUB RenderSpriteFromFile (x%, y%, widthMultiplier%, heightMultiplier%, SpriteName$)\r
-' Renders sprite from text file in normal orientation.\r
-' File format and rendering identical to RenderFlippedSpriteFromFile\r
-' but processes characters left-to-right instead of right-to-left.\r
-\r
-spriteWidth = widthMultiplier - x\r
-spriteHeight = heightMultiplier - y\r
-OPEN "IMG/" + SpriteName$ + ".i01" FOR INPUT AS #1\r
-INPUT #1, spriteHeight\r
-FOR row = 1 TO spriteHeight\r
- LINE INPUT #1, rowText$\r
- FOR column = 1 TO LEN(rowText$)\r
- ' Calculate color from ASCII value (offset by 40)\r
- currentColor = ASC(RIGHT$(LEFT$(rowText$, column), 1)) - 40\r
- ' Draw scaled pixel block\r
- LINE (x + (column * widthMultiplier), (y + (row * heightMultiplier)) + 1)-(x + ((column + 1) * widthMultiplier) - 1, y + ((row + 1) * heightMultiplier)), currentColor, BF\r
- NEXT column\r
-NEXT row\r
-CLOSE\r
-END SUB\r
-\r
-SUB ShowIntroScreen\r
-' Displays introductory splash screen using sprite rendering.\r
-\r
-CLS\r
-RenderSpriteFromFile 2, 2, 10, 1, "win.i01"\r
-END SUB\r
-\r
-SUB UpdateHUD (coinIncrementAmount%)\r
-' Updates Heads-Up Display showing coins and lives:\r
-' - Processes coin counter (with 100-coin bonus life)\r
-' - Draws coin counter digits\r
-' - Shows remaining lives\r
-\r
-' End game if no lives remain\r
-IF lives < 0 THEN GameOverSequence\r
-\r
-' Draw coin icon at left of HUD\r
-PUT (0, 180), largeCoinSpriteBuffer, PSET\r
-\r
-' Add new coins to counter\r
-CoinDigits(1) = CoinDigits(1) + coinIncrementAmount%\r
-\r
-' Handle decimal carry-over for coin counter\r
-FOR digitPosition = 1 TO 3\r
- ' Carry from ones place to tens place\r
- IF CoinDigits(1) > 9 THEN\r
- CoinDigits(1) = CoinDigits(1) - 10\r
- CoinDigits(2) = CoinDigits(2) + 1\r
- END IF\r
-\r
- ' Convert 100 coins to extra life\r
- IF CoinDigits(2) > 9 THEN\r
- CoinDigits(1) = 0\r
- CoinDigits(2) = 0\r
- lives = lives + 1\r
- END IF\r
-NEXT digitPosition\r
-\r
-LOCATE 1, 1\r
-digitPosition = 3\r
-' Draw both digits of coin counter\r
-FOR hudElement = 1 TO 2\r
- digitPosition = digitPosition - 1\r
- PUT ((hudElement * 11) + 10, 180), digitImages(100, CoinDigits(digitPosition)), PSET\r
-NEXT hudElement\r
-\r
-' Cap maximum lives at 10\r
-IF lives > 10 THEN lives = 10\r
-\r
-' Draw "X" before lives counter\r
-PUT (43, 180), digitImages(100, 10), PSET\r
-' Draw small coin icon next to lives counter\r
-PUT (53, 180), smallCoinSpriteBuffer, PSET\r
-' Draw current lives count\r
-PUT (73, 180), digitImages(100, lives), PSET\r
-END SUB\r
-\r
-SUB UpdateLoadingScreen\r
-' Visual progress indicator during asset loading.\r
-' Draws black screen with incremental dots on bottom row.\r
-\r
-LINE (0, 0)-(319, 150), 0, BF\r
-LOCATE 20, 10 + loadingProgressDotCount\r
-loadingProgressDotCount = loadingProgressDotCount + 1\r
-PRINT "."\r
-END SUB\r
-\r
-SUB WaitForUserInput\r
-' Waits for any keyboard input before continuing.\r
-' Clears userInput$ variable first, then polls INKEY$ until non-empty.\r
-\r
-userInput$ = ""\r
-WHILE userInput$ = ""\r
- userInput$ = INKEY$\r
-WEND\r
-END SUB\r
-\r
+++ /dev/null
- 10 \r
-((]]]]]]((\r
-(]]]]]]]](\r
-]]]]((]]]]\r
-]]]((((]]]\r
-]]]((((]]]\r
-]]]((((]]]\r
-]]]((((]]]\r
-]]]]((]]]]\r
-(]]]]]]]](\r
-((]]]]]]((\r
+++ /dev/null
- 10 \r
-((((]]](((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-(((]]]]]((\r
-((((]]](((\r
+++ /dev/null
- 10 \r
-(]]]]]]]((\r
-]]]]]]]]](\r
-]]]]((]]]]\r
-(]](((]]]]\r
-((((]]]]](\r
-(((]]]]]((\r
-(]]]](((((\r
-]]]](((]](\r
-]]]]]]]]]]\r
-(]]]]]]]](\r
+++ /dev/null
- 10 \r
-(]]]]]]]](\r
-]]]]]]]]]]\r
-(]](((]]]]\r
-(((((((]]]\r
-(((((]]]](\r
-(((((]]]](\r
-(((((((]]]\r
-(]](((]]]]\r
-]]]]]]]]]]\r
-(]]]]]]]](\r
+++ /dev/null
- 10 \r
-(((]](((](\r
-((]]](((]]\r
-((]]]((]]]\r
-(]]](((]]]\r
-(]]]((]]]]\r
-]]]]]]]]]]\r
-(]]]]]]]]]\r
-(((((]]]](\r
-(((((]]]](\r
-((((]]]]((\r
+++ /dev/null
- 10 \r
-((]]]]]]((\r
-(]]]]]](((\r
-(]](((((((\r
-(]](((((((\r
-(]]]]]]]](\r
-((]]]]]]]]\r
-(((((((]]]\r
-]]](((]]]]\r
-]]]]]]]]](\r
-(]]]]]]]((\r
+++ /dev/null
- 10 \r
-((]]]]]]((\r
-]]]]]]]]](\r
-]]](((]]](\r
-]]](((((((\r
-]]]]]]]]](\r
-]]]]]]]]]]\r
-]]]((((]]]\r
-]]](((]]]]\r
-]]]]]]]]](\r
-(]]]]]]]((\r
+++ /dev/null
- 10 \r
-(]]]]]]]](\r
-]]]]]]]]]]\r
-]]]((((]]]\r
-(](((((]]]\r
-((((]]]]]]\r
-((]]]]]]](\r
-((((((]]](\r
-(((((]]]((\r
-((((]]](((\r
-((((]]](((\r
+++ /dev/null
- 10 \r
-((]]]]]]((\r
-(]]]((]]](\r
-(]]((((]](\r
-((]]((]]((\r
-(]]]]]]]](\r
-]]]]((]]]]\r
-]]]((((]]]\r
-]]]]((]]]]\r
-(]]]]]]]](\r
-((]]]]]]((\r
+++ /dev/null
- 10 \r
-(]]]]]]]((\r
-]]]]]]]]](\r
-]]](((]]]]\r
-]](((((]]]\r
-]]](((]]]]\r
-(]]]]]]]]]\r
-((]]]((]]]\r
-((((((]]]]\r
-((]]]]]]](\r
-((]]]]]]((\r
+++ /dev/null
- 20 \r
-(DDDDDDDDDDDDDDDDDD(\r
-D(EEEEEEEEEEEEEEEE(=\r
-DE(EEEEEEEEEEEEEE(>=\r
-DEE@@@@@@@@@@@@@@?>=\r
-DEE@???????????D@?>=\r
-DEE@??CCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@?CCCCCCCCCCD@?>=\r
-DEE@DDDDDDDDDDDD@?>=\r
-DEE@@@@@@@@@@@@@@?>=\r
-DE=??????????????(>=\r
-D(>>>>>>>>>>>>>>>>(=\r
-(==================(\r
+++ /dev/null
- 10 \r
-(((TTTT(((\r
-(TTTSSSSR(\r
-TTSSSSSSSR\r
-TSSS\\SSSR\r
-TSSS\]SSSR\r
-TSSS\]SSSR\r
-TSSS\]SSSR\r
-TSSS\]SSSR\r
-(SRSSSSRR(\r
-(((RRRR(((\r
+++ /dev/null
- 10 \r
-(((TTTT(((((((((((((\r
-(TTTSSSSR((FF((((FC(\r
-TTSSSSSSSR(FCC((FC@(\r
-TSSS\\SSSR((CCCFC@((\r
-TSSS\]SSSR(((CCC@(((\r
-TSSS\]SSSR(((FCC@(((\r
-TSSS\]SSSR((FCC@C@((\r
-TSSS\]SSSR(FC@((@C@(\r
-(SRSSSSRR((C@((((@@(\r
-(((RRRR(((((((((((((\r
+++ /dev/null
- 10 \r
-((QQQQ((((((((((((((\r
-(QQQQQQ((((FF((((FC(\r
-((jjjj(((((FCC((FC@(\r
-((jjjj((((((CCCFC@((\r
-(c(jj(c((((((CCC@(((\r
-c]]]]]]c(((((FCC@(((\r
-((]]]]((((((FCC@C@((\r
-(]]]]]]((((FC@((@C@(\r
-XX]((]XX(((C@((((@@(\r
-XXX((XXX((((((((((((\r
+++ /dev/null
- 20 \r
-(RRRRRQQQQ((((((((((\r
-RRQQQQQQQQQ(RRRR((((\r
-RQQQQQQQQQQRRQQQQ(((\r
-RQQQQQQQQQQQQQQQ((((\r
-QQQQQQQQQQQQQ(((((((\r
-QQQQQQQQQ((\81((((((((\r
-(QQQQQQQ\81\81\81\81\81\81((((((\r
-((\81\81\81\81\81\81\81\81\81\81\81\81\81(((((\r
-((\81\81\81\81\81\81\81\81\81\81\81\81((((((\r
-(((\81\81\81\81\81\81(\81(((((((((\r
-(((((\81\81\81\81\81((((((((((\r
-((((((JJJJJ(((((((((\r
-((((((JJJJJJ((((((((\r
-(((((JJJJJIJ((((((((\r
-(((((JIIIIJJ((((((((\r
-((((IIIIIIIJ((((((((\r
-((((IIIIIIJJJ(((((((\r
-((XXXIII(JJJJXXX((((\r
-(XXXXXXX((JXXXXXXX((\r
-((XXXXX((((XXXXXX(((\r
+++ /dev/null
- 20 \r
-(RRRRQQQQ(((((((((((\r
-RQQQQQQQQQ((((((((((\r
-QQQQQQQQQQRRRRR(((((\r
-QQQQQQQQQQQQQQQQ((((\r
-QQQQQQQQQQQQQQQ(((((\r
-QQQQQQQQ((\81(((((((((\r
-QQQQQQQ\81\81\81\81\81\81(((((((\r
-(\81\81\81\81\81\81\81\81\81\81\81\81\81((((((\r
-(\81\81\81\81\81\81\81\81\81\81\81\81(((((((\r
-((\81\81\81\81\81\81(\81((((((((((\r
-((((\81\81\81\81\81(((((((((((\r
-(((((JJJJJ((((((((((\r
-(((((JJJJJJ(((((((((\r
-((((JJJJJIJ(((((((((\r
-((((JIIIIJJ(((((((((\r
-(((((IIIIIJ(((((((((\r
-(((((IIIII((((((((((\r
-((((XXXXXXXX((((((((\r
-(((XXXXXXXXXX(((((((\r
-((((XXXXXXXX((((((((\r
+++ /dev/null
- 30 \r
-(((((((((((((((((((((((((\\(\((((((((((((((((((((((((](((((((((]((((]((((]](((((((((((((((((((((((((\r
-((((((((((((((((((((((((\((((((((\\(((((((((\(((((((((]]((\(((\(((\((]](]]((((((((((((((((((((((((((\r
-((((((((((((((((\((\((\(\]\\((\(\(((((((]((((((((](((\((\]((((\(]\(\(]]]]]](((((((((((((((((((((((((\r
-(((((((((((((((((((]t\\(]]]\\\](](((\((]((](](((((((]((((\(\]](\((]\(((((\\(](](\]\(((((((((](((((((\r
-((((((((((t((\8fwt\8f\8f\\\t](tt\(]\\((\(](\\t\t((((]\t(](((\((\]\](\(\]](]]((]\(]](((]`\`\(\\](((((((((((\r
-(((((t((((((tttttt\8ft(t\\(\\((\(]]]\t((\\]\]((((\(](\((\\(]\(](`\\`]](\]\\]\(t\\\`\\t(t\]((](((((((((\r
-((((t(tt(t((t\8fttt\8ftt]t\\(](\\(t(t\\ttt\]tt]t\\(]\tt]](\((t]\](\t]((t]\t(]`\t(]]tt\\(tt\\]](]((((((((\r
-((((((\(ttt(tt\8f\8f\8ft\8f\tt]tt\\\\t\]\tt\(\t]((\\\tt\((]](\\t]tt(\\\(tt(t\(`]\`]]\\\\\(\`tt``^```(`((((((\r
-((((tt(tttt\8f\8ftttttt\\t]\tt]ttt(]\\\\\t\\t(\\((\\t\]t\\]]`\\\](\`]\\(\\]\`(t\\\t\\tt\\^(``]\(\]((]`((\r
-(((t\(t\ttt\]\8ft\8ftt\t\8ft]]]\\t]ttt]]t\t\\]ttt\]](tt\(]t\\\]t\t`t\\]\\tt]\^\t]\\\\\tt\\`t\t`^`(\`\]]]((\r
-(((((tt]]t\\twt\\8f\\t\8f\]tt]]t(]\t\tt]\tttt\tt]\((t(\\\t\`]t(\]t\\`\t\\(\\\t\t]^\\t\\\tt\t\\^```(`(]((\r
-((t(](\ttttwttw]t\\tt(^t\(t]\]tt\(\t]t\\t(]]\]ttt\\tttt\]\^]\tt\]``\t`(\tt\`^\\\\\ttt\tt\\`]\\^((\((\r
-]t(]]]]tt]t\t^t\tt\t(\](tt]\tt]\t\\\\\]t\tt`t\\`^]\]t\]]]tt\`(`(]`\tt\\`\t\t]\\tt\ttt^t\\`\`]``(\]((\r
-(]t]t\\t\\t\^t\^t\](\]]\]]t\(ttttt\]t\t\`\t\t\t\\\\`^t`(t(]]t]t`]]t]\\\^tt\]`\t\\t\\``t\\`\``\]t``\(\r
-(]t(tt\\\\\\\\\]^t]]t^t]tt\t^\\]]]]`t\]\t`]\t^```\^^]`\tt^t]`\`]^^\\\\\\\\]^(`\^`\\\\\\^``\```]`\`(]\r
-(](t^^]\\]\\\]t^\]]^]]\^^\]]t\`\^^``]t`^\\`\\`^`]\^\`t]\^^^`^]\\^^^\\\\\]]\`\^````\\]^`\`^`\```]``](\r
-]]]]](t]`t]^\]^]]^]^]^^]^^]`\^\]`]\]`\\\\``]`\`t\\`^]```^`]^^^^^]\^^\t\``]`\\``]\\^\^^^\\\```````]]]\r
-((^((]](`]]`]^^`^^]^`]]\]``\\(\(\`]``\```]`^^^````^````t(]`^t]^^t`\\]^^\^\^`^\^``\]\\````^`\`]```(](\r
-](^]((]\`(``]]]^``^t]^^]]t]``t`]``(`````\``\``\\`\```t`^t^(^^^^^]]t^`(\\^\^`(`^^^`\^```\````\]````](\r
-]((^^]]`]^]^\`]``t^```````\`^`\`\``\^t```````]`````]^`^]]^^t^(^(^]``^```\\\`^]]]^^^^]``^````t]``]``(\r
-(((^((]``^^`^^``^^^^^^]]t`t````^`^`^`^\^`]````````````^`````^^^`]`]^^^^^((]``^^`^]]^^`````]``^^(t`(]\r
-(]^(^(`(`^]]`]`^^^`]^```^^`````t`\^`^`````````^`(`^t^`t^`^^^(```t(`^]]^^^^```^]`]``]^`(```(^(`tttt((\r
-^(^(^(((t](((`]]`^`t``t```^``^``````^````(^`(````^^^``^`(```^]``]^(]`^```]````````(]^``]t]`^`](^(`((\r
-(((tt^(^((((]`^`^```t````^```^^^]``````](`tt``]``^```(^^`]``(``t````t```(``]`^]^t`]^`(`^^^^``tt]`(((\r
-(((((((]^](((``]`(`^`]^^^``]`]]((```(`(^```]((]^`^`````````(`((t``^`````]`^(^^```(`^`](`t]^((^(`((((\r
-(((((((((]((t(^`(`^``((``(^(``^(((((((((``((^``````^(^`t`(`^t``````^]((^^^`](^```((`]((`(]^`((^]((((\r
-(((((((((((t(^``(`(t^(^(`^(^^^((^(`((^(`]((((](((````^(`((((``((``((``(^`]`(]]]]``]``]````(`(``(`(((\r
-(((((((((((((^(^((((((^^(((^(((^(((^^`((`((]`((((^`((`(^``((```^`((((^(((t`(^`((`^(`(]`^`(((`^((((((\r
-((((((((((((((((((((^(((^(((((^(((((((((((((((((^(`^^`^(((^((^((``(((`((((`](((((((^(``(((`(((((((((\r
-(((((((((((((((((((^(((((((^((^(((((((((((((((((((((^(`(^^(`((((((^^(^((`((((](`((((((((((((((((((((\r
+++ /dev/null
- 20 \r
-((((((((((((((((((((((((((((((q((((q(q((((((((((((((((((((((\r
-((((((((((q((q(((q(((qq(((((((qq\8aqqqq(((((((qq((((((((((((((\r
-((((((((((q(q(((q(qq((qq((q((qqq(((q(qq(qq;(qq(q((((((((((((\r
-(((((((((qq(q(\8a(((q(q(q(q((((q2qqq(qqq(q(;((;q(q((((((((((((\r
-(((((qqq(q(q(((222\8aqqq(((\8aq(qqqq\8aq2qqqq2((;\8a((q(((q?q(((((((\r
-((((qq(nq(((q((2(qq2q2q(((nn(\8aq(qqq(nqq2n2;(qnq?(;???(((((((\r
-((((((qqqq2q(qqq2\8a(22\8a(qqq(\8aqq2n(2nqq2qqq(nq?q?\8a2;;;?(((((((\r
-(((((qn(qqqq\8a(\8a(qXn22X\8a(nq\8a\8aq2(22qq22(22(2?Y??2q;?q;22((((((\r
-((((q((qq2qq\8aqqnq2nX\8aX\8aqq2\8a\8aqq\8aqX2q22((qq;(Yq???;;2;;2q(((((\r
-((((((q(22(2q2(((nqqXX\8a(XX2Xq(q2\8a22nq22q?qY((?(?qqqq;???((((\r
-(((q(qq(qqqYYXq((YXXY\8aX2\8a2\8aX2\8aq;?2???2q;;q;X?2???;?;Y;??q(((\r
-(((q(q(q22222YYX2(XX?X2q2?qX2q?YYYn2q;Y;X2???X?;?;;;??;;((((\r
-(((n(qq(\8a2\8a22XYqXY?XY;2;???qq?;?Y;?2Y;2;;Y;?XX9X9;;(9;??;(((\r
-((((qnX\8a?YY22\9f\9f???YYqqX?;qXqqq;;???;@;;;;??X\9d;;?X?q;;;9?;(?(\r
-(nnn\8aX2?2??YX\9f\9fX2q?X;2;;?qq;;;q;?;;;;;;;\9f;X\9d;9;?X;;@;@;;?99(\r
-qqqnq\8aq222\8aX\9f\9f?Y(\9fY??;qq?2;?;q?;?;;?@X;;;?\9f;9999;9@;;;;;9n?9\r
-nqnqqn2??Y??(X?Y\9f\9fX?;?;?X?;Xq;;\9fX;n\9f@;\9f;;;;\9f9;;2;;@;;?;;9((9\r
-nnqqq2(?\9fn?n\9f\9f\9f?\9fY22X;X?q;;;;;qqq;;q;\9f;;;q9X\9d;;99;@;\9d;9;;;??\r
-qnq(qqnqq???\9f\9fX(?n\9fqX(XXqq2;nqq;;;\9f\9fq\9f\9f;\9f\9f;Xq;q;\9d\9d9n;\9d;??n?9\r
-((nn((q\9f(\9fnXn\9f(n\9fXn\9fn(XqqX2\9f\9f;q\9f(qq;(\9f\9fq\9f(9\9d9\9fq\9d\9d\9d?\9d;\9f\9f?????\r
+++ /dev/null
- 60 \r
-(((((((((((((((X(((((X((T(((((((((((((((\r
-(((((((((((((((X((T((X(X((((((((((((((((\r
-((((((((((((X(((((X(X((((((X(X((((((((((\r
-(((((((((((((XX((X(((((((((T((((((((((((\r
-((((((XX((((XX(XTT(X(TXXT(((((X(((((((((\r
-((((((((((((((X((X(TXXT\9f\9f(XXXX((((((((((\r
-((((((X(X((XXX(XXXTTT(XXXTX(X(((((((((((\r
-(((((((XX((X(XX((T((XXXX(T((XXX(X(X(((((\r
-((((X(X((XXXT((XX(XXX(TXXT\9fXX(X\9f(X((((((\r
-((((XXX((((XT(X(XXXTTT(XX\9fX\9f\9f\9f\9fX((X(((((\r
-(((((X((((XT((XX((XT(XTX((XX(\9fX((((\9f\9f(((\r
-(((X((X(((TX((XXXXTXX(TT\9f(((((\9fX\9f((\9fX(((\r
-((((X(XX((X(XX(X(TX(((TTT\9fX\9f(\9fXX\9f(((((((\r
-((((X(XXXXXX((XXTTXX(TXTTT(T(X\9fX(\9f(XX(((\r
-(((((X(XX(TXXTTT(TXXT(X((X((((X\9f(X(XX(((\r
-((((((X((X(XXXXXT(XXX(TT((T(X(((((((X(((\r
-(((XX((XX(((X(TXXX(TX(TTTTXT(\9f(((\9f((\9f(((\r
-(X(((X(((X(T((X(X(XX(T(XXTX(T\9fX((\9f\9fX((((\r
-((XX(X((((((XTX(TTTXTXT(XX((XX(\9f(\9f\9f(((X(\r
-((((((XXXX((X(XXTTXT(XX\9fTT(T(((X\9f((XX(((\r
-(((XXXX(X(((X(T(TTTTXXXXTX(X(XXXX(X(\9f(X(\r
-(((((((((X(XXXXX(XT(X(X((X(XXX(XXX((\9f(((\r
-X(((((X((X(X(X((XTT(((((XX\9f(XXXX\9f(\9f((X\9f(\r
-(((XXX(XXX((X(((XTXX(T(X((\9f(((\9fX(XXXX(X(\r
-(((X(((TTX((TTXTT(XXXT(X\9f\9f(XXX((XX\9f((X(\9f\r
-((X((((XTX(((X(XX(XTT(XXXX((XX(XX\9f(X((\9fX\r
-(((((TX(((X((T(XTTXXXTXX(XX\9fX(X((\9f((((((\r
-((X(X(TXTX(XX((XTTXX(X(X\9fXX\9fT\9fXXXX(\9f(\9f((\r
-((((X(X(X((TXTTT(((X\9f\9fX(XT((XXXXX(\9f(((\9f(\r
-((((X((X((T((X(TXXXXXXX\9f(T\9fX(XX\9f\9f((\9f\9f(((\r
-((((X(((TXTXX(XXX(((XXX(\9fX\9f\9f(X\9f\9f(\9f\9f\9f\9f\9f((\r
-((XX((XXXX((XX(((XX(XXX(T\9f\9f\9fX\9f(XXX\9f\9f((((\r
-((((((X((XTXXTTTXXXXXX\9a\9a\9a\9f(TXT\9f(\9f((((X((\r
-(((X(((XXXTTXTT(T(TX(\9f\9a\9f\9aX\9f\9f\9f(X(\9f\9f(X((((\r
-((X(((((XXT(TTT(X((T(\9aX\9aXXT\9f\9f\9f(\9f\9f\9f((((((\r
-(X(XXXX(X((X((TXTT(TT\9f\9aXX\9f\9f\9fXX(X(\9f(XX(((\r
-((((X(((XXXXTXXX(((T\9f\9a\9fXX\9fX\9fX\9fX\9f(\9fX(((((\r
-(((((((XX(XXX(XXTX((\9f\9a\9a\9aT\9f\9f(\9fTXX(TX(\9f(((\r
-(((((XXXXXXX((X(X(\9f\9f\9f\9a\9a\9a\9fX\9f\9f\9fXT(X((X((((\r
-(((X(((XXXXX(XT(TT(X\9f\9a\9a\9aX\9f\9f\9fTT\9fX\9f((((\9f((\r
-((((((XX(XX((X(XTX\9f\9f\9a\9a\9aX((XXXXTX(((\9f((((\r
-(((((X(XXXXXXXXX\9f(\9f(\9f\9aX\9a(X\9fXTXX((X((((((\r
-(((((((X(X\9fX(XX((T\9f\9f\9fXX\9f\9f(XX\9fXXXX(((((\9f(\r
-((((((XX(XX((XXTX(X(\9a\9a\9a\9fX(XXXX(XXX(X((((\r
-((((((((((XXX\9fX\9a\9a\9f(\9a\9a\9aX\9f(X(TXXX((X((((((\r
-((((((((((X(\9fX(\9a\9f\9aX\9f\9a\9aXX(X(XXX(X((((((((\r
-(((((((((XXX(X\9f\9a\9a\9fX\9f\9aXX\9f\9fX(((X(((((\9f((((\r
-(((((((((((X((X\9a\9a\9f\9f\9f\9f\9aXXX(X(\9fX(\9f\9f(((((((\r
-((((((((((XXX\9f(\9a\9a\9f\9f\9f\9f\9fX\9f\9f(X(((\9f(\9f\9f((((((\r
-(((((((((((((XXX(\9a\9a\9f\9a\9aXX(((((X((((((((((\r
-(((((((((((\9f(X((T\9a\9f\9aXX\9f\9f((((X(\9f(((((((((\r
-((((((((((X(((XX(\9a\9aX\9a\9a\9f\9f((((((((((((((((\r
-((((((((((((((((\9fX\9aXX\9aX(\9f(((((\9f(((((((((\r
-((((((((((((((X(XX\9a\9f\9f\9f((\9f(((((((((((((((\r
-(((((((((((\9f(((XX(\9a\9a\9a\9a(\9f((((((((((((((((\r
-((((((((((((((((((\9a\9a\9a\9aX(((\9f(((((((((((((\r
-((((((((((((((\9f(((\9a\9a\9a\9a((((((((((((((((((\r
-((((((((((((((((((\9a\9a\9a\9a((((((((((((((((((\r
-(((((((((((((((\9f((\9a\9a\9a\9a((((((((((((((((((\r
-((((((((((((((((((\9a\9a\9a(((((((((((((((((((\r
+++ /dev/null
- 20 \r
-00000000000000000000\r
-0@@//@/////////////0\r
-0@//////////@//////0\r
-0//@///////////////0\r
-0@//@//////////////0\r
-00000000000000000000\r
-/////////00@/@/@////\r
-/@///////00@////////\r
-@@///////00//@//////\r
-@////////00/////////\r
-00000000000000000000\r
-0@@////////////////0\r
-0/////@///@////////0\r
-0@///////////@/////0\r
-0//@/////////@@////0\r
-00000000000000000000\r
-/////////00@@///////\r
-/////////00@////////\r
-/////////00/////////\r
-/////////00/////////\r
+++ /dev/null
- 20 \r
-((((((((((((((((((((\r
-((((((((((((((((((((\r
-<(((((((((((((((((((\r
-?((((((((<((((((((((\r
-??((((((??((((((((((\r
-(?(((((??(((((((((((\r
-(??((???((((((((((((\r
-((????((((((((((((((\r
-(((??(((((((((((((((\r
-((<<<(((((((((((((((\r
-<<???<((((((((((((((\r
-<(???<<(((\9b\9b\9b\9b\9b\9b((((\r
-((????((\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
-((????(\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((\r
-((?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((\r
-((?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
-((??????\9b\9b\9b\9b\9b\9b\9b\9b\9b(((\r
-(((??????\9b\9b\9b\9b\9b\9b\9b((((\r
-((((???????????????(\r
-((((((??????????????\r
+++ /dev/null
- 20 \r
-((((((((((((((((((((\r
-((((((((((((((((((((\r
-((((((((((((((((((((\r
-((((((((((((((((((((\r
-(((((??<((((((((((((\r
-((((??((((((((((((((\r
-(<((?((((?<(((((((((\r
-(<(??????(((((((((((\r
-(<<??(((((((((((((((\r
-((<<<<<<((((((((((((\r
-((???(((((((((((((((\r
-((????((\9b\9b\9b\9b\9b\9b\9b(((((\r
-(?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
-(????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
-?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
-?????\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b\9b((((\r
-??????\9b\9b\9b\9b\9b\9b\9b\9b\9b(((((\r
-(??????\9b\9b\9b\9b\9b\9b\9b((((((\r
-((????????????????((\r
-((((????????????????\r
:ID: aa195f33-6d69-48ff-9af5-3f761a51dcb2
:END:
-** Pomppu Paavo
+** Pomppu Paavo 2
Player controls small character that has to collect coins and move
between screens. Player has to avoid contact with evil snails.
#+attr_html: :class responsive-img
#+attr_latex: :width 1000px
-[[https://www2.svjatoslav.eu/gitweb/?p=qbasicapps.git;a=tree;f=Games/Pomppu+Paavo][file:Games/Pomppu%20Paavo/screenshot.png]]
+[[https://www2.svjatoslav.eu/gitweb/?p=qbasicapps.git;a=tree;f=Games/Pomppu+Paavo][file:Games/Pomppu%20Paavo%202/screenshot.png]]
-[[https://www2.svjatoslav.eu/gitweb/?p=qbasicapps.git;a=tree;f=Games/Pomppu+Paavo][Source code]]
+[[https://www2.svjatoslav.eu/gitweb/?p=qbasicapps.git;a=tree;f=Games/Pomppu+Paavo+2][Source code]]
Source code organization:
#+begin_example