andrejtrindade [Lexaloffle Blog Feed]https://www.lexaloffle.com/bbs/?uid=86005 Hollow Seeker: Cartdata Edition <p> <table><tr><td> <a href="/bbs/?pid=176014#p"> <img src="/bbs/thumbs/pico8_hollow_seeker_cartdata-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=176014#p"> Hollow Seeker: Cartdata Edition 1.0</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=176014#p"> [Click to Play]</a> </td></tr></table> </p> <p>This is a simple fork of <a href="https://www.lexaloffle.com/bbs/?tid=2514">Hollow Seeker</a> that saves your hiscore (and prints it on the screen, obviously).</p> <h3>How to play</h3> <p>Go forward in right direction.<br /> Seek a hollow as refuge not to be crushed.<br /> [Z][X]: start/retry game</p> <h3>Implementation Notes</h3> <p>Changes were kept to a minimum, only 10 lines of code added.</p> <p>Enjoy!</p> https://www.lexaloffle.com/bbs/?tid=152248 https://www.lexaloffle.com/bbs/?tid=152248 Tue, 21 Oct 2025 13:38:13 UTC Cartdata Editor <p> <table><tr><td> <a href="/bbs/?pid=175742#p"> <img src="/bbs/thumbs/pico8_cartdata_editor-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=175742#p"> Cartdata Editor 1.0</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=175742#p"> [Click to Play]</a> </td></tr></table> </p> <h3>Warning</h3> <p>This tool overwrites saves from other carts. Make sure you know what you are doing.</p> <h3>Controls</h3> <p>Instructions on which keys or buttons to press are displayed on screen at all times.</p> <p><em>Note: pause menu is supressed in keyboard mode, hold ENTER or P for a second to display it.</em></p> <h3>Context</h3> <ul> <li>PICO-8 executables save cartdata as text files in the <em>cdata</em> folder.</li> <li>BBS javascript, on the other hand, is limited to your browser's internal storage, which is a lot less convenient for users to access directly.</li> </ul> <h3>Purpose</h3> <p>This tool allows you to easily transfer your progress between PICO-8 installations, particularly from/to the BBS. It also allows you to edit your saves on the fly.</p> <h3>Cartdata ID</h3> <p>First you need to find out the <em>cartdata ID</em> of the save you want to access.</p> <p>As an example, let's assume you are playing <a href="https://www.lexaloffle.com/bbs/?tid=55172">Tiny Tactics</a> (my first cart) on the BBS. If you click the <em>Code</em> button below that cart and search the page for <em>cartdata</em>, you are going to find the API call.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/cdata_editor_1.png" alt="" /> <p>The ID is the single parameter, quotes excluded. Enter that ID into <em>Cartdata Editor</em> to load your save.</p> <p><em>Note: if you type a wrong ID, an empty save will be created. That's just how the API works.</em></p> <h3>Copy to clipboard</h3> <p>If you select <code>copy to clipboard</code> and paste the contents into a text editor, you will see the same format used by PICO-8 executables when storing cartdata as text files: 8 lines of 64 hex digits.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/cdata_editor_4.png" alt="" /> <p>Saving this text file with the appropriate name in your <em>cdata</em> folder allows you to resume your game from PICO-8 executables.</p> <p>The file name must match the cartdata ID, with the <em>.p8d.txt</em> extension. For example, Tiny Tactics' save file should be named <code>ajt_tinytactics_1.p8d.txt</code>.</p> <h3>CTRL-C on the BBS</h3> <p>If you select <code>copy to clipboard</code> on the BBS you will see the following message on the bottom of the screen:</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/cdata_editor_6.png" alt="" /> <p>This will only work if you are using a keyboard, obviously.</p> <h3>Paste from clipboard</h3> <p>Instead of saving the text file yourself, you can press CTRL-V while running <em>Cartdata Editor</em> on your destination environment, then select <code>paste from clipboard</code>.</p> <p>Finally, select <code>save changes</code>. Think of it as saving the file in your text editor.</p> <h3>CTRL-V</h3> <p><code>paste from clipboard</code> only works if you are using a keyboard, both on the BBS and on PICO-8 executables.</p> <p>That's because PICO-8 only allows carts to read the clipboard after the user presses CTRL-V (for security).</p> <h3>Mobile clipboard</h3> <p><code>copy to clipboard</code> and <code>paste from clipboard</code> are less convenient on mobile, because you need to connect a keyboard to your device.</p> <p>It does work, though. You just need a bluetooth keyboard or OTG adapter. You can also use Phone Link on Windows to do it remotely.</p> <h3>Edit cartdata</h3> <p>You can edit your save with <code>edit cartdata</code>. Unsaved changes will be highlighted in orange.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/cdata_editor_5.png" alt="" /> <p>After you are done, select <code>save changes</code>.</p> <h3>Save changes</h3> <p>Do not forget to save your changes or you will loose them.</p> <p><code>paste from clipboard</code> and <code>edit cartdata</code> only change a copy stored in USER memory.</p> <p>You need to select <code>save changes</code> afterwards to actually overwrite your save.</p> <h3>Reset cart</h3> <p><em>Cartdata Editor</em> only lets you edit one save at a time. If you want to load a different cartdata ID, just reset the cart.</p> <h3>Feedback</h3> <p>If you have any problems, drop a comment and I'll try to help.</p> <p>I hope you find this tool useful!</p> https://www.lexaloffle.com/bbs/?tid=152145 https://www.lexaloffle.com/bbs/?tid=152145 Fri, 17 Oct 2025 10:36:46 UTC White Links <h3>Link example</h3> <p>Here is a link to <a href="https://www.google.com/">Google</a> in a standard paragraph.</p> <ul> <li>Here is a link to <a href="https://www.google.com/">Google</a> in a bullet list item.</li> </ul> <ol> <li>Here is a link to <a href="https://www.google.com/">Google</a> in a numbered list item.</li> </ol> <h3>Mention example</h3> <p>This post was created by <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> @andrejtrindade</a></a></a>.</p> <ul> <li>This post was created by <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> @andrejtrindade</a></a></a>.</li> </ul> <ol> <li>This post was created by <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> <a href="https://www.lexaloffle.com/bbs/?uid=86005"> @andrejtrindade</a></a></a>.</li> </ol> <h3>Bug</h3> <p>Why are links white when they appear in a bullet or numbered list item?</p> <p>This looks like a bug on the BBS...</p> https://www.lexaloffle.com/bbs/?tid=151912 https://www.lexaloffle.com/bbs/?tid=151912 Sat, 04 Oct 2025 19:20:40 UTC Caroline: Cartdata Edition <p> <table><tr><td> <a href="/bbs/?pid=175125#p"> <img src="/bbs/thumbs/pico8_caroline_cartdata-6.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=175125#p"> caroline: cartdata edition 1.6</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=175125#p"> [Click to Play]</a> </td></tr></table> </p> <p>This is a simple fork of <em>Caroline</em> that saves your progress.</p> <ul> <li>Saving happens when you enter a new room</li> <li>Time tracking, collectibles and deaths are also saved</li> <li>You can <code>reset save data</code> in the pause menu</li> </ul> <p>This fork aims to help those who prefer to play in short bursts, like myself.</p> <p><a href="https://www.lexaloffle.com/bbs/?tid=42270">Caroline</a> is a <em>&quot;Portal demake disguised as a Celeste Classic mod&quot;</em>, according to <a href="https://www.lexaloffle.com/bbs/?uid=10391"> @Meep</a> (one of the authors).</p> <p>Play using the ESDF keys and a mouse.</p> <p>Enjoy!</p> <h3>Implementation Notes</h3> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <ul> <li>Changes were kept to a minimum, I counted only 23 lines of code with a diff tool</li> <li>I had to use <code>split()</code> on two tables to stay below the token limit</li> </ul> <p></div></div></div></p> https://www.lexaloffle.com/bbs/?tid=151910 https://www.lexaloffle.com/bbs/?tid=151910 Sat, 04 Oct 2025 18:14:02 UTC Unfeatured Carts <h3>500 Featured Carts</h3> <p>Yes, we have just crossed that milestone! Have you ever wondered what kinds of carts don't make it into the featured section of the BBS? Call me crazy, but I have.</p> <p>So I looked at the 500 top-starred carts (searching for <code>tr:2015-2025</code>) and checked which ones aren't featured. It happens there are only 30! Here they are (with links, in case you want to go check any of them):</p> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <ol> <li>(155 stars) <a href="https://www.lexaloffle.com/bbs/?tid=35462">Palette-Maker</a></li> <li>(147 stars) <a href="https://www.lexaloffle.com/bbs/?tid=41010">Foreverred</a></li> <li>(134 stars) <a href="https://www.lexaloffle.com/bbs/?tid=31744">Super Mario Bros. (Authentic)</a></li> <li>(134 stars) <a href="https://www.lexaloffle.com/bbs/?tid=28785">Dank Tombs Tech Demo (with full write-up!)</a></li> <li>(116 stars) <a href="https://www.lexaloffle.com/bbs/?tid=39274">memsplore</a></li> <li>(101 stars) <a href="https://www.lexaloffle.com/bbs/?tid=3549">How to retrieve mouse coordinates (with demo)</a></li> <li>(94 stars) <a href="https://www.lexaloffle.com/bbs/?tid=42270">Caroline</a></li> <li>(92 stars) <a href="https://www.lexaloffle.com/bbs/?tid=33017">Old Site</a></li> <li>(90 stars) <a href="https://www.lexaloffle.com/bbs/?tid=48946">OLDESTE</a></li> <li>(88 stars) <a href="https://www.lexaloffle.com/bbs/?tid=43930">Volcana</a></li> <li>(87 stars) <a href="https://www.lexaloffle.com/bbs/?tid=145191">Super Mario Bros.</a></li> <li>(80 stars) <a href="https://www.lexaloffle.com/bbs/?tid=42977">Fuji</a></li> <li>(80 stars) <a href="https://www.lexaloffle.com/bbs/?tid=33258">Adelie</a></li> <li>(79 stars) <a href="https://www.lexaloffle.com/bbs/?tid=43723">picozelda</a></li> <li>(78 stars) <a href="https://www.lexaloffle.com/bbs/?tid=151194">From Rust To Ash</a></li> <li>(77 stars) <a href="https://www.lexaloffle.com/bbs/?tid=142638">Baba Is You Demake [FULL GAME]</a></li> <li>(77 stars) <a href="https://www.lexaloffle.com/bbs/?tid=52388">Picodex - A Pokemon Battle Sim</a></li> <li>(77 stars) <a href="https://www.lexaloffle.com/bbs/?tid=28465">[Dialogue Text Box Lib] Dialogue Demo</a></li> <li>(75 stars) <a href="https://www.lexaloffle.com/bbs/?tid=53093">Pico-8 Tetris</a></li> <li>(75 stars) <a href="https://www.lexaloffle.com/bbs/?tid=44473">Awake V1.1</a></li> <li>(75 stars) <a href="https://www.lexaloffle.com/bbs/?tid=3593">Rotating a sprite around its center</a></li> <li>(73 stars) <a href="https://www.lexaloffle.com/bbs/?tid=55113">Demi Daggers</a></li> <li>(71 stars) <a href="https://www.lexaloffle.com/bbs/?tid=44826">Squiddy (PICO-1k Jam)</a></li> <li>(71 stars) <a href="https://www.lexaloffle.com/bbs/?tid=33835">INGESTE: Play Celeste Classic as Kirby!</a></li> <li>(71 stars) <a href="https://www.lexaloffle.com/bbs/?tid=39433">PICO-RAY V1.0</a></li> <li>(70 stars) <a href="https://www.lexaloffle.com/bbs/?tid=39469">Super Mario Bros. Map Demo - All Levels in one cart</a></li> <li>(69 stars) <a href="https://www.lexaloffle.com/bbs/?tid=140166">Super Mario Bros. Demo</a></li> <li>(67 stars) <a href="https://www.lexaloffle.com/bbs/?tid=52986">Fill Pattern Catalogue</a></li> <li>(67 stars) <a href="https://www.lexaloffle.com/bbs/?tid=46049">Mega Game launcher</a></li> <li>(64 stars) <a href="https://www.lexaloffle.com/bbs/?tid=47390">PicoShop Pro</a></li> </ol> <p><em>My favorite cart on this list is <a href="https://www.lexaloffle.com/bbs/?tid=42270">Caroline</a>. What can I say? I'm not so much into precision platformers, but I do love Portal...</em></p> <p></div></div></div></p> <p>I do somewhat understand why these carts didn't make it. We don't want the featured section flooded with Celeste mods and SMB ports.</p> <p>On the other hand, it's not like we don't already have some featured Celeste mods, tools, demos, demakes and ports...</p> <p>But there is hope. <a href="https://www.lexaloffle.com/bbs/?tid=149366">Walker</a> would be on the list, but it has been featured a few weeks ago!</p> <p>Anyway, what are your thoughts on this?</p> https://www.lexaloffle.com/bbs/?tid=151884 https://www.lexaloffle.com/bbs/?tid=151884 Fri, 03 Oct 2025 20:29:51 UTC Seinfeld Simulator: Fast-iary Edition <p> <table><tr><td> <a href="/bbs/?pid=174995#p"> <img src="/bbs/thumbs/pico8_seinsim_fastiary-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=174995#p"> Seinfeld Simulator: Fast-iary Edition 1.0</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=174995#p"> [Click to Play]</a> </td></tr></table> </p> <p>This cart is a fork of the original <a href="https://www.lexaloffle.com/bbs/?tid=40862">Seinfeld Simulator 1.0</a> by <a href="https://www.lexaloffle.com/bbs/?uid=40503"> @Rangee27</a>.</p> <h3>Quality of life improvements</h3> <ul> <li>You will only see jokes that are not in your &quot;Joke-iary&quot; yet (until you complete it), works both in kid mode and 18+</li> <li>You can disable mouse in the pause menu - in case you enabled it by mistake on a device with no mouse</li> <li>Better contrast on the &quot;Joke-iary&quot; and some other text (title screen / button prompts)</li> <li>Same cartdata ID, so you can switch from the original to this cart and vice versa as you please</li> </ul> <p>I had to do some tweaking to stay below the token and compressed limits, but I tried to keep changes to a minimum. Using a diff tool I only counted about 30 lines of code changed.</p> <p>Enjoy!</p> https://www.lexaloffle.com/bbs/?tid=151862 https://www.lexaloffle.com/bbs/?tid=151862 Thu, 02 Oct 2025 18:23:27 UTC How does &quot;Fork&quot; actually work in the BBS? <p>As the title says, I'd like to know what are the consequences of setting carts as forks.</p> <p>Here's an example... I submitted <a href="https://www.lexaloffle.com/bbs/?tid=151129">STAR SPLORE</a> last month. This week, I got a reply asking for some changes. I wanted to accommodate the request without changing the main cart, so I submitted an alternative version of the cart.</p> <p>I didn't want to start a new thread for this alternative cart, though. So I just <a href="https://www.lexaloffle.com/bbs/?pid=173433#p">embedded it in a reply</a> on the original thread. I guess that's why the cart doesn't show up in &quot;New Carts&quot;, nor does it appear in my profile under &quot;Cartridges&quot;.</p> <p>And that's fine! It's an alternativo cart, I don't want anyone to find it before the main one...</p> <p>But I noticed that, when I click &quot;Edit&quot; on a cart, there is a &quot;Forks&quot; section. I know what a fork is in GitHub, but what does it mean here?</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/fork.png" alt="" /> <p>Should I set this alternative cart as a fork of the original STAR SPLORE? What are the consequences of doing that in the BBS?</p> https://www.lexaloffle.com/bbs/?tid=151386 https://www.lexaloffle.com/bbs/?tid=151386 Fri, 05 Sep 2025 20:07:09 UTC config.txt: map_scancodes does not suppress modifier keys (CTRL, ALT, SHIFT) <p>While <a href="https://www.lexaloffle.com/bbs/?pid=172940#p">troubleshooting</a> why unwanted shortcuts were triggering on my handheld, I noticed that <code>map_scancodes</code> does not suppress the original scancode if it corresponds to a modifier key.</p> <p>For example, you can add the following line to your config.txt:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>map_scancodes 4=5,224=6,</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>This will remap:</p> <ul> <li>the A key (scancode 4) to B (scancode 5)</li> <li>the LEFT CTRL key (scancode 224) to C (scancode 6)</li> </ul> <p>Then, download this <a href="https://www.lexaloffle.com/bbs/?tid=151221">test cart</a> and run it in PICO-8.</p> <ul> <li>when you press the A key, it will detect only scan code 5 (key B)</li> <li>when you press the LEFT CTRL key, it will detect both scancode 6 (key C) and scancode 224 (LEFT CTRL, not supressed).</li> </ul> <p>You can test this with left and right CTRL, ALT and SHIFT.</p> <p>Keep this in mind when mapping your handheld buttons, especially if they are originally assigned to modifier keys... So you don't end up accidentally triggering unwanted shortcuts.</p> https://www.lexaloffle.com/bbs/?tid=151245 https://www.lexaloffle.com/bbs/?tid=151245 Fri, 29 Aug 2025 15:20:29 UTC test_scancodes <p> <table><tr><td> <a href="/bbs/?pid=172931#p"> <img src="/bbs/thumbs/pico8_test_scancodes-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172931#p"> test_scancodes v1.1</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=172931#p"> [Click to Play]</a> </td></tr></table> </p> <p><em>Note: this cart was mostly based on <a href="https://www.lexaloffle.com/bbs/?tid=49258">New Raw Key Reader</a>, from <a href="https://www.lexaloffle.com/bbs/?uid=15232">dw817</a>.</em></p> <p>This is a very simple tool to show scancodes (and SDL key names) for keys pressed on a keyboard.</p> <p>This can be useful when remapping handheld buttons. For example, I have an original RG35XX and <a href="https://www.lexaloffle.com/bbs/?tid=150808">I'm using the MyMinUI custom firmare</a>. I wasn't satisfied with the default button mappings, so I decided to remap everything from scratch.</p> <p>First, I commented the <code>map_scancodes</code> line in config.txt and ran this cart.</p> <ul> <li>The A button was mapped to scancode 44 (spacebar).</li> <li>The B button was mapped to scancode 224 (left ctrl).</li> <li>I wanted to remap them to scancodes 29 (the Z key) and 27 (the X key), respectively.</li> </ul> <p>If these were the only two buttons I wanted to remap, I could simply add the line below to my config.txt:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>map_scancodes 44=29,224=27</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>MyMinUI actually already remaps the A and B buttons the way I wanted. In the real scenario, I did this to remap other buttons (SELECT and POWER).</p> <p>But explaining Z and X keys is easier to digest, as these bindings are engraved in our brains after playing so much PICO-8 on our keyboards.</p> <p>Anyway, I hope this cart is useful to someone...</p> <h2>SDL names</h2> <p>SDL names were taken from</p> <p><a href="https://fossies.org/linux/SDL2/include/SDL_scancode.h"><a href="https://fossies.org/linux/SDL2/include/SDL_scancode.h">https://fossies.org/linux/SDL2/include/SDL_scancode.h</a></a></p> <h2>Changelog</h2> <ul> <li>v1.1: improves the draw function to display up to 14 keys pressed at once</li> <li>v1.0: initial version</li> </ul> https://www.lexaloffle.com/bbs/?tid=151221 https://www.lexaloffle.com/bbs/?tid=151221 Thu, 28 Aug 2025 16:13:15 UTC Fixing Cart and Thread Titles <p>While releasing <a href="https://www.lexaloffle.com/bbs/?tid=151129">STAR SPLORE</a>, my second cart, I realized that it's nice to change the default title of you carts and its threads.</p> <p>Here's what happens when you search for &quot;star_splore&quot; in &quot;New Carts&quot;, for example.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_10.png" alt="" /> <p>You get a nice cart title, &quot;STAR SPLORE 2025-08-16&quot;. If you click on it, you go to STAR SPLORE's thread.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_11a.png" alt="" /> <ul> <li>The thread will have a nice title, &quot;STAR SPLORE&quot;, which is independent of the cart's version.</li> <li>The cart will have the same nice title as before.</li> <li>Note that both titles are different from the cart's ID (star_splore).</li> </ul> <p>I didn't pay attention to that when I released <a href="https://www.lexaloffle.com/bbs/?tid=55172">Tiny Tactics</a>, my first cart.</p> <p>You can see how it didn't look so nice.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_1.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_2a.png" alt="" /> <p>Maybe those titles weren't exactly <em>BAD</em>, but I could do better. </p> <p>You see, the default title, both your for cart and its thread, is the cart's ID.</p> <p>To change the cart title I clicked on the tiny &quot;Edit&quot; link on the bottom right of the cart.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_2b.png" alt="" /> <p>Then, I clicked on the title.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_3a.png" alt="" /> <p>As this was the title for the &quot;-5&quot; version of the cart, I went with &quot;Tiny Tactics v5&quot;, then pressed &quot;Save&quot;.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_4a.png" alt="" /> <p>To edit the thread's title, I scrolled to the end of the post and pressed &quot;Edit&quot;.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_5a.png" alt="" /> <p>Then I clicked on the title.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_6a.png" alt="" /> <p>I typed &quot;Tiny Tactics&quot; as the thread's title and pressed &quot;Save&quot;.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_7a.png" alt="" /> <p>Let's see how Tiny Tactics looks in search results now.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_8.png" alt="" /> <p>Clicking on it, let's see the thread...</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tt_print_9a.png" alt="" /> <p>That's much nicer, isn't it?</p> https://www.lexaloffle.com/bbs/?tid=151142 https://www.lexaloffle.com/bbs/?tid=151142 Sat, 23 Aug 2025 20:13:25 UTC STAR SPLORE <p> <table><tr><td> <a href="/bbs/?pid=172639#p"> <img src="/bbs/thumbs/pico8_star_splore-2.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172639#p"> STAR SPLORE 2025-09-16</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=172639#p"> [Click to Play]</a> </td></tr></table> </p> <p>It's like browsing &quot;Featured Carts&quot; in <strong>SPLORE</strong>... But they are ranked by <strong>STAR</strong>s!</p> <h2>Controls</h2> <ul> <li>⬅️➡️: previous / next page</li> <li>⬆️⬇️: previous / next cart</li> <li>🅾️: filter by <em>game genre</em> or by <em>year</em></li> <li>❎: run cart</li> </ul> <p>After you are done with the cart, enter the pause menu and select the last option:<br /> <code>back to ★SPLORE</code></p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/star_splore_demo_2.gif" alt="" /> <h2>About</h2> <p><strong>STAR SPLORE</strong> aims to help you discover some of the best PICO-8 carts ever made.</p> <ul> <li>That's why only featured carts are included.</li> <li>That's also why carts are ranked by stars, the BBS version of &quot;likes&quot;.</li> </ul> <p>As imperfect as these metrics may be, they are the ones we have.</p> <p><em>Note: when carts are tied for stars, newer carts rank higher.</em></p> <h2>Interface</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/star_splore_interface.png" alt="" /> <p><em>Note: when loading carts from the BBS, STAR SPLORE ignores the version number after the ID to get the latest version of the cart.</em></p> <h2>Filters</h2> <p>Filters by <em>game genre</em> and by <em>year</em> are provided to improve cart discoverability.</p> <p>Game genres are obtained from <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> @NerdyTeachers</a></a></a></a>' excelent <a href="https://nerdyteachers.com/PICO-8/Games/">Curated PICO-8 Games</a>.</p> <p><em>Note: STAR SPLORE was actually inspired by <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> @NerdyTeachers</a></a></a></a>' <a href="https://nerdyteachers.com/PICO-8/Games/Top200/">200 Best PICO-8 Games</a> list.</em></p> <h2>Updates</h2> <p>New carts won't show up until <strong>STAR SPLORE</strong> is updated.</p> <p><strong>STAR SPLORE</strong> itself is a regular PICO-8 cart after all. It can't fetch newer carts from the BBS automatically.</p> <p>The date you see on the top right of the screen is <strong>STAR SPLORE</strong>'s current version. This is the date when cart information was extrated from the BBS and genre information was extracted from <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> @NerdyTeachers</a></a></a></a>' curated list.</p> <h2>Offline</h2> <p><strong>STAR SPLORE</strong> can also run carts offline, as long as they are in the same folder. Just make sure you don't rename cart files after downloading them from the BBS.</p> <p>Note that running multicarts offline can be tricky, no matter how you launch them. Please refer to <a href="https://nerdyteachers.com/PICO-8/Hardware/70#multicart">this excelente article</a> from <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> <a href="https://www.lexaloffle.com/bbs/?uid=25898"> @NerdyTeachers</a></a></a></a> for more information on the subject. Just expand section 3, &quot;For Multicart Games&quot;.</p> <h2>Scraper</h2> <p>On <a href="https://github.com/andrejtrindade/star-splore">STAR SPLORE's GitHub repository</a> you will find the <a href="https://github.com/andrejtrindade/star-splore/tree/main/scraper">scraper</a> used to extract information from the BBS.</p> <h3>HTML</h3> <p>You can browse every information and link collected for every scraped cart in <a href="https://github.com/andrejtrindade/star-splore/blob/main/scraper/results/featured_carts.html">this HTML page</a> (download it and open in your browser).</p> <h3>Download</h3> <p>The scraper also creates a <a href="https://github.com/andrejtrindade/star-splore/blob/main/scraper/results/featured_carts_urls.txt">file with URLs for all featured carts scraped</a>. You can use that file to download all those carts at once using <a href="https://www.gnu.org/software/wget/">Wget</a>. Please note that downloading carts from the BBS is perfectly legit according to Lexaloffle's <a href="https://www.lexaloffle.com/info.php?page=tos">terms of use</a>.</p> <p>Dumping these 500 carts together with <strong>STAR SPLORE</strong> in an handheld is a great way to browse and discover some great PICO-8 games on the go, even when you are offline.</p> <h2>0.2.7</h2> <p>I didn't know it when I developed and released STAR SPLORE, but you can rank carts by stars on the BBS since at least <a href="https://www.lexaloffle.com/bbs/?pid=167739#p">May 29, 2025</a>. Thanks to <a href="https://www.lexaloffle.com/bbs/?uid=68936"> @Verb</a> for pointing that out to me.</p> <p>To do that, go to New Carts or Featured Carts, click the search icon and...</p> <ul> <li>type <code>t:week</code> / <code>t:month</code> / <code>t:year</code> / <code>t:halfyear</code> to search top-starred carts released in the last week / month / year / six months;</li> <li>type <code>tr:202210-202305</code> to specify an inclusive time range (<code>tr:2015-2025</code> is equivalent to using STAR SPLORE);</li> <li>type <code>tr:2022</code> to search carts from a specific year.</li> </ul> <p><a href="https://www.lexaloffle.com/bbs/?tid=150992">PICO-8 0.2.7</a> added this to regular SPLORE, so now you can search for carts ranked by stars over there too.</p> <p>When you are on your handheld, though, with no wi-fi or no keyboard... Or when you want to browse carts by game genre... STAR SPLORE can be there to save the day!</p> <h2>Changelog</h2> <ul> <li><strong>Version 2025-09-16</strong>: added filters (by game genre and by year), also adjusted cart names to better fit the interface.</li> <li><strong>Version 2025-08-28</strong>: celebrating 500 featured carts!</li> <li><strong>Version 2025-08-16</strong>: initial version.</li> </ul> https://www.lexaloffle.com/bbs/?tid=151129 https://www.lexaloffle.com/bbs/?tid=151129 Fri, 22 Aug 2025 21:16:52 UTC MyMinUI: native PICO-8 on the original RG 35XX <h1>MyMinUI</h1> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/MyMinUIb.jpg" alt="" /> <p>I've just discovered <a href="https://github.com/Turro75/MyMinUI">MyMinUI</a>, a custom firmware for my original RG 35XX... that has <strong>native PICO-8</strong>!</p> <p><em>Note: MyMinUI is a fork of <a href="https://github.com/shauninman/MinUI">MinUI</a>, a custom firmware much more people know about. MyMinUI is also available for some other handhelds: Miyoo Mini (and Plus), SJGAM M21 and GameConsole R36s.</em></p> <h2>Instalation</h2> <p>If you want to install MyMinUI on a SD card and try it for yourself, I have some tips for you. First, grab the <a href="https://github.com/Turro75/MyMinUI/releases">latest release</a> and unzip it (don't delete the zip file, you will need it).</p> <p>The instalation is pretty standard custom firmware stuff, and is well documented in the README.txt file. If you have any doubts, leave a comment below and I will try to help.</p> <p>Now, for my tips... We will change a few files in your SD card - same card and partition where you copied some files from PICO-8 (Raspberry Pi's version) during the instalation process.</p> <h2>TIP 1: Change &quot;romdir&quot;</h2> <p>Without this change, Splore will look for carts in the fake-08 folder.</p> <p>Open &quot;Tools/rg35xx/Pico-8 Splore.pak/launch.sh&quot; and change the line</p> <p><code>romdir=&quot;${SDCARD_PATH}/Roms/Pico-8 (P8)&quot;</code></p> <p>to</p> <p><code>romdir=&quot;${SDCARD_PATH}/Roms/Pico-8 Native (P8N)&quot;</code></p> <h2>TIP 2: Change &quot;root_path&quot;</h2> <p>Without this change, multicarts will look for secondary carts in the fake-08 folder (unless launched from Splore, see above).</p> <p>Open &quot;Tools/rg35xx/Pico-8 Splore.pak/pico8-native/.lexaloffle/pico-8/config.txt&quot; and change the line</p> <p><code>root_path /mnt/sdcard/Roms/Pico-8 (P8)/</code></p> <p>to</p> <p><code>root_path /mnt/sdcard/Roms/Pico-8 Native (P8N)/</code></p> <h2>Adding carts</h2> <p>After making the changes above, you can simply drop carts in &quot;Roms/Pico-8 Native (P8N)/&quot; and launch them from the &quot;Pico-8 Native&quot; menu!</p> <p>You can also launch Splore from the Tools menu. You will be able to browse local carts (in the same folder) and favorite them, but that's all. The other menus (New, Favorite etc.) will be empty, as the original RG 35XX doesn't have wifi.</p> <h2>TIP 3: Multicarts</h2> <p>Multicarts work, but they may require some adjustments.</p> <p>As there is no wifi, carts can only load other local carts. This may require changing the &quot;load&quot; calls inside carts. You may also need to rename carts so the load calls can be successfull.</p> <p><strong>Nerdy Theachers</strong> has an excellent tutorial on the subject, I'll leave a link below. Just expand section 3 (multicart games).</p> <p><a href="https://nerdyteachers.com/PICO-8/Hardware/70#multicart"><a href="https://nerdyteachers.com/PICO-8/Hardware/70#multicart">https://nerdyteachers.com/PICO-8/Hardware/70#multicart</a></a></p> <p>After adjusting your carts, just drop them all in &quot;Roms/Pico-8 Native (P8N)/&quot;.</p> <h2>TIP 4: Quitting</h2> <p>While playing PICO-8, the menu and power buttons won't do anything. To quit back to MyMinUI, go into the pause menu...</p> <ul> <li>If you launched the cart from MyMinUI, simply select &quot;shutdown&quot;.</li> <li>If you launched the cart from Splore, select &quot;options&quot;, then &quot;shutdown pico-8&quot;.</li> </ul> <p>If you are in Splore, you don't need to launch a cart. Just press start on any cart and select &quot;options&quot;, then &quot;shutdown pico-8&quot;.</p> <p>Now go play some native PICO-8 on the go!</p> https://www.lexaloffle.com/bbs/?tid=150808 https://www.lexaloffle.com/bbs/?tid=150808 Thu, 07 Aug 2025 16:25:51 UTC Glyphs or Letters: XO / OX / ZX / XC ? <p>In this post I'll try to answer some questions regarding the ❎ and 🅾️ buttons. This is a design decision that came up early when I started making <a href="https://www.lexaloffle.com/bbs/?tid=55172">my first PICO-8 game</a>.</p> <p>I'll consider some well-received PICO-8 games from <a href="https://nerdyteachers.com/PICO-8/Games/Top200/">Nerdy Teachers' 200 Best PICO-8 Games</a> when trying to address these questions. When I do that, I will provide the game's ranking in that list in parethesis, e.g., <em>Celeste</em> (#1).</p> <h2>Glyphs or Letters</h2> <ul> <li><strong>Question 1:</strong> <em>Should I use the ❎ and 🅾️ button glyphs when displaying commands on screen, or should I print letters for the key mappings?</em></li> </ul> <p>In theory, you should use button glyphs, right? I mean, if you were making a NES game, you would prompt the player to press A or B. You wouldn't try to guess key bindings used by the emulator, even though a NES game released in 2025 has very slim chances of being played on original hardware.</p> <p>Often, though, reality kicks in. If you upload your game to <em>itch.io</em>, for example, people are playing a browser game. Most may not even know what PICO-8 is or even suspect they need to consider key bindings. They may see &quot;press 🅾️&quot;, reach for the O key, nothing happens.</p> <p><em>&quot;Let's try another game, then.&quot;</em></p> <p>Also, you have to consider if the player is on a PC with a keyboard, in which case key letters would be more straightforward, or on a mobile phone, using virtual buttons that match the glyphs.</p> <p>That's why there is no clear-cut consensus. <em>Celeste</em> (#1) uses key letters, while <em>Terra</em> (#5) uses button glyphs. <em>Birds With Guns</em> (#4) and <em>Picohot</em> (#6) show both: glyph first, then key letter in parenthesis.</p> <h2>Left or Right</h2> <ul> <li><strong>Question 2:</strong> <em>If order matters, which button is the left one and which one is on the right?</em></li> </ul> <p>My first impression was that 🅾️ should be the button on the left and ❎ should be the one on the right. After all, default key bindings (ZX/CV/NM) are like that. Also, control options in the pause menu show this order as well.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/60_pause.png" alt="" /> <p>But I think it's best to leave ❎ as the left button and 🅾️ as the right one. The reasons for doing so are compelling...</p> <ol> <li> <p>If you enable mouse with <code>poke(0x5f2d, 2)</code>, left click will trigger ❎ and right click will trigger 🅾️.</p> </li> <li> <p>The joystick image in KEYCONFIG.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/keyconfig.png" alt="" /> </li> <li> <p>The virtual buttons when playing a BBS game on a mobile phone.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/virtual.png" alt="" /> </li> </ol> <p><em>&quot;Ok, but if you do that, key mappings (ZX/CV/NM) will be in reverse order!&quot;</em>, you may think.</p> <p>Well, not necessarily. Segway to our next question...</p> <h2>Z or C</h2> <ul> <li><strong>Question 3:</strong> <em>If I decide to show key letters, everyone agrees that I should use X for ❎, for obvious reasons. But what about 🅾️? Should I use Z or C?</em></li> </ul> <p>I'll cut to the chase: use C.</p> <p><a href="https://www.lexaloffle.com/bbs/?uid=12861"> @krajzeg</a>, author of <em>The Lair</em> (#7) and <em>Dank Tomb</em> (#10), explains why <a href="https://www.lexaloffle.com/bbs/?pid=43014#p">here</a>:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>XC is stable across international keyboards (at least the ones I'm familiar with, German and French). I learned my lesson when I released The Lair and got tons of comments saying that ZX doesn't work well in their country.</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Also, using C has an added benefit: you will have ❎ on the left and 🅾️ on the right, which is consistent with the postion of the virtual buttons on mobile phones.</p> <h2>Primary or Secondary</h2> <ul> <li><strong>Question 4.</strong> <em>Which button should be the primary one, used for the main action in the game and to select stuff in menus?</em></li> </ul> <p>Again, there is no consensus on this one, but I think you should stick to ❎ as your primary button for two reasons:</p> <ol> <li> <p>Western gamers are used to this since the first PlayStation. ❎=select, 🅾️=cancel/back. For the PlayStation 5, Sony unified this configuration globally, so now this is true even in Japan.</p> <p><em>Note: I'm not a PlayStation fanboy... It's just a matter of PICO-8's choice for the button names. If they were named A and B, I would suggest you use Xbox / Nintendo conventions (A=select, B=cancel/back).</em></p> </li> <li>The ❎ button is mapped to the X key in keyboards, so the ❎ glyph can be safely used to let the player select an option to show other controls from the title screen / main menu.</li> </ol> <h2>My Approach</h2> <p>In <a href="https://www.lexaloffle.com/bbs/?tid=55172">Tiny Tactics</a>, my first PICO-8 game, I ask the player if a keyboard is being used.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/keyboard.png" alt="" /> <p>Note that ❎=yes, so the X key will work. After that, I draw a single pixel on top of the 🅾️ glyph, turning it into a C.</p> <p>Of course, if the player is not using a keyboad I will simply print the 🅾️ glyph normally.</p> <p>Also, ❎ is always on the left, responsible for the main action, while 🅾️/C is always on the right, responsible for the secondary action.</p> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/level1.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/menu.png" alt="" /></p> <p>I hope this was an interesting read. Maybe it will help you think about how to better communicate controls on your next PICO-8 game!</p> https://www.lexaloffle.com/bbs/?tid=150163 https://www.lexaloffle.com/bbs/?tid=150163 Thu, 10 Jul 2025 15:20:28 UTC load x cartdata <p>I am currently developing my second PICO-8 game. I'm considering adding an option to load my first game directly from the new cart, if the player wants to give it a try.</p> <p>Both games are single carts, and there is no sort of communication between them. It's a simple <em>load</em> call with a <em>breadcrumb</em> parameter.</p> <p>I was concerned about <em>cartdata</em> though. Both games use <em>cartdata</em> to store progress, each using its own ID. And <a href="https://www.lexaloffle.com/dl/docs/pico-8_manual.html">the PICO-8 User Manual</a> states, in section 6.11, that <em>&quot;CARTDATA can be called once per cartridge execution&quot;</em>.</p> <p>The wording on the manual indicates that my approach was OK, but I decided to test it anyway, just to make sure.</p> <h1>Only once</h1> <p>First, I simply called <em>cartdata</em> twice to see how PICO-8 would enforce the single call.</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>cartdata(&quot;test_load_1&quot;) cartdata(&quot;test_load_2&quot;)</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>This is the error message:</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/cartdata.png" alt="" /> <h1>Simulating carts</h1> <p>I created two simple test carts. Below is the code for test_load_1.p8, which simulates <em>cartdata</em> and <em>load</em> behaviour in my new game.</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _init() cartdata(&quot;test_load_1&quot;) n = peek(0x5e00) end function _update() if btnp(4) then n += 1 if (n &gt; 9) n = 1 poke(0x5e00,n) end if btnp(5) then load(&quot;test_load_2&quot;,&quot;load test_load_1&quot;) end end function _draw() cls() color(7) print(&quot;test_load_1 - n = &quot;..n) print(&quot;&quot;) print(&quot;press 🅾️ to add 1 to n (max 9)&quot;) print(&quot;&quot;) print(&quot;press ❎ to load test_load_2&quot;) end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>There is a vaiable, <em>n</em>, that starts at 0 if there is no save data. You press 🅾️ to increment it by 1 (up to 9, then it loops back to 1). Whenever you do that, the new value is persistent in <em>cartdata</em> (ID = <em>&quot;test_load_1&quot;</em>).</p> <p>You press ❎ to load test_load_2.p8, which simulates <em>cartdata</em> behaviour in my old game. The code for that follows below.</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _init() cartdata(&quot;test_load_2&quot;) n = peek(0x5e00) end function _update() if btnp(4) then n += 10 if (n &gt; 90) n = 10 poke(0x5e00,n) end end function _draw() cls() color(7) print(&quot;test_load_2 - n = &quot;..n) print(&quot;&quot;) print(&quot;press 🅾️ to add 10 to n (max 90)&quot;) print(&quot;&quot;) print(&quot;use pause menu to go back&quot;) end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Here you press 🅾️ to increment n by 10 (up to 90, then it loops back to 10). Whenever you do that, the new value is persistent in <em>cartdata</em> (ID = <em>&quot;test_load_2&quot;</em>).</p> <p>To go back to test_load_1, you must use the last option in the pause menu to follow the <em>breadcrumb</em>.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/53_pause.png" alt="" /> <h1>Results</h1> <p>There were no surprises in my tests. Both carts were able to update their save data independently, no matter how many times I switched back and forth between them. I even checked the .txt files in pico-8\cdata and everything was properly persisted.</p> <p>This may seem obvious and unnecessary, but I just wanted to make sure before implementing the feature in my new game. I searched the forums and couldn't find a definitive answer, so I decided to test for myself.</p> <p>I made this post hoping this might be useful for someone. Happy coding!</p> https://www.lexaloffle.com/bbs/?tid=149969 https://www.lexaloffle.com/bbs/?tid=149969 Wed, 02 Jul 2025 12:29:15 UTC test_102 <p> <table><tr><td> <a href="/bbs/?pid=169494#p"> <img src="/bbs/thumbs/pico8_test_102-8.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=169494#p"> test_102 v1.8</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=169494#p"> [Click to Play]</a> </td></tr></table> </p> <p>A very simple multicart to test:</p> <ul> <li><code>stat(102)</code></li> <li><code>load(&quot;#bbs_id&quot;)</code></li> <li><code>load(&quot;localfile_or_multicartexport&quot;)</code></li> </ul> <p>I made this test cart because I wanted to know if <code>stat(102)</code> is useful to determine whether I should <em>load</em> another cart from the BBS or as a local / exported file. Spoiler: it's not...</p> <h2>stat(102)</h2> <p>Value returned by <code>stat(102)</code>, depending on how the cart is run:</p> <ul> <li>number 0 when running .p8 file in PICO-8.</li> <li>number 0 when running cart from SPLORE.</li> <li>number 0 when running Windows .exe standalone.</li> <li>empty string when running .html standalone export directly from filesystem.</li> <li><em>&quot;www.lexaloffle.com&quot;</em> string when running from BBS forum post.</li> </ul> <p>I suppose running the .html standalone from some server will return the domain name as a string.</p> <h2>BBS ID</h2> <p>When <code>load(&quot;#bbs_id&quot;)</code> does work:</p> <ul> <li>when ruuning .p8 file in PICO-8.</li> <li>when running from BBS forum post.</li> <li>when running from SPLORE.</li> </ul> <p><code>load(&quot;#bbs_id&quot;)</code> doesn't work when running .html and binary exports, as stated in the <a href="https://www.lexaloffle.com/dl/docs/pico-8_manual.html">PICO-8 User Manual</a> (section 6.1).</p> <h2>Local .p8 file or multicart export</h2> <p>I exported test_102 as .html and .bin <em>including test_102_unlisted.p8</em> to test multicart behaviour.</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>export test_102.html test_102_unlisted.p8 export test_102.bin test_102_unlisted.p8</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>It works just as expected.</p> <h2>Notifications</h2> <p>No notifications are displayed when trying to load invalid local/exported carts.</p> <p>When trying to load an invalid BBS cart, this is what happens...</p> <ul> <li>In PICO-8, SPLORE or the BBS, the &quot;cart loading&quot; animation at the top will start, but it will quickly dissapear from the screen before the cart starts spinning.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/loading.png" alt="" /> <ul> <li>The .html standalone shows a <strong>DOWNLOAD FAILED</strong> notification on the bottom of the screen when trying to load any BBS ID (valid or invalid).</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/notification.png" alt="" /> <ul> <li>Finally, the standalone Windows executable never shows any notifications.</li> </ul> <p><em>Note: I only tested the Windows binary.</em></p> <h2>Conclusions</h2> <p><code>stat(102)</code> is only useful if you wnat to know from which domain the cart is running. It's not useful to decide if you should load another cart from the BBS or as a local / exported file, which is what I'm interested in.</p> <p>Calling <code>load(&quot;localfile_or_multicartexport&quot;)</code> first, then <code>load(&quot;#bbs_id&quot;)</code>, will always work without showing the <strong>DOWNLOAD FAILED</strong> notification (as long as you don't try to load invalid carts).</p> <p>You can test this pressing ⬇️ in this test cart.</p> <p>If both <em>load</em> calls fail, code execution will continue normally (if you want, display any error messages immediately afterwards).</p> https://www.lexaloffle.com/bbs/?tid=149956 https://www.lexaloffle.com/bbs/?tid=149956 Tue, 01 Jul 2025 18:19:31 UTC stat(102) <p>I am currently developing my second PICO-8 game. I'm considering adding an option to load my first game directly from the new cart, if the player wants to give it a try.</p> <p>I know, from <a href="https://www.lexaloffle.com/dl/docs/pico-8_manual.html">the PICO-8 User Manual</a> (section 6.1), that <em>&quot;BBS carts can be loaded from other BBS carts or local carts, but not from exported carts.&quot;</em> But how can I detect from which type of cart the code is running?</p> <h1>stat(102)</h1> <p>I know, from <a href="http://pico8wiki.com/index.php?title=Stat">the PICO-8 Wiki</a>, that I can use <code>stat(102)</code> (not officially documented) to gather URL information. For BBS carts, it returns <em>&quot;www.lexaloffle.com&quot;</em>. For local carts, it returns <em>0</em>.</p> <p>I wrote a simple test cart to investigate a little further.</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _init() s102 = stat(102) end function _update() end function _draw() cls() color(7) print(&quot;stat(102):&quot;,0,0) print(&quot;[&quot;..s102..&quot;]&quot;,0,6) print(&quot;type:&quot;..type(s102),0,18) end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Here is what I found...</p> <h2>.html standalone, BBS and splore</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/Standalone HTML.png" alt="" /> <p>The .html standalone returns an empty string when running directly from the filesystem. I suppose that, if I upload this somewhere, it will return the domain, like <em>&quot;itch.io&quot;</em>.</p> <p>I don't want to upload this test cart to the BBS, but I suppose it would return <em>&quot;www.lexaloffle.com&quot;</em> if I did, both running from a post in the forum and running from <strong>splore</strong>.</p> <p>Can someone confirm this?</p> <h2>.bin standalones and .p8 carts</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/Standalone BIN Windows.png" alt="" /> <p>Unfortunately, both .bin standalones (which can <strong>NOT</strong> load BBS carts) and .p8 carts running inside PICO-8 (which <strong>CAN</strong> load BBS carts) returns <em>0</em>, so I can't use <code>stat(102)</code> to differentiate.</p> <p><em>Note: I only tested the Windows executable.</em></p> <p>Any suggestions on another way to detect if the code is running from an exported binary or from a .p8 cart inside PICO-8?</p> https://www.lexaloffle.com/bbs/?tid=149952 https://www.lexaloffle.com/bbs/?tid=149952 Tue, 01 Jul 2025 15:15:58 UTC Tiny Tactics Postmortem <h1>Tiny Tactics Postmortem</h1> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/24_1-title.png" alt="" /> <p>A few months ago I discovered PICO-8 and decided to make a game for it. It was a nice experience, and I'm proud of this little turn based, tactics / puzzle game. I'll try to summarize below how I made <strong>Tiny Tactics</strong>.</p> <p>I didn't have much spare time to devote to this project (maybe 5 to 10 hours a week), but I think it went pretty smooth. I spent exactly 3 months making the game (from purchasing a license for PICO-8 to exporting the final version of the cart).</p> <p>You can play the game and download the cart <a href="https://www.lexaloffle.com/bbs/?tid=55172">here</a>.</p> <p>I have also created a <a href="https://github.com/andrejtrindade/tiny_tactics/tree/main">project</a> on GitHub. It contains:</p> <ul> <li>source code before flattening / compression;</li> <li>spritesheet and map exports;</li> <li>a standalone HTML version; </li> <li>binaries for Windows, Mac, Linux and Raspberry Pi; </li> <li>a <strong>walkthrough</strong>: GIFs I recorded using PICO-8, showing my solutions for each level; </li> <li><strong>leaderboards</strong>: more GIFs, showing how to get <em>gold trophies</em> I'm aware are possible (first person to claim the record gets the credit).</li> </ul> <p>Note: <strong>Tiny Tactics</strong> was created using PICO-8 version 0.2.5g</p> <h2>1. What I set out to do</h2> <p>One of my main goals when making the game was learning PICO-8, so I decided to only use documented features while reading the PICO-8 Manual. This means no alternate palette, for example. I only used graphics functions in the most straightforward way possible (no 3D, lighting or other complicated techniques not directly supported by the PICO-8 graphics callbacks).</p> <p>I also decided right away to fit everything into a single cart: I liked the limitations imposed by PICO-8, and I feared going multicart would allow the scope to creeply get out of hand (as it tends to do), especially on my first project.</p> <p>On the other hand, I didn't want the game to feel like a vertical slice demo. I wanted it to feel somewhat complete, so I decided to cram as much levels into the cart as possible (no decompression or other advance techniques though, see the previous paragraphs). One of the earliest design decisions I made in <strong>Tiny Tactics</strong> was to devote all shared memory to the map.</p> <p>You can see below that i used 99.87% of the available tiles in the map (including shared memory).</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tiny_tactics.map.png" alt="" /> <p>This left me with only two tabs for sprites. I also decided very early on that all enemies would use the player sprites, palette swapped. I experimented with different sprites for enemies, but the levels became more difficult to read so I abandoned the idea.</p> <p>Of course there are also sprites for drawing the map (including enemies starting postion), story elements etc.<br /> In the end I had just enough sprites to make a simple (yet pleasant) title screen and add a few &quot;easter eggs&quot; to the levels (dining rooms and offices, just to make the levels feel more lived-in).</p> <p>You can see below that I used all available sprites (first two tabs only).</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/tiny_tactics_sprites.png" alt="" /> <p>The UI was also very important from the start, as I feel this is part of what makes the game feel &quot;somewhat complete.&quot; I opted not to include transitions or other fancy UI animations, though. Instead, I focused on the quality of life settings the player can configure in the game's menus (customizable animations, controls, tips and so on).</p> <p>Also, I tried to &quot;do it only once&quot;. I didn't want to spend lots of time redesigning levels or reimplementing mechanincs. If it wasn't fun, I scrapped it ASAP. If it was fun, I finished it and moved on. This is my first project, it was not supposed to have a long development cycle.</p> <p>Finally, I quickly decided to use an external editor (Notepad++) to edit the code. The code section in tiny_tactics.p8 only contains 20 <code>#include</code> lines and a few comments, like the cart label ones.</p> <h2>2. What changed along the way</h2> <h3>2.1. Feel</h3> <p>The game started as a minimalist tactics game, but it ended up also feeling like a puzzle game. Which is fine by me, these are my two favorite game genres. What was set on stone from the very beginning was that I wanted the game to feel &quot;fair&quot;. The player and the enemies should be able to perform the same actions. Everyone should die in one hit. I wanted the player to feel he is overcoming all those enemies by being smarter than their simple AI, not because of some super powered armor or weapon.</p> <h3>2.2. Colors</h3> <p>The colors I used to palette swap the enemies changed a lot during development. I needed to have good contrast with the floor. The checkered white / light gray floor tile was set on stone very early on, but enemies' colors changed a lot along the way. When designing the last enemy types, the idea of using both hair and jacket colors to independently indicate different characteristics of their AI behaviour finally came to me.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/enemies.png" alt="" /> <p>Also, the idea of palette swapping wall colors to make each secret base feel different from the last one only came when designing the final bases. For most of the development process, the map was all in shades of gray. In the end of the development process, I realized this made progress very monotonous. I tried to choose wall colors that don't sacrifice level readability and also don't distract you from the enemies you should be focusing on.</p> <h3>2.3. Levels</h3> <p>When I was designing the first levels, the plan was to make all levels 15x13 tiles (which is the maximum level size, as some screen space is reserved for status bars on top and bottom and for the EXIT text when the door is unlocked).</p> <p>Each level would consist of multiple rooms and, when a player moved from one room to another, enemies would enter the room from color coded doors. I quickly realized this made the code a lot more complex than it should... And also severely limited level design, which was the worst drawback.</p> <p>I changed the approach, making each level be a single room with x, y, width and height coordinates stored in a table. Player and enemies are positioned when the level starts. This is done through color coded floor sprites (invisible by palette swapping these colors to white when drawing the map).</p> <p>This brought much more freedom for the level design - and was much simpler to code.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/map2.png" alt="" /> <h3>2.4. Menu</h3> <p>When I designed the first few levels I quickly realized the game felt a lot like a puzzle game. I remembered how much fun I had optimizing my solutions in <em>Sokoban</em> and <em>Hitman Go</em>, so I decided to add a turn counter and records very early on. Player records are persisted on cart data.</p> <p>On the other hand, I didn't want players to feel stuck so I included an option to unlock all levels (I also persisted that option on cart data). This helped a lot with development and testing.</p> <p>For a long part of development, the menu only had three options. </p> <ul> <li><strong>play</strong> - I wanted level names front and center, as I quickly found out they were important to make levels feel unique and keep them engaging. When you press <strong>play</strong> you only see level numbers, names and wether you've cleared them or not.</li> <li><strong>options</strong> - The only option at the time was to unlock all levels.</li> <li><strong>records</strong> - Where the player can compare their best score for each level with the <em>dev's record</em>. As the record chase is meant to be the endgame, I decided this would be the last option on the menu.</li> </ul> <h3>2.5. Controls</h3> <p>Using arrows to move and a button to shoot was obvious from the start, but what about the other button? Should it also be used? For what? In the beginning I thought about using it to let the player spin in place (without moving), but I had the intuition this would lead to less interesting, more bureaucratic puzzles - and more complex AI. </p> <p>I decided the second button would simply skip the turn for the player. This made the levels more claustrophobic - in a good way! Now the player has to consider if he has enough space to position himself so he can aim at enemies. This made for much more interesting puzzles.</p> <p>I know the community knows keyboard input mappings like the back of their hands, but I wanted to show the game to friends who never played a PICO-8 game, so I decided to ask the player if he is using a keyboard and change button / key labels accordingly. The game does this when it can't load cart data (first time the game is started) or at any time the player selects <strong>controls</strong> on the title screen.</p> <p>Based on the feedback I received, this was the right choice.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/29_1-controls.png" alt="" /> <h3>2.6. Tips</h3> <p>Tips started as random hints that appeared when levels were small enough, so i had some screen space to show them. In the end, though, it was best to leave them in the main menu, so they are easier to access. </p> <p>I like that you have the basic info you need to play available in the game's menus, even if you don't read anything in a blog post. I wrote a lot more tips, but had to trim them down to the absolutely necessary so I could fit everything in a single cart.</p> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/30_1-tips1.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/31_2-tips2.png" alt="" /></p> <h3>2.7. Customizable animations</h3> <p>When I added animations to the game and tested levels with more enemies (like level 1-9), the testing process quickly became tedious. I decided to do what a lot of RPGs do: give players an option to skip animations. Then I decided to break that into more detailed options, like letting players set the <em>animation speed</em> and skip <em>move</em> and <em>idle</em> animations.</p> <p>I decided to let animations in mid speed by default and trust the player to find these options by himself. Many didn't. I noticed many people didn't read the instructions or even checked to see what was available in the <strong>options</strong>. I suspected this could happen, but didn't want to interrupt the player with yet another text screen. I'm not sure it was the best decision though.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/32_1-options.png" alt="" /> <p>While testing with <em>move</em> / <em>idle</em> animations turned off, I noticed the game was letting only one enemy act in each frame. This made the game feel too slow when there were many enemies on a level. I changed the code to make sure the game lets more than one enemy act in a single frame when their animations are skipped.</p> <p>The game still isn't as responsive as I would like when <em>idle</em> and specially <em>move</em> animations are turned off. But I don't have the tokens to completely overhaul the animations, turns and controls. Besides, as I said before, this is my first project. &quot;Do it once and move on&quot; was my motto! In any case, the game still is pretty playable and enjoyable as it is, IMHO.</p> <h3>2.8. Pause menu</h3> <p>Restarting or quitting the level is possible through additional commands in the pause menu.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/33_2-pause.gif" alt="" /> <p>I didn't want to assume player would be familiar with the pause menu, though. That's why the button / key used to access the pause menu are displayed in the <strong>controls</strong> screen.</p> <p>That's also why I added the ability to turn off sound from the title screen, even though you can do the same in the pause menu. Redundant? Yes. But if I didn't know I could do that for the first few weeks of development, why assume players will know about it? Many players are friends of mine who never played a PICO-8 game before...</p> <h3>2.9. Story</h3> <p>While designing levels and testing them, I felt the game was feeling like a simple pack of levels. Level names did make each level more unique, but I still missed some kind of overarching narrative. I believed the game needed a story, even if it was as simple as the story in the first <em>Super Mario Bros.</em> game. So I made a simple story referencing some sentences from that game, but using a Mission: Impossible / 007 setting - which better fitted the gameplay.</p> <p>Did you catch those references while playing the game? I even hightlighted the word substitutions in different colors to make them as identifiable as possible.</p> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/base_cleared.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/mario.png" alt="" /></p> <p>I liked the end result, even if it actually consists of just a few screens with text and very simple graphics with a different perspective (side view instead of top-down). It's simple, but I find it charming.</p> <h3>2.10. Trophies and alternative skin</h3> <p>I wanted to give players an additional challenge, and I wanted to reward them for it. So I added my personal records to the level coordinates table as the <em>dev's record</em>. I also added a screen to track records... And trophies! If the player matches my record for a level, he gets a silver trophy. If he breaks my record, he gets a gold one.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/records-gold.png" alt="" /> <p><strong>Note</strong>: I won't update the <em>dev's records</em>, even if I break my own records after the game's release (it has already happened, in fact). That's what the <a href="https://github.com/andrejtrindade/tiny_tactics/tree/main/leaderboards">leaderboards</a> are for.</p> <p>I also added an alternative skin in the <strong>options</strong> if the player manages to get trophies for all levels (doesn't matter if they are silver or gold). It's been a week since I published the game on the BBS. As far as I know, nobody has unlocked the alternative skin yet... If you manage to do so, post a screenshot on the game's thread!</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/37_3-.png" alt="" /> <h3>2.11. Sound</h3> <p>I'll admit sound was an afterthough in this project. The game didn't have any sound for most of the development process. Adding sound effects was pretty straightforward, but composing music takes time. I decided to do a very simple theme for the menus, use looping sound effects for story screens and not have any music during levels (just sound effects). I used less than 25% of the available sound effects and music patterns, but that's OK.</p> <p>Maybe my next game will have more sophisticated sound, but the sound in <strong>Tiny Tactics</strong>, though simple, is serviceable and pleasent - at least to my ears. Also, it doesn't distract you from solving the puzzles, which is something I consider essential.</p> <h3>2.12. Tokens</h3> <p>I have used 99.86% of the available tokens and 99.55% of the compressed bytes limit.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/39_tokens.png" alt="" /> <p>I broke the token limit a few times during the last few weeks. I had to use some tricks to optimize my token count. Here are the two main ones...</p> <ul> <li>The coordinates for each stage were combined into a single integer. As there are 81 levels, this saved me more than 1,000 tokens. For example, for stage 5-8 we have <code>0x1216.892e</code>. Let me break it down (all numbers are in hex): <ul> <li>12 and 16 are the x and y map coordinates of the topmost, leftmost tile of the level. </li> <li>8 is the level width in tiles. </li> <li>9 is the level height. </li> <li>Finally, 2e is the <em>dev's record</em> for the level.</li> </ul></li> <li>I used split() to create most of my tables, as each string only consume a single token. For example, the main menu is created with <code>split(&quot;play,controls,options,tips,records&quot;)</code>. You can do the same with numbers, split() will convert them for you.</li> </ul> <p>Something I wish I could do is to define constants without wasting tokens. Constants in lua are just variables, and you spent tokens to define them. I still created a lot of them to make the code more readable, but in the final weeks I just didn't have the tokens to spare.</p> <p>Sound effects constants, for example, are commented, and sfx numbers are hardcoded in the lua files. Side view character sprites for the story are also hardcoded for the same reason. I'm glad I managed to avoid this in most other situations, though.</p> <p>I also simplified or removed a few redundant, verbose comments from the code to keep everything under the compressed bytes limit. The code is still very readable though, I believe.</p> <h3>2.13. Release</h3> <p>Before posting the cart on the Lexaloffle BBS, I uploaded the whole project to GitHub. I wanted anyone to have easy access to the bynary apps (Windows / Mac / Linux / Raspberry Pi), the standalone HTML version and the uncompressed source code, even if the person doesn't have PICO-8 to export everything.</p> <p>I also created a walkthrough by recording GIFs, showing my solution for every level. After some time, it may be difficult to recall how exactly you finished a level in X turns. I know this from experience...</p> <h3>2.14. Updates</h3> <p>I updated the game a couple of days after releasing it. This first change was very minor: I addeed the level number to the clear screen, because my friends were sending me screenshots of broken records - and I had to ask which level they were playing.</p> <p>Then, a couple of days later, I found a bug (suprised no one complained!) where you could walk through the locked exit door before you eliminated all the enemies... So I updated the game again to fix this.</p> <p>I also added a leaderboards folder to the GitHub project. It contains GIFs showing how to get the gold trophies I'm aware are achieavable. First person to claim the record gets the credit (once I verify the new record is actually possible, of course).</p> <p>This game has 9 enemy types and 9 secret bases with 9 levels each. Right now there are 9 gold trophies on the leaderboards. Funny coincidence, huh?</p> <h2>3. How did it go?</h2> <p>It's been a week since I published the game on the BBS.</p> <p>I'm very happy to see my friends and family playing the game, finishing bases and even breaking my records! Two of them have already finished the whole game, all 81 levels! </p> <p>It's also very nice that several forum members tried the game and liked it enough to give it a star or leave a comment.</p> <p>I remember when I was a kid, drawing super heroes on my notebook. I didn't want to make money out of it, put my drawings in an art gallery or anything. I just liked drawing... Whenever I was proud of a drawing and my friends thought it was cool, that was my definition of success. </p> <p>That's how I feel now, decades later, about <strong>Tiny Tactics</strong>. I had fun making it! I'm thrilled people are also having fun playing it! It's not perfect, but I'm proud of it.</p> <p>Anyway, I hope you liked this writeup! And, if you still haven't played <strong>Tiny Tactics</strong>... <a href="https://www.lexaloffle.com/bbs/?tid=55172">Go try it!</a></p> https://www.lexaloffle.com/bbs/?tid=55244 https://www.lexaloffle.com/bbs/?tid=55244 Fri, 08 Dec 2023 15:54:35 UTC Tiny Tactics <p> <table><tr><td> <a href="/bbs/?pid=138037#p"> <img src="/bbs/thumbs/pico8_tiny_tactics-5.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=138037#p"> Tiny Tactics v1.5</a><br><br> by <a href="/bbs/?uid=86005"> andrejtrindade</a> <br><br><br> <a href="/bbs/?pid=138037#p"> [Click to Play]</a> </td></tr></table> </p> <h1>Tiny Tactics</h1> <p>A turn based, tactics / puzzle game for PICO-8</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-playing.gif" alt="" /> <h2>Controls</h2> <ul> <li>When you start the game for the first time it will show you the controls and ask if you are using a keyboard. Your answer will be saved, and appropriate button / key labels will be used on the menus. </li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/1-controls.png" alt="" /> <ul> <li>Shorter levels (like the first few ones) will also show the controls at the bottom so you get used to them.</li> <li>If you want to change labels from keys to buttons or vice-versa later on, just select <strong>controls</strong> on the title screen.</li> </ul> <h2>Features</h2> <ul> <li>81 levels</li> <li>9 enemy types</li> <li>2 hours of gameplay (first playthrough estimate)</li> <li>Story with an actual ending</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-briefing.png" alt="" /> <ul> <li>Customizable animations</li> <li>Ability to unlock all levels if you get stuck</li> <li>Appropriate button / key labels wether you are using a keyboard or not</li> </ul> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-buttons.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/3-keys.png" alt="" /></p> <ul> <li>In-game tips detailing enemies AI behaviour</li> <li>Your settings and records are saved</li> <li>Get trophies if you match the <em>dev's records</em></li> <li>Unlockable skin if you get trophies for all levels</li> </ul> <h2>Playing Levels</h2> <ul> <li>Select <strong>play</strong> on the title screen.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/1-bases.gif" alt="" /> <ul> <li>Clear a level to unlock the next one.</li> <li>You can quit or restart the current level from the <em>pause menu</em>.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-pause.gif" alt="" /> <ul> <li>Notice the level name at the top, it may be a hint on how to solve it.</li> <li>Notice the turn counter and the turn indicator (<strong>player turn</strong> / <strong>enemies turn</strong>) at the bottom.</li> </ul> <h2>Options</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/1-options.png" alt="" /> <ul> <li>You can adjust the <em>animation speed</em>.</li> <li>You can speed up the gameplay further by disabling <em>idle</em> and/or <em>move</em> animations.</li> <li>If you get stuck, you can <em>unlock all levels</em>.</li> <li>You can also change your <em>active skin</em> (once you unlock the <em>alternative skin</em>).</li> <li>Your settings are saved when you go back to the title screen.</li> <li>You can also <em>show FPS</em> (frames per second), which boringly stay at 30 at all times in my experience. This setting is intentionally not saved.</li> </ul> <h2>Tips</h2> <ul> <li>Select <strong>tips</strong> from the title screen for some in-game hints.</li> </ul> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/1-tips1.png" alt="" /> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-tips2.png" alt="" /></p> <ul> <li>Take your time to understand enemies AI behaviour, which is indicated by the color of their hair and jacket.</li> <li>Also note the order of activation during enemies turn.</li> </ul> <h2>Records</h2> <ul> <li>Your record is saved when you set a new personal record for a level.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/1-record_saved.png" alt="" /> <ul> <li>Select <strong>records</strong> from the title screen to see the <em>dev's records</em> and compare them to yours.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-records.png" alt="" /> <ul> <li>You earn a <em>silver trophy</em> for each level in which you tied the <em>dev's record</em>.</li> <li>It's possible that you are able to break the <em>dev's record</em> in some levels. In such case, you will earn a <em>gold trophy</em>.</li> <li>If you earn trophies for all levels you will unlock an <em>alternative skin</em>. It doesn't matter if your trophies are silver or gold.</li> <li>Once the <em>alternative skin</em> is unlocked, you can change your <em>active skin</em> in the <strong>options</strong>.</li> </ul> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/3-.png" alt="" /> <h2>Project</h2> <p>You can download <a href="https://github.com/andrejtrindade/tiny_tactics">the complete project</a> from GitHub, including:</p> <ul> <li>the separate .lua files before flattening;</li> <li>a <a href="https://github.com/andrejtrindade/tiny_tactics/tree/main/exports/html">standalone HTML version</a>;</li> <li><a href="https://github.com/andrejtrindade/tiny_tactics/tree/main/exports/binary%20apps">binary versions</a> for Windows / Mac / Linux / Raspberry Pi.</li> </ul> <h2>Walkthrough</h2> <p>I strongly suggest you try to tackle the levels in the game by yourself. If you get stuck, you can unlock all levels in the <strong>options</strong> and skip the level that's giving you trouble.</p> <p>The same can be said about records. You don't need to tie the <em>dev's record</em> for every level, unless you want to unlock the alternative skin. Even then, you don't need to do it straight away, you can always keep playing the next levels and come back for records later.</p> <p>But if you really want to see how the <em>dev's record</em> can be obtained for a specific level, I have recorded GIFs showing my solution for all levels in the game. The GIFs are on the GitHub repository, in the <a href="https://github.com/andrejtrindade/tiny_tactics/tree/main/walkthrough">walkthrough folder</a>.</p> <h2>Gold Trophies</h2> <p>On many levels, especially the simpler ones, the <em>dev's record</em> already seem to be the optimal solution, so don't expect to be able to get gold trophies on all levels.</p> <p>If you manage to get a gold trophy... Take a screenshot of the <em>level clear</em> screen! This screenshot will contain your entire solution so you (or anyone else) can replay it.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/86005/2-7 solution.png" alt="" /> <p>Please post your screenshot on this forum. I'll appreciate it, and I'll add your record to the leaderboards (see below), giving you the credit for being the first to discover said solution (to the best of my knowledge, naturally).</p> <h2>Leaderboards</h2> <p>On the GitHub repository there is a <a href="https://github.com/andrejtrindade/tiny_tactics/tree/main/leaderboards">leaderboards folder</a> with GIFs showing how to get the gold trophies that I'm aware are possible. First person to claim the record gets the credit (once I can verify the record is really achievable, of course).</p> <h2>Development</h2> <p>I wrote an extensive <a href="https://www.lexaloffle.com/bbs/?tid=55244">postmortem</a>. Go read it!</p> <h2>Feedback</h2> <p>This is my first PICO-8 game. It took exactly 3 months of my spare time (5 to 10 hours / week) to make, from purchasing a license to exporting the final version of the cart. Any feedback is appreciated.</p> <p>I hope you have fun playing <strong>Tiny Tactics</strong>!</p> https://www.lexaloffle.com/bbs/?tid=55172 https://www.lexaloffle.com/bbs/?tid=55172 Thu, 30 Nov 2023 12:46:00 UTC