-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% > 300 THEN Companion1HorizontalVelocity = -1\r
-IF Companion1PositionX% < 3 THEN Companion1HorizontalVelocity = 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
-PUT (Companion1PositionX%, Companion1PositionY%), HedgehogSprite1, PSET\r
-\r
-' Restore previous player position\r
-IF b > 0 THEN PUT (a, b), PlayerSpriteBuffer, PSET\r
-\r
-' Handle sprite clearing after coin collection\r
-IF kustuta = 1 THEN kustuta = 0: PUT (((a + 10) \ 20) * 20, (b \ 20) * 20), EmptySpaceSprite, PSET\r
-IF kustuta1 = 1 THEN kustuta1 = 0: PUT (((a + 10) \ 20) * 20, ((b + 10) \ 20) * 20), EmptySpaceSprite, PSET\r
-IF kustuta2 = 1 THEN kustuta2 = 0: PUT (((a + 10) \ 20) * 20, ((b + 28) \ 20) * 20), EmptySpaceSprite, 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
-\r
-' Apply gravity to companions (max downward velocity = 2)\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 > 297 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 = 296: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber%: ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode = 2 THEN a = 594\r
-\r
-' Player falls off bottom of screen\r
-IF b > 179 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: b = 100: a = 2: DisplayGameStatistics\r
-\r
-' Teleportation triggers ("u" and "U" markers in level data)\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "u" THEN a = DoorExitX% + 10: b = DoorExitY%: eda = 0\r
-IF TerrainGrid((a + 30) \ 20, (b + 30) \ 20) = "U" THEN a = DoorEntryX% + 10: b = DoorEntryY%: eda = 0\r
-\r
-IF 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 TerrainGrid((Companion2HorizontalPosition% + 25) \ 20, (Companion2VerticalPosition% + 25) \ 20) = "z" THEN Companion2VerticalSpeed% = -1\r
+IF TerrainGrid((Companion2HorizontalPosition% + 30) \ 20, (Companion2VerticalPosition% + 10) \ 20) = "z" THEN Companion2HorizontalSpeed% = -1\r
+IF TerrainGrid((Companion2HorizontalPosition% + 20) \ 20, (Companion2VerticalPosition% + 10) \ 20) = "z" THEN Companion2HorizontalSpeed% = 1\r
+\r
+' Screen boundary checks for companions to keep them within play area\r
+IF Companion1HorizontalPosition% > 300 THEN Companion1HorizontalSpeed% = -1\r
+IF Companion1HorizontalPosition% < 3 THEN Companion1HorizontalSpeed% = 1\r
+IF Companion2HorizontalPosition% > 300 THEN Companion2HorizontalSpeed% = -1\r
+IF Companion2HorizontalPosition% < 3 THEN Companion2HorizontalSpeed% = 1\r
+\r
+' Restore previous companion positions before moving them (erases old sprite)\r
+PUT (Companion2HorizontalPosition%, Companion2VerticalPosition%), HedgehogSprite2, PSET\r
+PUT (Companion1HorizontalPosition%, Companion1VerticalPosition%), HedgehogSprite1, PSET\r
+\r
+' Restore previous player position (erases old sprite)\r
+IF PlayerYPosition% > 0 THEN PUT (PlayerXPosition%, PlayerYPosition%), PlayerSpriteBuffer, PSET\r
+\r
+' Handle sprite clearing after collecting coins or breaking blocks\r
+IF TopBreakableBlockClearedFlag% = 1 THEN TopBreakableBlockClearedFlag% = 0: PUT (((PlayerXPosition% + 10) \ 20) * 20, (PlayerYPosition% \ 20) * 20), EmptySpaceSprite, PSET\r
+IF CoinCollectedFlag% = 1 THEN CoinCollectedFlag% = 0: PUT (((PlayerXPosition% + 10) \ 20) * 20, ((PlayerYPosition% + 10) \ 20) * 20), EmptySpaceSprite, PSET\r
+IF BottomBreakableBlockClearedFlag% = 1 THEN BottomBreakableBlockClearedFlag% = 0: PUT (((PlayerXPosition% + 10) \ 20) * 20, ((PlayerYPosition% + 28) \ 20) * 20), EmptySpaceSprite, PSET\r
+\r
+IF PullBackwardFlag% = 1 THEN PullBackwardFlag% = 0: PlayerXPosition% = PlayerXPosition% - 20\r
+\r
+ObjectGrid((Companion2HorizontalPosition% + 25) \ 20, (Companion2VerticalPosition% + 8) \ 20) = "": ObjectGrid((Companion1HorizontalPosition% + 25) \ 20, (Companion1VerticalPosition% + 8) \ 20) = ""\r
+\r
+' Update companion positions based on their current velocities\r
+Companion1HorizontalPosition% = Companion1HorizontalPosition% + Companion1HorizontalSpeed%\r
+Companion1VerticalPosition% = Companion1VerticalPosition% + Companion1VerticalSpeed%\r
+Companion2HorizontalPosition% = Companion2HorizontalPosition% + Companion2HorizontalSpeed%\r
+Companion2VerticalPosition% = Companion2VerticalPosition% + Companion2VerticalSpeed%\r
+\r
+' Mark new companion positions in object grid for collision detection\r
+ObjectGrid((Companion2HorizontalPosition% + 25) \ 20, (Companion2VerticalPosition% + 8) \ 20) = "q": ObjectGrid((Companion1HorizontalPosition% + 25) \ 20, (Companion1VerticalPosition% + 8) \ 20) = "q"\r
+\r
+' Apply gravity to companions (max downward speed capped at 2 pixels/frame)\r
+Companion1VerticalSpeed% = Companion1VerticalSpeed% + 1: IF Companion1VerticalSpeed% > 2 THEN Companion1VerticalSpeed% = 2\r
+Companion2VerticalSpeed% = Companion2VerticalSpeed% + 1: IF Companion2VerticalSpeed% > 2 THEN Companion2VerticalSpeed% = 2\r
+\r
+' Update player position based on calculated velocities\r
+PlayerXPosition% = PlayerXPosition% + PlayerHorizontalSpeed%\r
+PlayerYPosition% = PlayerYPosition% + PlayerVerticalSpeed%\r
+\r
+' Level transition when reaching right edge of screen\r
+IF PlayerXPosition% > 297 THEN PlayerXPosition% = 2: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalSpeed% = 1: Companion2HorizontalSpeed% = 1\r
+\r
+' Level transition when reaching left edge of screen\r
+IF PlayerXPosition% < 1 THEN PlayerXPosition% = 296: IF CurrentLevelNumber% = 1 THEN LoadCurrentLevel CurrentLevelNumber% ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: IF GraphicsDisplayMode% = 2 THEN _\r
+PlayerXPosition% = 594\r
+\r
+' Player falls off bottom of screen - lose life and restart level\r
+IF PlayerYPosition% > 179 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadCurrentLevel CurrentLevelNumber%: PlayerYPosition% = 100: PlayerXPosition% = 2: DisplayGameStatistics\r
+\r
+' Teleportation triggers ("u" and "U" markers in level data create door pairs)\r
+IF TerrainGrid((PlayerXPosition% + 30) \ 20, (PlayerYPosition% + 30) \ 20) = "u" THEN PlayerXPosition% = DoorExitX% + 10: PlayerYPosition% = DoorExitY%: PlayerHorizontalSpeed% = 0\r
+IF TerrainGrid((PlayerXPosition% + 30) \ 20, (PlayerYPosition% + 30) \ 20) = "U" THEN PlayerXPosition% = DoorEntryX% + 10: PlayerYPosition% = DoorEntryY%: PlayerHorizontalSpeed% = 0\r
+\r
+' Handle keyboard input for movement controls\r
+IF keyboardInput$ = rightArrowKey$ THEN PlayerHorizontalSpeed% = PlayerHorizontalSpeed% + 1: IF PlayerHorizontalSpeed% > 3 THEN PlayerHorizontalSpeed% = 3: HorizontalAnimationCounter% = 0 ELSE IF GroundContactTime% > 10 THEN PlayerHorizontalSpeed% = 5\r
+IF keyboardInput$ = rightArrowKey$ THEN IF RunningAnimationStage% = 1 THEN PlayerAnimationState% = 1 ELSE PlayerAnimationState% = 2\r
+IF keyboardInput$ = leftArrowKey$ THEN IF RunningAnimationStage% = 1 THEN PlayerAnimationState% = 10 ELSE PlayerAnimationState% = 20\r
+IF keyboardInput$ = leftArrowKey$ THEN PlayerHorizontalSpeed% = PlayerHorizontalSpeed% - 1: IF PlayerHorizontalSpeed% < -3 THEN PlayerHorizontalSpeed% = -3: HorizontalAnimationCounter% = 0 ELSE IF GroundContactTime% > 10 THEN PlayerHorizontalSpeed% = -5\r
+IF keyboardInput$ = upArrowKey$ AND JumpReadinessCounter% < 10 THEN PlayerVerticalSpeed% = PlayerVerticalSpeed% - 5: JumpReadinessCounter% = 20: VerticalAnimationCounter% = 0: PlayerAnimationState% = 3\r
+IF keyboardInput$ = downArrowKey$ THEN PlayerVerticalSpeed% = PlayerVerticalSpeed% + 1\r
+IF keyboardInput$ = "/" THEN PlayerXPosition% = 2: PlayerYPosition% = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalSpeed% = 1: Companion2HorizontalSpeed% = 1\r
+IF keyboardInput$ = "+" THEN PlayerXPosition% = 2: PlayerYPosition% = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadCurrentLevel CurrentLevelNumber%: Companion1HorizontalSpeed% = 1: Companion2HorizontalSpeed% = 1\r