aKidCalledAris [Lexaloffle Blog Feed]https://www.lexaloffle.com/bbs/?uid=36544 Map Command Tool <h3><span style="color: #55aaff;">if there's something I forgot, let me know</span></h3> <p><span style="color: #66bbff;"><strong>No, you probably won't know what I forgot, but if something messes up, or something's really weird and confusing, let me know.</strong></span></p> <h2>Cartridge</h2> <p> <table><tr><td> <a href="/bbs/?pid=126521#p"> <img src="/bbs/thumbs/pico8_wvm_mapc_tool-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=126521#p"> Map Command Tool v1</a><br><br> by <a href="/bbs/?uid=36544"> aKidCalledAris</a> <br><br><br> <a href="/bbs/?pid=126521#p"> [Click to Play]</a> </td></tr></table> </p> <p>Code licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>. Yeah, that's right, steal the freaking code!!!!!</p> <h2>About <span style="color: #766;">-</span> <span style="color: #c79b61;"><em>MCT, Map Command Tool</em></span></h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/36544/mct-v1_show.gif" alt="" /> <p>This is a cartridge that can help fit large maps in an extremely small space via the use of two byte commands that fill in or remove large sections at a time.<br /> It doesn't do so automatically, but you are given a little interface to do the work.<br /> You can also edit the maker code itself to create extra commands (there's five dedicated 2 byte commands available, and you can probably go crazy with the alternate commands).</p> <p>It's not a compression system like <a href="https://www.lexaloffle.com/bbs/?tid=34058">PX9</a>, but it still puts large amounts of data in a smaller space.<br /> Still, it might not be what you're looking for, as it requires you to simplify quite a lot of the data and (as of right now) costs about 500 tokens to implement (which is kind of a lot).<br /> In return, theoretically, you get a significant savings in map space. The above gif's map is in 10% of the usual space. <span style="color: #ff6677;"><strong>I have not tested this against any other compression system.</strong></span></p> <p>Just think really hard about what kind of maps you have before you pick a compression system.</p> <p>I really want to work towards making it super editable &amp; good for whatever, so if you have any suggestions, let me know!! Please!</p> <p><span style="color: #55ddee;"><strong>Data to command table costs ~229 tokens</strong></span><br /> <span style="color: #44ee88;"><strong>Unmodified commands to map costs ~263 tokens</strong></span><br /> Make sure you have a <code>screens = {}</code> declaration.</p> <p>You can see an example implementation down below in the OTHER section!</p> <p><span style="color: #FF4477;"><strong>Some limitations</strong></span></p> <ul> <li>There are only 14 main commands, 15 usable alternate commands.</li> <li>Currently it only supports nibbles for each main command value. Thus it can really only support 16x16 maps.</li> <li>It can only use 63 tile values without adding an extra byte (though you can use commands A-E to add extra tiles).</li> <li>Fills only use one tile at a time.</li> <li>If two maps use the same screen space, that's on you, dingus.</li> <li>Binary export messes with commands if they have too much zero</li> <li>The cart doesn't use devkit keyboard.</li> </ul> <h2>Versions</h2> <p><strong>v1</strong><br /> Release<br /> <span style="color: #55ddee;">D&gt;T 229t</span>, <span style="color: #44ee88;">T&gt;M 263t</span></p> <h2>How to Use</h2> <p>Download the cart and place tiles in the spritesheet representing tiles from your game. Run the cart. Start editing!<br /> Use arrow keys to move.<br /> O and X are modifiers, and holding them will change what your arrow keys do - X will change what part of the screen you work with, and O will let you change a specific value.<br /> O is also used as the &quot;accept&quot; button.</p> <p>You can export it at any time by going to the bottom bar, hitting EXPORT, and then selecting either binary or hex.<br /> Hexadecimal prints something like <code>hf037</code>, and is safe to put in any text editor. Binary instead gives you one-byte characters, along the lines of <code>bユs</code> that are meant to be put in a PICO-8 string, can contain weird characters that could possibly mess with other text editors, and <em><strong>will break if you have a command with &quot;zero parameters&quot;</strong> (see Commands documentation)</em>.<br /> After hitting O on an export type, hit CTRL-C up to 12 times (just in case) and paste it somewhere safe.</p> <p>To import, copy the entirety of a map string, paste into the app up to 12 times (just in case), then hit IMPORT 3 or 4 times.</p> <h2>Documentation</h2> <h3>Bars</h3> <p><strong>Top Bar</strong><br /> Use left and right to change the screen.<br /> O opens up the banner, where you can add and delete screens, or go to the map preview (which uses the bigmap space).<br /> On the banner, hit O to perform the action selected and use arrows to change selection.<br /> <span style="color: #FF4477;">Deletion is an irreversible action. Be careful.</span><br /> The bar also shows how many bytes the current screen uses.</p> <p><strong>Middle</strong><br /> Arrows change the selection. Holding O makes them change a value instead.<br /> To add a new command, go to <span style="color: #FFaa22;">NEW</span>, hold O, and use up/down to choose where to place the new command.<br /> All commands are put in the map in order, starting with &quot;G&quot; (which can't be changed as that marks where a new map is).<br /> On a null command, you can press left and then O to delete it.</p> <p><strong>Bottom Bar</strong><br /> When unselected, the bar shows the total bytes this set of screens is using, compared to how many bytes it would take up uncompressed. It also shows the compression rate.<br /> When selected, a banner opens up allowing you to import and export the map. To use import, you have to paste while the cart is in focus.<br /> <span style="color: #FF4477;">Importing is an irreversible action. Make sure your data is backed up well.</span><br /> Exporting opens up the export menu and lets you export to hex or binary. <strong>You have to press CTRL-C to copy once you hit O on an export option.</strong></p> <h3>Commands</h3> <p>Normal command parameters are sorted <strong><span style="color: #29ADFF;">COMMAND</span>, <span style="color: #FF004D;">X</span>, <span style="color: #00E436;">Y</span>, <span style="color: #FF77A8;">V</span></strong></p> <p><span style="color: #FF4477;"><strong>Binary Conditions</strong></span><br /> If a command does not follow these conditions, it will be changed or removed on binary export. If you wanna use a lot of zeroes, you need to use hex export.<br /> <strong>For normal commands, Y or V must be non-zero.</strong><br /> <strong>For F0, you must have one non-zero value. <span style="color: #FF4477;">THIS COMMAND WILL DEFAULT TO X=F and Y=F OTHERWISE</span></strong><br /> <strong>For F1, you must have one non-zero value.</strong><br /> <strong>For F2, X or Y must be non-zero, and V must be non-zero.</strong></p> <p><strong>COMMAND LIST</strong><br /> <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> <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>0 - null, ignored on export **Normal Commands** two bytes, all 4 bits per parameter 1 - erase one line x,v - start, end y - y position 2 - fill from bottom x,v - start, end y - y position 3 - fill one line x,v - start, end y - y position 4-7 - place one tile x,y - position v - tile: 4 is 0-15 5 is 16-31 6 is 32-47 7 is 48-63 8 - fill from top x,v - start, end y - y position 9 - erase from bottom x,v - start, end y - y position a-e - unused f - ALT MODE **Alternate Commands** alternate commands use a different parameter format f0 - new screen (2 bytes, always one per screen) x,y - screen position on bigmap however, you don't have to use this as screen position idk what else you'd use it for though f1 - change fill brush (2b - f1, 8v) v - tile to use as brush f2 - place one tile (3b - f2, 4x 4y, 8v) x,y - position v - tile to use</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p></div></div></div></p> <h2>License</h2> <p>I created this so that I could compress my map data without having to put BY-NC-SA, a license I didn't want on a game I'm making. So I'm making all of this cartridge under a CC-BY license. That includes the map loading code, but all you have to do is put a <code>-- by wish volo</code> comment right before it and you'll be good.</p> <p>I completely encourage you to do whatever the heck you want. That's what this is meant for.</p> <h2>Other</h2> <p>Yes, it works:<br /> <table><tr><td> <a href="/bbs/?pid=126521#p"> <img src="/bbs/thumbs/pico8_wvm_mct_test-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=126521#p"> MCT Test Cart</a><br><br> by <a href="/bbs/?uid=36544"> aKidCalledAris</a> <br><br><br> <a href="/bbs/?pid=126521#p"> [Click to Play]</a> </td></tr></table> </p> <p>I think a good way to use the &quot;tiles&quot; in the cart is as representations - it doesn't have to look exactly as it does in the editor. You can make it look different during import, like changing a tile based on possible variations or whatever.<br /> example: Tile 1, no matter what it is in the normal cart, represents all and any ground tiles of type X. When loading to map data, if it detects value 1, then it will pick a random tile from group X and draw it!<br /> easy peasy.</p> <p>You can put a PAL() call at the bottom of DRAW(), cause that's where the map preview code is, if you want to see a different palette to match what your tiles will actually look like.</p> <p>If you don't use a specific command, feel free to comment it out.<br /> If you stick to using <strong>only</strong> hex or binary, then you can cut a few extra tokens out of the functions.</p> <p>at some point i need to add base 64<br /> the only issue with base 64 is that it might actually cost more tokens to do so, but it'd save more space than hex</p> <p><strong>Dev ramble</strong><br /> <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;"><br /> okay so i made this thing based on Super Mario Bros' maps, or at least what i heard about them.</p> <p>i didn't want to bother with finding a compression system on PICO-8, and i didn't want to use PX9 because it's under a fairly restrictive license<br /> (nothing wrong with it, i just don't want to worry about what i can and can't do. like, uh. make money.)</p> <p>at first i was just going to make something that tallied up all the tiles in byte order, then shove it to two bytes<br /> it'd say the tile, then the amount of times that tile appeared, counting horizontally. does that make sense?</p> <p>and i made it, and it did okay.</p> <p>then i thought about &quot;how big are SMB maps?&quot; so i tried to look it up but then i found <a href="https://news.ycombinator.com/item?id=21213421">&quot;hey, this game uses a bunch of commands that say to draw a fill pattern here or whatever&quot;</a></p> <p>so i decided to do something based on that! and that's the story.</p> <hr /> <p>oh also one time i forgot about 0x8000's existence, and there was a bunch of other stupid stuff i did because i didn't think 100% of the way, but i don't remember much beyond &quot;oh crap, big maps exist&quot;<br /> that doesn't really have anything to do with the editor, that was just me worrying about how many tokens i'd have to spend to have a dynamically loading map</p> <p>also yes, the ui is (coincidentally) like LSDJ's if you noticed</p> <p>If this sucks, then it's perfectly fine cause it was fun to put it together, write the documentation, interestingly enough. I finally made a relatively smart thing! that has a purpose! woo!<br /> and i'm still gonna use this cart anyways lol</p> <p>do whatever you want with it lol<br /> </div></div></div></p> https://www.lexaloffle.com/bbs/?tid=51825 https://www.lexaloffle.com/bbs/?tid=51825 Sat, 04 Mar 2023 01:43:44 UTC Puny font breaks in 0.2.5d <p>I found a minor (except that to me it's kinda major) bug concerning puny font.</p> <p>It seems to only affect PICO-8 when loading or reloading - whenever I save in an external source and reload, or when I boot up the console, all the puny font disappears.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/36544/old.png" alt="" /> <p>EDIT: Never mind, turns out it was that _ENV thing. Thanks zep lexaloffle!</p> https://www.lexaloffle.com/bbs/?tid=50640 https://www.lexaloffle.com/bbs/?tid=50640 Wed, 14 Dec 2022 00:59:09 UTC ORBSORT - a game about sorting orbs <h3>Hello, I'm Wish Volo. I made a game about sorting orbs.</h3> <p>And it's in PICO-8!</p> <p> <table><tr><td> <a href="/bbs/?pid=121141#p"> <img src="/bbs/thumbs/pico8_wvm_orbsort_sort-5.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=121141#p"> ORBSORT (sort.p8 - vol 1.1 / p68)</a><br><br> by <a href="/bbs/?uid=36544"> aKidCalledAris</a> <br><br><br> <a href="/bbs/?pid=121141#p"> [Click to Play]</a> </td></tr></table> </p> <h3>old versions</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;"><br /> <table><tr><td> <a href="/bbs/?pid=121141#p"> <img src="/bbs/thumbs/pico8_wvm_orbsort_sort-4.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=121141#p"> ORBSORT (sort.p8 - vol 1.1 / p67)</a><br><br> by <a href="/bbs/?uid=36544"> aKidCalledAris</a> <br><br><br> <a href="/bbs/?pid=121141#p"> [Click to Play]</a> </td></tr></table> <br /> <table><tr><td> <a href="/bbs/?pid=121141#p"> <img src="/bbs/thumbs/pico8_wvm_orbsort_sort-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=121141#p"> ORBSORT (sort.p8 - p64.0)</a><br><br> by <a href="/bbs/?uid=36544"> aKidCalledAris</a> <br><br><br> <a href="/bbs/?pid=121141#p"> [Click to Play]</a> </td></tr></table> <br /> </div></div></div></p> <p>Z/C/N/Tab/Lshift to swap / &quot;yes&quot;<br /> X/V/M/Q/A to cancel combotimer / &quot;no&quot;<br /> Enter pauses (you're gonna have to hold it to bring up the PICO-8 pause menu)</p> <p>It's got four gamemodes!</p> <ul> <li>Infinite: sort forever</li> <li>Blitz: sort quickly for a high score in a short time</li> <li>Clear: get as many capsules cleared as quickly as you can</li> <li>Knockout: splitscreen multiplayer</li> </ul> <p>It's also got 12 tracks of music (5 casual, 4 tense, 2 KO)!</p> <p>It's also got a little bit of contrast assistance. It's there.</p> <p>You can also change the combotimer length and the orbcount with no penalty :)</p> <p>Oh, and it's on itch.io too. <a href="https://wish-volo.itch.io/orbsort">https://wish-volo.itch.io/orbsort</a></p> <p><object width="640" height="400"><param name="movie" value="https://www.youtube.com/v/kkYqO0c3JvU&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://www.youtube.com/v/kkYqO0c3JvU&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="400"></embed></object></p> <p>if you don't mind, check it out for a little bit!</p> <h3>last note: This version of the game is only on Lexaloffle / Splore. The A version is found only on itch.io. If either version is found anywhere else, it&rsquo;s been copied. Have a nice day :)</h3> https://www.lexaloffle.com/bbs/?tid=50304 https://www.lexaloffle.com/bbs/?tid=50304 Tue, 22 Nov 2022 15:37:30 UTC # operator doesn't work <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/36544/intro_000.png" alt="" /> <p>What I'm trying to do is make a typewriter script, but when checking to see that the third line has less characters than the dialogue, I keep running into the same odd error. Is this not a string?</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>-- typewriter dialogue = {d1={ l1=&quot;qwertyuiop&quot;, l2=&quot;asdfghjkl&quot;, l3=&quot;zxcvbnm&quot;}} c_text_1 = &quot;.&quot; c_text_2 = &quot;.&quot; c_text_3 = &quot;.&quot; c_dia = 1 function typewriter(string,wait) if frame &gt; wait and #c_text_3 != #tostr(dialogue[(&quot;d&quot;..c_dia)[l3]]) then sfx(0) frame = 0 end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> https://www.lexaloffle.com/bbs/?tid=37288 https://www.lexaloffle.com/bbs/?tid=37288 Wed, 08 Apr 2020 13:44:54 UTC I'm working on another game <p>So I'm working on another game<br /> <a href="https://www.lexaloffle.com/bbs/files/36544/004_000.png" target=_view_image><img loading="lazy" style="margin-bottom:16px" border=0 src="https://www.lexaloffle.com/bbs/files/36544/004_000.png" width=160 height=160 alt="" /></a><br /> The previous ones I worked on were a little... I guess... too much for my current PICO-8 skill. This new one will not be as big as the others.<br /> Guess I'm both worried about my skill and the amount of coding I'd need for it.</p> https://www.lexaloffle.com/bbs/?tid=34344 https://www.lexaloffle.com/bbs/?tid=34344 Mon, 27 May 2019 16:50:57 UTC Why are sprites in the map? <p>So I was working on the map in PICO-8 when I found some tiles I never placed, so I started erasing them. Later I saw a chunk of my spritesheet was erased, so I fixed that manually. Later the same thing happened and found that the tiles are related to the colors in the sprites. Why is this?</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="https://www.lexaloffle.com/bbs/files/36544/012_000.png" alt="" /> https://www.lexaloffle.com/bbs/?tid=34335 https://www.lexaloffle.com/bbs/?tid=34335 Sat, 25 May 2019 20:40:15 UTC What could this possibly be? <img loading="lazy" style="margin-bottom:16px" border=0 src="https://www.lexaloffle.com/bbs/files/36544/00004_001.png" alt="" /> <p>🤔 what could I be presenting?<br /> what could possibly concern me so much I require the changing of keys?<br /> who <em>is</em> Aris? (wait, I'm the one making this post...)</p> <p>Random bird and random person said bird will be attacking.<br /> <table><tr><td width=0> <img src="https://www.lexaloffle.com/bbs/gfxc/36544_2.png" width=0 height=0> </td> <td valign=bottom> <a style="cursor:pointer;font-size:8pt" onclick=' var el = document.getElementById("gfxcode_36544_2"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("https://www.lexaloffle.com/bbs/gfxc/36544_2.txt", function (retdata){ var el = document.getElementById("gfxcode_36544_2"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> [0x0]</a> </td></tr> <tr><td colspan=2> <textarea rows=3 class=lexinput id="gfxcode_36544_2" style="width:640px;background-color:#fed;display:none;overflow:hidden; font-size:6pt;"></textarea> </td> </tr> </table> <br /> <table><tr><td width=0> <img src="https://www.lexaloffle.com/bbs/gfxc/36544_3.png" width=0 height=0> </td> <td valign=bottom> <a style="cursor:pointer;font-size:8pt" onclick=' var el = document.getElementById("gfxcode_36544_3"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("https://www.lexaloffle.com/bbs/gfxc/36544_3.txt", function (retdata){ var el = document.getElementById("gfxcode_36544_3"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> [0x0]</a> </td></tr> <tr><td colspan=2> <textarea rows=3 class=lexinput id="gfxcode_36544_3" style="width:640px;background-color:#fed;display:none;overflow:hidden; font-size:6pt;"></textarea> </td> </tr> </table> </p> https://www.lexaloffle.com/bbs/?tid=33869 https://www.lexaloffle.com/bbs/?tid=33869 Sun, 14 Apr 2019 13:28:28 UTC Good form of wait() command? <p>In ROBLOX I am also learning how to code, but one thing stands out that I feel should be necessary.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="https://www.lexaloffle.com/bbs/files/36544/00004_000.png" alt="" /> <p>What is supposed to happen is that it runs:</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() cls() spr(192,20,20,4,4) wait(3) 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>But it errors with<br /> &quot;Runtime error line 4 tab 0<br /> wait(3)<br /> Attempt to call global 'wait' (a nil value)<br /> In _init line 4 (tab 0)<br /> At line 1 (tab 1)&quot;</p> <p>Is there a way to make the program wait a few seconds without taking too much space?</p> <p>Thanks :)</p> https://www.lexaloffle.com/bbs/?tid=33868 https://www.lexaloffle.com/bbs/?tid=33868 Sun, 14 Apr 2019 13:10:03 UTC