-DECLARE SUB RenderSpriteFromFile (p%, O%, m%, fr%, teler%)\r
+DECLARE SUB RenderSpriteFromFile (x%, y%, spriteID%, animationFrame%)\r
' Pomppu Paavo\r
'\r
' This program is free software: released under Creative Commons Zero (CC0) license\r
DECLARE SUB LoadCurrentLevel (y%)\r
\r
DEFINT A-Z\r
-DIM SHARED GraphicsDisplayMode\r
DIM SHARED AsciiLevelData(1 TO 20) AS STRING * 31\r
DIM SHARED Companion1PositionY%, Companion1PositionX%, Companion2PositionY%, Companion2PositionX%\r
DIM SHARED LivesRemaining%, CoinsCollected%\r
DIM SHARED PlayerJumpingSprite(51)\r
DIM SHARED DoorSprite(120)\r
\r
-' Small scale sprites (mostly 10x10 pixels) - denoted with "Small" suffix\r
-DIM SHARED SolidTerrainSpriteSmall(51)\r
-DIM SHARED EmptySpaceSpriteSmall(51)\r
-DIM SHARED BoxSpriteSmall(51)\r
-DIM SHARED PlayerSpriteBufferSmall(70)\r
-DIM SHARED CloudSpriteSmall(209)\r
-DIM SHARED StarSpriteSmall(50)\r
-DIM SHARED HedgehogSpriteSmall(30)\r
-DIM SHARED HedgehogSpriteSmall1(30)\r
-DIM SHARED HedgehogSpriteSmall2(30)\r
-DIM SHARED CoinSpriteSmall(30)\r
-DIM SHARED BushSpriteSmall(100)\r
-DIM SHARED WindowSpriteSmall(100)\r
-DIM SHARED TrampolineSpriteSmall(50)\r
-DIM SHARED TreeSpriteSmall(3000)\r
-DIM SHARED RightArrowSpriteSmall(51)\r
-DIM SHARED LeftArrowSpriteSmall(51)\r
-DIM SHARED HoleSpriteSmall(51)\r
-DIM SHARED PlayerRunRight1SpriteSmall(51)\r
-DIM SHARED PlayerRunRight2SpriteSmall(51)\r
-DIM SHARED PlayerRunLeft1SpriteSmall(51)\r
-DIM SHARED PlayerRunLeft2SpriteSmall(51)\r
-DIM SHARED PlayerJumpingSpriteSmall(51)\r
-DIM SHARED DoorSpriteSmall(50)\r
-\r
' Define keyboard control sequences\r
leftArrowKey$ = CHR$(0) + "K"\r
rightArrowKey$ = CHR$(0) + "M"\r
' Capture sprite images from screen drawing operations.\r
' This technique uses GET command to save drawn graphics into arrays.\r
GET (1, 1)-(20, 20), EmptySpaceSprite\r
-RenderSpriteFromFile 0, 0, 1, 1, 1\r
+RenderSpriteFromFile 0, 0, 1, 1\r
GET (1, 1)-(20, 20), SolidTerrainSprite\r
-RenderSpriteFromFile 0, 0, 4, 1, 1\r
+RenderSpriteFromFile 0, 0, 4, 1\r
GET (1, 1)-(20, 20), BoxSprite\r
PUT (1, 180), SolidTerrainSprite, PSET\r
PUT (300, 1), SolidTerrainSprite, PSET\r
PUT (300, 180), SolidTerrainSprite, PSET\r
-RenderSpriteFromFile 30, 50, 2, 1, 1\r
+RenderSpriteFromFile 30, 50, 2, 1\r
GET (31, 51)-(91, 76), CloudSprite\r
PUT (160, 10), CloudSprite, PSET\r
-RenderSpriteFromFile 20, 100, 3, 1, 1\r
+RenderSpriteFromFile 20, 100, 3, 1\r
GET (21, 101)-(31, 114), StarSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 5, 1, 1\r
+RenderSpriteFromFile 0, 0, 5, 1\r
GET (1, 1)-(11, 8), HedgehogSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 6, 1, 1\r
+RenderSpriteFromFile 0, 0, 6, 1\r
GET (1, 1)-(8, 10), CoinSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 7, 1, 1\r
+RenderSpriteFromFile 0, 0, 7, 1\r
GET (1, 1)-(31, 11), BushSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 8, 1, 1\r
+RenderSpriteFromFile 0, 0, 8, 1\r
GET (1, 1)-(26, 21), WindowSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 9, 1, 1\r
+RenderSpriteFromFile 0, 0, 9, 1\r
GET (1, 1)-(21, 11), TrampolineSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 11, 1, 1\r
+RenderSpriteFromFile 0, 0, 11, 1\r
GET (1, 1)-(51, 81), TreeSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 12, 1, 1\r
+RenderSpriteFromFile 0, 0, 12, 1\r
GET (1, 1)-(20, 20), RightArrowSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 12, 50, 1\r
+RenderSpriteFromFile 0, 0, 12, 50\r
GET (1, 1)-(20, 20), LeftArrowSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 13, 1, 1\r
+RenderSpriteFromFile 0, 0, 13, 1\r
GET (1, 1)-(20, 20), HoleSprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 14, 1, 1\r
+RenderSpriteFromFile 0, 0, 14, 1\r
GET (1, 1)-(20, 20), PlayerRunRight1Sprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 15, 1, 1\r
+RenderSpriteFromFile 0, 0, 15, 1\r
GET (1, 1)-(20, 20), PlayerRunRight2Sprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 14, 50, 1\r
+RenderSpriteFromFile 0, 0, 14, 50\r
GET (1, 1)-(20, 20), PlayerRunLeft1Sprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 15, 50, 1\r
+RenderSpriteFromFile 0, 0, 15, 50\r
GET (1, 1)-(20, 20), PlayerRunLeft2Sprite\r
CLS\r
-RenderSpriteFromFile 0, 0, 16, 1, 1\r
+RenderSpriteFromFile 0, 0, 16, 1\r
GET (1, 1)-(20, 20), PlayerJumpingSprite\r
CLS\r
\r
\r
-' Capture small scale versions of sprites (half size)\r
-GET (1, 1)-(10, 10), EmptySpaceSpriteSmall\r
-RenderSpriteFromFile 0, 0, 1, 1, 2\r
-GET (1, 1)-(10, 10), SolidTerrainSpriteSmall\r
-RenderSpriteFromFile 0, 0, 4, 1, 2\r
-GET (1, 1)-(10, 10), BoxSpriteSmall\r
-PUT (1, 180), SolidTerrainSprite, PSET\r
-PUT (300, 1), SolidTerrainSprite, PSET\r
-PUT (300, 180), SolidTerrainSprite, PSET\r
-RenderSpriteFromFile 30, 50, 2, 1, 2\r
-GET (16, 26)-(46, 38), CloudSpriteSmall\r
-RenderSpriteFromFile 20, 100, 3, 1, 2\r
-GET (11, 51)-(16, 72), StarSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 5, 1, 2\r
-GET (1, 1)-(6, 4), HedgehogSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 6, 1, 2\r
-GET (1, 1)-(4, 5), CoinSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 7, 1, 2\r
-GET (1, 1)-(16, 6), BushSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 8, 1, 2\r
-GET (1, 1)-(13, 11), WindowSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 9, 1, 2\r
-GET (1, 1)-(11, 6), TrampolineSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 11, 1, 2\r
-GET (1, 1)-(26, 41), TreeSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 12, 1, 2\r
-GET (1, 1)-(10, 10), RightArrowSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 12, 50, 2\r
-GET (1, 1)-(10, 10), LeftArrowSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 13, 1, 2\r
-GET (1, 1)-(10, 10), HoleSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 14, 1, 2\r
-GET (1, 1)-(10, 10), PlayerRunRight1SpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 15, 1, 2\r
-GET (1, 1)-(10, 10), PlayerRunRight2SpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 14, 50, 2\r
-GET (1, 1)-(10, 10), PlayerRunLeft1SpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 15, 50, 2\r
-GET (1, 1)-(10, 10), PlayerRunLeft2SpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 16, 1, 2\r
-GET (1, 1)-(10, 10), PlayerJumpingSpriteSmall\r
-CLS\r
-RenderSpriteFromFile 0, 0, 17, 1, 1\r
-GET (1, 1)-(21, 31), DoorSprite\r
-CLS\r
-RenderSpriteFromFile 0, 0, 17, 1, 2\r
-GET (1, 1)-(11, 16), IntroScreen\r
-CLS\r
-\r
-RenderSpriteFromFile -1, -1, 10, 4, 1\r
+RenderSpriteFromFile -1, -1, 10, 4\r
GET (1, 1)-(318, 124), IntroScreen\r
\r
key$ = INPUT$(1)\r
Companion2HorizontalVelocity = 1\r
MainGameLoop:\r
keyboardInput$ = INKEY$\r
-IF GraphicsDisplayMode = 2 THEN b = b * 2: GOTO SmallScaleGameLoop\r
IF b > 0 THEN GET (a, b)-(a + 20, b + 20), PlayerSpriteBuffer\r
IF b > 0 THEN IF PlayerAnimationState = 1 THEN PUT (a, b), PlayerRunRight1Sprite, OR\r
IF b > 0 THEN IF PlayerAnimationState = 2 THEN PUT (a, b), PlayerRunRight2Sprite, OR\r
IF sipa = 3 THEN sipa = 1\r
GOTO MainGameLoop\r
\r
-\r
-SmallScaleGameLoop:\r
-keyboardInput$ = INKEY$\r
-IF GraphicsDisplayMode = 1 THEN b = b / 2: GOTO MainGameLoop\r
-IF b > 0 THEN GET (a \ 2, b \ 2)-((a + 20) \ 2, (b + 20) \ 2), PlayerSpriteBufferSmall\r
-IF b > 0 THEN IF PlayerAnimationState = 1 THEN PUT (a \ 2, b \ 2), PlayerRunRight1SpriteSmall, OR\r
-IF b > 0 THEN IF PlayerAnimationState = 2 THEN PUT (a \ 2, b \ 2), PlayerRunRight2SpriteSmall, OR\r
-IF b > 0 THEN IF PlayerAnimationState = 10 THEN PUT (a \ 2, b \ 2), PlayerRunLeft1SpriteSmall, OR\r
-IF b > 0 THEN IF PlayerAnimationState = 20 THEN PUT (a \ 2, b \ 2), PlayerRunLeft2SpriteSmall, OR\r
-IF b > 0 THEN IF PlayerAnimationState = 3 THEN PUT (a \ 2, b \ 2), PlayerJumpingSpriteSmall, OR\r
-\r
-' Draw companions in scaled down mode\r
-GET (Companion1PositionX% \ 2, Companion1PositionY% \ 2)-((Companion1PositionX% + 10) \ 2, (Companion1PositionY% + 10) \ 2), HedgehogSpriteSmall1\r
-PUT (Companion1PositionX% \ 2, Companion1PositionY% \ 2), HedgehogSpriteSmall, OR\r
-GET (Companion2PositionX% \ 2, Companion2PositionY% \ 2)-((Companion2PositionX% + 10) \ 2, (Companion2PositionY% + 10) \ 2), HedgehogSpriteSmall2\r
-PUT (Companion2PositionX% \ 2, Companion2PositionY% \ 2), HedgehogSpriteSmall, OR\r
-\r
-' Small delay to limit framerate\r
-SOUND 0, .8\r
-\r
-' Collision detection system for small scale graphics mode.\r
-' (z = solid block)\r
-' Note: All coordinates are halved compared to normal scale\r
-\r
-' Right side collision checks\r
-IF TerrainGrid((a + 38) \ 20, (b + 37) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
-IF TerrainGrid((a + 38) \ 20, (b + 22) \ 20) = "z" THEN eda = -1: r = 9: lke = 0\r
-\r
-' Left side collision checks\r
-IF TerrainGrid((a + 21) \ 20, (b + 22) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
-IF TerrainGrid((a + 21) \ 20, (b + 37) \ 20) = "z" THEN eda = 1: r = 9: lke = 0\r
-\r
-' Top collision checks\r
-IF TerrainGrid((a + 22) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
-IF TerrainGrid((a + 37) \ 20, (b + 21) \ 20) = "z" THEN all = 0: cd = 10: lke = 0\r
-\r
-' Bottom collision checks (landing on ground)\r
-IF TerrainGrid((a + 22) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
-IF TerrainGrid((a + 37) \ 20, (b + 38) \ 20) = "z" THEN all = -1: r1 = 2: lk = 1: lke = 0\r
-\r
-qwer = qwer + 1: IF ObjectGrid((a + 30) \ 20, (b + 30) \ 20) = "q" AND qwer > 20 THEN qwer = 1: LivesRemaining% = LivesRemaining% - 1: eda = -5: all = -3: DisplayGameStatistics\r
-IF qwer > 100 THEN qwer = 50\r
-\r
-' Coin collection logic\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "1" THEN CoinsCollected% = CoinsCollected% + 1: kustuta1 = 1: DisplayGameStatistics: TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = ""\r
-\r
-' Trampoline effect\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "v" THEN all = -8: PlayerAnimationState = 3\r
-\r
-' Conveyor belt movement triggers\r
-IF ObjectGrid((a + 30) \ 20, (b + 38) \ 20) = ">" THEN eda = 3\r
-IF ObjectGrid((a + 30) \ 20, (b + 38) \ 20) = "<" THEN eda = -3\r
-\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
-\r
-' Breakable block interaction\r
-IF ObjectGrid((a + 30) \ 20, (b + 21) \ 20) = "o" THEN TerrainGrid((a + 30) \ 20, (b + 21) \ 20) = "": ObjectGrid((a + 30) \ 20, (b + 21) \ 20) = "": kustuta = 1\r
-\r
-IF ObjectGrid((a + 30) \ 20, (b + 38) \ 20) = "a" THEN TerrainGrid((a + 30) \ 20, (b + 38) \ 20) = "": ObjectGrid((a + 30) \ 20, (b + 38) \ 20) = "": kustuta2 = 1\r
-\r
-' First companion hedgehog terrain collision checks\r
-IF TerrainGrid((Companion1PositionX% + 25) \ 20, (Companion1PositionY% + 25) \ 20) = "z" THEN Companion1VerticalVelocity = -1\r
-IF TerrainGrid((Companion1PositionX% + 30) \ 20, (Companion1PositionY% + 10) \ 20) = "z" THEN Companion1HorizontalVelocity = -1\r
-IF TerrainGrid((Companion1PositionX% + 20) \ 20, (Companion1PositionY% + 10) \ 20) = "z" THEN Companion1HorizontalVelocity = 1\r
-\r
-' Second companion hedgehog terrain collision checks\r
-IF TerrainGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 25) \ 20) = "z" THEN Companion2VerticalVelocity = -1\r
-IF TerrainGrid((Companion2PositionX% + 30) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN Companion2HorizontalVelocity = -1\r
-IF TerrainGrid((Companion2PositionX% + 20) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN Companion2HorizontalVelocity = 1\r
-\r
-' Screen boundary checks for companions\r
-IF Companion1PositionX% > 600 THEN Companion1HorizontalVelocity = -1\r
-IF Companion1PositionX% < 3 THEN Companion1HorizontalVelocity = 1\r
-IF Companion2PositionX% > 600 THEN Companion2HorizontalVelocity = -1\r
-IF Companion2PositionX% < 3 THEN Companion2HorizontalVelocity = 1\r
-\r
-' Restore previous companion positions\r
-PUT (Companion2PositionX% \ 2, Companion2PositionY% \ 2), HedgehogSpriteSmall2, PSET\r
-PUT (Companion1PositionX% \ 2, Companion1PositionY% \ 2), HedgehogSpriteSmall1, PSET\r
-\r
-' Restore previous player position\r
-IF b > 0 THEN PUT (a \ 2, b \ 2), PlayerSpriteBufferSmall, PSET\r
-\r
-' Handle sprite clearing after coin collection\r
-IF kustuta = 1 THEN kustuta = 0: PUT (((a + 10) \ 20) * 10, (b \ 20) * 10), EmptySpaceSpriteSmall, PSET\r
-IF kustuta1 = 1 THEN kustuta1 = 0: PUT (((a + 10) \ 20) * 10, ((b + 10) \ 20) * 10), EmptySpaceSpriteSmall, PSET\r
-IF kustuta2 = 1 THEN kustuta2 = 0: PUT (((a + 10) \ 20) * 10, ((b + 28) \ 20) * 10), EmptySpaceSpriteSmall, PSET\r
-\r
-IF makk = 1 THEN makk = 0: a = a - 20\r
-\r
-ObjectGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 8) \ 20) = "": ObjectGrid((Companion1PositionX% + 25) \ 20, (Companion1PositionY% + 8) \ 20) = ""\r
-\r
-' Update companion positions\r
-Companion1PositionX% = Companion1PositionX% + Companion1HorizontalVelocity\r
-Companion1PositionY% = Companion1PositionY% + Companion1VerticalVelocity\r
-Companion2PositionX% = Companion2PositionX% + Companion2HorizontalVelocity\r
-Companion2PositionY% = Companion2PositionY% + Companion2VerticalVelocity\r
-\r
-' Mark new companion positions in object grid\r
-ObjectGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 8) \ 20) = "q": ObjectGrid((Companion1PositionX% + 25) \ 20, (Companion1PositionY% + 8) \ 20) = "q"\r
-Companion1VerticalVelocity = Companion1VerticalVelocity + 1: IF Companion1VerticalVelocity > 2 THEN Companion1VerticalVelocity = 2\r
-Companion2VerticalVelocity = Companion2VerticalVelocity + 1: IF Companion2VerticalVelocity > 2 THEN Companion2VerticalVelocity = 2\r
-\r
-' Update player position based on velocity\r
-a = a + eda\r
-b = b + all\r
-\r
-' Level transition when reaching right edge\r
-IF a > 594 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalVelocity = 1: Companion2HorizontalVelocity = 1\r
-\r
-' Level transition when reaching left edge\r
-IF a < 1 THEN a = 594: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode = 1 THEN a = 297\r
-\r
-' Player falls off bottom of screen\r
-IF b > 358 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: b = 100: a = 2: DisplayGameStatistics\r
-\r
-' Teleportation triggers ("u" and "U" markers in level data)\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = DoorExitX% + 5: b = DoorExitY%: eda = 0\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = DoorEntryX% + 5: b = DoorEntryY%: eda = 0\r
-\r
-IF keyboardInput$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
-IF keyboardInput$ = rightArrowKey$ THEN IF sipa = 1 THEN PlayerAnimationState = 1: ELSE PlayerAnimationState = 2\r
-IF keyboardInput$ = leftArrowKey$ THEN IF sipa = 1 THEN PlayerAnimationState = 10: ELSE PlayerAnimationState = 20\r
-IF keyboardInput$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
-IF keyboardInput$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: PlayerAnimationState = 3\r
-IF keyboardInput$ = downArrowKey$ THEN all = all + 1\r
-IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalVelocity = 1: Companion2HorizontalVelocity = 1\r
-IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalVelocity = 1: Companion2HorizontalVelocity = 1\r
-IF keyboardInput$ = "q" THEN END\r
-\r
-sipa = sipa + 1\r
-IF sipa = 3 THEN sipa = 1\r
-\r
-GOTO SmallScaleGameLoop\r
-\r
SUB DisplayGameStatistics\r
'\r
' Updates and displays the game's status information (coins, lives)\r
SELECT CASE y\r
CASE 19\r
CLS\r
- RenderSpriteFromFile 1, 1, 10, 3, 1\r
+ RenderSpriteFromFile 1, 1, 10, 3\r
LOCATE 20, 1\r
PRINT "end"\r
' Wait for 50 frames before accepting input\r
GraphicsDisplayMode% = 2\r
END SELECT\r
END IF\r
-IF GraphicsDisplayMode = 2 THEN GOTO 124\r
FOR e = 0 TO 9\r
FOR D = 0 TO 15\r
q$ = RIGHT$(LEFT$(AsciiLevelData(e + 1), D + 1), 1)\r
IF q$ = "U" THEN PUT (D * 20, e * 20), DoorSprite, PSET: TerrainGrid(D + 1, e + 1) = "U": DoorExitX% = D * 20: DoorExitY% = 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$(AsciiLevelData(e + 1), D + 1), 1)\r
-IF q$ = "m" THEN PUT (D * 10, e * 10), SolidTerrainSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "z"\r
-IF q$ = "o" THEN PUT (D * 10, e * 10), BoxSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "o"\r
-IF q$ = "." THEN PUT (D * 10, e * 10), StarSpriteSmall, PSET\r
-IF q$ = "-" THEN PUT (D * 10, e * 10), CloudSpriteSmall, PSET\r
-IF q$ = "x" THEN Companion1PositionX% = D * 20: Companion1PositionY% = (e + 1) * 20\r
-IF q$ = "y" THEN Companion2PositionX% = D * 20: Companion2PositionY% = (e + 1) * 20\r
-IF q$ = "1" THEN PUT (D * 10, e * 10), CoinSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "1"\r
-IF q$ = "p" THEN PUT (D * 10, (e * 10) + 5), BushSpriteSmall, PSET\r
-IF q$ = "h" THEN PUT (D * 10, e * 10), WindowSpriteSmall, PSET\r
-IF q$ = "v" THEN PUT (D * 10, (e * 10) + 5), TrampolineSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "v"\r
-IF q$ = "t" THEN PUT (D * 10, e * 10), TreeSpriteSmall, PSET\r
-IF q$ = ">" THEN PUT (D * 10, e * 10), RightArrowSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = ">"\r
-IF q$ = "<" THEN PUT (D * 10, e * 10), LeftArrowSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "<"\r
-IF q$ = "a" THEN PUT (D * 10, e * 10), HoleSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "a"\r
-IF q$ = "u" THEN PUT (D * 10, e * 10), DoorSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "u": DoorEntryX% = D * 20: DoorEntryY% = e * 20\r
-IF q$ = "U" THEN PUT (D * 10, e * 10), DoorSpriteSmall, PSET: TerrainGrid(D + 1, e + 1) = "U": DoorExitX% = D * 20: DoorExitY% = e * 20\r
-NEXT D\r
-NEXT e\r
-123\r
END SUB\r
\r
-SUB RenderSpriteFromFile (x%, y%, spriteID%, animationFrame%, scaleFactor%)\r
+SUB RenderSpriteFromFile (x%, y%, spriteID%, animationFrame%)\r
'\r
' Renders a sprite on screen by loading pixel data from external file\r
' File format explanation:\r
' 1 = normal rendering\r
' 50 = horizontally flipped\r
' Other values = scaled rendering (value = scale factor)\r
-' scaleFactor% = Pixel scaling factor (1 = full size, 2 = half size)\r
\r
DIM rowText AS STRING\r
fileName$ = "img/" + LTRIM$(STR$(spriteID%)) + ".i01"\r
\r
' Handle special rendering modes based on animationFrame parameter\r
IF animationFrame% = 50 THEN GOTO DrawFlippedSprite\r
-IF animationFrame% > 1 THEN GOTO DrawScaledSprite\r
\r
-' Normal rendering mode (1:1 pixels)\r
FOR rowIndex% = 1 TO 100\r
IF spritePixelRows(rowIndex%) = "" THEN GOTO FinishDrawing\r
FOR columnIndex% = 1 TO LEN(spritePixelRows(rowIndex%))\r
' Convert character digit to numeric color value (0-3)\r
pixelColor% = ASC(RIGHT$(LEFT$(spritePixelRows(rowIndex%), columnIndex%), 1)) - 48\r
' Calculate actual screen position considering scaleFactor\r
- PSET ((x% + columnIndex%) \ scaleFactor%, (y% + rowIndex%) \ scaleFactor%), pixelColor%\r
- NEXT columnIndex%\r
-NEXT rowIndex%\r
-GOTO FinishDrawing\r
-\r
-DrawScaledSprite:\r
-' Scaled rendering mode (stretches pixels)\r
-FOR rowIndex% = 1 TO 100\r
- IF spritePixelRows(rowIndex%) = "" THEN GOTO FinishDrawing\r
- FOR columnIndex% = 1 TO LEN(spritePixelRows(rowIndex%))\r
- pixelColor% = ASC(RIGHT$(LEFT$(spritePixelRows(rowIndex%), columnIndex%), 1)) - 48\r
- ' Draw filled rectangle instead of single pixel\r
- LINE (x% + (columnIndex% * animationFrame%), y% + (rowIndex% * animationFrame%))-(x% + (columnIndex% * animationFrame%) + animationFrame%, y% + (rowIndex% * animationFrame%) + animationFrame%), pixelColor%, BF\r
+ PSET ((x% + columnIndex%), (y% + rowIndex%)), pixelColor%\r
NEXT columnIndex%\r
NEXT rowIndex%\r
GOTO FinishDrawing\r
IF spritePixelRows(rowIndex%) = "" THEN GOTO FinishDrawing\r
FOR columnIndex% = 1 TO LEN(spritePixelRows(rowIndex%))\r
' Note: X position is mirrored (right-to-left)\r
- PSET ((x% + (LEN(spritePixelRows(rowIndex%)) - columnIndex% + 1)) \ scaleFactor%, (y% + rowIndex%) \ scaleFactor%), ASC(RIGHT$(LEFT$(spritePixelRows(rowIndex%), columnIndex%), 1)) - 48\r
+ PSET ((x% + (LEN(spritePixelRows(rowIndex%)) - columnIndex% + 1)), (y% + rowIndex%)), ASC(RIGHT$(LEFT$(spritePixelRows(rowIndex%), columnIndex%), 1)) - 48\r
NEXT columnIndex%\r
NEXT rowIndex%\r
\r