+DECLARE SUB RenderSpriteFromFile (p%, o%, m%, fr%, teler%)\r
' Pomppu Paavo\r
'\r
' This program is free software: released under Creative Commons Zero (CC0) license\r
a = 50\r
b = 50\r
siie = 1\r
-siie1 = 1\r
+Companion2HorizontalVelocity = 1\r
MainGameLoop:\r
keyboardInput$ = INKEY$\r
IF GraphicsDisplayMode = 2 THEN b = b * 2: GOTO SmallScaleGameLoop\r
\r
' Second companion hedgehog terrain collision checks\r
IF TerrainGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
-IF TerrainGrid((Companion2PositionX% + 30) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN siie1 = -1\r
-IF TerrainGrid((Companion2PositionX% + 20) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN siie1 = 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% > 300 THEN siie = -1\r
IF Companion1PositionX% < 3 THEN siie = 1\r
-IF Companion2PositionX% > 300 THEN siie1 = -1\r
-IF Companion2PositionX% < 3 THEN siie1 = 1\r
+IF Companion2PositionX% > 300 THEN Companion2HorizontalVelocity = -1\r
+IF Companion2PositionX% < 3 THEN Companion2HorizontalVelocity = 1\r
\r
' Restore previous companion positions\r
PUT (Companion2PositionX%, Companion2PositionY%), HedgehogSprite2, PSET\r
' Update companion positions\r
Companion1PositionX% = Companion1PositionX% + siie\r
Companion1PositionY% = Companion1PositionY% + siiall\r
-Companion2PositionX% = Companion2PositionX% + siie1\r
+Companion2PositionX% = Companion2PositionX% + Companion2HorizontalVelocity\r
Companion2PositionY% = Companion2PositionY% + siiall1\r
\r
' Mark new companion positions in object grid\r
b = b + all\r
\r
' Level transition when reaching right edge\r
-IF a > 297 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF a > 297 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: Companion2HorizontalVelocity = 1\r
\r
' Level transition when reaching left edge\r
IF a < 1 THEN a = 296: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode = 2 THEN a = 594\r
IF keyboardInput$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
IF keyboardInput$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
IF keyboardInput$ = downArrowKey$ THEN all = all + 1\r
-IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: Companion2HorizontalVelocity = 1\r
+IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: Companion2HorizontalVelocity = 1\r
IF keyboardInput$ = "q" THEN END\r
sipa = sipa + 1\r
IF sipa = 3 THEN sipa = 1\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)-((siia1 + 10) \ 2, (Companion2PositionY% + 10) \ 2), HedgehogSpriteSmall2\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
-' Check collisions with terrain (z = solid block)\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
' Second companion hedgehog terrain collision checks\r
IF TerrainGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
-IF TerrainGrid((Companion2PositionX% + 30) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN siie1 = -1\r
-IF TerrainGrid((Companion2PositionX% + 20) \ 20, (Companion2PositionY% + 10) \ 20) = "z" THEN siie1 = 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 siie = -1\r
IF Companion1PositionX% < 3 THEN siie = 1\r
-IF Companion2PositionX% > 600 THEN siie1 = -1\r
-IF Companion2PositionX% < 3 THEN siie1 = 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
' Update companion positions\r
Companion1PositionX% = Companion1PositionX% + siie\r
Companion1PositionY% = Companion1PositionY% + siiall\r
-Companion2PositionX% = Companion2PositionX% + siie1\r
+Companion2PositionX% = Companion2PositionX% + Companion2HorizontalVelocity\r
Companion2PositionY% = Companion2PositionY% + siiall1\r
\r
' Mark new companion positions in object grid\r
b = b + all\r
\r
' Level transition when reaching right edge\r
-IF a > 594 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF a > 594 THEN a = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 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
IF keyboardInput$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
IF keyboardInput$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
IF keyboardInput$ = downArrowKey$ THEN all = all + 1\r
-IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF keyboardInput$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: siie = 1: Companion2HorizontalVelocity = 1\r
+IF keyboardInput$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: siie = 1: Companion2HorizontalVelocity = 1\r
IF keyboardInput$ = "q" THEN END\r
\r
sipa = sipa + 1\r
IF LivesRemaining% < 0 THEN END\r
END SUB\r
\r
-SUB RenderSpriteFromFile (p, o, m, fr, teler)\r
-' Renders a sprite on screen loaded from file "img/<m>.i01"\r
-'\r
-' File format: First line = height (number of rows)\r
-' Subsequent lines = strings of digit characters ('0'-'3') representing pixel colors</m>\r
-DIM rowText AS STRING\r
-fileName$ = "img/" + LTRIM$(STR$(m)) + ".i01"\r
-OPEN fileName$ FOR INPUT AS #1\r
-INPUT #1, height%\r
-DIM ao(1 TO 100) AS STRING\r
-FOR a = 1 TO height%\r
-LINE INPUT #1, ao(a)\r
-NEXT a\r
-CLOSE #1\r
-IF fr = 50 THEN GOTO DrawFlippedSprite\r
-IF fr > 1 THEN GOTO DrawScaledSprite\r
-FOR a = 1 TO 100 ' Normal sprite\r
-IF ao(a) = "" THEN GOTO FinishDrawing\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 FinishDrawing\r
-DrawScaledSprite: ' Scaled sprite\r
-FOR a = 1 TO 100\r
-IF ao(a) = "" THEN GOTO FinishDrawing\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 FinishDrawing\r
-DrawFlippedSprite: ' Horizontally flipped sprite\r
-FOR a = 1 TO 100\r
-IF ao(a) = "" THEN GOTO FinishDrawing\r
-FOR b = 1 TO LEN(ao(a))\r
-PSET ((p + (LEN(ao(a)) - b + 1)) \ teler, (o + a) \ teler), ASC(RIGHT$(LEFT$(ao(a), b), 1)) - 48\r
-NEXT b\r
-NEXT a\r
-FinishDrawing:\r
-ERASE ao\r
-END SUB\r
-\r
SUB LoadCurrentLevel (y)\r
125\r
Companion1PositionX% = 0\r
NEXT D\r
NEXT e\r
123\r
-END SUB
\ No newline at end of file
+END SUB\r
+\r
+SUB RenderSpriteFromFile (p, o, m, fr, teler)\r
+' Renders a sprite on screen loaded from file "img/<m>.i01"\r
+'\r
+' File format: First line = height (number of rows)\r
+' Subsequent lines = strings of digit characters ('0'-'3') representing pixel colors</m>\r
+DIM rowText AS STRING\r
+fileName$ = "img/" + LTRIM$(STR$(m)) + ".i01"\r
+OPEN fileName$ FOR INPUT AS #1\r
+INPUT #1, height%\r
+DIM ao(1 TO 100) AS STRING\r
+FOR a = 1 TO height%\r
+LINE INPUT #1, ao(a)\r
+NEXT a\r
+CLOSE #1\r
+IF fr = 50 THEN GOTO DrawFlippedSprite\r
+IF fr > 1 THEN GOTO DrawScaledSprite\r
+FOR a = 1 TO 100 ' Normal sprite\r
+IF ao(a) = "" THEN GOTO FinishDrawing\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 FinishDrawing\r
+DrawScaledSprite: ' Scaled sprite\r
+FOR a = 1 TO 100\r
+IF ao(a) = "" THEN GOTO FinishDrawing\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 FinishDrawing\r
+DrawFlippedSprite: ' Horizontally flipped sprite\r
+FOR a = 1 TO 100\r
+IF ao(a) = "" THEN GOTO FinishDrawing\r
+FOR b = 1 TO LEN(ao(a))\r
+PSET ((p + (LEN(ao(a)) - b + 1)) \ teler, (o + a) \ teler), ASC(RIGHT$(LEFT$(ao(a), b), 1)) - 48\r
+NEXT b\r
+NEXT a\r
+FinishDrawing:\r
+ERASE ao\r
+END SUB\r
+\r