Better code readability
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 24 Aug 2025 19:06:49 +0000 (22:06 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 24 Aug 2025 19:06:49 +0000 (22:06 +0300)
Games/Pomppu Paavo/Pomppu Paavo.bas

index 907daef..edba001 100755 (executable)
@@ -1,3 +1,4 @@
+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
@@ -215,7 +216,7 @@ LoadCurrentLevel 1
 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
@@ -284,14 +285,14 @@ IF TerrainGrid((Companion1PositionX% + 20) \ 20, (Companion1PositionY% + 10) \ 2
 \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
@@ -312,7 +313,7 @@ ObjectGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 8) \ 20) =
 ' 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
@@ -327,7 +328,7 @@ a = a + eda
 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
@@ -345,8 +346,8 @@ IF keyboardInput$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp =
 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
@@ -366,13 +367,16 @@ IF b > 0 THEN IF sipp = 3 THEN PUT (a \ 2, b \ 2), sippm3, OR
 ' 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
@@ -419,14 +423,14 @@ IF TerrainGrid((Companion1PositionX% + 20) \ 20, (Companion1PositionY% + 10) \ 2
 \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
@@ -447,7 +451,7 @@ ObjectGrid((Companion2PositionX% + 25) \ 20, (Companion2PositionY% + 8) \ 20) =
 ' 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
@@ -460,7 +464,7 @@ a = a + eda
 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
@@ -478,8 +482,8 @@ IF keyboardInput$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp =
 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
@@ -515,49 +519,6 @@ SkipTextDisplay:
 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
@@ -683,4 +644,48 @@ IF q$ = "U" THEN PUT (D * 10, e * 10), DoorSpriteSmall, PSET: TerrainGrid(D + 1,
 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