Move Pomppu Paavo to own directory
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Fri, 22 Aug 2025 19:45:10 +0000 (22:45 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Fri, 22 Aug 2025 19:45:10 +0000 (22:45 +0300)
16 files changed:
2D GFX/Fractals/index.html
2D GFX/Spirals/index.html
2D GFX/Textures/index.html
3D GFX/3D Synthezier/doc/index.html
3D GFX/Miscellaneous/index.html
3D GFX/Space/index.html
Games/Pomppu Paavo.bas [deleted file]
Games/Pomppu Paavo.png [deleted file]
Games/Pomppu Paavo/Pomppu Paavo.bas [new file with mode: 0755]
Games/Pomppu Paavo/Pomppu Paavo.png [new file with mode: 0644]
Math/Plotting/index.html
Math/Simulation/index.html
Math/Truth table/index.html
Miscellaneous/Mouse driver/index.html
Networking/Digital data over analog audio/index.html
Networking/LPT communication driver/index.html

index 038a6d0..cd95ce4 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:38 -->
+<!-- 2025-08-21 to 21:52 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Fractals</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org42e4a0e">1. Fractal circles</a></li>
-<li><a href="#org938330e">2. Fractal circles animated</a></li>
-<li><a href="#orgea51240">3. Fractal of squares</a></li>
-<li><a href="#org02cc95c">4. Fractal of squares animated</a></li>
-<li><a href="#orgde91374">5. Fractal of trees</a></li>
+<li><a href="#orgfb15af5">1. Fractal circles</a></li>
+<li><a href="#org75bfc16">2. Fractal circles animated</a></li>
+<li><a href="#org0866228">3. Fractal of squares</a></li>
+<li><a href="#orgcb5baa7">4. Fractal of squares animated</a></li>
+<li><a href="#orgb5ac4f1">5. Fractal of trees</a></li>
 </ul>
 </div>
 </div>
 </style>
 
 
-<div id="outline-container-org42e4a0e" class="outline-2">
-<h2 id="org42e4a0e"><span class="section-number-2">1.</span> Fractal circles</h2>
+<div id="outline-container-orgfb15af5" class="outline-2">
+<h2 id="orgfb15af5"><span class="section-number-2">1.</span> Fractal circles</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program generates a visually captivating spiral fractal
@@ -247,7 +247,7 @@ geometry, recursive programming, and graphical design.
 </p>
 
 
-<div id="org849866d" class="figure">
+<div id="org0191231" class="figure">
 <p><a href="fractal circles.bas" class="responsive-img"><img src="fractal%20circles.png" alt="fractal%20circles.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -266,8 +266,8 @@ indefinitely.</dd>
 </div>
 </div>
 
-<div id="outline-container-org938330e" class="outline-2">
-<h2 id="org938330e"><span class="section-number-2">2.</span> Fractal circles animated</h2>
+<div id="outline-container-org75bfc16" class="outline-2">
+<h2 id="org75bfc16"><span class="section-number-2">2.</span> Fractal circles animated</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program creates an animated fractal composed of circles,
@@ -287,29 +287,29 @@ system to control the animation's progression.
 </div>
 </div>
 
-<div id="outline-container-orgea51240" class="outline-2">
-<h2 id="orgea51240"><span class="section-number-2">3.</span> Fractal of squares</h2>
+<div id="outline-container-org0866228" class="outline-2">
+<h2 id="org0866228"><span class="section-number-2">3.</span> Fractal of squares</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program generates and displays a fractal pattern composed of squares.
 </p>
 
 
-<div id="orgef5948f" class="figure">
+<div id="org92a5fd7" class="figure">
 <p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%201.png" alt="fractal%20squares,%201.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="orgfc784cd" class="figure">
+<div id="org4d30426" class="figure">
 <p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%202.png" alt="fractal%20squares,%202.png" class="responsive-img" /></a>
 </p>
 </div>
 </div>
 </div>
 
-<div id="outline-container-org02cc95c" class="outline-2">
-<h2 id="org02cc95c"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
+<div id="outline-container-orgcb5baa7" class="outline-2">
+<h2 id="orgcb5baa7"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program generates an animated fractal pattern composed of
@@ -331,8 +331,8 @@ resulting in a dynamic and ever-changing geometric pattern.
 </div>
 </div>
 
-<div id="outline-container-orgde91374" class="outline-2">
-<h2 id="orgde91374"><span class="section-number-2">5.</span> Fractal of trees</h2>
+<div id="outline-container-orgb5ac4f1" class="outline-2">
+<h2 id="orgb5ac4f1"><span class="section-number-2">5.</span> Fractal of trees</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 QBasic program that generates a visually appealing fractal tree
@@ -355,7 +355,7 @@ resembles a tree, with branches that grow and change over time.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:38</p>
+<p class="date">Created: 2025-08-21 to 21:52</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index f485729..f99da9b 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:38 -->
+<!-- 2025-08-21 to 21:52 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Spiral series</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orga0d32a0">1. Spiral with increasing density</a></li>
-<li><a href="#org76bc215">2. Spiral with varying height</a></li>
-<li><a href="#org09d3dce">3. Shaded spiral</a></li>
-<li><a href="#org49c7277">4. Sphere forming spiral</a></li>
-<li><a href="#org2e5ec26">5. Textured spherical spiral</a></li>
-<li><a href="#org673b4e9">6. Textured and shaded spherical spiral</a></li>
+<li><a href="#orgae221d0">1. Spiral with increasing density</a></li>
+<li><a href="#orgc328487">2. Spiral with varying height</a></li>
+<li><a href="#org5341573">3. Shaded spiral</a></li>
+<li><a href="#org9ab51c3">4. Sphere forming spiral</a></li>
+<li><a href="#orgfc68305">5. Textured spherical spiral</a></li>
+<li><a href="#orgcac15fb">6. Textured and shaded spherical spiral</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-orga0d32a0" class="outline-2">
-<h2 id="orga0d32a0"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
+<div id="outline-container-orgae221d0" class="outline-2">
+<h2 id="orgae221d0"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
 <div class="outline-text-2" id="text-1">
 
-<div id="org233ed88" class="figure">
+<div id="orgdec2c57" class="figure">
 <p><img src="spiral.png" alt="spiral.png" class="responsive-img" />
 </p>
 </div>
@@ -320,11 +320,11 @@ userInput$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org76bc215" class="outline-2">
-<h2 id="org76bc215"><span class="section-number-2">2.</span> Spiral with varying height</h2>
+<div id="outline-container-orgc328487" class="outline-2">
+<h2 id="orgc328487"><span class="section-number-2">2.</span> Spiral with varying height</h2>
 <div class="outline-text-2" id="text-2">
 
-<div id="org9168230" class="figure">
+<div id="org63ab393" class="figure">
 <p><img src="spiral, 2.png" alt="spiral, 2.png" class="responsive-img" />
 </p>
 </div>
@@ -391,11 +391,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org09d3dce" class="outline-2">
-<h2 id="org09d3dce"><span class="section-number-2">3.</span> Shaded spiral</h2>
+<div id="outline-container-org5341573" class="outline-2">
+<h2 id="org5341573"><span class="section-number-2">3.</span> Shaded spiral</h2>
 <div class="outline-text-2" id="text-3">
 
-<div id="org5b5881a" class="figure">
+<div id="orgeb59b9b" class="figure">
 <p><img src="spiral, 3.png" alt="spiral, 3.png" class="responsive-img" />
 </p>
 </div>
@@ -497,8 +497,8 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org49c7277" class="outline-2">
-<h2 id="org49c7277"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
+<div id="outline-container-org9ab51c3" class="outline-2">
+<h2 id="org9ab51c3"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 Similar to previous spiral, Line segments are connected between the
@@ -507,7 +507,7 @@ multiple linked spherical shapes. Initially point cloud in shown:
 </p>
 
 
-<div id="org2337537" class="figure">
+<div id="orge412474" class="figure">
 <p><img src="spiral, 4, 1.png" alt="spiral, 4, 1.png" class="responsive-img" />
 </p>
 </div>
@@ -517,7 +517,7 @@ In the next step, points are connected using lines:
 </p>
 
 
-<div id="org2ca1549" class="figure">
+<div id="org138ed4a" class="figure">
 <p><img src="spiral, 4, 2.png" alt="spiral, 4, 2.png" class="responsive-img" />
 </p>
 </div>
@@ -622,11 +622,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org2e5ec26" class="outline-2">
-<h2 id="org2e5ec26"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
+<div id="outline-container-orgfc68305" class="outline-2">
+<h2 id="orgfc68305"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
 <div class="outline-text-2" id="text-5">
 
-<div id="org07f7473" class="figure">
+<div id="org77ad57c" class="figure">
 <p><img src="spiral, 5.png" alt="spiral, 5.png" class="responsive-img" />
 </p>
 </div>
@@ -749,11 +749,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org673b4e9" class="outline-2">
-<h2 id="org673b4e9"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
+<div id="outline-container-orgcac15fb" class="outline-2">
+<h2 id="orgcac15fb"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
 <div class="outline-text-2" id="text-6">
 
-<div id="orgd48d0b0" class="figure">
+<div id="org60ad66f" class="figure">
 <p><img src="spiral, 6.png" alt="spiral, 6.png" class="responsive-img" />
 </p>
 </div>
@@ -937,7 +937,7 @@ yStep2 = (oppositePointY2 - oppositePointY1) / stepCount
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:38</p>
+<p class="date">Created: 2025-08-21 to 21:52</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 5e8f67e..ad92071 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:39 -->
+<!-- 2025-08-21 to 21:52 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Algorithmic textures</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org4172501">1. Circular waves</a></li>
-<li><a href="#org716ee27">2. Diamond square clouds</a></li>
-<li><a href="#org51c0242">3. Old paper</a></li>
-<li><a href="#orgc283a0f">4. Wood</a></li>
-<li><a href="#org74f85f3">5. Yellow flame</a></li>
+<li><a href="#orga669494">1. Circular waves</a></li>
+<li><a href="#org39d824a">2. Diamond square clouds</a></li>
+<li><a href="#orga08e07e">3. Old paper</a></li>
+<li><a href="#org392c78a">4. Wood</a></li>
+<li><a href="#org7417c70">5. Yellow flame</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org4172501" class="outline-2">
-<h2 id="org4172501"><span class="section-number-2">1.</span> Circular waves</h2>
+<div id="outline-container-orga669494" class="outline-2">
+<h2 id="orga669494"><span class="section-number-2">1.</span> Circular waves</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program creates visually captivating circular wave
@@ -313,8 +313,8 @@ algorithms can produce intricate and visually appealing results.
 </div>
 </div>
 
-<div id="outline-container-org716ee27" class="outline-2">
-<h2 id="org716ee27"><span class="section-number-2">2.</span> Diamond square clouds</h2>
+<div id="outline-container-org39d824a" class="outline-2">
+<h2 id="org39d824a"><span class="section-number-2">2.</span> Diamond square clouds</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program demonstrates the Diamond-Square algorithm, a
@@ -429,8 +429,8 @@ WAITa$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org51c0242" class="outline-2">
-<h2 id="org51c0242"><span class="section-number-2">3.</span> Old paper</h2>
+<div id="outline-container-orga08e07e" class="outline-2">
+<h2 id="orga08e07e"><span class="section-number-2">3.</span> Old paper</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program generates a procedural texture that simulates the
@@ -527,8 +527,8 @@ inputKey$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-orgc283a0f" class="outline-2">
-<h2 id="orgc283a0f"><span class="section-number-2">4.</span> Wood</h2>
+<div id="outline-container-org392c78a" class="outline-2">
+<h2 id="org392c78a"><span class="section-number-2">4.</span> Wood</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program creates a visually appealing simulation of a wood
@@ -622,8 +622,8 @@ exitKey$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org74f85f3" class="outline-2">
-<h2 id="org74f85f3"><span class="section-number-2">5.</span> Yellow flame</h2>
+<div id="outline-container-org7417c70" class="outline-2">
+<h2 id="org7417c70"><span class="section-number-2">5.</span> Yellow flame</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 "Yellow Flame" is a visually captivating program written in QBasic
@@ -702,7 +702,7 @@ userInput$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:39</p>
+<p class="date">Created: 2025-08-21 to 21:52</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index a6a111f..a3436a1 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:40 -->
+<!-- 2025-08-21 to 21:54 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>3D Synthezier</title>
@@ -1103,39 +1103,39 @@ hsAddReviewPanels();
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org6985cf4">1. Operating principle</a>
+<li><a href="#org2c63533">1. Operating principle</a>
 <ul>
-<li><a href="#org9a49685">1.1. Rectangular city</a></li>
-<li><a href="#org7117577">1.2. Hexagonal city</a></li>
+<li><a href="#org5b17288">1.1. Rectangular city</a></li>
+<li><a href="#orge6cbbc5">1.2. Hexagonal city</a></li>
 </ul>
 </li>
-<li><a href="#orgd22055c">2. Scene description language</a>
+<li><a href="#org8d87596">2. Scene description language</a>
 <ul>
-<li><a href="#org402b3b4">2.1. here</a></li>
-<li><a href="#org3b76413">2.2. p</a></li>
-<li><a href="#org2253fc8">2.3. f</a></li>
-<li><a href="#org4463c29">2.4. warn</a></li>
-<li><a href="#org02c2663">2.5. end</a></li>
-<li><a href="#org577eff7">2.6. mtl</a></li>
-<li><a href="#orgf0c8b8e">2.7. mtlrnd</a></li>
-<li><a href="#orgccd43e9">2.8. obj</a></li>
-<li><a href="#org9302011">2.9. rnd</a></li>
-<li><a href="#orgbd69f4d">2.10. #</a></li>
-<li><a href="#org9584409">2.11. out</a></li>
-<li><a href="#org0fafa26">2.12. set</a></li>
-<li><a href="#org24912e2">2.13. variables usage</a></li>
-<li><a href="#orgc9998b0">2.14. cmp</a></li>
-<li><a href="#orgf4e8e2a">2.15. ?</a></li>
-<li><a href="#org780b765">2.16. dum</a></li>
+<li><a href="#orgd49bf1f">2.1. here</a></li>
+<li><a href="#org7efb8d7">2.2. p</a></li>
+<li><a href="#org47127ef">2.3. f</a></li>
+<li><a href="#orgc621be4">2.4. warn</a></li>
+<li><a href="#org103e495">2.5. end</a></li>
+<li><a href="#org77f3318">2.6. mtl</a></li>
+<li><a href="#org4b07dfa">2.7. mtlrnd</a></li>
+<li><a href="#org089a549">2.8. obj</a></li>
+<li><a href="#org71f165f">2.9. rnd</a></li>
+<li><a href="#orgfc39c52">2.10. #</a></li>
+<li><a href="#org8c68fec">2.11. out</a></li>
+<li><a href="#org7a1a36b">2.12. set</a></li>
+<li><a href="#org0774706">2.13. variables usage</a></li>
+<li><a href="#org11fa56e">2.14. cmp</a></li>
+<li><a href="#orgf38af62">2.15. ?</a></li>
+<li><a href="#org783609f">2.16. dum</a></li>
 </ul>
 </li>
-<li><a href="#org8c506b2">3. Installation</a>
+<li><a href="#org9207184">3. Installation</a>
 <ul>
-<li><a href="#org50a66ee">3.1. System requirements</a></li>
-<li><a href="#orgc818d58">3.2. Directory layout</a></li>
+<li><a href="#orgec89826">3.1. System requirements</a></li>
+<li><a href="#org1b70e65">3.2. Directory layout</a></li>
 </ul>
 </li>
-<li><a href="#orgda8a075">4. Usage</a></li>
+<li><a href="#orgf1405a7">4. Usage</a></li>
 </ul>
 </div>
 </div>
@@ -1157,8 +1157,8 @@ hsAddReviewPanels();
 </style>
 
 
-<div id="outline-container-org6985cf4" class="outline-2">
-<h2 id="org6985cf4"><span class="section-number-2">1.</span> Operating principle</h2>
+<div id="outline-container-org2c63533" class="outline-2">
+<h2 id="org2c63533"><span class="section-number-2">1.</span> Operating principle</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 Parses scene definition language and creates 3D world based on
@@ -1221,60 +1221,60 @@ They were produced by importing generated <a href="https://en.wikipedia.org/wiki
 </p>
 </div>
 
-<div id="outline-container-org9a49685" class="outline-3">
-<h3 id="org9a49685"><span class="section-number-3">1.1.</span> Rectangular city</h3>
+<div id="outline-container-org5b17288" class="outline-3">
+<h3 id="org5b17288"><span class="section-number-3">1.1.</span> Rectangular city</h3>
 <div class="outline-text-3" id="text-1-1">
 
-<div id="org420f818" class="figure">
+<div id="org163841b" class="figure">
 <p><img src="rectangular city, 1.jpeg" alt="rectangular city, 1.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="orgb966f5c" class="figure">
+<div id="org4766dac" class="figure">
 <p><img src="rectangular city, 2.jpeg" alt="rectangular city, 2.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="org78d5d19" class="figure">
+<div id="orge195542" class="figure">
 <p><img src="rectangular city, 3.jpeg" alt="rectangular city, 3.jpeg" class="responsive-img" />
 </p>
 </div>
 </div>
 </div>
-<div id="outline-container-org7117577" class="outline-3">
-<h3 id="org7117577"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
+<div id="outline-container-orge6cbbc5" class="outline-3">
+<h3 id="orge6cbbc5"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
 <div class="outline-text-3" id="text-1-2">
 
-<div id="orgb099bb4" class="figure">
+<div id="org983cf9e" class="figure">
 <p><img src="hexagonal city, 1.jpeg" alt="hexagonal city, 1.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="orgde44976" class="figure">
+<div id="org273bba7" class="figure">
 <p><img src="hexagonal city, 2.jpeg" alt="hexagonal city, 2.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="orgaad919d" class="figure">
+<div id="orgb55402c" class="figure">
 <p><img src="hexagonal city, 3.jpeg" alt="hexagonal city, 3.jpeg" class="responsive-img" />
 </p>
 </div>
 </div>
 </div>
 </div>
-<div id="outline-container-orgd22055c" class="outline-2">
-<h2 id="orgd22055c"><span class="section-number-2">2.</span> Scene description language</h2>
+<div id="outline-container-org8d87596" class="outline-2">
+<h2 id="org8d87596"><span class="section-number-2">2.</span> Scene description language</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 See also examples.
 </p>
 </div>
-<div id="outline-container-org402b3b4" class="outline-3">
-<h3 id="org402b3b4"><span class="section-number-3">2.1.</span> here</h3>
+<div id="outline-container-orgd49bf1f" class="outline-3">
+<h3 id="orgd49bf1f"><span class="section-number-3">2.1.</span> here</h3>
 <div class="outline-text-3" id="text-2-1">
 <pre class="example">
 here
@@ -1285,8 +1285,8 @@ defines new segment
 </p>
 </div>
 </div>
-<div id="outline-container-org3b76413" class="outline-3">
-<h3 id="org3b76413"><span class="section-number-3">2.2.</span> p</h3>
+<div id="outline-container-org7efb8d7" class="outline-3">
+<h3 id="org7efb8d7"><span class="section-number-3">2.2.</span> p</h3>
 <div class="outline-text-3" id="text-2-2">
 <pre class="example">
 p  x y z
@@ -1297,8 +1297,8 @@ defines new point
 </p>
 </div>
 </div>
-<div id="outline-container-org2253fc8" class="outline-3">
-<h3 id="org2253fc8"><span class="section-number-3">2.3.</span> f</h3>
+<div id="outline-container-org47127ef" class="outline-3">
+<h3 id="org47127ef"><span class="section-number-3">2.3.</span> f</h3>
 <div class="outline-text-3" id="text-2-3">
 <pre class="example">
 f  p1 p2 p3 p4
@@ -1309,8 +1309,8 @@ defines new polygon,  p4  may be unused
 </p>
 </div>
 </div>
-<div id="outline-container-org4463c29" class="outline-3">
-<h3 id="org4463c29"><span class="section-number-3">2.4.</span> warn</h3>
+<div id="outline-container-orgc621be4" class="outline-3">
+<h3 id="orgc621be4"><span class="section-number-3">2.4.</span> warn</h3>
 <div class="outline-text-3" id="text-2-4">
 <pre class="example">
 warn  &lt;message&gt;
@@ -1321,8 +1321,8 @@ displays warning message, and wait for key
 </p>
 </div>
 </div>
-<div id="outline-container-org02c2663" class="outline-3">
-<h3 id="org02c2663"><span class="section-number-3">2.5.</span> end</h3>
+<div id="outline-container-org103e495" class="outline-3">
+<h3 id="org103e495"><span class="section-number-3">2.5.</span> end</h3>
 <div class="outline-text-3" id="text-2-5">
 <pre class="example">
 end
@@ -1333,8 +1333,8 @@ terminates parser
 </p>
 </div>
 </div>
-<div id="outline-container-org577eff7" class="outline-3">
-<h3 id="org577eff7"><span class="section-number-3">2.6.</span> mtl</h3>
+<div id="outline-container-org77f3318" class="outline-3">
+<h3 id="org77f3318"><span class="section-number-3">2.6.</span> mtl</h3>
 <div class="outline-text-3" id="text-2-6">
 <pre class="example">
 mtl  material
@@ -1345,8 +1345,8 @@ selects material
 </p>
 </div>
 </div>
-<div id="outline-container-orgf0c8b8e" class="outline-3">
-<h3 id="orgf0c8b8e"><span class="section-number-3">2.7.</span> mtlrnd</h3>
+<div id="outline-container-org4b07dfa" class="outline-3">
+<h3 id="org4b07dfa"><span class="section-number-3">2.7.</span> mtlrnd</h3>
 <div class="outline-text-3" id="text-2-7">
 <pre class="example">
 mtlrnd  material ...
@@ -1357,8 +1357,8 @@ selects random material from list
 </p>
 </div>
 </div>
-<div id="outline-container-orgccd43e9" class="outline-3">
-<h3 id="orgccd43e9"><span class="section-number-3">2.8.</span> obj</h3>
+<div id="outline-container-org089a549" class="outline-3">
+<h3 id="org089a549"><span class="section-number-3">2.8.</span> obj</h3>
 <div class="outline-text-3" id="text-2-8">
 <pre class="example">
 obj  object xz45 xy20 x+3 y*2
@@ -1373,14 +1373,14 @@ directly from file, and not chached, to allow loading of greater than
 </p>
 
 
-<div id="org7d55bcc" class="figure">
+<div id="org67744d0" class="figure">
 <p><img src="rotation.png" alt="rotation.png" />
 </p>
 </div>
 </div>
 </div>
-<div id="outline-container-org9302011" class="outline-3">
-<h3 id="org9302011"><span class="section-number-3">2.9.</span> rnd</h3>
+<div id="outline-container-org71f165f" class="outline-3">
+<h3 id="org71f165f"><span class="section-number-3">2.9.</span> rnd</h3>
 <div class="outline-text-3" id="text-2-9">
 <pre class="example">
 rnd  p^1^2^3 p^7^2^1
@@ -1391,8 +1391,8 @@ select random command to execute, ^ will be converted to spaces.
 </p>
 </div>
 </div>
-<div id="outline-container-orgbd69f4d" class="outline-3">
-<h3 id="orgbd69f4d"><span class="section-number-3">2.10.</span> #</h3>
+<div id="outline-container-orgfc39c52" class="outline-3">
+<h3 id="orgfc39c52"><span class="section-number-3">2.10.</span> #</h3>
 <div class="outline-text-3" id="text-2-10">
 <pre class="example">
 # whatever text
@@ -1403,8 +1403,8 @@ comment
 </p>
 </div>
 </div>
-<div id="outline-container-org9584409" class="outline-3">
-<h3 id="org9584409"><span class="section-number-3">2.11.</span> out</h3>
+<div id="outline-container-org8c68fec" class="outline-3">
+<h3 id="org8c68fec"><span class="section-number-3">2.11.</span> out</h3>
 <div class="outline-text-3" id="text-2-11">
 <pre class="example">
 out  file
@@ -1415,8 +1415,8 @@ specify output file name, must be first command
 </p>
 </div>
 </div>
-<div id="outline-container-org0fafa26" class="outline-3">
-<h3 id="org0fafa26"><span class="section-number-3">2.12.</span> set</h3>
+<div id="outline-container-org7a1a36b" class="outline-3">
+<h3 id="org7a1a36b"><span class="section-number-3">2.12.</span> set</h3>
 <div class="outline-text-3" id="text-2-12">
 <pre class="example">
 set  variable  contents
@@ -1428,8 +1428,8 @@ string. max variables is 100. first is 0.
 </p>
 </div>
 </div>
-<div id="outline-container-org24912e2" class="outline-3">
-<h3 id="org24912e2"><span class="section-number-3">2.13.</span> variables usage</h3>
+<div id="outline-container-org0774706" class="outline-3">
+<h3 id="org0774706"><span class="section-number-3">2.13.</span> variables usage</h3>
 <div class="outline-text-3" id="text-2-13">
 <pre class="example">
 anycommand %1 anything
@@ -1440,8 +1440,8 @@ inserts variable 1 contents info line
 </p>
 </div>
 </div>
-<div id="outline-container-orgc9998b0" class="outline-3">
-<h3 id="orgc9998b0"><span class="section-number-3">2.14.</span> cmp</h3>
+<div id="outline-container-org11fa56e" class="outline-3">
+<h3 id="org11fa56e"><span class="section-number-3">2.14.</span> cmp</h3>
 <div class="outline-text-3" id="text-2-14">
 <pre class="example">
 cmp  flag string1 string2
@@ -1452,8 +1452,8 @@ compares strings, and inserts TRUE to flag, if they are equal, else inserts FALS
 </p>
 </div>
 </div>
-<div id="outline-container-orgf4e8e2a" class="outline-3">
-<h3 id="orgf4e8e2a"><span class="section-number-3">2.15.</span> ?</h3>
+<div id="outline-container-orgf38af62" class="outline-3">
+<h3 id="orgf38af62"><span class="section-number-3">2.15.</span> ?</h3>
 <div class="outline-text-3" id="text-2-15">
 <pre class="example">
 ?flag anycommand
@@ -1468,8 +1468,8 @@ exapmle: ?3 obj car z*2 xy45
 </p>
 </div>
 </div>
-<div id="outline-container-org780b765" class="outline-3">
-<h3 id="org780b765"><span class="section-number-3">2.16.</span> dum</h3>
+<div id="outline-container-org783609f" class="outline-3">
+<h3 id="org783609f"><span class="section-number-3">2.16.</span> dum</h3>
 <div class="outline-text-3" id="text-2-16">
 <pre class="example">
 dum
@@ -1482,16 +1482,16 @@ dummy function, does notheing
 </div>
 </div>
 
-<div id="outline-container-org8c506b2" class="outline-2">
-<h2 id="org8c506b2"><span class="section-number-2">3.</span> Installation</h2>
+<div id="outline-container-org9207184" class="outline-2">
+<h2 id="org9207184"><span class="section-number-2">3.</span> Installation</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </p>
 </div>
 
-<div id="outline-container-org50a66ee" class="outline-3">
-<h3 id="org50a66ee"><span class="section-number-3">3.1.</span> System requirements</h3>
+<div id="outline-container-orgec89826" class="outline-3">
+<h3 id="orgec89826"><span class="section-number-3">3.1.</span> System requirements</h3>
 <div class="outline-text-3" id="text-3-1">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1522,8 +1522,8 @@ Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </div>
 </div>
 
-<div id="outline-container-orgc818d58" class="outline-3">
-<h3 id="orgc818d58"><span class="section-number-3">3.2.</span> Directory layout</h3>
+<div id="outline-container-org1b70e65" class="outline-3">
+<h3 id="org1b70e65"><span class="section-number-3">3.2.</span> Directory layout</h3>
 <div class="outline-text-3" id="text-3-2">
 <dl class="org-dl">
 <dt>bin</dt><dd><dl class="org-dl">
@@ -1540,8 +1540,8 @@ Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </div>
 </div>
 
-<div id="outline-container-orgda8a075" class="outline-2">
-<h2 id="orgda8a075"><span class="section-number-2">4.</span> Usage</h2>
+<div id="outline-container-orgf1405a7" class="outline-2">
+<h2 id="orgf1405a7"><span class="section-number-2">4.</span> Usage</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 Make sure you have QB binaries in your PATH.  Execute
@@ -1566,7 +1566,7 @@ Visualize scene with your favourite renderer.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:40</p>
+<p class="date">Created: 2025-08-21 to 21:54</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 721c910..4038c39 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:40 -->
+<!-- 2025-08-21 to 21:54 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Miscellaneous 3D graphics demos</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orga4a72f5">1. Rotating exclamation mark</a></li>
-<li><a href="#org31b8ab6">2. 3D bouncing ball</a></li>
-<li><a href="#org72ab268">3. 3D text in a room</a></li>
-<li><a href="#org6b1db02">4. 3D bouncing cubes on grid floor</a></li>
-<li><a href="#org3861f6e">5. Matrix math for rotation in 3D space</a></li>
-<li><a href="#org14f2c0a">6. Maze explorer</a></li>
-<li><a href="#org40429a3">7. Tank animation</a></li>
-<li><a href="#org54bfd8f">8. Tiled room</a></li>
+<li><a href="#org0b0dc59">1. Rotating exclamation mark</a></li>
+<li><a href="#org939b492">2. 3D bouncing ball</a></li>
+<li><a href="#orge8aeef4">3. 3D text in a room</a></li>
+<li><a href="#orgd43ac71">4. 3D bouncing cubes on grid floor</a></li>
+<li><a href="#orgf642fb9">5. Matrix math for rotation in 3D space</a></li>
+<li><a href="#org03d66c4">6. Maze explorer</a></li>
+<li><a href="#orgf2c9be3">7. Tank animation</a></li>
+<li><a href="#orgc1f33e4">8. Tiled room</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-orga4a72f5" class="outline-2">
-<h2 id="orga4a72f5"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
+<div id="outline-container-org0b0dc59" class="outline-2">
+<h2 id="org0b0dc59"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 Wireframe 3D model of a rotating exclamation mark.
@@ -258,8 +258,8 @@ Wireframe 3D model of a rotating exclamation mark.
 </div>
 </div>
 
-<div id="outline-container-org31b8ab6" class="outline-2">
-<h2 id="org31b8ab6"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
+<div id="outline-container-org939b492" class="outline-2">
+<h2 id="org939b492"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program creates a visually engaging 3D animation of a
@@ -280,8 +280,8 @@ of early computer graphics techniques.
 </div>
 </div>
 
-<div id="outline-container-org72ab268" class="outline-2">
-<h2 id="org72ab268"><span class="section-number-2">3.</span> 3D text in a room</h2>
+<div id="outline-container-orge8aeef4" class="outline-2">
+<h2 id="orge8aeef4"><span class="section-number-2">3.</span> 3D text in a room</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 Wireframe 3D text hanging in a wireframe 3D room. User can look and
@@ -301,8 +301,8 @@ fly around in all directions.
 </div>
 </div>
 
-<div id="outline-container-org6b1db02" class="outline-2">
-<h2 id="org6b1db02"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
+<div id="outline-container-orgd43ac71" class="outline-2">
+<h2 id="orgd43ac71"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 3D wireframe cubes bouncing on a grid floor, creating an immersive and
@@ -322,8 +322,8 @@ dynamic visual effect.
 </div>
 </div>
 
-<div id="outline-container-org3861f6e" class="outline-2">
-<h2 id="org3861f6e"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
+<div id="outline-container-orgf642fb9" class="outline-2">
+<h2 id="orgf642fb9"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 Instead of combining simple 2D rotors, pixels in this 3D space are
@@ -343,8 +343,8 @@ rotated by using matrix multiplications.
 </div>
 </div>
 
-<div id="outline-container-org14f2c0a" class="outline-2">
-<h2 id="org14f2c0a"><span class="section-number-2">6.</span> Maze explorer</h2>
+<div id="outline-container-org03d66c4" class="outline-2">
+<h2 id="org03d66c4"><span class="section-number-2">6.</span> Maze explorer</h2>
 <div class="outline-text-2" id="text-6">
 <p>
 The Evolving 3D Maze Explorer is a QBasic program that generates and
@@ -355,7 +355,7 @@ changes as they navigate through it.
 </p>
 
 
-<div id="orgfb16485" class="figure">
+<div id="orgff7a5f9" class="figure">
 <p><a href="Maze%20explorer.bas" class="responsive-img"><img src="Maze%20explorer.png" alt="Maze%20explorer.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -366,8 +366,8 @@ changes as they navigate through it.
 </div>
 </div>
 
-<div id="outline-container-org40429a3" class="outline-2">
-<h2 id="org40429a3"><span class="section-number-2">7.</span> Tank animation</h2>
+<div id="outline-container-orgf2c9be3" class="outline-2">
+<h2 id="orgf2c9be3"><span class="section-number-2">7.</span> Tank animation</h2>
 <div class="outline-text-2" id="text-7">
 <p>
 Animated tank driving through the bridge back and forward. User can
@@ -387,8 +387,8 @@ look and fly around in all directions.
 </div>
 </div>
 
-<div id="outline-container-org54bfd8f" class="outline-2">
-<h2 id="org54bfd8f"><span class="section-number-2">8.</span> Tiled room</h2>
+<div id="outline-container-orgc1f33e4" class="outline-2">
+<h2 id="orgc1f33e4"><span class="section-number-2">8.</span> Tiled room</h2>
 <div class="outline-text-2" id="text-8">
 <p>
 Room with some tiles on the wall and on the floor. User can freely fly
@@ -409,7 +409,7 @@ around.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:40</p>
+<p class="date">Created: 2025-08-21 to 21:54</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 23dd250..c31ff99 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:41 -->
+<!-- 2025-08-21 to 21:54 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Space themed 3D graphics</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgbad8929">1. Galaxy explorer</a></li>
-<li><a href="#org94730f6">2. Rocket simulator</a></li>
-<li><a href="#orgd116ebc">3. Stars</a></li>
-<li><a href="#orga52d044">4. Universe explorer</a></li>
+<li><a href="#org488fbd1">1. Galaxy explorer</a></li>
+<li><a href="#org5f807c1">2. Rocket simulator</a></li>
+<li><a href="#orgf1c78fb">3. Stars</a></li>
+<li><a href="#orgd0388c4">4. Universe explorer</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-orgbad8929" class="outline-2">
-<h2 id="orgbad8929"><span class="section-number-2">1.</span> Galaxy explorer</h2>
+<div id="outline-container-org488fbd1" class="outline-2">
+<h2 id="org488fbd1"><span class="section-number-2">1.</span> Galaxy explorer</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program renders a navigable 3D point cloud galaxy,
@@ -245,7 +245,7 @@ galaxy with stars distributed in a spiral pattern.
 </p>
 
 
-<div id="org6bc4e3e" class="figure">
+<div id="org7a73982" class="figure">
 <p><a href="Galaxy%20explorer.bas" class="responsive-img"><img src="Galaxy%20explorer.png" alt="Galaxy%20explorer.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -256,8 +256,8 @@ galaxy with stars distributed in a spiral pattern.
 </div>
 </div>
 
-<div id="outline-container-org94730f6" class="outline-2">
-<h2 id="org94730f6"><span class="section-number-2">2.</span> Rocket simulator</h2>
+<div id="outline-container-org5f807c1" class="outline-2">
+<h2 id="org5f807c1"><span class="section-number-2">2.</span> Rocket simulator</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 QBasic program that simulates the takeoff and flight of a rocket from
@@ -279,8 +279,8 @@ observe the rocket's trajectory from various angles.
 </div>
 </div>
 
-<div id="outline-container-orgd116ebc" class="outline-2">
-<h2 id="orgd116ebc"><span class="section-number-2">3.</span> Stars</h2>
+<div id="outline-container-orgf1c78fb" class="outline-2">
+<h2 id="orgf1c78fb"><span class="section-number-2">3.</span> Stars</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 The 3D Starfield Simulation is a QBasic program that creates a
@@ -320,8 +320,8 @@ based on its distance, with closer stars appearing brighter.</dd>
 </div>
 </div>
 
-<div id="outline-container-orga52d044" class="outline-2">
-<h2 id="orga52d044"><span class="section-number-2">4.</span> Universe explorer</h2>
+<div id="outline-container-orgd0388c4" class="outline-2">
+<h2 id="orgd0388c4"><span class="section-number-2">4.</span> Universe explorer</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program that simulates a navigable 3D universe. Users can
@@ -358,19 +358,19 @@ limiting the number of rendered objects based on distance.</dd>
 </dl>
 
 
-<div id="org24d8744" class="figure">
+<div id="org8412950" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/1.png" alt="1.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="org4484559" class="figure">
+<div id="org1dea067" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/2.png" alt="2.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="org4b399b5" class="figure">
+<div id="org94e3b3a" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/3.png" alt="3.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -382,7 +382,7 @@ limiting the number of rendered objects based on distance.</dd>
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:41</p>
+<p class="date">Created: 2025-08-21 to 21:54</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
diff --git a/Games/Pomppu Paavo.bas b/Games/Pomppu Paavo.bas
deleted file mode 100755 (executable)
index 92ccdd9..0000000
+++ /dev/null
@@ -1,1309 +0,0 @@
-' Pomppu Paavo\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
-' 1998, Initial version\r
-' 2025, Improved program readability\r
-\r
-\r
-DECLARE SUB DisplayGameStatistics ()\r
-DECLARE SUB LoadLevel (y%)\r
-DECLARE SUB DrawSprite (p%, o%, m%, fr%, teler%)\r
-\r
-DEFINT A-Z\r
-DIM SHARED graphicsMode\r
-DIM SHARED asciiLevelData(1 TO 20) AS STRING * 31\r
-DIM SHARED FirstCompanionY%, FirstCompanionX%, SecondCompanionY%, SecondCompanionX%\r
-DIM SHARED LivesRemaining%, CoinsCollected%\r
-DIM SHARED DoorEntryX%, DoorEntryY%, DoorExitX%, DoorExitY%\r
-DIM SHARED CurrentLevelNumber%\r
-DIM SHARED TerrainGrid(0 TO 34, -10 TO 20) AS STRING * 1\r
-DIM SHARED ObjectGrid(0 TO 34, -10 TO 20) AS STRING * 1\r
-\r
-' Full scale sprites\r
-DIM SHARED SolidTerrainSprite(51)\r
-DIM SHARED EmptySpaceSprite(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 CoinSprite(30)\r
-DIM SHARED poosas(100)\r
-DIM SHARED WindowSprite(100)\r
-DIM SHARED TrampolineSprite(50)\r
-DIM SHARED IntroScreen(6000)\r
-DIM SHARED TreeSprite(3000)\r
-DIM SHARED noolt(51)\r
-DIM SHARED noolt1(51)\r
-DIM SHARED HoleSprite(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 DoorSprite(120)\r
-\r
-' Small scale sprites (S suffix is used)\r
-DIM SHARED SolidTerrainSpriteSmall(51)\r
-DIM SHARED EmptySpaceSpriteSmall(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 CoinSpriteSmall(30)\r
-DIM SHARED poosasm(100)\r
-DIM SHARED WindowSpriteSmall(100)\r
-DIM SHARED TrampolineSpriteSmall(50)\r
-DIM SHARED TreeSpriteSmall(3000)\r
-DIM SHARED nooltm(51)\r
-DIM SHARED nooltm1(51)\r
-DIM SHARED HoleSpriteSmall(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 DoorSpriteSmall(50)\r
-\r
-leftArrowKey$ = CHR$(0) + "K"\r
-rightArrowKey$ = CHR$(0) + "M"\r
-upArrowKey$ = CHR$(0) + "H"\r
-downArrowKey$ = CHR$(0) + "P"\r
-\r
-LivesRemaining% = 10\r
-\r
-SCREEN 1\r
-CurrentLevelNumber% = 1\r
-\r
-' Capture sprite images from screen drawing operations\r
-GET (1, 1)-(20, 20), EmptySpaceSprite\r
-DrawSprite 0, 0, 1, 1, 1\r
-GET (1, 1)-(20, 20), SolidTerrainSprite\r
-DrawSprite 0, 0, 4, 1, 1\r
-GET (1, 1)-(20, 20), kast\r
-PUT (1, 180), SolidTerrainSprite, PSET\r
-PUT (300, 1), SolidTerrainSprite, PSET\r
-PUT (300, 180), SolidTerrainSprite, PSET\r
-DrawSprite 30, 50, 2, 1, 1\r
-GET (31, 51)-(91, 76), pilv\r
-PUT (160, 10), pilv, PSET\r
-DrawSprite 20, 100, 3, 1, 1\r
-GET (21, 101)-(31, 114), taht\r
-CLS\r
-DrawSprite 0, 0, 5, 1, 1\r
-GET (1, 1)-(11, 8), siil\r
-CLS\r
-DrawSprite 0, 0, 6, 1, 1\r
-GET (1, 1)-(8, 10), CoinSprite\r
-CLS\r
-DrawSprite 0, 0, 7, 1, 1\r
-GET (1, 1)-(31, 11), poosas\r
-CLS\r
-DrawSprite 0, 0, 8, 1, 1\r
-GET (1, 1)-(26, 21), WindowSprite\r
-CLS\r
-DrawSprite 0, 0, 9, 1, 1\r
-GET (1, 1)-(21, 11), TrampolineSprite\r
-CLS\r
-DrawSprite 0, 0, 11, 1, 1\r
-GET (1, 1)-(51, 81), TreeSprite\r
-CLS\r
-DrawSprite 0, 0, 12, 1, 1\r
-GET (1, 1)-(20, 20), noolt\r
-CLS\r
-DrawSprite 0, 0, 12, 50, 1\r
-GET (1, 1)-(20, 20), noolt1\r
-CLS\r
-DrawSprite 0, 0, 13, 1, 1\r
-GET (1, 1)-(20, 20), HoleSprite\r
-CLS\r
-DrawSprite 0, 0, 14, 1, 1\r
-GET (1, 1)-(20, 20), sipp1\r
-CLS\r
-DrawSprite 0, 0, 15, 1, 1\r
-GET (1, 1)-(20, 20), sipp2\r
-CLS\r
-DrawSprite 0, 0, 14, 50, 1\r
-GET (1, 1)-(20, 20), sipp10\r
-CLS\r
-DrawSprite 0, 0, 15, 50, 1\r
-GET (1, 1)-(20, 20), sipp20\r
-CLS\r
-DrawSprite 0, 0, 16, 1, 1\r
-GET (1, 1)-(20, 20), sipp3\r
-CLS\r
-\r
-\r
-' Capture small scale versions of sprites\r
-GET (1, 1)-(10, 10), EmptySpaceSpriteSmall\r
-DrawSprite 0, 0, 1, 1, 2\r
-GET (1, 1)-(10, 10), SolidTerrainSpriteSmall\r
-DrawSprite 0, 0, 4, 1, 2\r
-GET (1, 1)-(10, 10), kastm\r
-PUT (1, 180), SolidTerrainSprite, PSET\r
-PUT (300, 1), SolidTerrainSprite, PSET\r
-PUT (300, 180), SolidTerrainSprite, PSET\r
-DrawSprite 30, 50, 2, 1, 2\r
-GET (16, 26)-(46, 38), pilvm\r
-DrawSprite 20, 100, 3, 1, 2\r
-GET (11, 51)-(16, 72), tahtm\r
-CLS\r
-DrawSprite 0, 0, 5, 1, 2\r
-GET (1, 1)-(6, 4), siilm\r
-CLS\r
-DrawSprite 0, 0, 6, 1, 2\r
-GET (1, 1)-(4, 5), CoinSpriteSmall\r
-CLS\r
-DrawSprite 0, 0, 7, 1, 2\r
-GET (1, 1)-(16, 6), poosasm\r
-CLS\r
-DrawSprite 0, 0, 8, 1, 2\r
-GET (1, 1)-(13, 11), WindowSpriteSmall\r
-CLS\r
-DrawSprite 0, 0, 9, 1, 2\r
-GET (1, 1)-(11, 6), TrampolineSpriteSmall\r
-CLS\r
-DrawSprite 0, 0, 11, 1, 2\r
-GET (1, 1)-(26, 41), TreeSpriteSmall\r
-CLS\r
-DrawSprite 0, 0, 12, 1, 2\r
-GET (1, 1)-(10, 10), nooltm\r
-CLS\r
-DrawSprite 0, 0, 12, 50, 2\r
-GET (1, 1)-(10, 10), nooltm1\r
-CLS\r
-DrawSprite 0, 0, 13, 1, 2\r
-GET (1, 1)-(10, 10), HoleSpriteSmall\r
-CLS\r
-DrawSprite 0, 0, 14, 1, 2\r
-GET (1, 1)-(10, 10), sippm1\r
-CLS\r
-DrawSprite 0, 0, 15, 1, 2\r
-GET (1, 1)-(10, 10), sippm2\r
-CLS\r
-DrawSprite 0, 0, 14, 50, 2\r
-GET (1, 1)-(10, 10), sippm10\r
-CLS\r
-DrawSprite 0, 0, 15, 50, 2\r
-GET (1, 1)-(10, 10), sippm20\r
-CLS\r
-DrawSprite 0, 0, 16, 1, 2\r
-GET (1, 1)-(10, 10), sippm3\r
-CLS\r
-DrawSprite 0, 0, 17, 1, 1\r
-GET (1, 1)-(21, 31), DoorSprite\r
-CLS\r
-DrawSprite 0, 0, 17, 1, 2\r
-GET (1, 1)-(11, 16), IntroScreen\r
-CLS\r
-\r
-DrawSprite -1, -1, 10, 4, 1\r
-GET (1, 1)-(318, 124), IntroScreen\r
-\r
-key$ = INPUT$(1)\r
-\r
-LoadLevel 1\r
-a = 50\r
-b = 50\r
-siie = 1\r
-siie1 = 1\r
-MainGameLoop:\r
-kbd$ = INKEY$\r
-IF graphicsMode = 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
-' Draw first companion hedgehog\r
-GET (FirstCompanionX%, FirstCompanionY%)-(FirstCompanionX% + 10, FirstCompanionY% + 10), siil1\r
-PUT (FirstCompanionX%, FirstCompanionY%), siil, OR\r
-\r
-' Draw second companion hedgehog\r
-GET (SecondCompanionX%, SecondCompanionY%)-(SecondCompanionX% + 10, SecondCompanionY% + 10), siil2\r
-PUT (SecondCompanionX%, SecondCompanionY%), siil, OR\r
-\r
-' Create short delay using sound command (workaround for no built-in delay)\r
-SOUND 0, .8\r
-\r
-' Check collisions with terrain (z = solid block)\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 = -10: all = -5: 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: sipp = 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((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 25) \ 20) = "z" THEN siiall = -1\r
-IF TerrainGrid((FirstCompanionX% + 30) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = -1\r
-IF TerrainGrid((FirstCompanionX% + 20) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = 1\r
-\r
-' Second companion hedgehog terrain collision checks\r
-IF TerrainGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
-IF TerrainGrid((SecondCompanionX% + 30) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = -1\r
-IF TerrainGrid((SecondCompanionX% + 20) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = 1\r
-\r
-' Screen boundary checks for companions\r
-IF FirstCompanionX% > 300 THEN siie = -1\r
-IF FirstCompanionX% < 3 THEN siie = 1\r
-IF SecondCompanionX% > 300 THEN siie1 = -1\r
-IF SecondCompanionX% < 3 THEN siie1 = 1\r
-\r
-' Restore previous companion positions\r
-PUT (SecondCompanionX%, SecondCompanionY%), siil2, PSET\r
-PUT (FirstCompanionX%, FirstCompanionY%), siil1, PSET\r
-\r
-' Restore previous player position\r
-IF b > 0 THEN PUT (a, b), mar1, 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((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = ""\r
-\r
-' Update companion positions\r
-FirstCompanionX% = FirstCompanionX% + siie\r
-FirstCompanionY% = FirstCompanionY% + siiall\r
-SecondCompanionX% = SecondCompanionX% + siie1\r
-SecondCompanionY% = SecondCompanionY% + siiall1\r
-\r
-' Mark new companion positions in object grid\r
-ObjectGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "q": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = "q"\r
-\r
-' Apply gravity to companions (max downward velocity = 2)\r
-siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
-siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 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: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-\r
-' Level transition when reaching left edge\r
-IF a < 1 THEN a = 296: IF CurrentLevelNumber% = 1 THEN LoadLevel CurrentLevelNumber%:  ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel CurrentLevelNumber%: IF graphicsMode = 2 THEN a = 594\r
-\r
-' Player falls off bottom of screen\r
-IF b > 179 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel 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 kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
-IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1:  ELSE sipp = 2\r
-IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp = 20\r
-IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
-IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
-IF kbd$ = downArrowKey$ THEN all = all + 1\r
-IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "q" THEN END\r
-sipa = sipa + 1\r
-IF sipa = 3 THEN sipa = 1\r
-GOTO MainGameLoop\r
-\r
-\r
-106\r
-kbd$ = INKEY$\r
-IF graphicsMode = 1 THEN b = b / 2: GOTO MainGameLoop\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
-' Draw companions in scaled down mode\r
-GET (FirstCompanionX% \ 2, FirstCompanionY% \ 2)-((FirstCompanionX% + 10) \ 2, (FirstCompanionY% + 10) \ 2), siilm1\r
-PUT (FirstCompanionX% \ 2, FirstCompanionY% \ 2), siilm, OR\r
-GET (SecondCompanionX% \ 2, SecondCompanionY% \ 2)-((siia1 + 10) \ 2, (SecondCompanionY% + 10) \ 2), siilm2\r
-PUT (SecondCompanionX% \ 2, SecondCompanionY% \ 2), siilm, OR\r
-\r
-' Small delay to limit framerate\r
-SOUND 0, .8\r
-\r
-' Check collisions with terrain (z = solid block)\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: sipp = 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((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 25) \ 20) = "z" THEN siiall = -1\r
-IF TerrainGrid((FirstCompanionX% + 30) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = -1\r
-IF TerrainGrid((FirstCompanionX% + 20) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = 1\r
-\r
-' Second companion hedgehog terrain collision checks\r
-IF TerrainGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
-IF TerrainGrid((SecondCompanionX% + 30) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = -1\r
-IF TerrainGrid((SecondCompanionX% + 20) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = 1\r
-\r
-' Screen boundary checks for companions\r
-IF FirstCompanionX% > 600 THEN siie = -1\r
-IF FirstCompanionX% < 3 THEN siie = 1\r
-IF SecondCompanionX% > 600 THEN siie1 = -1\r
-IF SecondCompanionX% < 3 THEN siie1 = 1\r
-\r
-' Restore previous companion positions\r
-PUT (SecondCompanionX% \ 2, SecondCompanionY% \ 2), siilm2, PSET\r
-PUT (FirstCompanionX% \ 2, FirstCompanionY% \ 2), siilm1, PSET\r
-\r
-' Restore previous player position\r
-IF b > 0 THEN PUT (a \ 2, b \ 2), marm1, 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((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = ""\r
-\r
-' Update companion positions\r
-FirstCompanionX% = FirstCompanionX% + siie\r
-FirstCompanionY% = FirstCompanionY% + siiall\r
-SecondCompanionX% = SecondCompanionX% + siie1\r
-SecondCompanionY% = SecondCompanionY% + siiall1\r
-\r
-' Mark new companion positions in object grid\r
-ObjectGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "q": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = "q"\r
-siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
-siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 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: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-\r
-' Level transition when reaching left edge\r
-IF a < 1 THEN a = 594: IF CurrentLevelNumber% = 1 THEN LoadLevel CurrentLevelNumber%:  ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel CurrentLevelNumber%: IF graphicsMode = 1 THEN a = 297\r
-\r
-' Player falls off bottom of screen\r
-IF b > 358 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel 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 kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
-IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1:  ELSE sipp = 2\r
-IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp = 20\r
-IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
-IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
-IF kbd$ = downArrowKey$ THEN all = all + 1\r
-IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
-IF kbd$ = "q" THEN END\r
-\r
-sipa = sipa + 1\r
-IF sipa = 3 THEN sipa = 1\r
-\r
-GOTO 106\r
-\r
-SUB DisplayGameStatistics\r
-'\r
-' Updates and displays the game's status information (coins collected, lives remaining)\r
-' Handles game over condition when lives reach zero.\r
-'\r
-' This subroutine is called whenever the game state changes that affects statistics:\r
-' - When a coin is collected\r
-' - When the player loses a life\r
-' - Periodically during gameplay\r
-\r
-LOCATE 1, 1\r
-IF GraphicsMode% = 2 THEN GOTO SkipTextDisplay\r
-\r
-' Clear previous stats display\r
-PRINT "                "\r
-\r
-' Award extra life every 10 coins collected\r
-IF CoinsCollected% > 9 THEN CoinsCollected% = 0: LivesRemaining% = LivesRemaining% + 1\r
-\r
-' Display current game statistics\r
-LOCATE 1, 1\r
-PRINT "o "; CoinsCollected%; "  Lives "; LivesRemaining%\r
-\r
-SkipTextDisplay:\r
-' Check if player has run out of lives\r
-IF LivesRemaining% < 0 THEN END\r
-END SUB\r
-\r
-SUB DrawSprite (p, o, m, fr, teler)\r
-\r
-' Renders a sprite on screen based on predefined character patterns.\r
-'\r
-' How it works:\r
-' The subroutine uses a lookup table (ao array) containing string representations\r
-' of each sprite. Each character in these strings represents a pixel color.\r
-' Depending on the parameters, it either:\r
-'   - Draws individual pixels (ScaleFactor=1)\r
-'   - Draws filled rectangles for each pixel (ScaleFactor>1 but not 50)\r
-'   - Draws flipped version of individual pixels (SpriteVariant=50)\r
-'\r
-' This flexible approach allows the same sprite data to be rendered at different\r
-' sizes and orientations without storing multiple copies of the sprite data.\r
-\r
-DIM ao(1 TO 100) AS STRING\r
-SELECT CASE m\r
-CASE 1 ' Solid block pattern\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 ' Cloud sprite\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
-\r
-ao(1) = "00000000022220000000"\r
-ao(2) = "00000000022220000000"\r
-ao(3) = "00000000022222000000"\r
-ao(4) = "00000000033333000000"\r
-ao(5) = "00000000033333300000"\r
-ao(6) = "00000000033333300000"\r
-ao(7) = "00000000003333000000"\r
-ao(8) = "00000000011100000000"\r
-ao(9) = "00000003111130000000"\r
-ao(10) = "00000003111130000000"\r
-ao(11) = "00000003111130000000"\r
-ao(12) = "00000003111133000000"\r
-ao(13) = "00000003111130000000"\r
-ao(14) = "00000003111130000000"\r
-ao(15) = "00000000333300000000"\r
-ao(16) = "00000000333300000000"\r
-ao(17) = "00000003303300000000"\r
-ao(18) = "00000003303300000000"\r
-ao(19) = "00000033302220000000"\r
-ao(20) = "00000022200000000000"\r
-\r
-\r
-CASE 15\r
-ao(1) = "00000000022220000000"\r
-ao(2) = "00000000022220000000"\r
-ao(3) = "00000000022222000000"\r
-ao(4) = "00000000033333000000"\r
-ao(5) = "00000000033333300000"\r
-ao(6) = "00000000033333300000"\r
-ao(7) = "00000000003333000000"\r
-ao(8) = "00000000011100000000"\r
-ao(9) = "00000003111130000000"\r
-ao(10) = "00000003111130000000"\r
-ao(11) = "00000003111130000000"\r
-ao(12) = "00000033111130000000"\r
-ao(13) = "00000003111130000000"\r
-ao(14) = "00000003111130000000"\r
-ao(15) = "00000000333300000000"\r
-ao(16) = "00000000333300000000"\r
-ao(17) = "00000000330330000000"\r
-ao(18) = "00000000330330000000"\r
-ao(19) = "00000002220333000000"\r
-ao(20) = "00000000000222000000"\r
-\r
-CASE 16\r
-\r
-ao(1) = "00000000022220000000"\r
-ao(2) = "00000000022220000000"\r
-ao(3) = "00000000022222000000"\r
-ao(4) = "00000000033333000000"\r
-ao(5) = "00000000033333300000"\r
-ao(6) = "00000000033333300000"\r
-ao(7) = "00000000103330100000"\r
-ao(8) = "00000001111111000000"\r
-ao(9) = "00000000311130000000"\r
-ao(10) = "00000000311130000000"\r
-ao(11) = "00000000311130000000"\r
-ao(12) = "00000000311130000000"\r
-ao(13) = "00000000311130000000"\r
-ao(14) = "00000000311130000000"\r
-ao(15) = "00000000333300000000"\r
-ao(16) = "00000000333300000000"\r
-ao(17) = "00000000330330000000"\r
-ao(18) = "00000000330330000000"\r
-ao(19) = "00000000330330000000"\r
-ao(20) = "00000000222222000000"\r
-\r
-CASE 17 ' Door sprite\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 DrawFlippedSprite\r
-IF fr > 1 THEN GOTO DrawScaledSprite\r
-\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
-\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
-\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 + b) \ teler, (o + a) \ teler), ASC(LEFT$(RIGHT$(ao(a), b), 1)) - 48\r
-NEXT b\r
-NEXT a\r
-\r
-FinishDrawing:\r
-ERASE ao\r
-END SUB\r
-\r
-SUB LoadLevel (y)\r
-125\r
-FirstCompanionX% = 0\r
-FirstCompanionY% = 0\r
-aiia1 = 0\r
-SecondCompanionY% = 0\r
-FOR a1 = 1 TO 32\r
-  FOR b1 = 1 TO 20\r
-    TerrainGrid(a1, b1) = ""\r
-    ObjectGrid(a1, b1) = ""\r
-  NEXT b1\r
-NEXT a1\r
-\r
-FOR a = 1 TO 10\r
-  asciiLevelData(a) = ""\r
-NEXT a\r
-\r
-CLS\r
-LOCATE 3, 10\r
-\r
-SELECT CASE y\r
-CASE 1\r
-asciiLevelData(1) = "             mmm"\r
-asciiLevelData(2) = "    -       m mm"\r
-asciiLevelData(3) = "        .  - mmm"\r
-asciiLevelData(4) = "o   .  .    mymm"\r
-asciiLevelData(5) = "o           -mmm"\r
-asciiLevelData(6) = "o    t      mxmm"\r
-asciiLevelData(7) = "o            mmm"\r
-asciiLevelData(8) = "o           1 1 "\r
-asciiLevelData(9) = "o  p     p 1 1 1"\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-graphicsMode = 1\r
-CASE 2\r
-asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
-asciiLevelData(2) = "mm   h h        "\r
-asciiLevelData(3) = "mmx m    mmmymmm"\r
-asciiLevelData(4) = "mmommmmmm  mom m"\r
-asciiLevelData(5) = "mo   1 1 1 o1m1m"\r
-asciiLevelData(6) = "momm m m m m111m"\r
-asciiLevelData(7) = "m      h mmmmoom"\r
-asciiLevelData(8) = " mm h          m"\r
-asciiLevelData(9) = "        v mmm mm"\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-CASE 3\r
-asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
-asciiLevelData(2) = " h h h h h  ym11"\r
-asciiLevelData(3) = "mm mmmmmmmmmmm1m"\r
-asciiLevelData(4) = "m h  m      xm  "\r
-asciiLevelData(5) = "mm m m mmmmmmmmm"\r
-asciiLevelData(6) = "mmmm     m1m    "\r
-asciiLevelData(7) = "m    h   m1moo m"\r
-asciiLevelData(8) = "m mmmmmm m1moomm"\r
-asciiLevelData(9) = "m 11111m  h h   "\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-CASE 4\r
-asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
-asciiLevelData(2) = "     h1  h1    m"\r
-asciiLevelData(3) = "mmm  1 11  1 o1m"\r
-asciiLevelData(4) = "  m 1  oo   1o1m"\r
-asciiLevelData(5) = "m moo       oo1m"\r
-asciiLevelData(6) = "  m      h  o   "\r
-asciiLevelData(7) = "mmm  h      o   "\r
-asciiLevelData(8) = "m           o   "\r
-asciiLevelData(9) = "        x   oy  "\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-CASE 5\r
-asciiLevelData(1) = "m       . y -   "\r
-asciiLevelData(2) = "m      m     moo"\r
-asciiLevelData(3) = "m.    mxm    mmo"\r
-asciiLevelData(4) = "m  -    m mmmmmm"\r
-asciiLevelData(5) = "m .    m     mm "\r
-asciiLevelData(6) = "mt  o   o    m  "\r
-asciiLevelData(7) = "m   o om o  ooo "\r
-asciiLevelData(8) = "m   ooooooooooo "\r
-asciiLevelData(9) = "         v    o "\r
-asciiLevelData(10) = "oooooooooooooooo"\r
-CASE 6\r
-CLS\r
-asciiLevelData(1) = "    -           "\r
-asciiLevelData(2) = "             .  "\r
-asciiLevelData(3) = "       oo- oo   "\r
-asciiLevelData(4) = "  -    11  11  ."\r
-asciiLevelData(5) = "       oo  oo   "\r
-asciiLevelData(6) = "   m ym11  11   "\r
-asciiLevelData(7) = "   m  m         "\r
-asciiLevelData(8) = "   ooom  <>  <> "\r
-asciiLevelData(9) = "       xmmm  mmm"\r
-asciiLevelData(10) = "mmmmmmmmmmm  mmm"\r
-CASE 7\r
-asciiLevelData(1) = " oooo           "\r
-asciiLevelData(2) = " o111  .        "\r
-asciiLevelData(3) = " oooo>    >>>>>>"\r
-asciiLevelData(4) = "  .    x v     m"\r
-asciiLevelData(5) = "       mym     m"\r
-asciiLevelData(6) = "        m      m"\r
-asciiLevelData(7) = "            111m"\r
-asciiLevelData(8) = "            111m"\r
-asciiLevelData(9) = "  v          p  "\r
-asciiLevelData(10) = "oooaaaaaaaaaoooo"\r
-CASE 8\r
-asciiLevelData(1) = "      .        o"\r
-asciiLevelData(2) = "  .    mm      o"\r
-asciiLevelData(3) = ".     ommm  t  o"\r
-asciiLevelData(4) = "     mom mm    o"\r
-asciiLevelData(5) = "   pmmoyxmmm   o"\r
-asciiLevelData(6) = "   mmmomammmm  m"\r
-asciiLevelData(7) = "p mmmmv   mmmm  "\r
-asciiLevelData(8) = "mmmmmmmmm mmmmmm"\r
-asciiLevelData(9) = "                "\r
-asciiLevelData(10) = ">>>>>>>>>>>>>>>>"\r
-CurrentLevelNumber% = CurrentLevelNumber% + 1\r
-CASE 10\r
-asciiLevelData(1) = "m.  -          m"\r
-asciiLevelData(2) = "m  .           m"\r
-asciiLevelData(3) = "m 111     -    m"\r
-asciiLevelData(4) = "mmmmm>>>    ammm"\r
-asciiLevelData(5) = "a           a  m"\r
-asciiLevelData(6) = "mmm  t      a  m"\r
-asciiLevelData(7) = "           ma  m"\r
-asciiLevelData(8) = ">>>         a  m"\r
-asciiLevelData(9) = "       m yx  m m"\r
-asciiLevelData(10) = ">>>mmmmmmmmmmm m"\r
-CASE 9\r
-asciiLevelData(1) = "mammmmmmmmmmmmm "\r
-asciiLevelData(2) = "m1m  y     xmo  "\r
-asciiLevelData(3) = "mamooo>>>a>am om"\r
-asciiLevelData(4) = "m1m     m1mamo m"\r
-asciiLevelData(5) = "mamm    m1mam om"\r
-asciiLevelData(6) = "m1m    mm1mamo m"\r
-asciiLevelData(7) = "mammm   m1ma  om"\r
-asciiLevelData(8) = "m1m   mmm1ma o m"\r
-asciiLevelData(9) = "m        amam om"\r
-asciiLevelData(10) = "mmmmmmmm<mmammmm"\r
-CurrentLevelNumber% = CurrentLevelNumber% + 2\r
-CASE 11\r
-asciiLevelData(1) = ">>>>>>>>>>>>>>><"\r
-asciiLevelData(2) = "> <x           <"\r
-asciiLevelData(3) = "> <         >> <"\r
-asciiLevelData(4) = "> <y>>>>>>>    <"\r
-asciiLevelData(5) = "> <       <  <<<"\r
-asciiLevelData(6) = "> <<<<a<< << < >"\r
-asciiLevelData(7) = "> <        < <  "\r
-asciiLevelData(8) = "> <m >m>>m <   >"\r
-asciiLevelData(9) = ">              <"\r
-asciiLevelData(10) = ">>>>m<<<<<<<<mm<"\r
-CurrentLevelNumber% = CurrentLevelNumber% + 2\r
-CASE 12\r
-asciiLevelData(1) = "m     aaaaaaaaam"\r
-asciiLevelData(2) = "m  -         xmm"\r
-asciiLevelData(3) = "m        t. ym 1"\r
-asciiLevelData(4) = "m     .     moom"\r
-asciiLevelData(5) = "m          am  1"\r
-asciiLevelData(6) = "m         mamomm"\r
-asciiLevelData(7) = "m      - mmam  1"\r
-asciiLevelData(8) = "m       mmmamomm"\r
-asciiLevelData(9) = "m p  p mm      1"\r
-asciiLevelData(10) = "mmmmmmmmmammmm<<"\r
-CASE 13\r
-asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
-asciiLevelData(2) = "m   m          m"\r
-asciiLevelData(3) = "  ma   1a1a1a  m"\r
-asciiLevelData(4) = "mmma aaaaaaaam m"\r
-asciiLevelData(5) = "11maaaaaaaaaam m"\r
-asciiLevelData(6) = "mmmaaaaaaaaaam m"\r
-asciiLevelData(7) = "11x         ym m"\r
-asciiLevelData(8) = "mmmmmmmmmmmmmm m"\r
-asciiLevelData(9) = "               m"\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-CASE 14\r
-asciiLevelData(1) = "mmmmmmmmm-      "\r
-asciiLevelData(2) = "mm mmmmmmm  -   "\r
-asciiLevelData(3) = "mm       m      "\r
-asciiLevelData(4) = "mm >>>>> m  -   "\r
-asciiLevelData(5) = "mmv  m   m     ."\r
-asciiLevelData(6) = ">><< m <<m  -   "\r
-asciiLevelData(7) = "11 m m m   .    "\r
-asciiLevelData(8) = ">> m m m    xy    "\r
-asciiLevelData(9) = "mm  vm    v     "\r
-asciiLevelData(10) = "mm>><m>>>>>mmmmm"\r
-CASE 15\r
-CLS\r
-asciiLevelData(1) = "      m        m"\r
-asciiLevelData(2) = "mm ymmmmmmmmmaaa"\r
-asciiLevelData(3) = "<<oo    1111maaa"\r
-asciiLevelData(4) = "       <<111maaa"\r
-asciiLevelData(5) = "<<m<     m11maaa"\r
-asciiLevelData(6) = "    t  oomm  aaa"\r
-asciiLevelData(7) = "      vo    mm1m"\r
-asciiLevelData(8) = "       mm<<<mm1m"\r
-asciiLevelData(9) = "  m  x <<mmmmm11"\r
-asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
-graphicsMode = 1\r
-CASE 16\r
-asciiLevelData(1) = "m11     aa       m     11111  m"\r
-asciiLevelData(2) = "m11    a   a  a    <          m"\r
-asciiLevelData(3) = "m11  >aam       v  t  a       m"\r
-asciiLevelData(4) = "m11om y o                 a  am"\r
-asciiLevelData(5) = "m11  oooo  t                  m"\r
-asciiLevelData(6) = ">>>om         p  p        m   m"\r
-asciiLevelData(7) = "m     mmm     mamamom     mm  m"\r
-asciiLevelData(8) = "m  v mmmmm    mam 11m  mmmmmm m"\r
-asciiLevelData(9) = "m  mmmmmmmmm  mam  1mm    mm  m"\r
-asciiLevelData(10) = "mm  m1     m  mam111m     m   m"\r
-asciiLevelData(11) = "m m  o     m  mam  vm         m"\r
-asciiLevelData(12) = "m  m  m1111m vmammmmm  m      m"\r
-asciiLevelData(13) = "m   m  mmmmm 11                "\r
-asciiLevelData(14) = "mmmmmm   m mamammmmm         mm"\r
-asciiLevelData(15) = "m       m  mam1111m       m  >m"\r
-asciiLevelData(16) = "m      m   m1m111m     m      m"\r
-asciiLevelData(17) = "      m    mammmm  mm>>> <<<>>m"\r
-asciiLevelData(18) = "     m     m  x   m      m   m "\r
-asciiLevelData(19) = "mmmmm      mmmmmmm       mmm mm"\r
-graphicsMode = 2\r
-CASE 17\r
-asciiLevelData(1) = "mu 1111        m"\r
-asciiLevelData(2) = "mmmmmmm   <<<<am"\r
-asciiLevelData(3) = "m     m  a   mam"\r
-asciiLevelData(4) = "m     m    y m1m"\r
-asciiLevelData(5) = "m     mm   <xmam"\r
-asciiLevelData(6) = "      m  <<<<m1m"\r
-asciiLevelData(7) = "      m      ma1"\r
-asciiLevelData(8) = "mmmm  m    <<mmm"\r
-asciiLevelData(9) = "m111    vU   m  "\r
-asciiLevelData(10) = "mmmmmmmaamaaam  "\r
-graphicsMode = 1\r
-CASE 18\r
-asciiLevelData(1) = "oo            m                "\r
-asciiLevelData(2) = "oo     h   h  m                "\r
-asciiLevelData(3) = "oo x          m   h      m>>>>>"\r
-asciiLevelData(4) = "oo m11111111m m         mm    m"\r
-asciiLevelData(5) = "oo m11111111m m  mm  h  m     m"\r
-asciiLevelData(6) = "oo mmmmmmmmmm m   m    vm     m"\r
-asciiLevelData(7) = "oo            mm  mmmmmmm     m"\r
-asciiLevelData(8) = " v                            m"\r
-asciiLevelData(9) = "mom    mmmmmm   v             m"\r
-asciiLevelData(10) = "m m m  mmmmmm     mm   h  h   m"\r
-asciiLevelData(11) = "m                             m"\r
-asciiLevelData(12) = "m <<<<<<<<<<<<<<<<<<<<<<<<<<< m"\r
-asciiLevelData(13) = "mam                           m"\r
-asciiLevelData(14) = "mammooooommaaammm      maaaaavm"\r
-asciiLevelData(15) = "mam     oo       a ma  m111111m"\r
-asciiLevelData(16) = "mam    oo  <<< h mh h  mma<>amm"\r
-asciiLevelData(17) = "mam   moom   <<               m"\r
-asciiLevelData(18) = "my   mm         m     m       m"\r
-asciiLevelData(19) = "mmmmmmmmmmmm<<mmmaaaaammmmmmmmm"\r
-graphicsMode = 2\r
-CASE 19\r
-CLS\r
-DrawSprite 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
-END\r
-END\r
-CASE 100\r
-asciiLevelData(1) = "                "\r
-asciiLevelData(2) = "                "\r
-asciiLevelData(3) = "                "\r
-asciiLevelData(4) = "                "\r
-asciiLevelData(5) = "                "\r
-asciiLevelData(6) = "                "\r
-asciiLevelData(7) = "                "\r
-asciiLevelData(8) = "                "\r
-asciiLevelData(9) = "                "\r
-asciiLevelData(10) = "                "\r
-CASE 101\r
-asciiLevelData(1) = "                               "\r
-asciiLevelData(2) = "                               "\r
-asciiLevelData(3) = "                               "\r
-asciiLevelData(4) = "                               "\r
-asciiLevelData(5) = "                               "\r
-asciiLevelData(6) = "                               "\r
-asciiLevelData(7) = "                               "\r
-asciiLevelData(8) = "                               "\r
-asciiLevelData(9) = "                               "\r
-asciiLevelData(10) = "                               "\r
-asciiLevelData(11) = "                               "\r
-asciiLevelData(12) = "                               "\r
-asciiLevelData(13) = "                               "\r
-asciiLevelData(14) = "                               "\r
-asciiLevelData(15) = "                               "\r
-asciiLevelData(16) = "                               "\r
-asciiLevelData(17) = "                               "\r
-asciiLevelData(18) = "                               "\r
-asciiLevelData(19) = "                               "\r
-graphicsMode = 2\r
-\r
-END SELECT\r
-IF graphicsMode = 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$ = "m" THEN PUT (D * 20, e * 20), SolidTerrainSprite, PSET: TerrainGrid(D + 1, e + 1) = "z"\r
-IF q$ = "o" THEN PUT (D * 20, e * 20), kast, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(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 FirstCompanionX% = D * 20: FirstCompanionY% = (e + 1) * 20\r
-IF q$ = "y" THEN SecondCompanionX% = D * 20: SecondCompanionY% = (e + 1) * 20\r
-IF q$ = "1" THEN PUT (D * 20, e * 20), CoinSprite, PSET: TerrainGrid(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), WindowSprite, PSET\r
-IF q$ = "v" THEN PUT (D * 20, (e * 20) + 10), TrampolineSprite, PSET: TerrainGrid(D + 1, e + 1) = "v"\r
-IF q$ = "t" THEN PUT (D * 20, e * 20), TreeSprite, PSET\r
-IF q$ = ">" THEN PUT (D * 20, e * 20), noolt, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = ">"\r
-IF q$ = "<" THEN PUT (D * 20, e * 20), noolt1, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "<"\r
-IF q$ = "a" THEN PUT (D * 20, e * 20), HoleSprite, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "a"\r
-IF q$ = "u" THEN PUT (D * 20, e * 20), DoorSprite, PSET: TerrainGrid(D + 1, e + 1) = "u": DoorEntryX% = D * 20: DoorEntryY% = e * 20\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), kastm, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(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 FirstCompanionX% = D * 20: FirstCompanionY% = (e + 1) * 20\r
-IF q$ = "y" THEN SecondCompanionX% = D * 20: SecondCompanionY% = (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), poosasm, 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), nooltm, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = ">"\r
-IF q$ = "<" THEN PUT (D * 10, e * 10), nooltm1, 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
diff --git a/Games/Pomppu Paavo.png b/Games/Pomppu Paavo.png
deleted file mode 100644 (file)
index a37d478..0000000
Binary files a/Games/Pomppu Paavo.png and /dev/null differ
diff --git a/Games/Pomppu Paavo/Pomppu Paavo.bas b/Games/Pomppu Paavo/Pomppu Paavo.bas
new file mode 100755 (executable)
index 0000000..92ccdd9
--- /dev/null
@@ -0,0 +1,1309 @@
+' Pomppu Paavo\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
+' 1998, Initial version\r
+' 2025, Improved program readability\r
+\r
+\r
+DECLARE SUB DisplayGameStatistics ()\r
+DECLARE SUB LoadLevel (y%)\r
+DECLARE SUB DrawSprite (p%, o%, m%, fr%, teler%)\r
+\r
+DEFINT A-Z\r
+DIM SHARED graphicsMode\r
+DIM SHARED asciiLevelData(1 TO 20) AS STRING * 31\r
+DIM SHARED FirstCompanionY%, FirstCompanionX%, SecondCompanionY%, SecondCompanionX%\r
+DIM SHARED LivesRemaining%, CoinsCollected%\r
+DIM SHARED DoorEntryX%, DoorEntryY%, DoorExitX%, DoorExitY%\r
+DIM SHARED CurrentLevelNumber%\r
+DIM SHARED TerrainGrid(0 TO 34, -10 TO 20) AS STRING * 1\r
+DIM SHARED ObjectGrid(0 TO 34, -10 TO 20) AS STRING * 1\r
+\r
+' Full scale sprites\r
+DIM SHARED SolidTerrainSprite(51)\r
+DIM SHARED EmptySpaceSprite(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 CoinSprite(30)\r
+DIM SHARED poosas(100)\r
+DIM SHARED WindowSprite(100)\r
+DIM SHARED TrampolineSprite(50)\r
+DIM SHARED IntroScreen(6000)\r
+DIM SHARED TreeSprite(3000)\r
+DIM SHARED noolt(51)\r
+DIM SHARED noolt1(51)\r
+DIM SHARED HoleSprite(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 DoorSprite(120)\r
+\r
+' Small scale sprites (S suffix is used)\r
+DIM SHARED SolidTerrainSpriteSmall(51)\r
+DIM SHARED EmptySpaceSpriteSmall(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 CoinSpriteSmall(30)\r
+DIM SHARED poosasm(100)\r
+DIM SHARED WindowSpriteSmall(100)\r
+DIM SHARED TrampolineSpriteSmall(50)\r
+DIM SHARED TreeSpriteSmall(3000)\r
+DIM SHARED nooltm(51)\r
+DIM SHARED nooltm1(51)\r
+DIM SHARED HoleSpriteSmall(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 DoorSpriteSmall(50)\r
+\r
+leftArrowKey$ = CHR$(0) + "K"\r
+rightArrowKey$ = CHR$(0) + "M"\r
+upArrowKey$ = CHR$(0) + "H"\r
+downArrowKey$ = CHR$(0) + "P"\r
+\r
+LivesRemaining% = 10\r
+\r
+SCREEN 1\r
+CurrentLevelNumber% = 1\r
+\r
+' Capture sprite images from screen drawing operations\r
+GET (1, 1)-(20, 20), EmptySpaceSprite\r
+DrawSprite 0, 0, 1, 1, 1\r
+GET (1, 1)-(20, 20), SolidTerrainSprite\r
+DrawSprite 0, 0, 4, 1, 1\r
+GET (1, 1)-(20, 20), kast\r
+PUT (1, 180), SolidTerrainSprite, PSET\r
+PUT (300, 1), SolidTerrainSprite, PSET\r
+PUT (300, 180), SolidTerrainSprite, PSET\r
+DrawSprite 30, 50, 2, 1, 1\r
+GET (31, 51)-(91, 76), pilv\r
+PUT (160, 10), pilv, PSET\r
+DrawSprite 20, 100, 3, 1, 1\r
+GET (21, 101)-(31, 114), taht\r
+CLS\r
+DrawSprite 0, 0, 5, 1, 1\r
+GET (1, 1)-(11, 8), siil\r
+CLS\r
+DrawSprite 0, 0, 6, 1, 1\r
+GET (1, 1)-(8, 10), CoinSprite\r
+CLS\r
+DrawSprite 0, 0, 7, 1, 1\r
+GET (1, 1)-(31, 11), poosas\r
+CLS\r
+DrawSprite 0, 0, 8, 1, 1\r
+GET (1, 1)-(26, 21), WindowSprite\r
+CLS\r
+DrawSprite 0, 0, 9, 1, 1\r
+GET (1, 1)-(21, 11), TrampolineSprite\r
+CLS\r
+DrawSprite 0, 0, 11, 1, 1\r
+GET (1, 1)-(51, 81), TreeSprite\r
+CLS\r
+DrawSprite 0, 0, 12, 1, 1\r
+GET (1, 1)-(20, 20), noolt\r
+CLS\r
+DrawSprite 0, 0, 12, 50, 1\r
+GET (1, 1)-(20, 20), noolt1\r
+CLS\r
+DrawSprite 0, 0, 13, 1, 1\r
+GET (1, 1)-(20, 20), HoleSprite\r
+CLS\r
+DrawSprite 0, 0, 14, 1, 1\r
+GET (1, 1)-(20, 20), sipp1\r
+CLS\r
+DrawSprite 0, 0, 15, 1, 1\r
+GET (1, 1)-(20, 20), sipp2\r
+CLS\r
+DrawSprite 0, 0, 14, 50, 1\r
+GET (1, 1)-(20, 20), sipp10\r
+CLS\r
+DrawSprite 0, 0, 15, 50, 1\r
+GET (1, 1)-(20, 20), sipp20\r
+CLS\r
+DrawSprite 0, 0, 16, 1, 1\r
+GET (1, 1)-(20, 20), sipp3\r
+CLS\r
+\r
+\r
+' Capture small scale versions of sprites\r
+GET (1, 1)-(10, 10), EmptySpaceSpriteSmall\r
+DrawSprite 0, 0, 1, 1, 2\r
+GET (1, 1)-(10, 10), SolidTerrainSpriteSmall\r
+DrawSprite 0, 0, 4, 1, 2\r
+GET (1, 1)-(10, 10), kastm\r
+PUT (1, 180), SolidTerrainSprite, PSET\r
+PUT (300, 1), SolidTerrainSprite, PSET\r
+PUT (300, 180), SolidTerrainSprite, PSET\r
+DrawSprite 30, 50, 2, 1, 2\r
+GET (16, 26)-(46, 38), pilvm\r
+DrawSprite 20, 100, 3, 1, 2\r
+GET (11, 51)-(16, 72), tahtm\r
+CLS\r
+DrawSprite 0, 0, 5, 1, 2\r
+GET (1, 1)-(6, 4), siilm\r
+CLS\r
+DrawSprite 0, 0, 6, 1, 2\r
+GET (1, 1)-(4, 5), CoinSpriteSmall\r
+CLS\r
+DrawSprite 0, 0, 7, 1, 2\r
+GET (1, 1)-(16, 6), poosasm\r
+CLS\r
+DrawSprite 0, 0, 8, 1, 2\r
+GET (1, 1)-(13, 11), WindowSpriteSmall\r
+CLS\r
+DrawSprite 0, 0, 9, 1, 2\r
+GET (1, 1)-(11, 6), TrampolineSpriteSmall\r
+CLS\r
+DrawSprite 0, 0, 11, 1, 2\r
+GET (1, 1)-(26, 41), TreeSpriteSmall\r
+CLS\r
+DrawSprite 0, 0, 12, 1, 2\r
+GET (1, 1)-(10, 10), nooltm\r
+CLS\r
+DrawSprite 0, 0, 12, 50, 2\r
+GET (1, 1)-(10, 10), nooltm1\r
+CLS\r
+DrawSprite 0, 0, 13, 1, 2\r
+GET (1, 1)-(10, 10), HoleSpriteSmall\r
+CLS\r
+DrawSprite 0, 0, 14, 1, 2\r
+GET (1, 1)-(10, 10), sippm1\r
+CLS\r
+DrawSprite 0, 0, 15, 1, 2\r
+GET (1, 1)-(10, 10), sippm2\r
+CLS\r
+DrawSprite 0, 0, 14, 50, 2\r
+GET (1, 1)-(10, 10), sippm10\r
+CLS\r
+DrawSprite 0, 0, 15, 50, 2\r
+GET (1, 1)-(10, 10), sippm20\r
+CLS\r
+DrawSprite 0, 0, 16, 1, 2\r
+GET (1, 1)-(10, 10), sippm3\r
+CLS\r
+DrawSprite 0, 0, 17, 1, 1\r
+GET (1, 1)-(21, 31), DoorSprite\r
+CLS\r
+DrawSprite 0, 0, 17, 1, 2\r
+GET (1, 1)-(11, 16), IntroScreen\r
+CLS\r
+\r
+DrawSprite -1, -1, 10, 4, 1\r
+GET (1, 1)-(318, 124), IntroScreen\r
+\r
+key$ = INPUT$(1)\r
+\r
+LoadLevel 1\r
+a = 50\r
+b = 50\r
+siie = 1\r
+siie1 = 1\r
+MainGameLoop:\r
+kbd$ = INKEY$\r
+IF graphicsMode = 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
+' Draw first companion hedgehog\r
+GET (FirstCompanionX%, FirstCompanionY%)-(FirstCompanionX% + 10, FirstCompanionY% + 10), siil1\r
+PUT (FirstCompanionX%, FirstCompanionY%), siil, OR\r
+\r
+' Draw second companion hedgehog\r
+GET (SecondCompanionX%, SecondCompanionY%)-(SecondCompanionX% + 10, SecondCompanionY% + 10), siil2\r
+PUT (SecondCompanionX%, SecondCompanionY%), siil, OR\r
+\r
+' Create short delay using sound command (workaround for no built-in delay)\r
+SOUND 0, .8\r
+\r
+' Check collisions with terrain (z = solid block)\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 = -10: all = -5: 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: sipp = 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((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 25) \ 20) = "z" THEN siiall = -1\r
+IF TerrainGrid((FirstCompanionX% + 30) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = -1\r
+IF TerrainGrid((FirstCompanionX% + 20) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = 1\r
+\r
+' Second companion hedgehog terrain collision checks\r
+IF TerrainGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
+IF TerrainGrid((SecondCompanionX% + 30) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = -1\r
+IF TerrainGrid((SecondCompanionX% + 20) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = 1\r
+\r
+' Screen boundary checks for companions\r
+IF FirstCompanionX% > 300 THEN siie = -1\r
+IF FirstCompanionX% < 3 THEN siie = 1\r
+IF SecondCompanionX% > 300 THEN siie1 = -1\r
+IF SecondCompanionX% < 3 THEN siie1 = 1\r
+\r
+' Restore previous companion positions\r
+PUT (SecondCompanionX%, SecondCompanionY%), siil2, PSET\r
+PUT (FirstCompanionX%, FirstCompanionY%), siil1, PSET\r
+\r
+' Restore previous player position\r
+IF b > 0 THEN PUT (a, b), mar1, 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((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = ""\r
+\r
+' Update companion positions\r
+FirstCompanionX% = FirstCompanionX% + siie\r
+FirstCompanionY% = FirstCompanionY% + siiall\r
+SecondCompanionX% = SecondCompanionX% + siie1\r
+SecondCompanionY% = SecondCompanionY% + siiall1\r
+\r
+' Mark new companion positions in object grid\r
+ObjectGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "q": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = "q"\r
+\r
+' Apply gravity to companions (max downward velocity = 2)\r
+siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
+siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 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: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+\r
+' Level transition when reaching left edge\r
+IF a < 1 THEN a = 296: IF CurrentLevelNumber% = 1 THEN LoadLevel CurrentLevelNumber%:  ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel CurrentLevelNumber%: IF graphicsMode = 2 THEN a = 594\r
+\r
+' Player falls off bottom of screen\r
+IF b > 179 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel 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 kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1:  ELSE sipp = 2\r
+IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp = 20\r
+IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF kbd$ = downArrowKey$ THEN all = all + 1\r
+IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF kbd$ = "q" THEN END\r
+sipa = sipa + 1\r
+IF sipa = 3 THEN sipa = 1\r
+GOTO MainGameLoop\r
+\r
+\r
+106\r
+kbd$ = INKEY$\r
+IF graphicsMode = 1 THEN b = b / 2: GOTO MainGameLoop\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
+' Draw companions in scaled down mode\r
+GET (FirstCompanionX% \ 2, FirstCompanionY% \ 2)-((FirstCompanionX% + 10) \ 2, (FirstCompanionY% + 10) \ 2), siilm1\r
+PUT (FirstCompanionX% \ 2, FirstCompanionY% \ 2), siilm, OR\r
+GET (SecondCompanionX% \ 2, SecondCompanionY% \ 2)-((siia1 + 10) \ 2, (SecondCompanionY% + 10) \ 2), siilm2\r
+PUT (SecondCompanionX% \ 2, SecondCompanionY% \ 2), siilm, OR\r
+\r
+' Small delay to limit framerate\r
+SOUND 0, .8\r
+\r
+' Check collisions with terrain (z = solid block)\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: sipp = 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((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 25) \ 20) = "z" THEN siiall = -1\r
+IF TerrainGrid((FirstCompanionX% + 30) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = -1\r
+IF TerrainGrid((FirstCompanionX% + 20) \ 20, (FirstCompanionY% + 10) \ 20) = "z" THEN siie = 1\r
+\r
+' Second companion hedgehog terrain collision checks\r
+IF TerrainGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 25) \ 20) = "z" THEN siiall1 = -1\r
+IF TerrainGrid((SecondCompanionX% + 30) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = -1\r
+IF TerrainGrid((SecondCompanionX% + 20) \ 20, (SecondCompanionY% + 10) \ 20) = "z" THEN siie1 = 1\r
+\r
+' Screen boundary checks for companions\r
+IF FirstCompanionX% > 600 THEN siie = -1\r
+IF FirstCompanionX% < 3 THEN siie = 1\r
+IF SecondCompanionX% > 600 THEN siie1 = -1\r
+IF SecondCompanionX% < 3 THEN siie1 = 1\r
+\r
+' Restore previous companion positions\r
+PUT (SecondCompanionX% \ 2, SecondCompanionY% \ 2), siilm2, PSET\r
+PUT (FirstCompanionX% \ 2, FirstCompanionY% \ 2), siilm1, PSET\r
+\r
+' Restore previous player position\r
+IF b > 0 THEN PUT (a \ 2, b \ 2), marm1, 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((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = ""\r
+\r
+' Update companion positions\r
+FirstCompanionX% = FirstCompanionX% + siie\r
+FirstCompanionY% = FirstCompanionY% + siiall\r
+SecondCompanionX% = SecondCompanionX% + siie1\r
+SecondCompanionY% = SecondCompanionY% + siiall1\r
+\r
+' Mark new companion positions in object grid\r
+ObjectGrid((SecondCompanionX% + 25) \ 20, (SecondCompanionY% + 8) \ 20) = "q": ObjectGrid((FirstCompanionX% + 25) \ 20, (FirstCompanionY% + 8) \ 20) = "q"\r
+siiall = siiall + 1: IF siiall > 2 THEN siiall = 2\r
+siiall1 = siiall1 + 1: IF siiall1 > 2 THEN siiall1 = 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: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+\r
+' Level transition when reaching left edge\r
+IF a < 1 THEN a = 594: IF CurrentLevelNumber% = 1 THEN LoadLevel CurrentLevelNumber%:  ELSE CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel CurrentLevelNumber%: IF graphicsMode = 1 THEN a = 297\r
+\r
+' Player falls off bottom of screen\r
+IF b > 358 THEN LivesRemaining% = LivesRemaining% - 1: DisplayGameStatistics: CurrentLevelNumber% = CurrentLevelNumber% - 1: LoadLevel 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 kbd$ = rightArrowKey$ THEN eda = eda + 1: IF eda > 3 THEN eda = 3: r = 0 ELSE IF lke > 10 THEN eda = 5\r
+IF kbd$ = rightArrowKey$ THEN IF sipa = 1 THEN sipp = 1:  ELSE sipp = 2\r
+IF kbd$ = leftArrowKey$ THEN IF sipa = 1 THEN sipp = 10:  ELSE sipp = 20\r
+IF kbd$ = leftArrowKey$ THEN eda = eda - 1: IF eda < -3 THEN eda = -3: r = 0 ELSE IF lke > 10 THEN eda = -5\r
+IF kbd$ = upArrowKey$ AND lk < 10 THEN all = all - 5: lk = 20: r1 = 0: sipp = 3\r
+IF kbd$ = downArrowKey$ THEN all = all + 1\r
+IF kbd$ = "/" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 1: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF kbd$ = "+" THEN a = 2: b = 50: CurrentLevelNumber% = CurrentLevelNumber% + 5: LoadLevel CurrentLevelNumber%: siie = 1: siie1 = 1\r
+IF kbd$ = "q" THEN END\r
+\r
+sipa = sipa + 1\r
+IF sipa = 3 THEN sipa = 1\r
+\r
+GOTO 106\r
+\r
+SUB DisplayGameStatistics\r
+'\r
+' Updates and displays the game's status information (coins collected, lives remaining)\r
+' Handles game over condition when lives reach zero.\r
+'\r
+' This subroutine is called whenever the game state changes that affects statistics:\r
+' - When a coin is collected\r
+' - When the player loses a life\r
+' - Periodically during gameplay\r
+\r
+LOCATE 1, 1\r
+IF GraphicsMode% = 2 THEN GOTO SkipTextDisplay\r
+\r
+' Clear previous stats display\r
+PRINT "                "\r
+\r
+' Award extra life every 10 coins collected\r
+IF CoinsCollected% > 9 THEN CoinsCollected% = 0: LivesRemaining% = LivesRemaining% + 1\r
+\r
+' Display current game statistics\r
+LOCATE 1, 1\r
+PRINT "o "; CoinsCollected%; "  Lives "; LivesRemaining%\r
+\r
+SkipTextDisplay:\r
+' Check if player has run out of lives\r
+IF LivesRemaining% < 0 THEN END\r
+END SUB\r
+\r
+SUB DrawSprite (p, o, m, fr, teler)\r
+\r
+' Renders a sprite on screen based on predefined character patterns.\r
+'\r
+' How it works:\r
+' The subroutine uses a lookup table (ao array) containing string representations\r
+' of each sprite. Each character in these strings represents a pixel color.\r
+' Depending on the parameters, it either:\r
+'   - Draws individual pixels (ScaleFactor=1)\r
+'   - Draws filled rectangles for each pixel (ScaleFactor>1 but not 50)\r
+'   - Draws flipped version of individual pixels (SpriteVariant=50)\r
+'\r
+' This flexible approach allows the same sprite data to be rendered at different\r
+' sizes and orientations without storing multiple copies of the sprite data.\r
+\r
+DIM ao(1 TO 100) AS STRING\r
+SELECT CASE m\r
+CASE 1 ' Solid block pattern\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 ' Cloud sprite\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
+\r
+ao(1) = "00000000022220000000"\r
+ao(2) = "00000000022220000000"\r
+ao(3) = "00000000022222000000"\r
+ao(4) = "00000000033333000000"\r
+ao(5) = "00000000033333300000"\r
+ao(6) = "00000000033333300000"\r
+ao(7) = "00000000003333000000"\r
+ao(8) = "00000000011100000000"\r
+ao(9) = "00000003111130000000"\r
+ao(10) = "00000003111130000000"\r
+ao(11) = "00000003111130000000"\r
+ao(12) = "00000003111133000000"\r
+ao(13) = "00000003111130000000"\r
+ao(14) = "00000003111130000000"\r
+ao(15) = "00000000333300000000"\r
+ao(16) = "00000000333300000000"\r
+ao(17) = "00000003303300000000"\r
+ao(18) = "00000003303300000000"\r
+ao(19) = "00000033302220000000"\r
+ao(20) = "00000022200000000000"\r
+\r
+\r
+CASE 15\r
+ao(1) = "00000000022220000000"\r
+ao(2) = "00000000022220000000"\r
+ao(3) = "00000000022222000000"\r
+ao(4) = "00000000033333000000"\r
+ao(5) = "00000000033333300000"\r
+ao(6) = "00000000033333300000"\r
+ao(7) = "00000000003333000000"\r
+ao(8) = "00000000011100000000"\r
+ao(9) = "00000003111130000000"\r
+ao(10) = "00000003111130000000"\r
+ao(11) = "00000003111130000000"\r
+ao(12) = "00000033111130000000"\r
+ao(13) = "00000003111130000000"\r
+ao(14) = "00000003111130000000"\r
+ao(15) = "00000000333300000000"\r
+ao(16) = "00000000333300000000"\r
+ao(17) = "00000000330330000000"\r
+ao(18) = "00000000330330000000"\r
+ao(19) = "00000002220333000000"\r
+ao(20) = "00000000000222000000"\r
+\r
+CASE 16\r
+\r
+ao(1) = "00000000022220000000"\r
+ao(2) = "00000000022220000000"\r
+ao(3) = "00000000022222000000"\r
+ao(4) = "00000000033333000000"\r
+ao(5) = "00000000033333300000"\r
+ao(6) = "00000000033333300000"\r
+ao(7) = "00000000103330100000"\r
+ao(8) = "00000001111111000000"\r
+ao(9) = "00000000311130000000"\r
+ao(10) = "00000000311130000000"\r
+ao(11) = "00000000311130000000"\r
+ao(12) = "00000000311130000000"\r
+ao(13) = "00000000311130000000"\r
+ao(14) = "00000000311130000000"\r
+ao(15) = "00000000333300000000"\r
+ao(16) = "00000000333300000000"\r
+ao(17) = "00000000330330000000"\r
+ao(18) = "00000000330330000000"\r
+ao(19) = "00000000330330000000"\r
+ao(20) = "00000000222222000000"\r
+\r
+CASE 17 ' Door sprite\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 DrawFlippedSprite\r
+IF fr > 1 THEN GOTO DrawScaledSprite\r
+\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
+\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
+\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 + b) \ teler, (o + a) \ teler), ASC(LEFT$(RIGHT$(ao(a), b), 1)) - 48\r
+NEXT b\r
+NEXT a\r
+\r
+FinishDrawing:\r
+ERASE ao\r
+END SUB\r
+\r
+SUB LoadLevel (y)\r
+125\r
+FirstCompanionX% = 0\r
+FirstCompanionY% = 0\r
+aiia1 = 0\r
+SecondCompanionY% = 0\r
+FOR a1 = 1 TO 32\r
+  FOR b1 = 1 TO 20\r
+    TerrainGrid(a1, b1) = ""\r
+    ObjectGrid(a1, b1) = ""\r
+  NEXT b1\r
+NEXT a1\r
+\r
+FOR a = 1 TO 10\r
+  asciiLevelData(a) = ""\r
+NEXT a\r
+\r
+CLS\r
+LOCATE 3, 10\r
+\r
+SELECT CASE y\r
+CASE 1\r
+asciiLevelData(1) = "             mmm"\r
+asciiLevelData(2) = "    -       m mm"\r
+asciiLevelData(3) = "        .  - mmm"\r
+asciiLevelData(4) = "o   .  .    mymm"\r
+asciiLevelData(5) = "o           -mmm"\r
+asciiLevelData(6) = "o    t      mxmm"\r
+asciiLevelData(7) = "o            mmm"\r
+asciiLevelData(8) = "o           1 1 "\r
+asciiLevelData(9) = "o  p     p 1 1 1"\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+graphicsMode = 1\r
+CASE 2\r
+asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
+asciiLevelData(2) = "mm   h h        "\r
+asciiLevelData(3) = "mmx m    mmmymmm"\r
+asciiLevelData(4) = "mmommmmmm  mom m"\r
+asciiLevelData(5) = "mo   1 1 1 o1m1m"\r
+asciiLevelData(6) = "momm m m m m111m"\r
+asciiLevelData(7) = "m      h mmmmoom"\r
+asciiLevelData(8) = " mm h          m"\r
+asciiLevelData(9) = "        v mmm mm"\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 3\r
+asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
+asciiLevelData(2) = " h h h h h  ym11"\r
+asciiLevelData(3) = "mm mmmmmmmmmmm1m"\r
+asciiLevelData(4) = "m h  m      xm  "\r
+asciiLevelData(5) = "mm m m mmmmmmmmm"\r
+asciiLevelData(6) = "mmmm     m1m    "\r
+asciiLevelData(7) = "m    h   m1moo m"\r
+asciiLevelData(8) = "m mmmmmm m1moomm"\r
+asciiLevelData(9) = "m 11111m  h h   "\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 4\r
+asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
+asciiLevelData(2) = "     h1  h1    m"\r
+asciiLevelData(3) = "mmm  1 11  1 o1m"\r
+asciiLevelData(4) = "  m 1  oo   1o1m"\r
+asciiLevelData(5) = "m moo       oo1m"\r
+asciiLevelData(6) = "  m      h  o   "\r
+asciiLevelData(7) = "mmm  h      o   "\r
+asciiLevelData(8) = "m           o   "\r
+asciiLevelData(9) = "        x   oy  "\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 5\r
+asciiLevelData(1) = "m       . y -   "\r
+asciiLevelData(2) = "m      m     moo"\r
+asciiLevelData(3) = "m.    mxm    mmo"\r
+asciiLevelData(4) = "m  -    m mmmmmm"\r
+asciiLevelData(5) = "m .    m     mm "\r
+asciiLevelData(6) = "mt  o   o    m  "\r
+asciiLevelData(7) = "m   o om o  ooo "\r
+asciiLevelData(8) = "m   ooooooooooo "\r
+asciiLevelData(9) = "         v    o "\r
+asciiLevelData(10) = "oooooooooooooooo"\r
+CASE 6\r
+CLS\r
+asciiLevelData(1) = "    -           "\r
+asciiLevelData(2) = "             .  "\r
+asciiLevelData(3) = "       oo- oo   "\r
+asciiLevelData(4) = "  -    11  11  ."\r
+asciiLevelData(5) = "       oo  oo   "\r
+asciiLevelData(6) = "   m ym11  11   "\r
+asciiLevelData(7) = "   m  m         "\r
+asciiLevelData(8) = "   ooom  <>  <> "\r
+asciiLevelData(9) = "       xmmm  mmm"\r
+asciiLevelData(10) = "mmmmmmmmmmm  mmm"\r
+CASE 7\r
+asciiLevelData(1) = " oooo           "\r
+asciiLevelData(2) = " o111  .        "\r
+asciiLevelData(3) = " oooo>    >>>>>>"\r
+asciiLevelData(4) = "  .    x v     m"\r
+asciiLevelData(5) = "       mym     m"\r
+asciiLevelData(6) = "        m      m"\r
+asciiLevelData(7) = "            111m"\r
+asciiLevelData(8) = "            111m"\r
+asciiLevelData(9) = "  v          p  "\r
+asciiLevelData(10) = "oooaaaaaaaaaoooo"\r
+CASE 8\r
+asciiLevelData(1) = "      .        o"\r
+asciiLevelData(2) = "  .    mm      o"\r
+asciiLevelData(3) = ".     ommm  t  o"\r
+asciiLevelData(4) = "     mom mm    o"\r
+asciiLevelData(5) = "   pmmoyxmmm   o"\r
+asciiLevelData(6) = "   mmmomammmm  m"\r
+asciiLevelData(7) = "p mmmmv   mmmm  "\r
+asciiLevelData(8) = "mmmmmmmmm mmmmmm"\r
+asciiLevelData(9) = "                "\r
+asciiLevelData(10) = ">>>>>>>>>>>>>>>>"\r
+CurrentLevelNumber% = CurrentLevelNumber% + 1\r
+CASE 10\r
+asciiLevelData(1) = "m.  -          m"\r
+asciiLevelData(2) = "m  .           m"\r
+asciiLevelData(3) = "m 111     -    m"\r
+asciiLevelData(4) = "mmmmm>>>    ammm"\r
+asciiLevelData(5) = "a           a  m"\r
+asciiLevelData(6) = "mmm  t      a  m"\r
+asciiLevelData(7) = "           ma  m"\r
+asciiLevelData(8) = ">>>         a  m"\r
+asciiLevelData(9) = "       m yx  m m"\r
+asciiLevelData(10) = ">>>mmmmmmmmmmm m"\r
+CASE 9\r
+asciiLevelData(1) = "mammmmmmmmmmmmm "\r
+asciiLevelData(2) = "m1m  y     xmo  "\r
+asciiLevelData(3) = "mamooo>>>a>am om"\r
+asciiLevelData(4) = "m1m     m1mamo m"\r
+asciiLevelData(5) = "mamm    m1mam om"\r
+asciiLevelData(6) = "m1m    mm1mamo m"\r
+asciiLevelData(7) = "mammm   m1ma  om"\r
+asciiLevelData(8) = "m1m   mmm1ma o m"\r
+asciiLevelData(9) = "m        amam om"\r
+asciiLevelData(10) = "mmmmmmmm<mmammmm"\r
+CurrentLevelNumber% = CurrentLevelNumber% + 2\r
+CASE 11\r
+asciiLevelData(1) = ">>>>>>>>>>>>>>><"\r
+asciiLevelData(2) = "> <x           <"\r
+asciiLevelData(3) = "> <         >> <"\r
+asciiLevelData(4) = "> <y>>>>>>>    <"\r
+asciiLevelData(5) = "> <       <  <<<"\r
+asciiLevelData(6) = "> <<<<a<< << < >"\r
+asciiLevelData(7) = "> <        < <  "\r
+asciiLevelData(8) = "> <m >m>>m <   >"\r
+asciiLevelData(9) = ">              <"\r
+asciiLevelData(10) = ">>>>m<<<<<<<<mm<"\r
+CurrentLevelNumber% = CurrentLevelNumber% + 2\r
+CASE 12\r
+asciiLevelData(1) = "m     aaaaaaaaam"\r
+asciiLevelData(2) = "m  -         xmm"\r
+asciiLevelData(3) = "m        t. ym 1"\r
+asciiLevelData(4) = "m     .     moom"\r
+asciiLevelData(5) = "m          am  1"\r
+asciiLevelData(6) = "m         mamomm"\r
+asciiLevelData(7) = "m      - mmam  1"\r
+asciiLevelData(8) = "m       mmmamomm"\r
+asciiLevelData(9) = "m p  p mm      1"\r
+asciiLevelData(10) = "mmmmmmmmmammmm<<"\r
+CASE 13\r
+asciiLevelData(1) = "mmmmmmmmmmmmmmmm"\r
+asciiLevelData(2) = "m   m          m"\r
+asciiLevelData(3) = "  ma   1a1a1a  m"\r
+asciiLevelData(4) = "mmma aaaaaaaam m"\r
+asciiLevelData(5) = "11maaaaaaaaaam m"\r
+asciiLevelData(6) = "mmmaaaaaaaaaam m"\r
+asciiLevelData(7) = "11x         ym m"\r
+asciiLevelData(8) = "mmmmmmmmmmmmmm m"\r
+asciiLevelData(9) = "               m"\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+CASE 14\r
+asciiLevelData(1) = "mmmmmmmmm-      "\r
+asciiLevelData(2) = "mm mmmmmmm  -   "\r
+asciiLevelData(3) = "mm       m      "\r
+asciiLevelData(4) = "mm >>>>> m  -   "\r
+asciiLevelData(5) = "mmv  m   m     ."\r
+asciiLevelData(6) = ">><< m <<m  -   "\r
+asciiLevelData(7) = "11 m m m   .    "\r
+asciiLevelData(8) = ">> m m m    xy    "\r
+asciiLevelData(9) = "mm  vm    v     "\r
+asciiLevelData(10) = "mm>><m>>>>>mmmmm"\r
+CASE 15\r
+CLS\r
+asciiLevelData(1) = "      m        m"\r
+asciiLevelData(2) = "mm ymmmmmmmmmaaa"\r
+asciiLevelData(3) = "<<oo    1111maaa"\r
+asciiLevelData(4) = "       <<111maaa"\r
+asciiLevelData(5) = "<<m<     m11maaa"\r
+asciiLevelData(6) = "    t  oomm  aaa"\r
+asciiLevelData(7) = "      vo    mm1m"\r
+asciiLevelData(8) = "       mm<<<mm1m"\r
+asciiLevelData(9) = "  m  x <<mmmmm11"\r
+asciiLevelData(10) = "mmmmmmmmmmmmmmmm"\r
+graphicsMode = 1\r
+CASE 16\r
+asciiLevelData(1) = "m11     aa       m     11111  m"\r
+asciiLevelData(2) = "m11    a   a  a    <          m"\r
+asciiLevelData(3) = "m11  >aam       v  t  a       m"\r
+asciiLevelData(4) = "m11om y o                 a  am"\r
+asciiLevelData(5) = "m11  oooo  t                  m"\r
+asciiLevelData(6) = ">>>om         p  p        m   m"\r
+asciiLevelData(7) = "m     mmm     mamamom     mm  m"\r
+asciiLevelData(8) = "m  v mmmmm    mam 11m  mmmmmm m"\r
+asciiLevelData(9) = "m  mmmmmmmmm  mam  1mm    mm  m"\r
+asciiLevelData(10) = "mm  m1     m  mam111m     m   m"\r
+asciiLevelData(11) = "m m  o     m  mam  vm         m"\r
+asciiLevelData(12) = "m  m  m1111m vmammmmm  m      m"\r
+asciiLevelData(13) = "m   m  mmmmm 11                "\r
+asciiLevelData(14) = "mmmmmm   m mamammmmm         mm"\r
+asciiLevelData(15) = "m       m  mam1111m       m  >m"\r
+asciiLevelData(16) = "m      m   m1m111m     m      m"\r
+asciiLevelData(17) = "      m    mammmm  mm>>> <<<>>m"\r
+asciiLevelData(18) = "     m     m  x   m      m   m "\r
+asciiLevelData(19) = "mmmmm      mmmmmmm       mmm mm"\r
+graphicsMode = 2\r
+CASE 17\r
+asciiLevelData(1) = "mu 1111        m"\r
+asciiLevelData(2) = "mmmmmmm   <<<<am"\r
+asciiLevelData(3) = "m     m  a   mam"\r
+asciiLevelData(4) = "m     m    y m1m"\r
+asciiLevelData(5) = "m     mm   <xmam"\r
+asciiLevelData(6) = "      m  <<<<m1m"\r
+asciiLevelData(7) = "      m      ma1"\r
+asciiLevelData(8) = "mmmm  m    <<mmm"\r
+asciiLevelData(9) = "m111    vU   m  "\r
+asciiLevelData(10) = "mmmmmmmaamaaam  "\r
+graphicsMode = 1\r
+CASE 18\r
+asciiLevelData(1) = "oo            m                "\r
+asciiLevelData(2) = "oo     h   h  m                "\r
+asciiLevelData(3) = "oo x          m   h      m>>>>>"\r
+asciiLevelData(4) = "oo m11111111m m         mm    m"\r
+asciiLevelData(5) = "oo m11111111m m  mm  h  m     m"\r
+asciiLevelData(6) = "oo mmmmmmmmmm m   m    vm     m"\r
+asciiLevelData(7) = "oo            mm  mmmmmmm     m"\r
+asciiLevelData(8) = " v                            m"\r
+asciiLevelData(9) = "mom    mmmmmm   v             m"\r
+asciiLevelData(10) = "m m m  mmmmmm     mm   h  h   m"\r
+asciiLevelData(11) = "m                             m"\r
+asciiLevelData(12) = "m <<<<<<<<<<<<<<<<<<<<<<<<<<< m"\r
+asciiLevelData(13) = "mam                           m"\r
+asciiLevelData(14) = "mammooooommaaammm      maaaaavm"\r
+asciiLevelData(15) = "mam     oo       a ma  m111111m"\r
+asciiLevelData(16) = "mam    oo  <<< h mh h  mma<>amm"\r
+asciiLevelData(17) = "mam   moom   <<               m"\r
+asciiLevelData(18) = "my   mm         m     m       m"\r
+asciiLevelData(19) = "mmmmmmmmmmmm<<mmmaaaaammmmmmmmm"\r
+graphicsMode = 2\r
+CASE 19\r
+CLS\r
+DrawSprite 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
+END\r
+END\r
+CASE 100\r
+asciiLevelData(1) = "                "\r
+asciiLevelData(2) = "                "\r
+asciiLevelData(3) = "                "\r
+asciiLevelData(4) = "                "\r
+asciiLevelData(5) = "                "\r
+asciiLevelData(6) = "                "\r
+asciiLevelData(7) = "                "\r
+asciiLevelData(8) = "                "\r
+asciiLevelData(9) = "                "\r
+asciiLevelData(10) = "                "\r
+CASE 101\r
+asciiLevelData(1) = "                               "\r
+asciiLevelData(2) = "                               "\r
+asciiLevelData(3) = "                               "\r
+asciiLevelData(4) = "                               "\r
+asciiLevelData(5) = "                               "\r
+asciiLevelData(6) = "                               "\r
+asciiLevelData(7) = "                               "\r
+asciiLevelData(8) = "                               "\r
+asciiLevelData(9) = "                               "\r
+asciiLevelData(10) = "                               "\r
+asciiLevelData(11) = "                               "\r
+asciiLevelData(12) = "                               "\r
+asciiLevelData(13) = "                               "\r
+asciiLevelData(14) = "                               "\r
+asciiLevelData(15) = "                               "\r
+asciiLevelData(16) = "                               "\r
+asciiLevelData(17) = "                               "\r
+asciiLevelData(18) = "                               "\r
+asciiLevelData(19) = "                               "\r
+graphicsMode = 2\r
+\r
+END SELECT\r
+IF graphicsMode = 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$ = "m" THEN PUT (D * 20, e * 20), SolidTerrainSprite, PSET: TerrainGrid(D + 1, e + 1) = "z"\r
+IF q$ = "o" THEN PUT (D * 20, e * 20), kast, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(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 FirstCompanionX% = D * 20: FirstCompanionY% = (e + 1) * 20\r
+IF q$ = "y" THEN SecondCompanionX% = D * 20: SecondCompanionY% = (e + 1) * 20\r
+IF q$ = "1" THEN PUT (D * 20, e * 20), CoinSprite, PSET: TerrainGrid(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), WindowSprite, PSET\r
+IF q$ = "v" THEN PUT (D * 20, (e * 20) + 10), TrampolineSprite, PSET: TerrainGrid(D + 1, e + 1) = "v"\r
+IF q$ = "t" THEN PUT (D * 20, e * 20), TreeSprite, PSET\r
+IF q$ = ">" THEN PUT (D * 20, e * 20), noolt, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = ">"\r
+IF q$ = "<" THEN PUT (D * 20, e * 20), noolt1, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "<"\r
+IF q$ = "a" THEN PUT (D * 20, e * 20), HoleSprite, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = "a"\r
+IF q$ = "u" THEN PUT (D * 20, e * 20), DoorSprite, PSET: TerrainGrid(D + 1, e + 1) = "u": DoorEntryX% = D * 20: DoorEntryY% = e * 20\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), kastm, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(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 FirstCompanionX% = D * 20: FirstCompanionY% = (e + 1) * 20\r
+IF q$ = "y" THEN SecondCompanionX% = D * 20: SecondCompanionY% = (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), poosasm, 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), nooltm, PSET: TerrainGrid(D + 1, e + 1) = "z": ObjectGrid(D + 1, e + 1) = ">"\r
+IF q$ = "<" THEN PUT (D * 10, e * 10), nooltm1, 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
diff --git a/Games/Pomppu Paavo/Pomppu Paavo.png b/Games/Pomppu Paavo/Pomppu Paavo.png
new file mode 100644 (file)
index 0000000..a37d478
Binary files /dev/null and b/Games/Pomppu Paavo/Pomppu Paavo.png differ
index 67400cb..0dec982 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:41 -->
+<!-- 2025-08-21 to 21:54 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Plotting</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org2fe2ecb">1. 2D graph</a></li>
-<li><a href="#org59b5f9c">2. 3D graph</a></li>
-<li><a href="#org2ccad63">3. Deriviative calculator</a></li>
-<li><a href="#org753bfed">4. Sine and cosine table</a></li>
+<li><a href="#org490acaf">1. 2D graph</a></li>
+<li><a href="#org59ff41b">2. 3D graph</a></li>
+<li><a href="#orgeed3e27">3. Deriviative calculator</a></li>
+<li><a href="#orgb70749f">4. Sine and cosine table</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org2fe2ecb" class="outline-2">
-<h2 id="org2fe2ecb"><span class="section-number-2">1.</span> 2D graph</h2>
+<div id="outline-container-org490acaf" class="outline-2">
+<h2 id="org490acaf"><span class="section-number-2">1.</span> 2D graph</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 The 2D Graph Plotter is a simple yet effective program written in
@@ -251,7 +251,7 @@ based on a user-defined mathematical function.
 </p>
 
 
-<div id="orgdbfc5ac" class="figure">
+<div id="org0762592" class="figure">
 <p><a href="2D%20graph%20plot.bas" class="responsive-img"><img src="2D%20graph%20plot.png" alt="2D%20graph%20plot.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -262,8 +262,8 @@ based on a user-defined mathematical function.
 </div>
 </div>
 
-<div id="outline-container-org59b5f9c" class="outline-2">
-<h2 id="org59b5f9c"><span class="section-number-2">2.</span> 3D graph</h2>
+<div id="outline-container-org59ff41b" class="outline-2">
+<h2 id="org59ff41b"><span class="section-number-2">2.</span> 3D graph</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 The 3D Heightmap Explorer is a QBasic program designed to visualize
@@ -299,7 +299,7 @@ grid.
 </p>
 
 
-<div id="org199127a" class="figure">
+<div id="orga6d2606" class="figure">
 <p><a href="3D%20graph.bas" class="responsive-img"><img src="3D%20graph.png" alt="3D%20graph.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -310,8 +310,8 @@ grid.
 </div>
 </div>
 
-<div id="outline-container-org2ccad63" class="outline-2">
-<h2 id="org2ccad63"><span class="section-number-2">3.</span> Deriviative calculator</h2>
+<div id="outline-container-orgeed3e27" class="outline-2">
+<h2 id="orgeed3e27"><span class="section-number-2">3.</span> Deriviative calculator</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program is designed to compute and plot an arbitrary
@@ -324,7 +324,7 @@ visualized.
 </p>
 
 
-<div id="org220f716" class="figure">
+<div id="org78a990f" class="figure">
 <p><a href="Deriviative%20calculator.bas" class="responsive-img"><img src="Deriviative%20calculator.png" alt="Deriviative%20calculator.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -335,8 +335,8 @@ visualized.
 </div>
 </div>
 
-<div id="outline-container-org753bfed" class="outline-2">
-<h2 id="org753bfed"><span class="section-number-2">4.</span> Sine and cosine table</h2>
+<div id="outline-container-orgb70749f" class="outline-2">
+<h2 id="orgb70749f"><span class="section-number-2">4.</span> Sine and cosine table</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 The SIN &amp; COS Table Generator is a QBasic program designed to visually
@@ -346,7 +346,7 @@ visual representation of these fundamental trigonometric functions.
 </p>
 
 
-<div id="org14a8968" class="figure">
+<div id="org5f2b329" class="figure">
 <p><a href="Sine%20and%20cosine%20table.bas" class="responsive-img"><img src="Sine%20and%20cosine%20table.png" alt="Sine%20and%20cosine%20table.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -358,7 +358,7 @@ visual representation of these fundamental trigonometric functions.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:41</p>
+<p class="date">Created: 2025-08-21 to 21:54</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index f9ecc93..6581e0d 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:41 -->
+<!-- 2025-08-21 to 21:55 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Simulation</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org463ee62">1. Explosion simulator</a></li>
-<li><a href="#orgc03cf88">2. Gravity in 2D</a></li>
-<li><a href="#orgdda1843">3. Gravity in 3D</a></li>
-<li><a href="#orgb008a86">4. Interference</a></li>
-<li><a href="#org2ef04a9">5. Interferogram</a></li>
-<li><a href="#org005f34b">6. Surface tension</a></li>
-<li><a href="#org454c4b8">7. Wave 1</a></li>
-<li><a href="#orgeb059c7">8. Wave 2</a></li>
+<li><a href="#orgdfedd69">1. Explosion simulator</a></li>
+<li><a href="#org5d98092">2. Gravity in 2D</a></li>
+<li><a href="#org0dc5aee">3. Gravity in 3D</a></li>
+<li><a href="#org36f241a">4. Interference</a></li>
+<li><a href="#orgd7aaa57">5. Interferogram</a></li>
+<li><a href="#orgdc5efe7">6. Surface tension</a></li>
+<li><a href="#orgf92c587">7. Wave 1</a></li>
+<li><a href="#orgd0aed50">8. Wave 2</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org463ee62" class="outline-2">
-<h2 id="org463ee62"><span class="section-number-2">1.</span> Explosion simulator</h2>
+<div id="outline-container-orgdfedd69" class="outline-2">
+<h2 id="orgdfedd69"><span class="section-number-2">1.</span> Explosion simulator</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program simulates the propagation of shock waves in a gas
@@ -265,7 +265,7 @@ conditions by setting velocities to zero at wall boundaries.
 </p>
 
 
-<div id="org75591d2" class="figure">
+<div id="orged6652a" class="figure">
 <p><a href="Explosion%20simulator.bas" class="responsive-img"><img src="Explosion%20simulator.png" alt="Explosion%20simulator.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -276,8 +276,8 @@ conditions by setting velocities to zero at wall boundaries.
 </div>
 </div>
 
-<div id="outline-container-orgc03cf88" class="outline-2">
-<h2 id="orgc03cf88"><span class="section-number-2">2.</span> Gravity in 2D</h2>
+<div id="outline-container-org5d98092" class="outline-2">
+<h2 id="org5d98092"><span class="section-number-2">2.</span> Gravity in 2D</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 The Gravitation Simulation program is a simple yet insightful QBasic
@@ -289,7 +289,7 @@ educational tool for understanding basic orbital mechanics.
 </p>
 
 
-<div id="org72cc1ed" class="figure">
+<div id="org1fd2442" class="figure">
 <p><a href="Gravity%20in%202D.bas" class="responsive-img"><img src="Gravity%20in%202D.png" alt="Gravity%20in%202D.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -300,8 +300,8 @@ educational tool for understanding basic orbital mechanics.
 </div>
 </div>
 
-<div id="outline-container-orgdda1843" class="outline-2">
-<h2 id="orgdda1843"><span class="section-number-2">3.</span> Gravity in 3D</h2>
+<div id="outline-container-org0dc5aee" class="outline-2">
+<h2 id="org0dc5aee"><span class="section-number-2">3.</span> Gravity in 3D</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program simulates the gravitational interactions between
@@ -335,8 +335,8 @@ will reach stable configuration.
 </div>
 </div>
 
-<div id="outline-container-orgb008a86" class="outline-2">
-<h2 id="orgb008a86"><span class="section-number-2">4.</span> Interference</h2>
+<div id="outline-container-org36f241a" class="outline-2">
+<h2 id="org36f241a"><span class="section-number-2">4.</span> Interference</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program simulates the interference pattern created by two
@@ -364,8 +364,8 @@ displayed as a third waveform.
 </div>
 </div>
 
-<div id="outline-container-org2ef04a9" class="outline-2">
-<h2 id="org2ef04a9"><span class="section-number-2">5.</span> Interferogram</h2>
+<div id="outline-container-orgd7aaa57" class="outline-2">
+<h2 id="orgd7aaa57"><span class="section-number-2">5.</span> Interferogram</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 This QBasic program simulates the interference pattern created by
@@ -375,7 +375,7 @@ used in physics and engineering to analyze wave interactions.
 </p>
 
 
-<div id="org7879724" class="figure">
+<div id="orgd34df9e" class="figure">
 <p><a href="Interferogram.bas" class="responsive-img"><img src="Interferogram.png" alt="Interferogram.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -386,8 +386,8 @@ used in physics and engineering to analyze wave interactions.
 </div>
 </div>
 
-<div id="outline-container-org005f34b" class="outline-2">
-<h2 id="org005f34b"><span class="section-number-2">6.</span> Surface tension</h2>
+<div id="outline-container-orgdc5efe7" class="outline-2">
+<h2 id="orgdc5efe7"><span class="section-number-2">6.</span> Surface tension</h2>
 <div class="outline-text-2" id="text-6">
 <p>
 This QBasic program simulates the behavior of water spills and the
@@ -411,7 +411,7 @@ water cell if surrounded by a high density of water cells.
 </p>
 
 
-<div id="org0627f91" class="figure">
+<div id="org44a620d" class="figure">
 <p><a href="Surface%20tension.bas" class="responsive-img"><img src="Surface%20tension.png" alt="Surface%20tension.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -422,8 +422,8 @@ water cell if surrounded by a high density of water cells.
 </div>
 </div>
 
-<div id="outline-container-org454c4b8" class="outline-2">
-<h2 id="org454c4b8"><span class="section-number-2">7.</span> Wave 1</h2>
+<div id="outline-container-orgf92c587" class="outline-2">
+<h2 id="orgf92c587"><span class="section-number-2">7.</span> Wave 1</h2>
 <div class="outline-text-2" id="text-7">
 <p>
 This QBasic program simulates the propagation of waves across a
@@ -439,7 +439,7 @@ loss.
 </p>
 
 
-<div id="orgbef1a5a" class="figure">
+<div id="org5421a9e" class="figure">
 <p><a href="Wave%201.bas" class="responsive-img"><img src="Wave%201.png" alt="Wave%201.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -450,8 +450,8 @@ loss.
 </div>
 </div>
 
-<div id="outline-container-orgeb059c7" class="outline-2">
-<h2 id="orgeb059c7"><span class="section-number-2">8.</span> Wave 2</h2>
+<div id="outline-container-orgd0aed50" class="outline-2">
+<h2 id="orgd0aed50"><span class="section-number-2">8.</span> Wave 2</h2>
 <div class="outline-text-2" id="text-8">
 <p>
 This QBasic program simulates and visualizes the behavior of water
@@ -463,7 +463,7 @@ understanding wave mechanics.
 </p>
 
 
-<div id="orgeda2d8a" class="figure">
+<div id="org447b3f7" class="figure">
 <p><a href="Wave%202.bas" class="responsive-img"><img src="Wave%202.png" alt="Wave%202.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -475,7 +475,7 @@ understanding wave mechanics.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:41</p>
+<p class="date">Created: 2025-08-21 to 21:55</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 04a0238..f0f9a69 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:42 -->
+<!-- 2025-08-21 to 21:56 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Truth table calculator</title>
@@ -1103,20 +1103,20 @@ hsAddReviewPanels();
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org599912e">1. Implemented logical operations</a>
+<li><a href="#org7671461">1. Implemented logical operations</a>
 <ul>
-<li><a href="#org47008e6">1.1. Equivalent ( ⇔ , 1 )</a></li>
-<li><a href="#org12c7636">1.2. Implies ( ⇒ , 2 )</a></li>
-<li><a href="#org64afeb6">1.3. OR ( ∨ , 3 )</a></li>
-<li><a href="#org0efd4a6">1.4. AND ( ∧ , 4 )</a></li>
-<li><a href="#org5feef60">1.5. NOT ( ¬ , 5 )</a></li>
+<li><a href="#org50d0b37">1.1. Equivalent ( ⇔ , 1 )</a></li>
+<li><a href="#org4ef8eb8">1.2. Implies ( ⇒ , 2 )</a></li>
+<li><a href="#org1c1890c">1.3. OR ( ∨ , 3 )</a></li>
+<li><a href="#orgcee7cd2">1.4. AND ( ∧ , 4 )</a></li>
+<li><a href="#org21a4e7d">1.5. NOT ( ¬ , 5 )</a></li>
 </ul>
 </li>
-<li><a href="#orga2be0ae">2. Examples</a>
+<li><a href="#orgfed6829">2. Examples</a>
 <ul>
-<li><a href="#org26776eb">2.1. Example: (A ∧ B) ∨ ¬C</a></li>
-<li><a href="#org9bb12d4">2.2. Example: A ⇒ (B ∨ ¬C)</a></li>
-<li><a href="#orge0d2b66">2.3. Example: (A ⇔ B) ∧ C</a></li>
+<li><a href="#org71d5c8f">2.1. Example: (A ∧ B) ∨ ¬C</a></li>
+<li><a href="#org7d15dec">2.2. Example: A ⇒ (B ∨ ¬C)</a></li>
+<li><a href="#org4b5bd65">2.3. Example: (A ⇔ B) ∧ C</a></li>
 </ul>
 </li>
 </ul>
@@ -1133,12 +1133,12 @@ the input variables, with the corresponding output value. Truth tables are cruci
 designing and understanding digital circuits, Boolean algebra, and logical expressions.
 </p>
 
-<div id="outline-container-org599912e" class="outline-2">
-<h2 id="org599912e"><span class="section-number-2">1.</span> Implemented logical operations</h2>
+<div id="outline-container-org7671461" class="outline-2">
+<h2 id="org7671461"><span class="section-number-2">1.</span> Implemented logical operations</h2>
 <div class="outline-text-2" id="text-1">
 </div>
-<div id="outline-container-org47008e6" class="outline-3">
-<h3 id="org47008e6"><span class="section-number-3">1.1.</span> Equivalent ( ⇔ , 1 )</h3>
+<div id="outline-container-org50d0b37" class="outline-3">
+<h3 id="org50d0b37"><span class="section-number-3">1.1.</span> Equivalent ( ⇔ , 1 )</h3>
 <div class="outline-text-3" id="text-1-1">
 <p>
 The equivalent operation, also known as logical biconditional, is true if and only if
@@ -1196,8 +1196,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-org12c7636" class="outline-3">
-<h3 id="org12c7636"><span class="section-number-3">1.2.</span> Implies ( ⇒ , 2 )</h3>
+<div id="outline-container-org4ef8eb8" class="outline-3">
+<h3 id="org4ef8eb8"><span class="section-number-3">1.2.</span> Implies ( ⇒ , 2 )</h3>
 <div class="outline-text-3" id="text-1-2">
 <p>
 An implication asserts that if the first proposition is true, the
@@ -1255,8 +1255,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-org64afeb6" class="outline-3">
-<h3 id="org64afeb6"><span class="section-number-3">1.3.</span> OR ( ∨ , 3 )</h3>
+<div id="outline-container-org1c1890c" class="outline-3">
+<h3 id="org1c1890c"><span class="section-number-3">1.3.</span> OR ( ∨ , 3 )</h3>
 <div class="outline-text-3" id="text-1-3">
 <p>
 The OR operation, also known as logical disjunction, is true if at
@@ -1314,8 +1314,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-org0efd4a6" class="outline-3">
-<h3 id="org0efd4a6"><span class="section-number-3">1.4.</span> AND ( ∧ , 4 )</h3>
+<div id="outline-container-orgcee7cd2" class="outline-3">
+<h3 id="orgcee7cd2"><span class="section-number-3">1.4.</span> AND ( ∧ , 4 )</h3>
 <div class="outline-text-3" id="text-1-4">
 <p>
 The AND operation, also known as logical conjunction, is true if and
@@ -1372,8 +1372,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-org5feef60" class="outline-3">
-<h3 id="org5feef60"><span class="section-number-3">1.5.</span> NOT ( ¬ , 5 )</h3>
+<div id="outline-container-org21a4e7d" class="outline-3">
+<h3 id="org21a4e7d"><span class="section-number-3">1.5.</span> NOT ( ¬ , 5 )</h3>
 <div class="outline-text-3" id="text-1-5">
 <p>
 The NOT operation, also known as logical negation, inverts the value
@@ -1414,12 +1414,12 @@ Truth Table:
 </div>
 </div>
 </div>
-<div id="outline-container-orga2be0ae" class="outline-2">
-<h2 id="orga2be0ae"><span class="section-number-2">2.</span> Examples</h2>
+<div id="outline-container-orgfed6829" class="outline-2">
+<h2 id="orgfed6829"><span class="section-number-2">2.</span> Examples</h2>
 <div class="outline-text-2" id="text-2">
 </div>
-<div id="outline-container-org26776eb" class="outline-3">
-<h3 id="org26776eb"><span class="section-number-3">2.1.</span> Example: (A ∧ B) ∨ ¬C</h3>
+<div id="outline-container-org71d5c8f" class="outline-3">
+<h3 id="org71d5c8f"><span class="section-number-3">2.1.</span> Example: (A ∧ B) ∨ ¬C</h3>
 <div class="outline-text-3" id="text-2-1">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1502,8 +1502,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-org9bb12d4" class="outline-3">
-<h3 id="org9bb12d4"><span class="section-number-3">2.2.</span> Example: A ⇒ (B ∨ ¬C)</h3>
+<div id="outline-container-org7d15dec" class="outline-3">
+<h3 id="org7d15dec"><span class="section-number-3">2.2.</span> Example: A ⇒ (B ∨ ¬C)</h3>
 <div class="outline-text-3" id="text-2-2">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1586,8 +1586,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-orge0d2b66" class="outline-3">
-<h3 id="orge0d2b66"><span class="section-number-3">2.3.</span> Example: (A ⇔ B) ∧ C</h3>
+<div id="outline-container-org4b5bd65" class="outline-3">
+<h3 id="org4b5bd65"><span class="section-number-3">2.3.</span> Example: (A ⇔ B) ∧ C</h3>
 <div class="outline-text-3" id="text-2-3">
 <p>
 Truth Table:
@@ -1676,7 +1676,7 @@ Truth Table:
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:42</p>
+<p class="date">Created: 2025-08-21 to 21:56</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 4fa7079..95d318f 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:43 -->
+<!-- 2025-08-21 to 21:56 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Mouse driver for QBasic programs</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgb028711">1. Overview</a></li>
-<li><a href="#org66f515a">2. High-level idea</a></li>
-<li><a href="#orgcc9847a">3. Terminate and Stay Resident module</a></li>
-<li><a href="#org4e72599">4. QBasic demonstration program</a></li>
+<li><a href="#org4a0c7d1">1. Overview</a></li>
+<li><a href="#org5362a97">2. High-level idea</a></li>
+<li><a href="#org52f8d8c">3. Terminate and Stay Resident module</a></li>
+<li><a href="#orgb8f79f0">4. QBasic demonstration program</a></li>
 </ul>
 </div>
 </div>
 
-<div id="outline-container-orgb028711" class="outline-2">
-<h2 id="orgb028711"><span class="section-number-2">1.</span> Overview</h2>
+<div id="outline-container-org4a0c7d1" class="outline-2">
+<h2 id="org4a0c7d1"><span class="section-number-2">1.</span> Overview</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 QBasic, a popular programming language in the DOS era, lacks native
@@ -230,8 +230,8 @@ workaround that allows QBasic to use mouse input.
 </div>
 </div>
 
-<div id="outline-container-org66f515a" class="outline-2">
-<h2 id="org66f515a"><span class="section-number-2">2.</span> High-level idea</h2>
+<div id="outline-container-org5362a97" class="outline-2">
+<h2 id="org5362a97"><span class="section-number-2">2.</span> High-level idea</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 Workaround to access mouse involves a Terminate and Stay Resident
@@ -264,8 +264,8 @@ TSR keeps updating it with latest mouse state simultaneously.
 </div>
 </div>
 
-<div id="outline-container-orgcc9847a" class="outline-2">
-<h2 id="orgcc9847a"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
+<div id="outline-container-org52f8d8c" class="outline-2">
+<h2 id="org52f8d8c"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 A DOS TSR program that hooks into the system's interrupt mechanism to
@@ -351,8 +351,8 @@ meanwhile.</dd>
 </div>
 </div>
 
-<div id="outline-container-org4e72599" class="outline-2">
-<h2 id="org4e72599"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
+<div id="outline-container-orgb8f79f0" class="outline-2">
+<h2 id="orgb8f79f0"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 A QBasic program that reads mouse data from the memory location
@@ -362,7 +362,7 @@ clicks.
 
 
 
-<div id="org79862a5" class="figure">
+<div id="org594d99b" class="figure">
 <p><a href="mousedrv.bas" class="responsive-img"><img src="screenshot.png" alt="screenshot.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -383,7 +383,7 @@ used: Within <a href="https://www3.svjatoslav.eu/projects/qbasicapps/3D%20GFX/Sp
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:43</p>
+<p class="date">Created: 2025-08-21 to 21:56</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 70ca4f5..9914624 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:43 -->
+<!-- 2025-08-21 to 21:57 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Data over analog audio</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgea3d968">1. msg2xi: Text to Sound Encoder</a></li>
-<li><a href="#orgfbd1c5e">2. xi2msg: Sound to Text Decoder</a></li>
-<li><a href="#org3f78d40">3. aver</a></li>
+<li><a href="#org7430172">1. msg2xi: Text to Sound Encoder</a></li>
+<li><a href="#orga2c96f7">2. xi2msg: Sound to Text Decoder</a></li>
+<li><a href="#org166bf1b">3. aver</a></li>
 </ul>
 </div>
 </div>
 
-<div id="outline-container-orgea3d968" class="outline-2">
-<h2 id="orgea3d968"><span class="section-number-2">1.</span> msg2xi: Text to Sound Encoder</h2>
+<div id="outline-container-org7430172" class="outline-2">
+<h2 id="org7430172"><span class="section-number-2">1.</span> msg2xi: Text to Sound Encoder</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 <b>msg2xi</b> is a utility designed to encode arbitrary text messages into an
@@ -245,8 +245,8 @@ Download source code: <a href="msg2xi.bas">Source code</a>
 </div>
 </div>
 
-<div id="outline-container-orgfbd1c5e" class="outline-2">
-<h2 id="orgfbd1c5e"><span class="section-number-2">2.</span> xi2msg: Sound to Text Decoder</h2>
+<div id="outline-container-orga2c96f7" class="outline-2">
+<h2 id="orga2c96f7"><span class="section-number-2">2.</span> xi2msg: Sound to Text Decoder</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 The <b>xi2msg</b> utility is designed to decode digital information from an
@@ -287,7 +287,7 @@ transmitted over telephone lines.
 </p>
 
 
-<div id="orgb3872bc" class="figure">
+<div id="org5260b38" class="figure">
 <p><img src="screenshot.png" alt="screenshot.png" />
 </p>
 </div>
@@ -299,8 +299,8 @@ Download source code: <a href="xi2msg.bas">Source code</a>
 </div>
 </div>
 
-<div id="outline-container-org3f78d40" class="outline-2">
-<h2 id="org3f78d40"><span class="section-number-2">3.</span> aver</h2>
+<div id="outline-container-org166bf1b" class="outline-2">
+<h2 id="org166bf1b"><span class="section-number-2">3.</span> aver</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 The <b>aver.bas</b> utility is designed to reduce noise in digitized audio
@@ -343,7 +343,7 @@ Download source code: <a href="aver.bas">Source code</a>
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:43</p>
+<p class="date">Created: 2025-08-21 to 21:57</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index d26146b..bf5d853 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-08-21 to 21:43 -->
+<!-- 2025-08-21 to 21:57 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>LPT Communication Driver</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org5f4b120">1. Overview</a></li>
-<li><a href="#orgf6ab410">2. LPT Communication Driver</a>
+<li><a href="#org6aa91ac">1. Overview</a></li>
+<li><a href="#orge4c0c61">2. LPT Communication Driver</a>
 <ul>
-<li><a href="#org837c7b1">2.1. Overview</a></li>
-<li><a href="#org8952900">2.2. Data transmission implementation details</a></li>
-<li><a href="#org2e4374e">2.3. Driver API</a>
+<li><a href="#org3ca6080">2.1. Overview</a></li>
+<li><a href="#org976bc84">2.2. Data transmission implementation details</a></li>
+<li><a href="#org1cd8da0">2.3. Driver API</a>
 <ul>
-<li><a href="#org1fd5a15">2.3.1. Deactivate the driver</a></li>
-<li><a href="#org9fb3846">2.3.2. Activate the driver</a></li>
-<li><a href="#org2beca34">2.3.3. Retrieve downloaded data from the driver's input buffer</a></li>
-<li><a href="#org542d988">2.3.4. Upload data to the driver's output buffer for transmission</a></li>
+<li><a href="#orgf53f25e">2.3.1. Deactivate the driver</a></li>
+<li><a href="#orgeb6dd0f">2.3.2. Activate the driver</a></li>
+<li><a href="#orgef60e00">2.3.3. Retrieve downloaded data from the driver's input buffer</a></li>
+<li><a href="#org219ed21">2.3.4. Upload data to the driver's output buffer for transmission</a></li>
 </ul>
 </li>
 </ul>
 </div>
 </div>
 
-<div id="outline-container-org5f4b120" class="outline-2">
-<h2 id="org5f4b120"><span class="section-number-2">1.</span> Overview</h2>
+<div id="outline-container-org6aa91ac" class="outline-2">
+<h2 id="org6aa91ac"><span class="section-number-2">1.</span> Overview</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This is weird networking solution. It allows to send data using
@@ -256,7 +256,7 @@ communication.</dd>
 </dl>
 
 
-<div id="org03571ee" class="figure">
+<div id="orgb3f7ece" class="figure">
 <p><img src="diagram.png" alt="diagram.png" />
 </p>
 </div>
@@ -269,12 +269,12 @@ built to connect 2 computers in a DIY network setup.
 </div>
 </div>
 
-<div id="outline-container-orgf6ab410" class="outline-2">
-<h2 id="orgf6ab410"><span class="section-number-2">2.</span> LPT Communication Driver</h2>
+<div id="outline-container-orge4c0c61" class="outline-2">
+<h2 id="orge4c0c61"><span class="section-number-2">2.</span> LPT Communication Driver</h2>
 <div class="outline-text-2" id="text-2">
 </div>
-<div id="outline-container-org837c7b1" class="outline-3">
-<h3 id="org837c7b1"><span class="section-number-3">2.1.</span> Overview</h3>
+<div id="outline-container-org3ca6080" class="outline-3">
+<h3 id="org3ca6080"><span class="section-number-3">2.1.</span> Overview</h3>
 <div class="outline-text-3" id="text-2-1">
 <p>
 The LPT Communication Driver is a Terminate and Stay Resident (TSR)
@@ -322,8 +322,8 @@ Download:
 </div>
 </div>
 
-<div id="outline-container-org8952900" class="outline-3">
-<h3 id="org8952900"><span class="section-number-3">2.2.</span> Data transmission implementation details</h3>
+<div id="outline-container-org976bc84" class="outline-3">
+<h3 id="org976bc84"><span class="section-number-3">2.2.</span> Data transmission implementation details</h3>
 <div class="outline-text-3" id="text-2-2">
 <p>
 When there is incoming data transmission, the TSR driver detects it
@@ -405,8 +405,8 @@ is returned.
 </div>
 </div>
 
-<div id="outline-container-org2e4374e" class="outline-3">
-<h3 id="org2e4374e"><span class="section-number-3">2.3.</span> Driver API</h3>
+<div id="outline-container-org1cd8da0" class="outline-3">
+<h3 id="org1cd8da0"><span class="section-number-3">2.3.</span> Driver API</h3>
 <div class="outline-text-3" id="text-2-3">
 <p>
 The driver uses INT 63h for its API, with functions selected via the
@@ -462,29 +462,29 @@ API overview:
 <tbody>
 <tr>
 <td class="org-right">0</td>
-<td class="org-left"><a href="#org1fd5a15">Deactivate the driver</a></td>
+<td class="org-left"><a href="#orgf53f25e">Deactivate the driver</a></td>
 </tr>
 
 <tr>
 <td class="org-right">1</td>
-<td class="org-left"><a href="#org9fb3846">Activate the driver</a></td>
+<td class="org-left"><a href="#orgeb6dd0f">Activate the driver</a></td>
 </tr>
 
 <tr>
 <td class="org-right">2</td>
-<td class="org-left"><a href="#org2beca34">Retrieve downloaded data from the driver's input buffer</a></td>
+<td class="org-left"><a href="#orgef60e00">Retrieve downloaded data from the driver's input buffer</a></td>
 </tr>
 
 <tr>
 <td class="org-right">3</td>
-<td class="org-left"><a href="#org542d988">Upload data to the driver's output buffer for transmission</a></td>
+<td class="org-left"><a href="#org219ed21">Upload data to the driver's output buffer for transmission</a></td>
 </tr>
 </tbody>
 </table>
 </div>
 
-<div id="outline-container-org1fd5a15" class="outline-4">
-<h4 id="org1fd5a15"><span class="section-number-4">2.3.1.</span> Deactivate the driver</h4>
+<div id="outline-container-orgf53f25e" class="outline-4">
+<h4 id="orgf53f25e"><span class="section-number-4">2.3.1.</span> Deactivate the driver</h4>
 <div class="outline-text-4" id="text-2-3-1">
 <p>
 Disables the driver, stopping background monitoring and
@@ -502,8 +502,8 @@ communication is no longer needed to free system resources.</li>
 </div>
 </div>
 
-<div id="outline-container-org9fb3846" class="outline-4">
-<h4 id="org9fb3846"><span class="section-number-4">2.3.2.</span> Activate the driver</h4>
+<div id="outline-container-orgeb6dd0f" class="outline-4">
+<h4 id="orgeb6dd0f"><span class="section-number-4">2.3.2.</span> Activate the driver</h4>
 <div class="outline-text-4" id="text-2-3-2">
 <p>
 Enables the driver, starting background LPT port monitoring for
@@ -523,8 +523,8 @@ activations are harmless.</li>
 </div>
 </div>
 
-<div id="outline-container-org2beca34" class="outline-4">
-<h4 id="org2beca34"><span class="section-number-4">2.3.3.</span> Retrieve downloaded data from the driver's input buffer</h4>
+<div id="outline-container-orgef60e00" class="outline-4">
+<h4 id="orgef60e00"><span class="section-number-4">2.3.3.</span> Retrieve downloaded data from the driver's input buffer</h4>
 <div class="outline-text-4" id="text-2-3-3">
 <p>
 Copies all accumulated received data from the driver's download buffer
@@ -560,8 +560,8 @@ INT 63h; then process AX bytes if &gt;0.</li>
 </div>
 </div>
 
-<div id="outline-container-org542d988" class="outline-4">
-<h4 id="org542d988"><span class="section-number-4">2.3.4.</span> Upload data to the driver's output buffer for transmission</h4>
+<div id="outline-container-org219ed21" class="outline-4">
+<h4 id="org219ed21"><span class="section-number-4">2.3.4.</span> Upload data to the driver's output buffer for transmission</h4>
 <div class="outline-text-4" id="text-2-3-4">
 <p>
 Copies the specified data to the driver's upload buffer for background
@@ -599,7 +599,7 @@ caller can add headers if needed).</li>
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-08-21 to 21:43</p>
+<p class="date">Created: 2025-08-21 to 21:57</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>