<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://rae.wtf/feed.xml" rel="self" type="application/atom+xml" /><link href="http://rae.wtf/" rel="alternate" type="text/html" /><updated>2026-04-09T01:30:12+00:00</updated><id>http://rae.wtf/feed.xml</id><title type="html">rae.wtf</title><subtitle>My website!</subtitle><entry><title type="html">Labsylle Manual</title><link href="http://rae.wtf/blog/labsylle-manual" rel="alternate" type="text/html" title="Labsylle Manual" /><published>2026-02-17T00:00:00+00:00</published><updated>2026-02-17T00:00:00+00:00</updated><id>http://rae.wtf/blog/labsylle-manual</id><content type="html" xml:base="http://rae.wtf/blog/labsylle-manual"><![CDATA[<p><img src="/blog/images/2026-02-17-1.png" alt="Labsylle" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>A cool word puzzle game, all about the “building blocks” of the English language.</p>
</blockquote>

<p><em>Labsylle</em> is a puzzle game. All about syllables. It’s easy to play: you swap around these syllable blocks, two at a time, and try to assemble words. That’s it! Once you get started, though, it’s hard to stop yourself from saying “just one more”. Pop in and out of themed puzzle paks at ease — suspend, and then resume, exactly where you left off. Perfect to play on the bus, waiting in line, or anywhere you need a quick puzzle fix. Who knows? You might even learn a new word or three!</p>

<p>We’re not skimping, either. The game includes over four hundred and fifty word puzzles, and an expansive dictionary of <em>“Quik-Words”</em>, for you to barrel through in sixty second bursts — how many rounds can you complete in that time? If you want a break from all the words words words, there are also about 50 <em>bonus</em> puzzles centered on shapes — the perfect counterpart. That’s Labsylle, explained to you in one hundred and sixty eight words — are you in?</p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>A set of Directional and Action buttons are required to play this game. These buttons are used to navigate menus, and are mandatory in main gameplay.</p>

<p>On personal computers, you can use the keyboard (which defaults to Arrows &amp; Z + X), or a compatible gamepad (d-pad &amp; A + B). During an active game, ESC/Start accesses the pause menu. Otherwise, pressing either button twice in succession will quickly exit the game.</p>

<p>On Playdate, you can also optionally use the crank to perform the swapping action usually done by the Action buttons — this can be toggled in the Options menu. (The crank can also be used to navigate menus.)</p>

<h2 id="gameplay">Gameplay</h2>

<p>Gameplay is simple! You’ll be given a group of syllable “blocks”, which are jumbled around in a random order. Your task is to swap them, two-at-a-time, to reach the target word. Preferably, you’d like to do it in as few swaps as possible, as well. That’s it for the basics! But you may encounter a couple other quirky obstacles…</p>

<p><em>Impostors</em> are syllable blocks that don’t actually belong anywhere in the target word. When an impostor block is hiding about, there will be a dedicated spot for it at the far-right end of the playfield. To complete the puzzle, solve the rest of the word correctly, and silo the impostor out in the time-out corner.</p>

<p><em>Bombs</em> are syllable blocks that only give you a limited amount of swaps. If you shuffle them around too many times, they’ll get increasingly fired up, and eventually KERPLODE! …Which means you’ll need to restart the puzzle from the beginning.</p>

<h1 id="modes">Modes</h1>

<h2 id="word-puzzle-paks">Word Puzzle Paks</h2>

<p>The word puzzle paks comprise the default game mode. When you enter this mode, you’ll get to choose from a variety of paks, sorted by difficulty, where words are grouped together under common themes such as “Animals” or “Food &amp; Drink”. Solve all of these words in as little cumulative swaps as you can for a high score! High scores are tracked individually per pak.</p>

<p>If you wanna take a break from a pak and come back to it later, you can select “suspend” from the pause menu. This will kick you back to the pak selection screen, and re-entering the pak will put you exactly where you left off.</p>

<p>Selecting “quit” from the pause menu will maintain your progress within the pak, starting you at the top of the last puzzle you reached, but will reset any progress within the individual puzzle.</p>

<p>If you’d like to clear all progress on a puzzle pak, hover over the pak on the selection screen, and press the left Directional button to arm the deletion process. Press the primary Action button to confirm deletion, and reset all progress and high scores. If you’d like to change your mind, navigate away from the active pak or press the right Directional button to disarm the deletion process.</p>

<h2 id="quik-word">Quik-Word</h2>

<p>In Quik-Word, you get 60 seconds to plonk together as many 4-syllable words as you can! Instead of being scored based on minimum swaps, your goal is simply to complete as many rounds — properly assmble as many words — as possible in the time limit!</p>

<h2 id="bonus-paks">Bonus Paks</h2>

<p>Bonus Paks function like the Word Puzzle Paks, but center around anything but! Currently, there are two types of Bonus Paks — <em>Shapes Paks</em> ask of you to link the blocks together in such a way that there’s an unbroken string of properly-connected shapes, and <em>Math Paks</em> want you to assemble the blocks to create a valid mathematical equation.</p>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<blockquote>
  <p>⚠️ <em>Labsylle for personal computers does not connect on-line, or transmit high scores.</em></p>
</blockquote>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>To submit a new score to a global leaderboard, simply complete a pak or finish a round of Quik-Word. When you reach the end results screen, your score will be submitted to the proper leaderboard automatically.</p>

<blockquote>
  <p>⚠️ <em>Be careful — if you close out of Quik-Word without properly ending your run, your score won’t be saved or submitted!</em></p>
</blockquote>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the Labsylle game page in your Web browser, at <a href="https://play.date/games/labsylle">play.date/games/labsylle</a>. From here, you can view available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>To view global scores for paks within the game, hover over a pak on the selection screen, and select “pak boards” from the Slide menu. From here, you can see the top scores for the current pak.</p>
  </li>
  <li>
    <p>To view global scores for Quik-Word within the game, enter the “Best Scores” menu, accessible from the Title screen. When in this screen, you can use the left and right Directional buttons to toggle between the All-Time and Daily best score leaderboards. From here, you can see hte top scores for the currently-highlighted board.</p>
  </li>
</ol>

<p>The Daily Quik-Word leaderboard refreshes automatically at 00:00 midnight GMT, clearing all scores from the past day.</p>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art, code, music, and SFX — <a href="https://rae.wtf">Rae</a></li>
  <li>Pak writing — Rae, <a href="https://toadley.space">Toad</a>, and <a href="https://voxy.space">Voxy</a></li>
  <li><a href="https://github.com/gautesolheim/25000-syllabified-words-list">Quik-Word list</a> — <a href="https://github.com/gautesolheim">Gaute Solheim</a>; <a href="https://github.com/gautesolheim/25000-syllabified-words-list/blob/main/LICENSE.md">Unlicense</a></li>
  <li><a href="https://fontenddev.com/fonts/digital-disco/">Digital Disco</a> font — <a href="https://fontenddev.com">Font End Dev</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li><a href="https://fonts.google.com/specimen/Cal+Sans">Cal Sans</a> font — Mark Davis; <a href="https://github.com/calcom/sans/blob/main/OFL.txt">OFL</a></li>
  <li>Playdate <a href="https://playdatesquad.github.io/pd-achievements/">achievements</a> library — Playdate Squad</li>
  <li>xorshift PRNG implementation — <a href="https://bsky.app/profile/2darray.bsky.social">Eli Piilonen</a> (2DArray)</li>
  <li>LÖVE2D <a href="https://github.com/airstruck/knife">Knife</a> library — <a href="https://github.com/airstruck">airstruck</a>; <a href="https://github.com/airstruck/knife/blob/master/license">MIT</a></li>
  <li>LÖVE2D <a href="https://hump.readthedocs.io/en/latest/">HUMP</a> library — Matthias Richter; <a href="https://github.com/HDictus/hump/blob/temp-master/README.md">License</a></li>
  <li><a href="https://github.com/EmmanuelOga/easing">Tween easings</a> — Yuichi Tateno and Emmanuel Oga; <a href="https://github.com/EmmanuelOga/easing/blob/master/license.txt">MIT</a></li>
  <li>Lua <a href="https://github.com/rxi/json.lua">JSON</a> parser — <a href="https://github.com/rxi">rxi</a>; <a href="https://github.com/rxi/json.lua/blob/master/LICENSE">MIT</a></li>
  <li>Playtesters — Oatcup, Dimitri, dennens, scizzorz, benjymous, TheOddLinguist, Scenic Route, Toad, BrittOmnRex, and Angry</li>
  <li>Thanks — Voxy, Toad, Robbo, Scenic Route, Orchid, Winter, Devon, The Rhythm League, the PeeDee Dev Server, and Panic!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-103">Version 1.0.3</h2>
<h3 id="03012026">03.01.2026</h3>

<ul>
  <li>Fixed game crash when launching the Shapes! pak.</li>
  <li>Fixed game crash when entering puzzle 4 in the Card Stock bonus pak.</li>
  <li>Optimized automatic check logic slightly. Now the correct state will only be checked after each swap, and not on every frame.</li>
  <li>Page numbers are now displayed in Options and Credits screens.</li>
  <li>Removed impostor/bomb icons from the Pak Select screen (due to visual bug with it sometimes crashing into the text).</li>
</ul>

<p>Windows/macOS/Linux:</p>
<ul>
  <li>Added clearer selection indicator on the in-game Pause screen.</li>
  <li>Fixed edge case where you could pause the game again after selecting Suspend or Quit.</li>
  <li>Button display now always reads “A” and “B” regardless of controller connection (due to visual bug with some keyboard key labels).</li>
  <li>Fixed bug where scene transition would not properly occur when resuming a suspended pak.</li>
  <li>Fixed edge case where pressing ESC/Start too early as you enter a game would queue up the full-game quit flow.</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Added default username check to scoreboards, and a call-to-action if the player hasn’t set their own.</li>
  <li>Cranking on the Options screen will now move to the next/previous page of items (if any) when it attempts to pass the edge.</li>
</ul>

<h2 id="version-102">Version 1.0.2</h2>
<h3 id="02182026">02.18.2026</h3>

<ul>
  <li>Fixed impossible puzzle in the Sports! pak.</li>
  <li>Fixed word touching the edges of the syllable block in the Food &amp; Drink I pak.</li>
  <li>Cursor now starts in (or near) the center when opening a new puzzle.</li>
  <li>Adjusted visualization of bomb blocks (now the explosion happens <em>after</em> 0, not <em>at</em> 0).</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Added wrapping paper to launch experience.</li>
</ul>

<h2 id="version-101">Version 1.0.1</h2>
<h3 id="02172026">02.17.2026</h3>

<ul>
  <li>Fixed bug where Pak Swaps would erroneously be inflated in Results screen and Playdate leaderboards.</li>
  <li>Added edge-case catch to not attempt to play a sound if it doesn’t exist.</li>
  <li>In Quik-Word, timer will no longer remain visually frozen during Round 1.</li>
  <li>Fixed ‘Paks’ being referred to as ‘Packs’ in quite a lot of places.</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Fixed bug where, in Quik-Word, leaving the Results screen too fast would cause a leaderboard-related crash.</li>
  <li>Swapped direction of crank scrolling in Quik-Word results screen.</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="02092026">02.09.2026</h3>

<ul>
  <li>Initial pre-release.</li>
</ul>

<p><br />
<a href="https://rae.wtf/games/labsylle" class="button">Visit <i>Labsylle</i>’s webpage</a></p>]]></content><author><name></name></author><category term="labsylle" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">There But For The Hex of Gon Go I</title><link href="http://rae.wtf/blog/there-but-for-the-hex-of-gon-go-i" rel="alternate" type="text/html" title="There But For The Hex of Gon Go I" /><published>2025-10-05T00:00:00+00:00</published><updated>2025-10-05T00:00:00+00:00</updated><id>http://rae.wtf/blog/there-but-for-the-hex-of-gon-go-i</id><content type="html" xml:base="http://rae.wtf/blog/there-but-for-the-hex-of-gon-go-i"><![CDATA[<p>Hello! As I write this, it’s been just a couple of days since I launched HEXA on itch.io, for personal computers. If you’re reading this article, you’d probably like it!:</p>

<p><a href="https://raewtf.itch.io/hexa" class="button">PLUG PLUG PLUG (Buy HEXA for personal computers)</a></p>

<p>…Or if you hate clicking links, I’ll sum it up: it’s a puzzle game, with triangles. You make hexagons, and try to conquer the universe. Simple!</p>

<p><img src="/blog/images/2025-10-05-1.png" alt="Screenshot of HEXA running on a computer. In the center of the screen, there's a black, yellow, and white grid comprised of 19 individual triangles." /></p>

<p>I launched the original game in late July of 2024, exclusively on the Playdate console. This was my second release for the platform, and above all else a real testament to the idea of the game jam: come up with a good idea, iterate ‘till you find something that’s “fun”, and polish it ‘till you can see your own reflection. I gave a whole talk about this!¹</p>

<p><a href="https://play.date/games/hexa" class="button">The original Playdate version of HEXA, in Catalog</a></p>

<p>The initial game came together over the course of July — development started on the 4th, and it was released by the 30th. This was due in part to how fast I was able to iterate on the game and come up with something that I thought was really special, but also due to a lot of happenstance things that I just happened to get really lucky about. One could very convincingly argue that HEXA has been more trouble <em>after</em> it released than it ever was before! Hahaha, haha, haaa, ha.</p>

<p>But one thing has been on my mind for a while: this game would ROCK on computers. I don’t think it uses the crank in an imperative way (sorry hekhound), and it feels like it’s got better “legs” than a lot of other titles I’ve made for Playdate. I could technically have ported Cloudburst or something, but people aren’t really clamoring for a weather app on…their computers.</p>

<p>I actually went back through some DM history, and apparently the idea of porting HEXA over using LÖVE2D was in my head since…before HEXA even launched! Peep this:</p>

<p><img src="/blog/images/2025-10-05-2.png" alt="DM message from user 'rae'. Attached is a screenshot of the HEXA game board grid running in a macOS window. It's captioned &quot;STAND BACK IM GONNA BLOW THIS WHOLE THING WIDE OPEN&quot;" /></p>

<p>Crazy, right?! Since then I’ve talked with a couple people and formatted the idea a couple different ways (shoutouts to the incredible <a href="https://github.com/GamesRightMeow/playbit">Playbit</a> library from Alex over at <a href="https://gamesrightmeow.com">Games Right Meow</a>, which aims to make this Playdate &lt;=&gt; LÖVE pipeline way easier with a single-repository approach!), but I figure I should talk a bit about the process of this final incarnation of the port, the one that you can pick up today.</p>

<p>I kinda just…started! I downloaded the LÖVE tools, fired open a new Nova project, and just…started running full-force into this new brick wall that’s been placed in front of me. It took me a solid hour to even figure out how to format a window, but by the end I had…something I wound up replacing with a better system that allowed for fullscreen/free resizing. Wooooo…!</p>

<p>Anyway, I started knowing that I was going to have a few hurdles going in. For one, a lot of my projects rely on specific aspects of the Playdate SDK that aren’t necessarily directly portable to LÖVE. Namely, things like OOP (object-oriented programming), game state-switching (which relies on the OOP itself), timers (in the animation sense, to allow for nice easings and delayed reactions), and sprites (Playdate has these as an easier way to manage compartmentalized logic, drawing order, etc. Plus, they also rely on the OOP library, within my workflow).</p>

<p>I soon found out that I was talking to the right people though, because legend icon superfunc basically immediately pointed me towards a library called <a href="https://hump.readthedocs.io/en/latest/">HUMP</a>². And this got me like… most of the way there! OOP, game states, timers; the only thing it didn’t really have a <em>direct</em> analog for was sprites, but I worked around that by…not using any sprites. Sustainable? Nope! But it works for now. 😁</p>

<p>The timers were also a bit of a kerfuffle to get working, as well — the HUMP library gave me a pretty close approximation, but I definitely had to rework some of my internal logic about how timers need to work. You can’t, for example, create an independent timer object and call for its standalone value. With HUMP, you need to have a pre-existing value, and pass it into the newly-created timer which it will then interpolate based on its settings. So instead of calling timers directly on the field, I’d have individual variables, and then the timers call the shots from the sidelines.</p>

<p>HUMP’s timers also lack functions like repeating, or reversing; so I bodged my way around that by creating more timers that, after a delay, would influence the initial timer performing the animation. So for example, you’d have a “tween” timer that moves a value from 0 to 1 over a second. Then, I’d set up a “every” timer that, every 1 second, would reset the “tween” timer — if the value it was editing was above 0.5, though, it would instead tween from 1 down to 0. Voila; looping, reversing timer! It’s an incredible hack, but it seems to work great.</p>

<p>From there, a lot of the hard work boiled down to three things: trying to jump the mental hurdle of having to crawl through my old code again; getting used to the idiosyncrasies of the LÖVE2D engine (specifically with reference to porting over <em>other</em> idiosyncrasies from the <em>Playdate</em> engine); and also creating a game in a PC environment (instead of one guaranteed platform, there’s an untold number of display resolutions, control methods, etc etc etc).</p>

<p>One simple thing that really screwed me over was losing Playdate’s arithmetic shorthands. For example, in Playdate’s version of Lua, you can do something like <span class="code-span">foo += 1</span> to increment a variable. Stock Lua, however, does not allow for this, and will get SUPREMELY mad at you if you try. So I had to do it the “long” way; for example <span class="code-span">foo = foo + 1</span>. Not a bad change overall, but I definitely accidentally crashed the game quite a few times by just not remembering that I had to switch these over.</p>

<p>Two other big pain points were window resolutions (which I talked about a tiny bit before), and gamepad support. For the windows, I ended up landing on a solution where the game canvas is technically drawn in “the top left corner”, but is moved using translations and the “scissor” tool into the center of the window. The game will only ever scale on an integer level, because I A. did not want to implement a responsive design, and B. wanted to stay as true as I could to the look of the original game. You can even toggle off the color entirely, and play it near-exactly how it would look running on a Playdate!</p>

<p>The gamepad support is also really funny: I had already hooked up key bindings for each scene, and I didn’t feel like duplicating all of that function logic for the gamepads. So instead, I have a single global “gamepad pressed” function that interprets the button you’re pressing, spoofs a key on the keyboard, and tells the LÖVE engine that you “pressed” that “key”. So far, I haven’t heard about any bugs stemming from it!! 😬 (I also made it so that the on-screen button prompts react appropriately to the given control method you’re using. It’s a small touch, but I feel like it greatly improves the perceived polish level of the game!)</p>

<p>I also had the opportunity to add controller rumble, entirely on a whim — I was looking into adding support for the analog sticks on the controller (which I wound up not even supporting); and only in fumbling around through the LÖVE documentation was where I noticed the rumble function on supported controllers. I literally dropped everything to add that in in around ten minutes or so, and I’m really glad I did, because it adds so much in a way that I’ve never been able to toy around with before on Playdate. It’s so cool to experiment with even the subtle things like that which I just had no outlet for before now, and it makes me really stoked to keep working on stuff for the PC platform! If you haven’t already, try the game on a controller. It’s NICE.</p>

<p>On the topic of bespoke additions to the version for personal computers: obviously, color is a huge one. Here’s a fun fact: the game uses the Pico-8 stock color palette! Not for any particular reason, other than that I needed a palette, and it was the first one that I could think of with relative limitations. It was fun having the freedom of a full color suite, while still being limited in a way that necessitated the use of dithers for more advanced hues. I feel like it keeps the spirit of the Playdate original nicely despite much (read: infinitely) greater color fidelity.</p>

<p>At first, I was planning for a only single set of colors to the HEXAPLEX; the default set you see in the game today. After some tester feedback where players were mentioning that they weren’t sure if some of the tri colors were a bespoke value or just negative space on the game grid, I decided that I needed to change the colors. Problem was, I couldn’t decide which palette looked best…sooooo, I decided to add them all! In the final version, you unlock a new set of colors for your HEXAPLEX for every 1,000 on your top high score (up to 25,000). It’s a small bonus, but I really feel like it was a cool addition that helped underscore the insanity of getting to re-interpret a game that I’ve only ever envisioned in 1-bit, in color.</p>

<p>There were also some things that I added to the PC version, that I then <em>backported</em> into the Playdate original! So, this port was an entirely manual effort. I’m sure someone other than me would have written a batch script to convert function names, or asked one of their silly robots to do the job for them, or smartest of all designed the game to support both platforms in the first place. But for me, the only way I’d have been satisfied with the product was to manually vet all the code myself; staring at the Playdate script side-by-side with the new LÖVE code, and manually roping over logic and making engine conversions on the fly.</p>

<p>This process, start to finish, took about a week or two, but that’s also considering the time it took me to learn the fundamentals of LÖVE and figure out the transpositions for the Playdate-specific functions in the first place. One benefit(?) of doing the port this way, is that when you’re taking a very in-depth look through an entire codebase with a required focus on what it’s doing…you spot a lot of bugs you just kinda never noticed before! It’ll be hard to find the time to dive into a codebase that deep again (especially for a larger game), but it meant that I was also revising the Playdate version as I came across quirks and things I figured should be tweaked.</p>

<p>I did also tweak a couple of things just so that I could make things slightly easier on myself in the porting job, while keeping the visual parity up to code. (Nothing structural to the gameplay or logic, mainly just how a couple small things look). I also added a couple bonus features to the Playdate version; things that I was recommended to add to the PC version, but weren’t necessarily <em>impossible</em> to backport to the Playdate hardware. So, both versions now enjoy the benefits of a full Statistics menu, and granular volume controls rather than a static on/off toggle.</p>

<p>The final leap for me came in actually releasing the game. Bundling the versions for different platforms was and continues to be a pain — you can’t really <em>edit</em> a Windows executable without a Windows machine, so I’ve been unable to add fun metadata like icons (if anyone knows a way to do that from a Mac, get in touch!); and of course when creating an app that runs on computers, they are very very vigilant about virus protection. For extremely good reason, let’s face it!, but as someone who’s used to the ease of having someone sideload a Playdate title, the trust barrier of the computer actively being super reluctant to run some code I’ve compiled was a pretty crazy culture shock.</p>

<p>I released the game on itch.io on October 3rd, 2025; not knowing a single thing about the PC gaming market, or how a title like this would sell — I do have experience with itch’s backend (publishing jam titles for example), but am not too well-versed with maintaining a paid title on the platform. I decided to launch at $8 — the same current price as the Playdate version in Catalog — because I figured this would keep things simple. A couple of things are surprising me as someone who has majority experience selling in Playdate’s Catalog — namely, the lower default revenue share taken by itch.io (10%, compared to 25% in Playdate Catalog), and the addition of the ability to ‘tip’ above MSRP.</p>

<p>Catalog has no tips function, so as a developer I’ve subconsciously written it off in my mind just because I don’t have any experience with it; but I’m surprised that multiple people so far have opted to pay above my suggested price for the game! It’s super nice to see; of course if you’re out there, thank you to bits for your support.</p>

<p>And I think that brings us to…now! It was a super fun experience, and I’m definitely encouraged to make more games for personal computers. Just personally (ha), it was really fun being able to involve my friends who don’t own Playdates — I’ve been making games for a while, but seeing my friends testing and having fun with the things I can make is a magical feeling I didn’t realize I was missing. Once I get more time, I’d absolutely love to continue pursuits in LÖVE2D, and maybe even port some of my other Playdate titles with the same method. (I’ve been <em>racking</em> my brain trying to figure out how <a href="https://play.date/g/rbr">RowBot Rally</a> could work without the crank…) If you’ve read this far, thanks! I hope this interested you. And, if you haven’t picked up the game, I hope you consider it! I know I didn’t talk much about what it’s actually like, but believe me: it’s heaps of fun.</p>

<hr />

<p>¹I really should consider recording a cut of that for YouTube sometime — heaven knows I’ve already forgotten all my lines, and that it wasn’t that good of a talk anyway.</p>

<p>²I know, I know. Apparently a lot of LÖVE libraries are named like this. I don’t know why.</p>]]></content><author><name></name></author><category term="hexa" /><summary type="html"><![CDATA[Hello! As I write this, it’s been just a couple of days since I launched HEXA on itch.io, for personal computers. If you’re reading this article, you’d probably like it!:]]></summary></entry><entry><title type="html">The Crankyboard Saga</title><link href="http://rae.wtf/blog/the-crankyboard-saga" rel="alternate" type="text/html" title="The Crankyboard Saga" /><published>2025-05-17T00:00:00+00:00</published><updated>2025-05-17T00:00:00+00:00</updated><id>http://rae.wtf/blog/the-crankyboard-saga</id><content type="html" xml:base="http://rae.wtf/blog/the-crankyboard-saga"><![CDATA[<p>So, the Playdate — I’ve never talked about this thing before! Anyway, two important things you need to know heading into this post: the Playdate has games, and the games have scoreboards. …I should probably elaborate.</p>

<p>So certain Playdate games¹ have access to on-line scoreboards, giving players some nice global competition. At the time this story is set though (around April 2023), the only way to view a game’s leaderboard — assuming it had one — was to actually buy, download, and launch the game itself, and find where it holds ‘em (assuming it displays ‘em at all). So I figured…why doesn’t somebody make a web viewer for these things?</p>

<p>…Turns out, because nobody reasonably could in a sustainable way. But that wasn’t gonna stop me; so I got to work.</p>

<p><img src="/blog/images/2025-05-17-1.png" alt="WIP first iteration of the Crankyboard." /></p>

<p>Looks pretty good, right? …Eh? Well, I was still working on it at this point. Both in terms of visuals, as well as pretty much all of the underlying code — turns out, the Playdate API is handled in a reasonable manner. CURSES!!</p>

<p>APIs, put very very (overwhelmingly) simply: you yell at a specific endpoint, and it returns data. If you don’t want just anyone accessing that data, though, you can limit it — in Playdate’s case, any request to the leaderboard API, that isn’t coming from either the play.date domain or a physical Playdate console with its unique access token, would just not return anything useful. At this point, all hope seemed lost — how were we gonna be able to read from the API without that access key? Luckily, we have Scratchminer.</p>

<p>This is where the process gets super jank: Scratch helped me set up a dummy Playdate, on a second account. He scrubbed through all the Playdate serial numbers until he found one that wasn’t registered, and then told the Playdate servers “I’d like to register this console!” …In reality, it wasn’t a console at all, but just a very funny server request. And as part of the registration process, the handshaking and back-and-forth; the server provides you with…an access token! Bingo.</p>

<p>So, with this access key, we could now access the scoreboard API. Nice! Some more work later, and in just a weekend…I released the first iteration of the Crankyboard, on April 15th:</p>

<p><img src="/blog/images/2025-05-17-2.png" alt="First iteration of the Crankyboard, displaying Playdate game titles and associated scores." /></p>

<p>On the site end, this was just HTML and CSS, with some light Javascript set up to read from and display stuff in a data file. On my local end, however, I had also crafted the worst Python script of all time to help me maintain the site. Here’s the rundown of that script:</p>

<ul>
  <li>Take this access token, and combine it with a huge hard-coded list of all the Playdate scoreboards we knew existed.</li>
  <li>Scream at every single endpoint, one after another — yes this is as wasteful and silly as it sounds.</li>
  <li>Take all that nice JSON data, and format it into a horrible JS file containing a whole meaty bag of pre-baked HTML elements.</li>
  <li>Take this new JS file, drop it into the Crankyboard source directory, and push a patch — and now, the site has up-to-date info!</li>
</ul>

<p>This is the worst thing ever, and for quite a few reasons: for one, it was supremely hard-coded. If a new game came out that had added new scoreboards, I’d need to update both the website and the Python script to add that in. And to make things worse, the scoreboard API endpoints relied on knowing both the game’s bundle ID as well as the specific board IDs the developer had used to set up their boards. (I think more than a couple times this resulted in me just asking the developers directly what their info was, because guessing didn’t work LOL).</p>

<p>Also, it meant that updates to the boards were completely manual. I mean, not “I’m writing in all the values by hand” manual, but still pretty manual — if someone just posted a new score and they wanted to see it go up, I’d need to be awake and able to update that script, and push the thing through. If I was smarter I probably could have set up a cron job or something to do this automatically at certain periods, but I wasn’t, so this was how we rolled.</p>

<p>One nice thing about doing things manually for the most part, though, is that I could make it very bespoke. An important thing to note about the scoreboard API, is that it only handles a limited amount of data — for each entry you typically only get a username, a timestamp of when it was submitted, their current rank, and an integer number for their actual score. Even by the time I set up the Crankyboard (just a month-ish after the Catalog launched), games were kind of exploiting the integer numbers to allow for more data to be shared. Since the raw scores were never sent anywhere but to the games themselves (where the developers had control over how they were displayed), they could format these scores to their liking — something I had to learn first-hand when building this site.</p>

<p>For example, in <i>Grand Tour Legends</i> — this game’s leaderboards were three of the only to use a feature where the ordering of scores could be <i>flipped</i>, so that a lower number resulted in a higher rank. This makes sense, since being a racing game, having a lower time will naturally be better. But I had never paid any mind to this sort of thing before I had to add the game in, so I had done some pretty awful formatting to flip the scores “back” around, and display them properly.</p>

<p>Another more custom example can be found in <i>Swap Machina</i> — this puzzle game keeps track of both your score and the level you were at when you reached game over, and it does this by attaching the level (which is always a two-digit number) to the very end of the score before submitting. When displaying these scores, it simply has to detach the last two digits of the returned score number, display that as the “level”, and show the remainder as the “score”. I implemented that into Crankyboard too, and felt very smart about it.</p>

<p>Anyhoo, my constant hubris led me to wanna clean up the code and looks pretty much immediately after launch, and so just a day later, I pushed a new site design that made things look a lot cleaner, and added some nice perks like animated graphics and a dark mode.</p>

<p><img src="/blog/images/2025-05-17-3.png" alt="Second iteration of the Crankyboard." /></p>

<p><img src="/blog/images/2025-05-17-4.gif" alt="A gif showing some nice shine effects on the top three scores." /></p>

<p>I was honestly going ham adding way more stuff than this thing needed — toggles for relative and absolute time, special badges hard-coded to be assigned to different usernames (like ones for game developers, leaderboard winners, and people from Panic), showing all available scores for a given board (whereas the games themselves could only ever grab the top ten alongside the player’s own personal best), and a whole bunch more neat stuff like that.</p>

<p>And then, something really funny happened:</p>

<p><img src="/blog/images/2025-05-17-5.png" alt="Discord screenshot — rae saying &quot;IVE BEEN PUT OUT OF BUSINESS?!?!?!&quot;, and a screenshot of a Playdate game page showing leaderboards." /></p>

<p>Panic added scoreboards to the Playdate site! I got run out of business.²</p>

<p>They were actually super apologetic about the situation — turns out the feature’s been around on their end from day 1, and in the time between them implementing it and actually making it live, I just so happened to try the same thing. Theirs ran way more efficiently, though — since it was actually sanctioned, it could yell for the API in a way more responsible way, and crucially update in <i>real-time</i> without manual intervention. This, combined with being displayed on the game pages themselves, definitely made it much more convenient to check.</p>

<p>I kept updating the Crankyboard for a while, but at some point the dummy Playdate had disappeared, and I figured that was as good a sign as any to leave it be. The last update was on July 7th, 2023, so it lasted for a fun few months! And the archive is still around if you just wanna take a peek at the site design (I’m still really happy with how it turned out):</p>

<p><a href="https://rae.wtf/crankyboard" class="button">Visit the Crankyboard archive</a></p>

<p>Crankyboard was a super cool project to make, and it was really fun being a direct through-line to some fun competition like that, but in the end it would never have lasted forever anyway. Manual maintenance relying on one person just isn’t that smart, and it’s low-key nice to not have a weight like that on my shoulders LOL. In the modern day, Playdate scoreboard info is very readily accessible, which is the problem this site was trying to address in the first place; and I feel like it was nice to have in the time it was needed.</p>

<hr />

<p>¹Games in Catalog or a Season — basically, stuff Panic can actually reasonably vet.</p>

<p>²Don’t take that as a genuine complaint LOL, I genuinely do not mind; I just think it’s really funny to word it like that.</p>]]></content><author><name></name></author><category term="blog" /><summary type="html"><![CDATA[So, the Playdate — I’ve never talked about this thing before! Anyway, two important things you need to know heading into this post: the Playdate has games, and the games have scoreboards. …I should probably elaborate.]]></summary></entry><entry><title type="html">Traffic Jam Manual</title><link href="http://rae.wtf/blog/traffic-jam-manual" rel="alternate" type="text/html" title="Traffic Jam Manual" /><published>2025-04-08T00:00:00+00:00</published><updated>2025-04-08T00:00:00+00:00</updated><id>http://rae.wtf/blog/traffic-jam-manual</id><content type="html" xml:base="http://rae.wtf/blog/traffic-jam-manual"><![CDATA[<p><img src="/blog/images/2025-01-24-1.png" alt="Traffic Jam" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>Guide the traffic to the beat, don’t get swept up off your feet.</p>
</blockquote>

<p>Nebulous construction work’s a tough job, and somebody has to manage the traffic going in and out. Luckily, you happened to be around when they were scrambling in a blind panic to find somebody who could do it! Can you master the new rhythm-based method of guiding these overzealous cars?</p>

<p>Traffic Jam is a fun endless rhythm game that exclusively uses the Playdate’s crank. Watch out for four car types with distinct cue patterns, keep the beat (as well as you can, at least) while the tempo gets ever faster, and try to avoid a nasty collision! Features classic non-stop rhythm-action fun, in-depth statistics, and an unlockable Hardcore Mode to really test your skills.</p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>The crank is the main control method for this game, though the A and B buttons can be used instead. The D-pad and A and B buttons are used to navigate menus. The use of the crank is relatively binary.</p>

<p>To switch control methods, open the Slide menu on the Title screen, and change the “control” setting. You can choose between “crank” and “buttons”. When playing with the crank, you can choose between “crank”, “crank (+90)”, and “crank (-90)” play modes. These different modes will offset the 0º position of the crank as perceived by gameplay, so you can play with the console flat on a table for example.</p>

<p>Audio is quite important to gameplay — while the game can be played silently by a more experienced player, having an active audio output is recommended.</p>

<p>To adjust the starting BPM of gameplay, open the Slide menu on the Title screen, and change the “start bpm” setting. The default is 120. You can choose in increments of ±5 BPM from a minimum of 30, to a maximum of 170.</p>

<h2 id="gameplay">Gameplay</h2>

<p>During the game, your crank is separated into two “fields” — left, and right. When using the crank, cranking across the 0º or 180º boundaries will swap between them. When using buttons, pressing A or B will flip the sign to the left or right.</p>

<p>At certain points, cars will zoom in from either side of the screen. Depending on the car, a different warning cue will be provided to let you get ready to wave them through in the correct direction.</p>

<p>Scoring happens when the car passes you — if your sign is pointing in the correct direction, you’ll gain a point. Otherwise, you won’t gain a point, and will lose a life.</p>

<h1 id="modes">Modes</h1>

<h2 id="normal-mode">Normal Mode</h2>

<p>Normal Mode is the basic gameplay mode in <em>Traffic Jam</em>.</p>

<p>In this mode, you have three lives. A life is lost whenever you don’t wave a car through in the correct direction — indicated by a screen-shake and a skidding noise.</p>

<p>This mode starts out at your preset start BPM (defaults to 120). When you reach Level 5, every new round will increase the BPM by +10. For every 100 points you score, you’ll gain a life (maximum of 3).</p>

<h2 id="hardcore-mode">Hardcore Mode</h2>

<blockquote>
  <p>💡 <em>This Mode is only unlocked after scoring 100 or greater in Normal Mode.</em></p>
</blockquote>

<p>In Hardcore Mode, the default BPM is upped to +30 more than your preset (defaults to 150), and you also have only one life — miss any amount of times, and it’s game over.</p>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>To submit a new score to the global leaderboard, simply complete a game. When you reach the ‘Game Over’ screen, your score will be submitted to the proper leaderboard automatically.</p>

<blockquote>
  <p>⚠️ <em>Be careful — if you close out of the game without properly ending the round, your score won’t be saved or submitted!</em></p>
</blockquote>

<h2 id="my-score-didnt-send-what-do">My score didn’t send! What do?</h2>

<p>If you obtained a new high score, but it didn’t get sent up to the leaderboard, there are a few things you can try:</p>

<ol>
  <li>
    <p>Give it a little time, and see if it sends up automatically.</p>
  </li>
  <li>
    <p>Try playing another round — it doesn’t need to be <em>yet another</em> new high score, but this might kick the OS’ caching into high gear.</p>
  </li>
</ol>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the <em>Traffic Jam</em> game page in your Web browser, at <a href="https://play.date/games/traffic-jam/">play.date/games/traffic-jam</a>. From here, you can view available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>Enter the ‘Leaderboards’ menu within the game, accessible from the Title screen. When in this screen, you can use the A button to toggle between the Normal Mode and Hardcore mode leaderboards (if Hardcore Mode is unlocked). From here, you can see the top scores for the currently-highlighted board, as well as your own score and ranking (if available).</p>
  </li>
</ol>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art, code, music, and SFX — <a href="https://rae.wtf">Rae</a></li>
  <li>Cuberick and Nontendo fonts — <a href="https://panic.com">Panic</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li>Transmit truck cameo — <a href="https://panic.com">Panic</a></li>
  <li><a href="https://playdatesquad.github.io/pd-achievements/">Achievements</a> library — Playdate Squad</li>
  <li>Playtesters — Lav, ocean, xenwow, Lyman, PurpleMoustache, and Ledbetter</li>
  <li>Thanks — Tengu, Toad, 2DArray, Lav, and the rest of the Playdate Squad!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-104">Version 1.0.4</h2>
<h3 id="05202025">05.20.2025</h3>

<ul>
  <li>Floored car movement to prevent flashing of dither patterns</li>
  <li>Level end logic no longer plays out during game over sequence (which could result in boosted stats)</li>
  <li>Tweaked achievements slightly — instead of 50/100/250/500, score barriers are now 50/100/200/250 in both modes</li>
  <li>Fixed bug where slide menu options may persist upon entering the Credits screen</li>
  <li>Added “crank (+90)” and “crank (-90)” control options.</li>
</ul>

<h2 id="version-103">Version 1.0.3</h2>
<h3 id="04282025">04.28.2025</h3>

<ul>
  <li>Added four new music tracks!
    <ul>
      <li>You can also choose between any or all of them from the Title screen</li>
    </ul>
  </li>
  <li>Fixed bug where Tutorial would inherit custom BPM values</li>
  <li>Fixed leaderboards crash if number of score entries surpassed 5</li>
  <li>Added slower “start BPM” times, down to 30 BPM</li>
  <li>Adjusted speed-up behavior with external BPMs for better balancing</li>
  <li>Added default username check to the leaderboards screen</li>
  <li>Fixed leaderboards crash if you entered and exited the scene real fast</li>
  <li>Fixed possible crash if crank value equals “360”</li>
  <li>Updated achievements library to v1.0</li>
  <li>Added credit for achievements library</li>
</ul>

<h2 id="version-102">Version 1.0.2</h2>
<h3 id="03122025">03.12.2025</h3>

<ul>
  <li>Added “start bpm” option to define a faster start, toggle-able from the Title screen</li>
  <li>Added button controls, toggle-able from the Title screen</li>
  <li>BPM will now start ramping up instantly in Normal Mode</li>
  <li>Added achievements! <a href="https://github.com/PlaydateSquad/pd-achievements">Learn more here.</a></li>
  <li>Fixed bug where extra lives would be awarded in Hardcore Mode</li>
  <li>Flipped button prompts on Game Over screen</li>
  <li>Added some more stuff floating alongside the clouds</li>
  <li>Added some different random skins for the cars</li>
  <li>Correctly read off points as “point” if there’s only 1</li>
  <li>Hopefully fixed bug where Hardcore scores weren’t sending properly?</li>
</ul>

<h2 id="version-101">Version 1.0.1</h2>
<h3 id="02252025">02.25.2025</h3>

<ul>
  <li>Hardcore mode threshold increased from 50 pts to 100 pts</li>
  <li>BPM will now increase by +10 per level instead of +5</li>
  <li>Game will now award a life every +100 pts.</li>
  <li>Fixed a bug where having “react SFX” disabled would break the Tutorial mode</li>
  <li>Fixed visual issue on exit animation</li>
  <li>Added more save checks mid-play</li>
  <li>Player’s global rank is now shown in leaderboards page</li>
  <li>Added some more music and SFX to leaderboards page</li>
  <li>Fixed a couple crashes on the leaderboards page</li>
  <li>Game now only refreshes screen when necessary</li>
  <li>Cars coming in from the different directions now have subtly different audio cues</li>
  <li>Fixed thing where the Sedan was slightly misaligned with the beat</li>
  <li>Lowered volume of level-complete “ding!”</li>
  <li>Polished up sign flip animation</li>
  <li>Added clouds to gameplay screen</li>
  <li>Renamed “Practice” to “Tutorial”</li>
  <li>Fixed kerning on capital S in small-text font</li>
  <li>Fixed timing issue with loading transitions</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="02212025">02.21.2025</h3>

<ul>
  <li>Initial playtesting release.</li>
</ul>

<p><br />
<a href="https://play.date/games/traffic-jam" class="button">Buy <i>Traffic Jam</i> in Catalog</a></p>]]></content><author><name></name></author><category term="traffic jam" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Mission LunaTrix Manual</title><link href="http://rae.wtf/blog/mission-lunatrix-manual" rel="alternate" type="text/html" title="Mission LunaTrix Manual" /><published>2025-03-10T00:00:00+00:00</published><updated>2025-03-10T00:00:00+00:00</updated><id>http://rae.wtf/blog/mission-lunatrix-manual</id><content type="html" xml:base="http://rae.wtf/blog/mission-lunatrix-manual"><![CDATA[<p><img src="/blog/images/2025-03-10-1.png" alt="Mission LunaTrix" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>One small ollie for man, one giant kickflip for mankind.</p>
</blockquote>

<p><em>“Captain’s log: stardate…something-or-other. It’s been about 3 days since the lander made a rather high-speed landing into the Moon’s surface. My oxygen supplies are running low, my only possession that survived the crash is my trusty skateboard, and I need to find a way back home. …Now, this might sound crazy—”</em> [END TRANSMISSION]</p>

<p>When you find yourself trapped on the surface of an unfamiliar terrain, there’s only one thing that can bring you back to terra firma…<em>EPIC SKATE TRICKS</em>. Can you jump, grind and shred your way to escape velocity before time runs out? Mission LunaTrix is a radical sports-arcade game featuring innovative 3D terrain, plenty of strategy, and a bumpin’ original soundtrack.</p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>The d-pad and crank are required to play this game. The D-pad and A and B buttons are used to navigate menus.</p>

<h2 id="gameplay">Gameplay</h2>

<p>Navigate the moon’s surface, in search of opportunities to perform epic skate tricks. There are five types of objects you may encounter in your lunar venture:</p>

<ul>
  <li>Craters — These are good! Hit ‘em and launch into a jump.</li>
  <li>O2 Canisters — These are good! They replenish oxygen.</li>
  <li>UFOs — These are rad! Hit ‘em and score bonus points.</li>
  <li>Flags — Fun collectible! I wonder who’s been here?</li>
  <li>Rovers — These are bad! Hit one, and you get stunned.</li>
</ul>

<p>Ramp off craters, rack up points, and make your way back home! Or at least, to another moon…</p>

<p>It’s important to keep an eye on your oxygen levels. If they reach zero, you’ll be rather…stranded. You can replenish oxygen by picking up O2 Canisters, or by escaping the current moon. Your O2 gauge will re-fill on every successful escape.</p>

<h2 id="scoring">Scoring</h2>

<p>Ramping off of craters and performing tricks is key to your escape! When you’re sent into the air, use the crank in tandem with the d-pad to pull off different moves. Advanced ones can score big points!</p>

<p>When you reach a high enough score threshold, you’ll start flashing. This means you’ve got enough radical power charged up to escape the gravitational pull! Hit another crater, and you’ll be launched to the next moon.</p>

<h3 id="combos">Combos</h3>

<p>When you successfully land from a jump, your combo meter will increase. Hit more jumps to rack up the multiplier and score MASSIVE points! There’s no limit, so go wild! Your final score is displayed at the end.</p>

<p>If you skate around for long enough without hitting another crater, run into a rover, or get too overzealous with your tricks, your meter will reset back to x1.</p>

<h1 id="modes">Modes</h1>

<h2 id="arcade-mode">Arcade Mode</h2>

<p>In Arcade Mode, your goal is to hop from moon to moon, and survive for as long as you can without running out of oxygen. When you complete a level, your oxygen meter is replenished, and you’re sent to a new moon with a different, randomly-generated layout.</p>

<p>For each new moon, you’ll have less and less oxygen, and will require more and more points to be able to move on.</p>

<h2 id="daily-orbit">Daily Orbit</h2>

<p>In Daily Orbit, you get placed on a single moon — randomly-generated, but the same for everyone each day. Your goal is to rack up as many points as you can before your oxygen runs out.</p>

<p>You only get one shot at the Daily Orbit each day. Give the mode a try and see if you can best your friends (or your enemies)!</p>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>The Arcade Mode and Daily Orbit both support global on-line leaderboards.</p>

<p>To submit a new score to a global leaderboard, simply complete a game. When you reach the end results screen, your score will be submitted to the proper leaderboard automatically.</p>

<blockquote>
  <p>⚠️ <em>Be careful — if you close out of the game without properly ending your run, your score won’t be saved or submitted!</em></p>
</blockquote>

<h2 id="my-score-didnt-send-what-do">My score didn’t send! What do?</h2>

<p>If you obtained a new high score, but it didn’t get sent up to the appropriate leaderboard, there are a few things you can try:</p>

<ol>
  <li>
    <p>Give it a little time, and see if it sends up automatically.</p>
  </li>
  <li>
    <p>Try playing another round — it doesn’t need to be <em>yet another</em> new high score, but this might kick the OS’ caching into high gear.</p>
  </li>
</ol>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the <em>Mission LunaTrix</em> game page in your Web browser, at <a href="https://play.date/games/mission-lunatrix/">play.date/games/mission-lunatrix</a>. From here, you can view all available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>Enter the ‘Scoreboards’ menu within the game, accessible from the Title screen. When in this screen, you can use the A button to toggle between the Arcade Mode and Daily Orbit leaderboards. From here, you can see the top scores for the currently-highlighted board, as well as your own score and ranking (if available).</p>
  </li>
</ol>

<p>The Daily Orbit leaderboard refreshes automatically at 00:00 midnight GMT, clearing all scores from the past day. When viewing scores in-game, there’s also a handy timer to tell you when the boards will be cleared.</p>

<h2 id="user-icons">User Icons</h2>

<p>In <em>Mission LunaTrix</em>, you have the ability to set a custom user icon, which appears alongside your score in scoreboards.</p>

<p>To set a user icon, press B on the Title screen, and use the crank to preview the options. Press A to choose your favorite! Your icon will be updated on the leaderboards page next time you submit a new high score to the board.</p>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art, code, and music — <a href="https://rae.wtf">Rae</a></li>
  <li>SFX — <a href="https://pixabay.com/">pixabay.com</a>; <a href="https://pixabay.com/service/terms/">License</a></li>
  <li>Tubular V/O — <a href="https://jordancarroll.com">Jordan Carroll</a>; <a href="https://creativecommons.org/public-domain/cc0/">CC0</a></li>
  <li>Cutout City font — <a href="https://www.hawtpixel.com">Hawtpixel</a>; <a href="https://hawtpixel.com/Hawtpixel%20Font%20License%20-%20650%20Font%20Bundle.pdf">License</a></li>
  <li>Pedallica and Bitmore fonts — <a href="https://panic.com">Panic</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li><a href="https://playdatesquad.github.io/pd-achievements/">Achievements</a> library — Playdate Squad</li>
  <li>Playtesters — dennens, Alex, Scenic, Soinksters, Steven, Toad, and Kirkpad</li>
  <li>Thanks — Toad, Dimitri, Jex, John, Rob, Voxy, Mag, Tengu, Axo, freds, and 2DArray!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-200">Version 2.0.0</h2>
<h3 id="06242025">06.24.2025</h3>

<ul>
  <li>Added “Daily Orbit”! Just one shot at a seeded moon, every day
    <ul>
      <li>The original gameplay from the jam version has been renamed to “Arcade Mode”</li>
    </ul>
  </li>
  <li>Added on-line leaderboards! Available exclusively in the Catalog version.
    <ul>
      <li>Added boards for Arcade Mode and Daily Orbit</li>
      <li>Added user icons! Press B from the title screen to customize yours.</li>
    </ul>
  </li>
  <li>Fixed bugs where scores and save data would not get…saved</li>
  <li>Tweaked randomized level generation to guarantee at least some craters
    <ul>
      <li>New objects will also be at least one unit of space apart from each other</li>
    </ul>
  </li>
  <li>O2 and rover spawn ability is now determined by weighted random seed</li>
  <li>Player starting speed and jump length now based on random seed</li>
  <li>Added some tubular V/O, courtesy of Jordan Carroll. Thank you!</li>
  <li>Added “How to play” section that tells you what to do</li>
  <li>Added achievements! <a href="https://github.com/PlaydateSquad/pd-achievements">Learn more here.</a></li>
  <li>Added flags (just for fun!) and UFOs (rare score bonus!) to the play field</li>
  <li>Added an ollie mechanic, accessible by pressing Up on the d-pad</li>
  <li>Added escape progress indicator along the bottom edge</li>
  <li>Souped up all the music to be more jammy</li>
  <li>Changed the names of the performable tricks to be more fantastical</li>
  <li>Re-worked player tile alignment to make more sense (hopefully means less collision slips, too)</li>
  <li>Added a radical-looking new sidebar while doing tricks</li>
  <li>Added “Performance” option that knocks down some visual quality
    <ul>
      <li>Stock visual quality is a bit higher now, too</li>
    </ul>
  </li>
  <li>Added optional radar to display select objects before they appear over the horizon</li>
  <li>Spaced out the “bitmore” font a bit in-game, and added an outline.</li>
  <li>Added “Spin Camera” option to toggle camera rotation during tricks</li>
  <li>Drew up some new, more animated skater sprites</li>
  <li>Added mid-game pause image</li>
  <li>Fixed possible crash caused by moving away from the title real fast, then hitting buttons</li>
  <li>Added more tricks for cranking counter-clockwise</li>
  <li>Fixed bug where score readouts weren’t properly calculated</li>
  <li>Added slide menu items in most-all of the menus</li>
  <li>Added instant “end game” button mid-game, in the slide menu</li>
  <li>Low O2 audio indicator now starts sooner</li>
  <li>Added a pulse effect to low O2 and performing tricks</li>
  <li>Re-formatted game over screen, and added sounds</li>
  <li>Added a dynamic shadow under the skater</li>
  <li>Added lerped slowdown when you crash into a game over state</li>
  <li>Starting speed is slower, points threshold starts lower, O2 level starts higher</li>
  <li>O2 Canisters replenish more oxygen, from 1.2x current levels to 1.5x</li>
  <li>Added “Skip cutscene” option</li>
  <li>Added cool pseudo-random moon names</li>
  <li>Hitting rover now destroys your combo instantly</li>
  <li>Added slight cooldown between tricks. Land during this, and you’ll CRASH!!</li>
  <li>Credits screen is now more readable</li>
  <li>Fixed bug where crank could still be used to travel through menus, even when moving to a new scene</li>
  <li>Made objects on moon animate more smoothly</li>
  <li>Each round will display the current round at the start</li>
  <li>Made exit animation display at any time, even mid-game</li>
  <li>Added “Use the Crank!” prompt at the start of the game</li>
  <li>Added some more oomph to the turning radius</li>
  <li>Added “orchestra hit” launch sound</li>
  <li>Title screen now remembers your last selection</li>
  <li>Added commas to numbers</li>
  <li>You now lose some speed when crashing after a jump</li>
  <li>Trick “hit!” sound increases pitch in a more pleasing way</li>
  <li>Fixed bug where you could false-trigger buttons while transitioning between menus</li>
  <li>Added iris into the interstitial scene</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="03102025">03.10.2025</h3>

<ul>
  <li>Initial release, for PlayJam 7.</li>
</ul>

<p><br />
<a href="https://play.date/games/mission-lunatrix" class="button">Buy <i>Mission LunaTrix</i> in Catalog</a></p>]]></content><author><name></name></author><category term="mission lunatrix" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Cloudburst Manual</title><link href="http://rae.wtf/blog/cloudburst-manual" rel="alternate" type="text/html" title="Cloudburst Manual" /><published>2025-02-25T00:00:00+00:00</published><updated>2025-02-25T00:00:00+00:00</updated><id>http://rae.wtf/blog/cloudburst-manual</id><content type="html" xml:base="http://rae.wtf/blog/cloudburst-manual"><![CDATA[<p><img src="/blog/images/2025-02-07-1.png" alt="Cloudburst" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>Real-time weather. On your Playdate.</p>
</blockquote>

<p>Curious what the forecast looks like? Easy! But…your laptop’s out of reach, your phone’s battery is dead, your smart assistant’s brain is busted, and your curtains are shut. It’s just you, and your Playdate. What can you do? Well, here is your answer! Leveraging state-of-the-art networking capabilities, Cloudburst is a fully seamless, on-line enabled weather app for your Playdate!</p>

<p>Get the forecast here, there, or anywhere — it’s compatible with cities around the world! (And don’t worry, it works with Fahrenheit or Celsius — metric or imperial.) See detailed stats such as hourly forecast, precipitation, wind, and more. Change settings to your heart’s content, and even use it as a low-power screensaver — the perfect desk buddy. No external tools or setup required, just download and go — it’s weather, untethered.</p>

<h1 id="basics">Basics</h1>

<p>This app connects to an external on-line API, to enable sending and receiving of data including weather information. This app also connects to Playdate’s on-line leaderboard API, to enable sending of high scores among players across the globe. To use this app, make sure your Playdate has an active Wireless connection.</p>

<h2 id="controls">Controls</h2>

<p>The d-pad and A and B buttons are used to navigate menus. The crank is optionally used in menus, or to display detailed weather information. Within the app, context is provided as to which controls will perform what actions.</p>

<h2 id="initialization">Initialization</h2>

<p>When you first start the app, you’ll be prompted to provide an approximate location. This data will be shared with the weatherapi.com service to gather information about your area. This information isn’t shared anywhere else on-line, but your direct input will be saved on your Playdate’s local disk.</p>

<p>After providing a location, you’ll be prompted to adjust a few settings — namely, temperature preference, and measurement preference. After this, the Playdate will attempt to connect to the Internet and grab weather data for your area. If your Playdate cannot connect to the Internet, an error message will appear and you’ll be prompted to try again later.</p>

<h2 id="where-are-you">Where are you?</h2>

<p>If the resulting API data doesn’t match your location, try being a bit more specific with your data entry. For example, instead of “Portland”, try inputting something like “Portland OR”, or a direct ZIP/Postal code. Cloudburst should work with most (if not all) areas around the globe — if you live in or discover an area that you just cannot get to work, let me know!</p>

<h1 id="weather">Weather</h1>

<h2 id="main-screen">Main Screen</h2>

<p>The main screen always shows your area’s current temperature and estimated forecast, your console’s local time, and current battery estimate.</p>

<p>By default, when the Playdate is plugged in to power, animated wallpapers will refresh at 30 frames per second. When running on battery, the display will enter a lower-power state to save energy, refreshing at 5 frames per second. You can change this behavior by toggling “Smooth animations” in Options.</p>

<p>If you open the app without a Wireless connection, the main screen won’t contain weather information, or The Fold™. Feel free to continue using the app as a screensaver. When you get back into a place with internet, open the Slide menu and select ‘refresh’ to scout for new weather data.</p>

<blockquote>
  <p>💡 <em>When no connection is available, automatic refresh of weather data will be disabled.</em></p>
</blockquote>

<h2 id="the-fold">The Fold™</h2>

<p>By using the crank or d-pad on the main screen, you can wring up The Fold™. This contains more detailed weather info for your current location, such as:</p>

<ul>
  <li>Current temperature and estimated forecast</li>
  <li>“Feels like” temperature, and HI/LO temps for the day</li>
  <li>Estimated temperature and forecast for the next six hours</li>
  <li>Sunrise and sunset times</li>
  <li>Air quality (EPA and DEFRA index), and information on particulate matter</li>
  <li>Humidity, now and within the next hour</li>
  <li>Precipitation, now and within the next hour</li>
  <li>Estimated forecast, HI/LO temp, and sunrise/sunset times for the next day</li>
  <li>Current moon phase</li>
  <li>Current wind speed, gusts, and direction</li>
  <li>UV index</li>
  <li>Visibility</li>
</ul>

<h1 id="options">Options</h1>

<p>In this app, there are a variety of options you can change to fully optimize your experience.</p>

<ul>
  <li>Change area: Edit your location area used for gathering weather data. This can be changed as many times as you wish.</li>
  <li>Save recent areas: Choose how many location inputs are saved to disk, for easy access.</li>
  <li>Temperature: Choose between Celsius or Fahrenheit readings for temperature info.</li>
  <li>Measurement: Choose between Metric or Imperial readings for measurement info.</li>
  <li>Idle refresh rate: Decide how often the app will try to grab new weather data while idling.</li>
  <li>Auto-lock %: When the console reaches this battery percentage, it will automatically lock after three minutes without input.</li>
  <li>Time display: Whether clocks in the app should follow 24-hour or 12-hour time. “System” will force the app to respect your OS’ clock setting.</li>
  <li>Music: Toggles music in the Initialization screen.</li>
  <li>Sound Effects: Toggles sound effects throughout the app.</li>
  <li>Wallpaper: Choose the wallpaper that is displayed on the idle screen.
    <ul>
      <li>Default: The default setting; chill Cloudburst waves.</li>
      <li>Earth: A replication of the “Initialization” screen; a spinning globe in a starfield.</li>
      <li>Temp. Focus: A lower-power display that brings the temperature front-and-center.</li>
      <li>Clock Focus: A second low-power display that shows the current console time in large text.</li>
      <li>Analog: A recreation of the Playdate’s analog clock screen, with weather info.</li>
      <li>Flip Clock: A stylized design that emulates a retro flippy-flappy flip clock.</li>
      <li>Terminal: A retro design that looks like a computer terminal. Try mashing buttons!</li>
      <li>Custom Img.: If the console detects a 400x240 <span class="code-span">.pdi</span>-converted image (no transparency) in <span class="code-span">Data/wtf.rae.cloudburst/images/custom.pdi</span>, you can use this image as your wallpaper.</li>
    </ul>
  </li>
  <li>D-pad (The Fold™): Determines the direction of scrolling when using the d-pad to control The Fold™.</li>
  <li>Smooth animations: Choose whether the main weather screen should update at a full refresh rate of 30 FPS, or a lower-power 5 FPS. “On Power” will only enable smooth frame rate if the Playdate is plugged in to a power source.</li>
  <li>Invert display: Choose whether the display should be inverted. “On noons” will flip between them automatically — non-inverted from midnight to noon, and inverted from noon to midnight.</li>
  <li>?</li>
</ul>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="submitting-your-data">Submitting your data</h2>

<p>This app supports global on-line leaderboards — just for fun!</p>

<p>To submit new data to the global leaderboards, simply launch the app. As you leave the initialization screen, your data will be submitted to the proper leaderboards automatically.</p>

<h2 id="my-data-didnt-send-what-do">My data didn’t send! What do?</h2>

<p>If you tried to send some data, but it didn’t get sent up to the appropriate leaderboard, there are a few things you can try:</p>

<ol>
  <li>
    <p>Give it a little time, and see if it sends up automatically.</p>
  </li>
  <li>
    <p>Try refreshing the weather, by opening the Slide menu and selecting ‘refresh’ — this might kick the OS’ caching into high gear.</p>
  </li>
</ol>

<blockquote>
  <p>⚠️ <em>If you already set a greater benchmark earlier in the day, your score won’t be overwritten. Please wait for the leaderboards to refresh at the end of the day.</em></p>
</blockquote>

<h2 id="viewing-global-data">Viewing global data</h2>

<p>You can view global data by visiting the <em>Cloudburst</em> game page in your Web browser, at <a href="https://play.date/games/cloudburst/">play.date/games/cloudburst</a>. From here, you can view all available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>

<p>Leaderboards refresh automatically at 00:00 midnight GMT, clearing all scores from the past day.</p>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art, code, and music — <a href="https://rae.wtf">Rae</a></li>
  <li>Weather data — <a href="https://weatherapi.com">weatherapi.com</a></li>
  <li>Addtl. music — Scratchminer</li>
  <li>SFX — <a href="https://pixabay.com/">pixabay.com</a>; <a href="https://pixabay.com/service/terms/">License</a></li>
  <li>Planet animation — <a href="https://deep-fold.itch.io/pixel-planet-generator">Pixel Planet Generator</a></li>
  <li><a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence">Tanuk</a> library — <a href="https://toadleyundercontrol.itch.io/">Toad</a> and <a href="https://twitter.com/Schyzo99">Schyzo</a>; <a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence/blob/main/LICENSE">MIT</a></li>
  <li>Sasser Slab, Roobert, Asheville, and Mikodacs Clock fonts — <a href="https://panic.com">Panic</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li>Thanks — Andy, Toad, Vachi, Jackson, Scratchminer, and those who waited patiently!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-105">Version 1.0.5</h2>
<h3 id="09152025">09.15.2025</h3>

<ul>
  <li>Added three new wallpapers! “Analog”, “Flip Clock”, and “Terminal”</li>
  <li>Added “UV Index” and “Visibility” readings to The Fold™</li>
  <li>Added “Smooth animations” option (defaults to ‘on power’)</li>
  <li>Fixed potential crash when changing weather location</li>
  <li>Fixed bug where “last quarter” moon phase text was not localized properly</li>
</ul>

<h2 id="version-102">Version 1.0.2</h2>
<h3 id="08202025">08.20.2025</h3>

<ul>
  <li>Added “Auto-locate via IP” when changing location (IP is not saved locally)</li>
  <li>Hopefully fixed crash that happens on automatic refresh</li>
  <li>Added new “Today’s Coolest Temps — in K” board</li>
  <li>Improved error handling</li>
  <li>Added check for invalid or expired API keys</li>
  <li>Added “Invert” option for D-pad controls in The Fold™</li>
  <li>Added font credits in-game</li>
  <li>Added indicator in slide menu if refreshing is occurring</li>
  <li>Fixed “laod” typo in pause screen tips</li>
  <li>Improved handling of location name if metadata is missing</li>
</ul>

<h2 id="version-101">Version 1.0.1</h2>
<h3 id="08192025">08.19.2025</h3>

<ul>
  <li>Added time-out to manual/automatic refreshing after boot</li>
  <li>Fixed weather data not showing up on ‘Earth’ or ‘Custom Img.’ screens</li>
  <li>Fixed crash when ‘Invert display’ is set to ‘On Noons’</li>
  <li>Increased legibility of text in ‘Custom Img.’ screen</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="08192025-1">08.19.2025</h3>

<ul>
  <li>First ‘official’ release!</li>
  <li>Added ability to head to clock screen, even without internet</li>
  <li>Fixed time not updating in “focus” modes</li>
  <li>Fix crash if internet connection isn’t properly retrieved</li>
  <li>Added some leaderboards to the Catalog edition, just for fun</li>
  <li>Fixed auto-refresh not working more than once at a time</li>
  <li>The Fold™ can now be opened with the d-pad</li>
  <li>Removed print statements</li>
</ul>

<h2 id="version-100b4">Version 1.0.0b4</h2>
<h3 id="05192025">05.19.2025</h3>

<ul>
  <li>Hopefully fixed bug where auto-lock would behave incorrectly</li>
  <li>Fixed bug where any networking calls after launch would crash the app</li>
  <li>Added tips to the pause screen</li>
  <li>Added scrollability to the Credits screen</li>
  <li>Fixed scrollbar behavior in the Options menu</li>
  <li>Change “city name” to “local area” in setup</li>
  <li>Added exit animation and sound</li>
</ul>

<h2 id="version-100b3">Version 1.0.0b3</h2>
<h3 id="04012025">04.01.2025</h3>

<ul>
  <li>Fixed embarrassing bug when refreshing data from weather screen</li>
  <li>Added pause screen images with instructions for each screen
    <ul>
      <li>Moved the version number in here, too</li>
    </ul>
  </li>
  <li>Added recent locations list when changing your local area
    <ul>
      <li>Also added option to decide how many locations are saved (if at all)</li>
    </ul>
  </li>
  <li>Added scroll bar to Options menu</li>
  <li>Fixed bug where crank noise in the weather screen would change at the wrong height</li>
  <li>Options can now be cycled through with the A button as well as the D-pad</li>
  <li>Added save flags on every scene change, instead of just on exit.</li>
  <li>Added “Time display” option, with 24-hour, 12-hour, and System selections.</li>
</ul>

<h2 id="version-100b2">Version 1.0.0b2</h2>
<h3 id="03032025">03.03.2025</h3>

<ul>
  <li>Adds moon phase to The Fold™</li>
  <li>Added air quality/particulate matter info, too</li>
  <li>Different SFX if you try to crank too far</li>
  <li>Seamless transition from loading screen, if wallpaper is set to “Earth”</li>
</ul>

<h2 id="version-100-rev-cata-1">Version 1.0.0 rev Cata 1</h2>
<h3 id="02252025">02.25.2025</h3>

<ul>
  <li>Initial beta release.</li>
</ul>

<p><br />
<a href="https://play.date/games/cloudburst" class="button">Buy <i>Cloudburst</i> in Catalog</a></p>]]></content><author><name></name></author><category term="cloudburst" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">RowBot Rally Manual</title><link href="http://rae.wtf/blog/rowbot-rally-manual" rel="alternate" type="text/html" title="RowBot Rally Manual" /><published>2024-12-17T00:00:00+00:00</published><updated>2024-12-17T00:00:00+00:00</updated><id>http://rae.wtf/blog/rowbot-rally-manual</id><content type="html" xml:base="http://rae.wtf/blog/rowbot-rally-manual"><![CDATA[<p><img src="/blog/images/2024-12-17-1.png" alt="RowBot Rally" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>Team up with a mechanical pal and row for the gold in the annual Fish Bowl!</p>
</blockquote>

<p>Not too long ago, boat racing was a sport for everybody! Whether you were a rowing pro or just a novice, it was an activity that anyone could celebrate. The annual Fish Bowl was a town institution, pitting the best rowers up against each other in a high-stakes racing tournament - the winner bringing home a big trophy, and of course, infinite bragging rights.</p>

<p>…But that all changed, after the nefarious Robo-X corporation started manufacturing what they call RowBots - mechanized automata that could pilot a boat better and faster than any organic being ever could. It didn’t take long at all for the RowBots to overtake the racing circuit entirely. They played so well that any non-RowBot who dared to enter, would have gotten knocked out of the tourney pretty much immediately.</p>

<p>Soon, the only opponents the RowBots had left to fight against were themselves! Their skills were essentially perfected. The tournament’s now comprised of just a few champion machines, the rest being sent off as scrap. Trying to compete in the Fish Bowl is seen as a fool’s errand by many now - ask anybody, they’d tell you that you’re crazy if you think you can beat those robots at their own game! Nobody could possibly do it.</p>

<p>Well…not on their own, at least.</p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>The crank is the main control method for this game. The D-pad and A and B buttons are used to navigate menus.</p>

<p>If you lack the dexterity to use the crank, there’s an alternate control scheme that lets you use the D-pad to steer the boat. See <a href="#options">Options</a> &gt; Button Controls for more info.</p>

<h2 id="gameplay">Gameplay</h2>

<p>In RowBot Rally, you play as a scrappy bunny mechanic trying to take down the nefarious Robo-X corp, who’s dominating the competitive boat-racing circuit with their line of evil RowBots.</p>

<p>You wouldn’t stand a chance on your own, but luckily you found a junkyard RowBot who’s <em>totally</em> down to exact revenge (if it knew the feeling of revenge, at least) — problem is, his circuits are a bit busted, which means he can only turn left.</p>

<p>By using the crank, you effectively row one oar of the boat. By matching pace with your RowBot companion, you’ll move in a straight line. If you row quicker, you’ll take over and turn the boat to the right. If you start cranking more slowly (or not at all), the RowBot will steer you to the left.</p>

<p>At the bottom of the screen, you’ll see your Power Meter — this shows your relative cranking power compared to your RowBot. Match pace to move straight ahead!</p>

<h1 id="modes">Modes</h1>

<h2 id="story-mode">Story Mode</h2>

<p>Story mode is the main mode in the game, where you try to take down Robo-X across all seven stages sequentially.</p>

<p>When you start Story Mode from the Title screen, you’ll have three save slots to choose from. If you’re starting a new game, choose an empty slot, and hit Start! to begin a new game. If you’re continuing an existing save, select your slot and hit Play! to pick up from where you left off.</p>

<blockquote>
  <p>💡 <em>The game automatically saves at various points, noted by an indicator in the top-left of the screen. Please do not turn off the console or exit the game while saving is in progress!</em></p>
</blockquote>

<p>When you complete the Story mode, you’ll have the ability to replay the story within the same slot up to three more times, with slightly more difficult opponents each time.</p>

<p>To erase an existing save, select the save slot you’d like to delete, and then press the Up button to initiate the file erase sequence. This can’t be undone, so please make sure beforehand!</p>

<h2 id="time-trials">Time Trials</h2>

<blockquote>
  <p>💡 <em>This Mode is only unlocked after beating the first stage in Story Mode.</em></p>
</blockquote>

<p>In Time Trials, you’ll be able to replay any previously-beaten stages without any opponents on the track, and compete for a best time. After you unlock Time Trials, you can access the mode from the Title screen.</p>

<p>In the Time Trials mode exclusively, Rocket Arms can give you an opportune boost at specific points in the race. Press the B button at any time during the race for a temporary boost of speed! You’ll receive up to three in every race you play.</p>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>To submit a new time to the global leaderboard, simply complete a full race in Time Trials. When you reach the results screen that shows your new time, your score will be submitted to the stage’s respective leaderboard automatically.</p>

<blockquote>
  <p>💡 <em>For a time to be eligible for submission, it must be a better time than one you’ve achieved before.</em></p>
</blockquote>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the <em>RowBot Rally</em> game page on Catalog, at <a href="https://play.date/games/rowbot-rally/">play.date/games/rowbot-rally</a>. From here, you can view all available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>Enter the Time Trials stage select within the game, accessible from the Title screen. When in this screen, you can press the Up button to view best times for the currently-selected stage. <em>(On device, you can only view leaderboards for stages you’ve unlocked in Time Trials.)</em> From here, you can see the top 10 times for the selected stage, as well as your own score and ranking (if available).</p>
  </li>
</ol>

<blockquote>
  <p>💡 <em>Within the game, best times are displayed in a human-readable format — on web, a player’s time can be calculated by dividing the given number by 30. This results in their best time, in seconds.</em></p>
</blockquote>

<h1 id="other-scenes">Other Scenes</h1>

<h2 id="stats">Stats</h2>

<p>In the Stats screen, you can see all-time gameplay stats. This info is tracked across all save slots in Story Mode, as well as all Time Trials races.</p>

<ul>
  <li>Total play time (increments at all times while the game is launched)</li>
  <li>Time spent racing (only increments when the player is actively in a race)</li>
  <li>Total crashes</li>
  <li>Races completed (disqualifications or premature endings don’t count)</li>
  <li>Stories completed (times the Credits screen has been seen)</li>
  <li>Distance cranked</li>
  <li>Favorite Stage (with the most plays across all modes)</li>
  <li>Least Favorite Stage (with the least plays across all modes)</li>
</ul>

<blockquote>
  <p>💡 <em>Toggle “metric” from the Slide menu to adjust the read-out for Distance cranked.</em></p>
</blockquote>

<p>Some stats are also saved on-line! To view these boards, open the Slide menu, and select on-line stats. This area will show the top five global rankings for time spent racing, total crashes, and distance cranked. The game will attempt to send this data after the completion of any race, or on manual checking of the Stats leaderboards.</p>

<h2 id="cheats">Cheats</h2>

<p>In the Cheats menu, you can toggle cheats that you’ve unlocked in the past. To unlock a cheat, enter its respective code in the Title screen. If you entered a successful code, a notification will pop up telling you what you’ve unlocked.</p>

<blockquote>
  <p>⚠️ <em>When cheats are on, you can’t set new best times.</em></p>
</blockquote>

<h2 id="options">Options</h2>

<p>The options screen allows you to change various settings and accessibility features pertaining to the game.</p>

<ul>
  <li>Music — Toggles all the music throughout the game; including gameplay, menus, and cutscenes.</li>
  <li>
    <p>SFX — Toggles sound effects throughout the game; including gameplay, menus, and cutscenes.</p>
  </li>
  <li>Button Controls — Use the D-pad to play! Hold Up to start rowing straight-on, and hold Right to row clockwise.</li>
  <li>Easier Cranking — Makes matching pace with your RowBot require less cranking. (Has no effect with Button Controls.)</li>
  <li>Pro UI — Toggles a simpler UI in races, removing a lot of stuff. You can also toggle this during races, if you want.</li>
  <li>Minimap — Toggles a minimap in races, which also shows where the player and CPU are in the course.</li>
  <li>Performance Mode — Knocks down a bit of the visual quality, in exchange for better FPS when using Playdate Mirror.</li>
</ul>

<blockquote>
  <p>💡 <em>If you’re prone to photosensitive epilepsy, the Playdate console’s Reduce Flashing feature can dampen bright flashes and disable screen shaking.</em></p>
</blockquote>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art and code — <a href="https://rae.wtf">Rae</a></li>
  <li>Music — <a href="https://incompetech.com/">Kevin MacLeod</a>; <a href="https://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a></li>
  <li>SFX — <a href="https://pixabay.com/">pixabay.com</a>; <a href="https://pixabay.com/service/terms/">License</a></li>
  <li>Addtl. art — magPlex, NickNack</li>
  <li>Addtl. code — Voxy, Toad, superfunc, The3DPrintist, and TheMediocritist</li>
  <li>Addtl. music — nexusnecromance</li>
  <li>Pedallica font — <a href="https://mrgan.com">Neven Mrgan</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li>Kapel font — <a href="https://fontenddev.com">Font End Dev</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li><a href="https://devforum.play.date/t/video-encoder-work-in-progress-mac-only/1390">PDV conversion tool</a> — <a href="https://pdx.social/@dave">Dave Hayden</a></li>
  <li><a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence">Tanuk</a> library — <a href="https://toadleyundercontrol.itch.io/">Toad</a> and <a href="https://twitter.com/Schyzo99">Schyzo</a>; <a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence/blob/main/LICENSE">MIT</a></li>
  <li><a href="https://playdatesquad.github.io/pd-achievements/">Achievements</a> library — Playdate Squad</li>
  <li>Bugsmashers — NickNack, orkn, Toad, superfunc, Omikron, budpikmin, Lavender, Yadis, dwfp, Zel, Soinksters, and The3DPrintist</li>
  <li>Playtesters — AidenKT, magPlex, kiwi, puttheyarndown, sourencho, and ThatWontCompute</li>
  <li>Thanks — Panic, the Playdate Squad/devlog members, all my friends, SquidGod, and YOU!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-110">Version 1.1.0</h2>
<h3 id="10142025">10.14.2025</h3>

<ul>
  <li>Added “absolute crank” accessibility option — the boat will steer wherever the crank is pointing.
    <ul>
      <li>On-line leaderboards are disabled when this option is turned on.</li>
    </ul>
  </li>
  <li>Added Speedrun — “boss rush” mode, unlockable by completing a save file on all four circuits.
    <ul>
      <li>Added on-line leaderboards for this mode. Check the webpage!</li>
    </ul>
  </li>
  <li>Added Robo-Shark+ — endless version of the shark chase, unlockable by passing that point in the Story.
    <ul>
      <li>Added on-line leaderboards for this mode. Check the webpage!</li>
    </ul>
  </li>
  <li>Added achievements! <a href="https://github.com/PlaydateSquad/pd-achievements">Learn more here.</a></li>
  <li>Updated the shark chase:
    <ul>
      <li>Added a progress bar</li>
      <li>Progress now varies depending on circuit</li>
      <li>Added a more apparent health meter</li>
    </ul>
  </li>
  <li>Performance Mode will now turn on automatically when the device is connected to Playdate Mirror.</li>
  <li>Added Theater — view cutscenes at your leisure. Unlockable by completing the story at least once.</li>
  <li>Compressed cutscene videos — now the bundle is nearly a whole 10 MBs lighter!</li>
  <li>Added ‘match pace’ marker to the Power Meter, to make syncing movement with your RowBot easier.</li>
  <li>“Sending failed!” UI should now only occur once per session.</li>
  <li>UIs will also not interrupt during an active race</li>
  <li>Boat will now no longer re-start if the race is DQ’d immediately after a beach</li>
  <li>Adjusted some wording here and there</li>
  <li>Optimized minimap a little bit</li>
  <li>Wave now animates properly in Options screen</li>
  <li>Fixed softlock that would occur by leaving at a specific time during the race intro</li>
</ul>

<h2 id="version-102">Version 1.0.2</h2>
<h3 id="12192024">12.19.2024</h3>

<ul>
  <li>Re-balanced CPUs in Story Mode
    <ul>
      <li>Shorebreak and Twitcher in Circuit 4 are now opportunists</li>
      <li>Final stage was WAY too hard in all circuits. Sorry!</li>
      <li>All CPUs slowed down just a touch</li>
    </ul>
  </li>
  <li>Added contingency for memory issue where “bakedboat” would return nil</li>
  <li>Fixed collision bug where hitting checkpoints, power-ups, or the Finish line might not have counted</li>
  <li>Disqualifying during a leap will no longer cut off the boat visually</li>
  <li>Disqualifying during a beach will no longer start the boat back up afterwards</li>
  <li>Pop-up UI should now respect draw offset</li>
  <li>Removed the wave in Paddle Beach. It was creating more issues than it was solving</li>
  <li>Boat’s turning effect is slightly lessened during boosts (Boost Pads and Rocket Arms)</li>
  <li>Added dithering to RowBot Rally logo in the Credits scene</li>
  <li>Added rate-limit to the Time Trials leaderboards, to prevent display edge cases.</li>
  <li>10th place in the leaderboard no longer draws <em>juuust</em> off-screen</li>
  <li>Fixed bug where locking the device in the Time Trials scene would flip the display horizontally</li>
  <li>Fixed bug in Stage 3 mirror mode where the sunglasses would be misaligned. Radical.</li>
</ul>

<h2 id="version-101">Version 1.0.1</h2>
<h3 id="12172024">12.17.2024</h3>

<ul>
  <li>Fixed wonky text formatting in Credits sequence</li>
  <li>Fixed bug where viewing Credits from title screen after beating the game would accidentally affect save files.</li>
  <li>Fixed wonky fade-out behavior when skipping Credits</li>
  <li>Compressing parallax in Stage 7 to avoid memory issues</li>
  <li>Fixing some boat ‘beaching’ logic</li>
  <li>Moved the finish line to a spot that makes more sense in Stage 4</li>
  <li>Flipped “Flawless” and “Speedy” medal positions in Time Trials scene</li>
  <li>Slide menu items should not be available to select when the scene is transitioning anymore</li>
  <li>Cranking in menus should be more stable during scene transitions</li>
  <li>Adjusted wording of “Favorite stage” in Stats to be more consistent</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="12172024-1">12.17.2024</h3>

<ul>
  <li>Initial release.</li>
</ul>

<p><br />
<a href="https://play.date/games/rowbot-rally" class="button">Buy <i>RowBot Rally</i> in Catalog</a></p>]]></content><author><name></name></author><category term="rowbot rally" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Bona Fido Manual</title><link href="http://rae.wtf/blog/bona-fido-manual" rel="alternate" type="text/html" title="Bona Fido Manual" /><published>2024-10-13T00:00:00+00:00</published><updated>2024-10-13T00:00:00+00:00</updated><id>http://rae.wtf/blog/bona-fido-manual</id><content type="html" xml:base="http://rae.wtf/blog/bona-fido-manual"><![CDATA[<p><img src="/blog/images/2024-10-13-1.png" alt="Bona Fido" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>Turns out the afterlife’s not as bad as they say! Well, except for all the terrifying monsters, at least.</p>
</blockquote>

<p><em>“Hey. Name’s Fido. I’m a dog, as you can clearly see; but really I’m nothing but a bag of bones. The afterlife’s pretty nice; it’s a bit repetitive, but I can get used to it. It’s pretty chill! …Well, aside from all the unmentionable horrors that are out to kill me *again</em>. Maybe if I keep running around, I can find a way outta this place? Or at least set some new high scores.”*</p>

<p>Bona Fido is a fast-paced, single-screen platformer, inspired by classic arcade games but with a spooOOooky twist. Try for a new high score again and again as you narrowly dodge enemies, dig up treasures that could either help you eke out a record or spell your utter demise, and bark your way to becoming top dog of the afterlife! Don’t worry, it only goes on forever.</p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>The d-pad and A and B buttons are required to play this game. These buttons are also used to navigate menus. The crank can also optionally be used.</p>

<h2 id="gameplay">Gameplay</h2>

<p>The d-pad runs around. A button jumps, B button barks. The crank helps you dig up opportune stuff in the ground. Run around and dodge the enemies; bark to kill ‘em and move up to a harder (but higher-scoring) level. You’ve got three “lives” (hah)to start. Run out, and it’s game over.</p>

<p>Enemies, obviously, are bad. If you run into them, they’ll kill ya (…again), as quick as can be. Luckily, your bark seems to shut ‘em up and make ‘em go away. Press B to use that, so long as you haven’t lost your voice.</p>

<p>Dig-ups are items that sprout from the ground occasionally. Some are good, some are bad, but you don’t know what’s what until you go fish it out. If you see something buried in the ground, walk up to it and use the crank (or Down on the d-pad) to dig it up. Trick or treat!</p>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>To submit a new score to the global leaderboard, simply complete a game. When you reach the ‘Game Over’ screen, your score will be submitted to the proper leaderboard automatically.</p>

<blockquote>
  <p>⚠️ <em>Be careful — if you close out of the game without properly ending the round, your score won’t be saved or submitted!</em></p>
</blockquote>

<h2 id="my-score-didnt-send-what-do">My score didn’t send! What do?</h2>

<p>If you obtained a new high score, but it didn’t get sent up to the leaderboard, there are a few things you can try:</p>

<ol>
  <li>
    <p>Give it a little time, and see if it sends up automatically.</p>
  </li>
  <li>
    <p>Try playing another round — it doesn’t need to be <em>yet another</em> new high score, but this might kick the OS’ caching into high gear.</p>
  </li>
</ol>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the <em>Bona Fido</em> game page in your Web browser, at <a href="https://play.date/games/bona-fido/">play.date/games/bona-fido</a>. From here, you can view available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>Enter the ‘High Scores’ menu within the game, accessible by opening the Slide menu within the Title screen. From here, you can see the top scores for the board, as well as your own score and ranking (if available).</p>
  </li>
</ol>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art, code, and music — <a href="https://rae.wtf">Rae</a></li>
  <li>SFX — <a href="https://pixabay.com/">pixabay.com</a>; <a href="https://pixabay.com/service/terms/">License</a></li>
  <li>Newsleak font — <a href="https://panic.com">Panic</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li><a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence">Tanuk</a> library — <a href="https://toadleyundercontrol.itch.io/">Toad</a> and <a href="https://twitter.com/Schyzo99">Schyzo</a>; <a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence/blob/main/LICENSE">MIT</a></li>
  <li><a href="https://playdatesquad.github.io/pd-achievements/">Achievements</a> library — Playdate Squad</li>
  <li>Thanks — Mag, Toad, Kirk, Henry, John, and bumbleborn!</li>
</ul>

<h1 id="changelog">Changelog</h1>

<h2 id="version-157">Version 1.5.7</h2>
<h3 id="12032025">12.03.2025</h3>

<ul>
  <li>Fixed bug in a particular game mode, where the game would crash on lose</li>
  <li>Added ability to dig by holding Down on d-pad, instead of requiring the crank</li>
</ul>

<h2 id="version-156">Version 1.5.6</h2>
<h3 id="04282025">04.28.2025</h3>

<ul>
  <li>Updated achievements library to v1.0</li>
  <li>Added credit for achievements library</li>
</ul>

<h2 id="version-155">Version 1.5.5</h2>
<h3 id="02262025">02.26.2025</h3>

<ul>
  <li>Added achievements! <a href="https://github.com/PlaydateSquad/pd-achievements">Learn more here.</a></li>
</ul>

<h2 id="version-151">Version 1.5.1</h2>
<h3 id="01312025">01.31.2025</h3>

<ul>
  <li>Added hard cap on lives (six max)</li>
  <li>Platforms now disappear programmatically over the course of the game</li>
  <li>Barks are now limited (starts/caps at 3)
    <ul>
      <li>Dig-ups now always spawn +3 barks, if the player has no barks</li>
      <li>Barks reload on life loss</li>
    </ul>
  </li>
  <li>Bark indicator is now shown in the bottom-left corner</li>
  <li>Dig-ups no longer give or take away lives</li>
  <li>“Lose point” Dig-ups now take away more points</li>
  <li>Crank threshold for digging lowered slightly</li>
  <li>Bark cooldown removed (cuz now there’s an inherent limit!)</li>
  <li>Tweaked/fixed wording in tutorial pages</li>
  <li>Added ability for more enemies on-screen at once. Number increases as the game progresses</li>
</ul>

<h2 id="version-150">Version 1.5.0</h2>
<h3 id="01282025">01.28.2025</h3>

<ul>
  <li>Added on-line leaderboards! Access it via the Slide menu on the title screen.</li>
  <li>Added completely custom OST, made by yours truly!</li>
  <li>Fido will now be uncontrollable while digging.</li>
  <li>Timeout sensitivity for Dig-ups has been reduced (more safety net)</li>
  <li>Added digging animation for Fido</li>
  <li>Dig-up item sprites will now appear above Fido on the Z-index</li>
  <li>Best local score now shows on title screen</li>
  <li>Added wrapping paper on first unwrap</li>
  <li>Inverted list icon</li>
  <li>Crank can now be used to navigate menus</li>
  <li>Mud platforms now spawn a bit more often</li>
  <li>Dig-ups spawn a bit more often, and the likelihood of bad items has been evened out a tad.</li>
  <li>Credits moved to separate screen — access it via the Slide menu on the title screen.</li>
  <li>Bug fixes
    <ul>
      <li>Dig-up will no longer spawn if the player is not in control</li>
      <li>Fido will no longer slide around while holding Up/Down and walking</li>
      <li>“Reset local scores” in Options will now re-set itself if you hover away</li>
    </ul>
  </li>
  <li>First-person text in-game is more consistent now</li>
  <li>Dig-up noises are now stereo panned</li>
  <li>You can now end a game early, through the Slide menu.</li>
  <li>Fido’s hitbox is now smaller</li>
  <li>Game text updated to use localized strings</li>
  <li>B button will now act as a back button in menus.</li>
  <li>Cooldown between barks has been extended.</li>
  <li>Sprite classes now get properly purged on scene exit.</li>
  <li>Outlined gameplay sprites</li>
  <li>Added some cool art to the Options screen.</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="10132024">10.13.2024</h3>

<ul>
  <li>Initial release, for PlayJam 6.</li>
</ul>

<p><br />
<a href="https://play.date/games/bona-fido" class="button">Buy <i>Bona Fido</i> in Catalog</a></p>]]></content><author><name></name></author><category term="bona fido" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">The Lone Pirate</title><link href="http://rae.wtf/blog/the-lone-pirate" rel="alternate" type="text/html" title="The Lone Pirate" /><published>2024-09-08T00:00:00+00:00</published><updated>2024-09-08T00:00:00+00:00</updated><id>http://rae.wtf/blog/the-lone-pirate</id><content type="html" xml:base="http://rae.wtf/blog/the-lone-pirate"><![CDATA[<p>Now, if you’ve read my blog, or checked my website…or checked my socials…or know anything about me as a person, you probably know about the <a href="https://play.date">Playdate</a>, that quirky little game console with a crank, built-in games, and a black-and-white screen. There’s one thing that people might be at least a little surprised to hear, though:</p>

<p><em>There’s not really a piracy scene!</em></p>

<p>…Now I realize by saying that in such a public space that I’m kinda jinxing it, but like—! For a console with completely open game sideloading, and pretty much no copy protection¹ besides the honor system…it’s kinda super commendable! Now, that can be attributed to a lot of things — the games are made by small, often just one-or-two-person teams instead of massive evil blood-sucking corporations; that’s a huge part; but still! You’d expect someone to have at least <em>tried</em>, right?</p>

<p>…This blog post chronicles the story of the first (and only) act of Playdate “piracy” I’d ever encountered, how it got shuttered nigh-immediately due to pure happenstance, and some hilarious surrounding bits.</p>

<p>To set the scene: imagine in your head that it’s May 2023. The official Catalog had just launched about a month prior, and games were starting to regularly fill the scene every couple of weeks. It was a nice time! Imagine the collective surprise when someone pops into the Discord, and posts…a link to an unreleased game. (Here’s where I would have put an engaging image or something, but I think they got banned from the Playdate Discord at some point as all of their messages are completely gone. Oh well!)</p>

<p>Anyway, it was a link to the Playdate backend purchase screen for a game called “The Barkless Doctrine”. If you dunno about it, go play it! <a href="https://play.date/g/tbd">It’s really good.</a> Anyhoo, this whole thing happened about a month before the game was actually, like… supposed to be out! A few important things to know about the Playdate API’s inner workings, at this time:</p>

<ul>
  <li>Unpublished games were not accessible from the front-end (the pages are deliberately set up to 404), but they would still be fully accessible if you went through the proverbial back door of the API.</li>
  <li>Games uploaded to Panic’s storage network were <em>sequential</em> — it included all sideload, Catalog, and Season One titles, but a new game addition would come immediately after the last.</li>
  <li>If a game is unpublished, there’s no immediate urgency to fill in finalized details such as…the finished game bundle, or…price.</li>
</ul>

<p>The first point would importantly be fixed very soon after this all went down, but having games available sequentially via the backend means that someone with a keen eye and a Python script could go a-scrubbin’ for unreleased titles! Imagine their face when they stumble upon a completely unheard-of game while poking around back there. What do you do but post about it? And since it wasn’t meant to be, y’know, out yet, the price was tentatively labeled as $0. Or, in other words, …free.</p>

<p>Anyway, of course Neven Mrgan (of Panic; creator of Barkless in the first place) had to step in, and advise against playing this broken early build of the game. If you wanna know how this leak wraps up: the game released for real about a month later, the few people who had installed it illegitimately beforehand had access revoked, the early copy was preserved (privately!) as a neat piece of Playdate history (remember this part!), and all was right with the world once more. Yippee!</p>

<p>And all that brings us to…the conclusion of my wild pre-amble, and onto the beginning of the story of the lone pirate. Man, they should really put a character limit on this thing.</p>

<p>ANYHOO, cue a couple weeks after all this went down, when the person who had initially found the copy of Barkless had texted me over Discord DM. I’m not gonna reveal any of their identifying information, on account of A. I don’t wanna be that kinda person, and B. I don’t even remember it anyway. They got in touch with me asking if I still had a copy of the leaked version of Barkless.</p>

<p>We², of course, had saved a copy for preservation reasons.</p>

<p>…We, of course, told this guy we didn’t have any copy.</p>

<p>He then proceeds to lay down the deets of why he was asking: he had created an entire website to congregate and distribute free Playdate titles. Not free as in “these games were made free by the developer”, however — free as in “UH OH. UH OH. UH OH. UH OH. UH OH.”</p>

<p>Some highlights of what was featured (or at least, attempting to be) on this website at the time:</p>

<ul>
  <li>Various games which were listed, but had no download links attributed on account of them not even existing.</li>
  <li>CSS code directly stolen from the official Playdate Catalog! <a href="https://panic.com/extras/ripoff/">Someone phone the Rip-Off Express.</a></li>
  <li>An ‘early build’ of Hidey Spot, sneakily snagged from a Playdate developer forum where it was originally posted.</li>
  <li>A (non-functioning) download for the paid demo to Daily Driver, which this person has notoriously begged for a free copy of publicly in the past.</li>
</ul>

<p>There’s probably some philisophical implications to whether it can be considered a true attempt at piracy if they weren’t actually offering anything you couldn’t get for free elsewhere at the time, but regardless it was really strange. I say a lot of words pretty much amounting to “That’s Not Cool Dude”, and he, in response…immediately deletes every message he sent me. GREAT STRAT™!</p>

<p>Critically, he told exactly one other person about this thing though, and that was… scratchminer.</p>

<p>You may remember scratchminer from Index OS, Scrapbook, or even that footnote from earlier³. In between all that, he’s been busting open the Playdate pretty much every other way he knew how — importantly, in a responsible way. That means he had methods of contacting people at Panic about weird stuff like this, which he promptly does. They respond with something along the lines of “oh my god ok thanks”, and file a DMCA takedown request.</p>

<p>And that’s… not <em>quite</em> the end of the story! I mean, the site <em>did</em> get taken down, but here’s a funny thing: it was hosted on GitHub. Funnily enough, free hosting — that’ll be hilarious later! — but also, GitHub has a keen eye for transparency, and as such will publicly post any DMCA takedown requests filed at somebody using their service. We checked in on this repository after the site went down out of curiosity, and here’s the hilarious part:</p>

<p>There was nothin’ from Panic.</p>

<p>I mean, there was <em>somethin’</em> from Panic — some unrelated source code leak from 2017 — but there was nothing pertaining to the “free Catalog” website at all. So the only reasonable outcome I can imagine is that someone from Panic reached out to the person, said “please take this down or we’re going to pursue proper legal action”, and then they promptly screamed, ran and destroyed all the evidence.</p>

<p>Anyway, I think that’s about the end of it! The site where the games were originally hosted wound up having some cryptic password entry for a little while, but never came back, was never shared anywhere beyond scratch and I, and is now completely down.</p>

<p>That was over a year ago by now — I’ve never seen anyone try to host Playdate piracy before nor since, and I sure hope it stays that way for a while to come. This place is pretty cool! Let’s keep it that way.</p>

<hr />

<p>¹For sideloaded titles. Catalog games are encrypted with custom DRM, just for the record.</p>

<p>²”We” being myself and scratchminer — he’ll appear in the story later, but just for clarification.</p>

<p>³Footnote number 2.</p>

<hr />

<p>…While you’re still here, how about a funny button to cap off this story?</p>

<p>For all the “doesn’t wanna pay for things” talk going around, they actually <em>did</em> go through the effort of registering a custom domain for this site! Now, you gotta provide some info to ICANN when you register a domain, so they know Who It’s Going To — this information is typically publicly accessible with a WHOIS lookup, but domain registrars often provide WHOIS protection to shield it from public databases like that — either for free, or for a small fee.</p>

<p>Now, the domain registrar <em>he</em> used provided it for a small (iirc, ~$5 USD) fee alongside the domain, and…would you believe the guy who wasn’t willing to pay for a $5 Playdate game would also not pay the $5 for WHOIS protection?</p>

<p>We, of course, did absolutely <em>nothing</em> with this data. Never saved it anywhere, never shared it beyond us or tried to pursue them in any way, nothing. I just wanna make that very clear. But we both had a really hearty chuckle at the sheer irony of it, and I think it’s a very funny way to end this tale.</p>]]></content><author><name></name></author><category term="blog" /><summary type="html"><![CDATA[Now, if you’ve read my blog, or checked my website…or checked my socials…or know anything about me as a person, you probably know about the Playdate, that quirky little game console with a crank, built-in games, and a black-and-white screen. There’s one thing that people might be at least a little surprised to hear, though:]]></summary></entry><entry><title type="html">HEXA Manual</title><link href="http://rae.wtf/blog/hexa-manual" rel="alternate" type="text/html" title="HEXA Manual" /><published>2024-07-30T00:00:00+00:00</published><updated>2024-07-30T00:00:00+00:00</updated><id>http://rae.wtf/blog/hexa-manual</id><content type="html" xml:base="http://rae.wtf/blog/hexa-manual"><![CDATA[<p><img src="/blog/images/2024-07-30-1.png" alt="HEXA" /></p>

<h2 id="synopsis">Synopsis</h2>

<blockquote>
  <p>Board the helm of Starship HEXA, and conquer the universe the only way you know how: shapes.</p>
</blockquote>

<p>You’re the commander of Starship HEXA, the head of a space fleet dead-set on taking over the universe. You’re well on your way to assuming control of everything that is and shall be, but your attack methods are a bit…unorthodox. We can’t dwell on it for too long, though, so get out there and match those hexagons!</p>

<p>HEXA is a unique, quick to pick up, and super fun logic puzzle game based on everybody’s favorite polygon. Try for a high score in Arcade Mode, take on the dynamic Daily Run; or conquer dozens of unique challenges in Mission Mode! See if you can’t conquer the HEXAPLEX, wrangle those Power-ups, and maybe even become ruler of the universe along the way.</p>

<p>Give it a try… it’s <em>HEXA-good!</em></p>

<h1 id="gameplay-basics">Gameplay Basics</h1>

<h2 id="controls">Controls</h2>

<p>A set of Directional and Action buttons are required to play this game. These buttons are used to navigate menus, and are mandatory in main gameplay.</p>

<p>On personal computers, you can use the keyboard (which defaults to Arrows &amp; Z + X), or a compatible gamepad (d-pad &amp; A + B/X + O). During an active game, the pause menu can be accessed by pressing ESC/Start/Options. Otherwise, pressing any of those buttons twice in succession will quickly exit the game.</p>

<p>On Playdate, you can also optionally use the crank to perform the turning action usually done by the Action buttons — this can be toggled in the Options menu. (The crank can also be used to navigate menus.)</p>

<h2 id="gameplay">Gameplay</h2>

<p>When you start a new game, you’ll be faced with the HEXAPLEX — a grid of 19 tris (dark, dithered, or light), all interlaced with one another. Your goal is simple: create HEXAs!</p>

<p>Use the Directional buttons to navigate your Cursor along the HEXAPLEX, and the Action buttons (or, on Playdate, the crank) to rotate the currently-selected hexagon clockwise or counter-clockwise — this is called a Swap.</p>

<p>A full hexagon of similarly-colored tris is called a HEXA. These are the main way to earn points — create a HEXA match, and BOOM!! You gain points, and the tris involved are randomized and replaced.</p>

<p>As far as basic gameplay is concerned…that’s all you gotta know to get started! But, depending on the mode you’re playing, there are a few more things you need to learn…</p>

<h1 id="modes">Modes</h1>

<h2 id="arcade-mode">Arcade Mode</h2>

<p>Arcade Mode is the basic gameplay mode in <em>HEXA</em>.</p>

<p>In this mode, you start out with 45 seconds on the clock. As you match HEXAs, you’ll earn points, as well as more time on the timer! Your goal is to match as many HEXAs, and thus, earn as many points, as you can before time runs out. Light tris earn you 100 points, dithered tris earn you 150 points, and dark tris earn you 200 points.</p>

<p>There’s another element to this mode to keep you on your toes: randomly-generated Power-ups! These do various different things when matched:</p>

<ul>
  <li>Bombs — If matched into a HEXA, the whole HEXAPLEX gets “blown up” and replaced with a new, randomized set of tris.</li>
  <li>2x tris — When matched into a HEXA, you’ll earn double points for that match! Plus, a bigger timer boost.</li>
  <li>Wild tris — These tris can be used in place of any other color when creating a HEXA. No penalty nor reward.</li>
</ul>

<p>Power-ups will not stack up with themselves. For example, if you have multiple 2x tris in a match, you’ll still only receive one bonus. However, Power-ups <em>will</em> stack with eachother — if a match contains a 2x tri and a Bomb, for example, you’ll get double points <em>and</em> re-shuffle the entire board.</p>

<p>You can also score HEXA Combos — if you match a HEXA, and the resulting grid contains another HEXA, BOOM!! You’ll get double the points for that match! This stacks exponentially up until you reach a board state without an immediate HEXA. These are mostly luck-based, but it’s possible to create them intentionally if you really know what you’re doing.</p>

<p>As you earn more HEXAs, the timer boost will gradually become less and less effective. See how long you can keep it rolling!</p>

<p>The game will end when the timer reaches zero. If you wanna end it early, open the Pause menu and select “End Game”. The game will end from the current point, and any high scores will be saved.</p>

<h2 id="chill-mode">Chill Mode</h2>

<p>Chill Mode is a more relaxed experience, meant for casual play.</p>

<p>In this mode, there’s no score-keeping, Power-ups, or timers. The goal is just to chill out, and have a good time creating HEXA matches at your own pace!</p>

<p>To end the game, open the Slide menu and select “I’m Done!” to wrap up.</p>

<h2 id="daily-run">Daily Run</h2>

<p>Daily Run plays a lot like Arcade Mode, but with one big catch: you only get one shot per day!</p>

<p>In this mode, the board is <em>seeded</em> — every day, you play with the same starting layout as everyone else. From here, it plays just like Arcade Mode!</p>

<p>When you end the game, you won’t be able to play again until tomorrow. The Daily Run refreshes automatically at 00:00 midnight GMT, after which you’ll be able to play another run with a new layout.</p>

<blockquote>
  <p>💡 <em>There’s also a handy timer on the Title screen to let you know when the next run will appear!</em></p>
</blockquote>

<h2 id="hard-mode">Hard Mode</h2>

<p>From the Options menu, you can toggle an optional “Hard Mode” that affects Arcade Mode and Daily Run. This mode will cut the amount of time you earn from HEXA matches in half!</p>

<blockquote>
  <p>💡 <em>Hard Mode has separate on-line leaderboards on Playdate. Compete for a high score!</em></p>
</blockquote>

<h1 id="mission-mode">Mission Mode</h1>

<p>In Mission Mode, 50 logic challenges await you! These are grouped into four distinct types:</p>

<ul>
  <li>Picture: In this mode, there are no HEXAs! Perform Swaps from a random state to try and create the given picture in as little Swaps as possible.</li>
  <li>Time Attack: This plays like Arcade Mode, except…you get no time bonus for HEXAs! See how much of a score you can nab in the time allotted!</li>
  <li>Logic: From a determined starting layout, try and clear the condition using as little Swaps as possible! No time limit or pressure.</li>
  <li>Speedrun: These play like Logic Missions — complete the clear condition — but instead of Swaps, do it as fast as you can!</li>
</ul>

<p>A new Mission will unlock as soon as you clear the latest. On Playdate, if you’re ever feeling stuck, open the Slide menu to get another look at your objective.</p>

<blockquote>
  <p>💡 <em>On Playdate, in Picture Missions, the Slide menu will also show the picture you’re trying to re-create!</em></p>
</blockquote>

<h1 id="custom-missions">Custom Missions</h1>

<p>Keep the fun going with custom Missions! Accessible from the Mission Mode menu, additional user-created Missions can provide infinite world-conquering content.</p>

<h2 id="creating-custom-missions">Creating Custom Missions</h2>

<p>Follow these steps to create your own custom Missions!</p>

<p>For personal computers:</p>

<ol>
  <li>
    <p>Launch HEXA, and enter the Mission Mode menu.</p>
  </li>
  <li>
    <p>From here, press the on-screen command for <em>Mission Command</em> — this is where you can create your own custom Missions.</p>
  </li>
  <li>
    <p>From here, you can select from one of the four Mission types: Logic, Picture, Speedrun, or Time Attack. Depending on the Mission type you choose, you may need to define a few more settings.</p>
  </li>
</ol>

<p>For Time Attack Missions, please define a time limit (from 5 to 60 seconds), and a random seed (numbers only, max. 10 characters) for HEXAPLEX generation. On the next screen, you’ll get a chance to review your generated HEXAPLEX before continuing.</p>

<p>For Logic or Speedrun Missions, please define a clear goal — a specific color of tri, a specific Power-up, or clearing the entire HEXAPLEX.</p>

<ol>
  <li>
    <p>When you’ve defined your settings, select “Start Editing”! On the next screen, you can define your HEXAPLEX layout. Use the Directional buttons to hover over a tri, select it with the primary Action button, and use the prompt to define the color and Power-up of the given tri (if available). For Logic and Speedrun Missions, this step will be used to determine the starting layout of the HEXAPLEX. For Picture Missions, this step will be used to determine the ending layout, which will be randomly shuffled upon export to make the starting layout.</p>
  </li>
  <li>
    <p>When you’re ready, press the on-screen command to export! This will take you to a new screen to make some final touches. For Picture Missions, you’ll need to give a name (max. 10 characters) to your object. You’ll also need to define an author name (max. 10 characters) for your Mission. When you’re ready, hit “Export”!</p>
  </li>
  <li>
    <p>To access your newly-created Mission, press the primary Action button on the “Export Complete!” screen to open the custom Mission directory in your file explorer.</p>
  </li>
</ol>

<p>For Playdate:</p>

<ol>
  <li>
    <p>Launch HEXA, and enter the Mission Mode menu.</p>
  </li>
  <li>
    <p>From here, open the Slide menu, and select “create”. This will take you into <em>Mission Command</em>, where you can create your own custom Missions.</p>
  </li>
  <li>
    <p>From here, you can select from one of the four Mission types: Logic, Picture, Speedrun, or Time Attack. Depending on the Mission type you choose, you may need to define a few more settings.</p>
  </li>
</ol>

<p>For Time Attack Missions, please define a time limit (from 5 to 60 seconds), and a random seed (numbers only, max. 10 characters) for HEXAPLEX generation. On the next screen, you’ll get a chance to review your generated HEXAPLEX before continuing.</p>

<p>For Logic or Speedrun Missions, please define a clear goal — a specific color of tri, a specific Power-up, or clearing the entire HEXAPLEX.</p>

<ol>
  <li>
    <p>When you’ve defined your settings, select “Start Editing”! On the next screen, you can define your HEXAPLEX layout. Use the d-pad to hover over a tri, select it with the A button, and use the prompt to define the color and Power-up of the given tri (if available). For Logic and Speedrun Missions, this step will be used to determine the starting layout of the HEXAPLEX. For Picture Missions, this step will be used to determine the ending layout, which will be randomly shuffled upon export to make the starting layout.</p>
  </li>
  <li>
    <p>When you’re ready, open the Slide menu and select “export”! This will take you to a new screen to make some final touches. For Picture Missions, you’ll need to give a name (max. 10 characters) to your object. You’ll also need to define an author name (max. 10 characters) for your Mission. When you’re ready, hit “Export”!</p>
  </li>
</ol>

<h2 id="importing-custom-missions">Importing Custom Missions</h2>

<p>Follow these steps to import custom Missions!</p>

<p>For personal computers:</p>

<ol>
  <li>
    <p>Launch HEXA, and enter the Mission Mode menu.</p>
  </li>
  <li>
    <p>Press the on-screen command to enter the custom Missions list.</p>
  </li>
  <li>
    <p>Once you’re there, press the on-screen command to open the custom Mission directory in your file explorer.</p>
  </li>
  <li>
    <p>Drop your custom Mission JSON file(s) straight into this folder. Don’t put ‘em outside, or within any sub-folders!</p>
  </li>
  <li>
    <p>Re-start the game, enter the Mission Mode menu, and press the on-screen command to enter the custom list. If your Missions got imported correctly, you should see them listed here in date order!</p>
  </li>
</ol>

<p>For Playdate:</p>

<ol>
  <li>
    <p>Access Data Disk Mode on your Playdate by following <a href="https://help.play.date/games/sideloading/#data-disk-mode">these steps</a>.</p>
  </li>
  <li>
    <p>Navigate to <span class="code-span">Data/wtf.rae.hexa/missions</span>.</p>
  </li>
  <li>
    <p>Drop your custom Mission JSON file(s) straight into this folder. Don’t put ‘em outside, or within any sub-folders!</p>
  </li>
  <li>
    <p>Exit Data Disk Mode, launch HEXA, and enter the Mission Mode menu.</p>
  </li>
  <li>
    <p>From here, open the Slide menu, and enable “custom”. If your Missions got imported correctly, you should see them listed here in date order!</p>
  </li>
</ol>

<blockquote>
  <p>💡 <em>If you’ve sideloaded your copy of HEXA, you can still play with custom Missions, but your save data will be in a different place! Look for the same folder within Data, but prepended with “user.XXXX.”.</em></p>
</blockquote>

<h1 id="on-line-capability">On-line Capability</h1>

<h2 id="about-on-line-play">About on-line play</h2>

<p>This game connects to Playdate’s on-line leaderboard API, to enable sending and receiving of high scores among players across the globe. To use on-line functionality in this game, make sure your Playdate has an active Wireless connection.</p>

<blockquote>
  <p>⚠️ <em>HEXA for personal computers does not connect on-line, or transmit high scores.</em></p>
</blockquote>

<h2 id="submitting-your-scores">Submitting your scores</h2>

<p>The Arcade Mode and Daily Run both support global on-line leaderboards. You’re not the only one competing for the universe — go for the top spot!</p>

<p>To submit a new score to a global leaderboard, simply complete a game. When you reach the end results screen, your score will be submitted to the proper leaderboard automatically.</p>

<blockquote>
  <p>⚠️ <em>Be careful — if you close out of the game without properly ending your run, your score won’t be saved or submitted!</em></p>
</blockquote>

<h2 id="my-score-didnt-send-what-do">My score didn’t send! What do?</h2>

<p>If you obtained a new high score, but it didn’t get sent up to the appropriate leaderboard, there are a few things you can try:</p>

<ol>
  <li>
    <p>Give it a little time, and see if it sends up automatically.</p>
  </li>
  <li>
    <p>Try playing another round — it doesn’t need to be <em>yet another</em> new high score, but this might kick the OS’ caching into high gear.</p>
  </li>
  <li>
    <p>Try checking the scoreboards in-game (see below), which will attempt to send a “fake score” and bump the cache.</p>
  </li>
</ol>

<h2 id="viewing-global-scores">Viewing global scores</h2>

<p>You can view global scores using two primary methods:</p>

<ol>
  <li>
    <p>Visit the <em>HEXA</em> game page in your Web browser, at <a href="https://play.date/games/hexa/">play.date/games/hexa</a>. From here, you can view all available scores in the Scoreboards section. You can see top 10 scores in every available board.</p>
  </li>
  <li>
    <p>Enter the ‘High Scores’ menu within the game, accessible from the Title screen. When in this screen, you can use the A button to toggle between the Arcade Mode and Daily Run leaderboards. From here, you can see the top scores for the currently-highlighted board, as well as your own score and ranking (if available).</p>
  </li>
</ol>

<p>The Daily Run leaderboard refreshes automatically at 00:00 midnight GMT, clearing all scores from the past day. When viewing scores in-game, there’s also a handy timer to tell you when the boards will be cleared.</p>

<p>To view Hard Mode leaderboards in-game, enable “Hard Mode” from the Options menu before checking. To return to regular leaderboards, disable this setting.</p>

<h1 id="strategies">Strategies</h1>

<p>Here are a couple tips to hopefully help you conquer the HEXAPLEX!</p>

<ul>
  <li>Know your difference between clockwise and counter-clockwise.</li>
  <li>It’s easier to fill a gap of two tris than it is to fill a gap of one.</li>
  <li>Plan for the tris that reward higher points!</li>
  <li>Make use of Power-ups when possible, and especially when beneficial.</li>
  <li>The crank can perform Swaps faster, but is harder to dial in precisely.</li>
  <li>Use Bombs at opportune times to re-shuffle a poor layout!</li>
  <li>When in doubt, just take a moment to study the HEXAPLEX. You’ve got more time than you think!</li>
</ul>

<h1 id="credits">Credits</h1>

<ul>
  <li>Art and code — <a href="https://rae.wtf">Rae</a></li>
  <li>Music — <a href="https://musmus.main.jp">Watson at MusMus</a>; <a href="https://musmus.main.jp/info.html">Terms</a></li>
  <li>French localization — <a href="https://voxy.space">Voxy</a></li>
  <li>Japanese localization — Philemax</li>
  <li>SFX — <a href="https://sfxr.me">JSFXR</a></li>
  <li><a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence">Tanuk</a> library — <a href="https://toadleyundercontrol.itch.io/">Toad</a> and <a href="https://twitter.com/Schyzo99">Schyzo</a>; <a href="https://github.com/Schyzophrenic/Tanuk_CodeSequence/blob/main/LICENSE">MIT</a></li>
  <li>Full Circle and Mikodacs Clock fonts — <a href="https://panic.com">Panic</a>; <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></li>
  <li><a href="https://fonts.google.com/specimen/Righteous">Righteous</a> font — Astigmatic; <a href="https://openfontlicense.org">OFL</a></li>
  <li>Playdate <a href="https://kenney.nl/assets/input-prompts">input prompts</a> — <a href="https://kenney.nl">Kenney</a>; <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0 1.0</a></li>
  <li>LÖVE2D <a href="https://hump.readthedocs.io/en/latest/">HUMP</a> library — Matthias Richter; <a href="https://github.com/HDictus/hump/blob/temp-master/README.md">License</a></li>
  <li>Addtl. code — <a href="http://lua-users.org/wiki/FormattingNumbers">lua-users wiki</a> and <a href="https://aloebach.itch.io">Drew-Lo</a></li>
  <li>Playdate <a href="https://playdatesquad.github.io/pd-achievements/">achievements</a> library — Playdate Squad</li>
  <li>Thanks — Voxy, Toad, scizzorz, superfunc, Mag, Hunter Bridges, Scenic Route, DRD, IGDA Twin Cities, and Panic!</li>
  <li>PC testers — Orchid, Maddy, Toad, Seb, Winter, Voxy, Diego, Roxby, and Scenic Route</li>
</ul>

<h1 id="additional-notes">Additional Notes</h1>

<p>This game started life on the 4th of July, 2024. It came together pretty much over the weekend — initially being sent to the Playdate Catalog on July 7th, and approved on the 10th. The game was originally scheduled for release on August 13th, 2024, before suddenly having the opportunity to jump back and instead release on July 30th. This means that the game went from “start of development” to “literally out for people to buy” in just under a months’ time. New record!!</p>

<p>The version of HEXA for personal computers was an idea in my head for a while (even before the original Playdate release), but I started work on what would eventually be the final version just a couple weeks before I wound up releasing it. This version is a loving recreation of the Playdate original, with the code being entirely hand-ported to the fabulous LÖVE2D engine. While my original intent was to keep the two versions of the game as similar as possible, I hope you enjoy the extra benefits that come as a result of what the Playdate <em>can’t</em> do!</p>

<p>Special thanks to the folks in the Catalog dev chat for being there to witness my tomfoolery throughout the initial development, everybody who helped out and cheered me on as this game barreled through the finish line, and everyone who continues to compete so fiercely on the Playdate leaderboards and create such an inspiring community out of my little puzzle game. Enjoy the cake! And thanks to you, for reading, playing, and (hopefully) enjoying!</p>

<h1 id="changelog">Changelog</h1>

<h2 id="version-230">Version 2.3.0</h2>
<h3 id="05132026">05.13.2026</h3>

<ul>
  <li>Added a full Japanese localization! Thanks, Philemax!</li>
  <li>Added Language select screen that will show up at first launch, if user language isn’t determinable.</li>
  <li>Swaps:HEXAs ratio in Statistics now reads ‘N/A’ if ratio isn’t calculable.</li>
  <li>Mission Command headers now render with a nicer outlined font</li>
  <li>When resetting local stats in the Options screen, sound effects will no longer overlap</li>
  <li>Nudged manual images over slightly so they didn’t crash into the text so hard</li>
</ul>

<p>Windows/macOS/Linux:</p>
<ul>
  <li>When using a controller, the left control stick can now be used in place of the Directional buttons</li>
  <li>If a controller is disconnected in the middle of a game, the game will now pause</li>
  <li>When using a Sony-branded controller, appropriate button labels and glyphs will now be rendered</li>
  <li>Added persistent “Fullscreen” save option to Video Options (defaults to “ON”)</li>
  <li>Added ability to exit keyboard remapping by pressing ESC (or Start/Options, on a gamepad)</li>
  <li>Fixed bug where pressing an invalid key during keyboard remapping would crash the game</li>
  <li>Keyboard remapping will now refuse to initiate when activated with a controller</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Added “System” language option. If selected, the game will choose the language based on your Playdate’s language setting</li>
  <li>In Jukebox, going back from the Slide menu will no longer play an extra sound effect</li>
  <li>Added badge icons for locked and unlocked achievements</li>
  <li>Fixed bug where “Can’t clear the mission in this state!” error in Mission Command wouldn’t get properly localized</li>
  <li>Fixed incorrect criteria for Swap- and HEXA-based achievements</li>
  <li>Fixed wording in Mission Command achievement, as well as making it un-hidden</li>
</ul>

<h2 id="version-220">Version 2.2.0</h2>
<h3 id="10162025">10.16.2025</h3>

<ul>
  <li>Added new “Language” option, as well as a full French localization! Thanks, Voxy!</li>
  <li>Added ability to toggle Options using the left and right Directional buttons</li>
</ul>

<p>Windows/macOS/Linux:</p>
<ul>
  <li>Added keyboard remapping! Instead of presets, map the keys anywhere on the keyboard you like</li>
  <li>Added “Wonky Pixels” scaling mode, in Video Options. This minimizes letterboxing, at the cost of…well, wonky pixels</li>
  <li>Added ability to toggle Visual Options using the left and right Directional buttons</li>
  <li>Screen clip rect will now accurately follow screen “shake” effect</li>
  <li>Added ability to pause the game while a HEXA match is taking place</li>
  <li>App icon will now change at runtime based on Color attribute</li>
  <li>F11 will now toggle fullscreen mode</li>
  <li>Screen shake has been adjusted to hopefully better match the Playdate version</li>
  <li>Fixed controller logic — now any input from any connected controller will be registered</li>
  <li>Fixed rumble logic — the most recently used controller (if any) will be the one used for rumble</li>
  <li>Fixed bug where the screen border may flicker rapidly with a latent frame on resizing</li>
  <li>Fixed bug where music volume wouldn’t quieten properly on game pause, or quit from title</li>
  <li>Fixed bug where in Arcade Mode, the button inputs at the end of the round would not appear</li>
  <li>Fixed bug where in Chill Mode, the button inputs at the end of the round used the wrong font in Colorful mode</li>
  <li>Fixed bug where on exit from title screen, the text would be using the wrong font in Colorful mode</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Sped up HEXA matching to roughly match the PC version</li>
</ul>

<h2 id="version-217">Version 2.1.7</h2>
<h3 id="10032025">10.03.2025</h3>

<p>Windows/macOS/Linux:</p>
<ul>
  <li>Initial release.</li>
</ul>

<p>Playdate:</p>
<ul>
  <li>Added new Statistics menu! (Most statistics are tracked as of 10.03.2025. Sorry!)</li>
  <li>Added a second page to the credits screen — so many wonderful people!</li>
  <li>Replaced “Music” and “SFX” toggles with granular volume settings</li>
  <li>Reduced chance of Special Activity to one in ten thousand</li>
  <li>Fixed bug where “Half circle” font would be rendered under “Full circle” font in menus</li>
  <li>Fixed bug where Hard Mode Arcade score doesn’t get cleared upon resetting local stats</li>
  <li>Re-classified “black, gray, and white” tris to “dark, dithered, and light”</li>
  <li>Fixed crash that occurs if attempting to move left/right in an empty custom Mission list</li>
  <li>Daily Run no longer prompts to view high scores if the build isn’t from Catalog</li>
  <li>Non-JSON files in the custom Mission folder will no longer attempt to be read</li>
  <li>Track information is now hidden in the Jukebox, when music is disabled</li>
  <li>Seed argument is now properly set when entering a stock Mission</li>
  <li>Fixed Mission Command selector Power-ups still moving when Reduce Flashing is enabled</li>
  <li>Reduced flashing velocity of Mission Command selector cursor</li>
  <li>Edited author name save behavior to always keep the most recent name</li>
</ul>

<h2 id="version-216">Version 2.1.6</h2>
<h3 id="08202025">08.20.2025</h3>

<ul>
  <li>Fixed crash that happens when launching stock Missions in Mission Mode</li>
  <li>Improved error checking accuracy when creating custom Missions</li>
</ul>

<h2 id="version-215">Version 2.1.5</h2>
<h3 id="07302025">07.30.2025</h3>

<ul>
  <li>Added ability to create custom Missions! Check the game manual to learn more.</li>
  <li>Added achievements! <a href="https://github.com/PlaydateSquad/pd-achievements">Learn more here.</a></li>
  <li>Added separate save variable for when Hard Mode is enabled</li>
  <li>Added on-line leaderboards for Hard Mode (Arcade Mode and Daily Run)</li>
  <li>Hopefully fixed a rare crash when completing a game</li>
  <li>Souped up pause screen input guide (thanks Kenney for the input prompts!)</li>
  <li>Fixed a bug where Daily Run score wouldn’t be saved on sideloaded copies</li>
  <li>Leaderboard will now open to the mode you last played (Arcade Mode or Daily Run)</li>
  <li>Mission Mode will now remember your “custom” setting between Missions</li>
</ul>

<h2 id="version-212">Version 2.1.2</h2>
<h3 id="02072025">02.07.2025</h3>
<ul>
  <li><em>Actually</em> fixed crash that sometimes fired upon entering Mission Mode</li>
</ul>

<h2 id="version-211">Version 2.1.1</h2>
<h3 id="01152025">01.15.2025</h3>

<ul>
  <li>De-looped music tracks. Whoops!</li>
  <li>Fixed crash that sometimes fired upon entering Mission Mode</li>
  <li>“Hard Mode” is now available as a direct toggle in the Options menu</li>
  <li>Added slight deadzones to swapping with the crank</li>
</ul>

<h2 id="version-210">Version 2.1.0</h2>
<h3 id="01062025">01.06.2025</h3>

<ul>
  <li>Fix wi-fi cauterization in sideload copies</li>
  <li>Edit static list icon to be more visually interesting</li>
  <li>Compress music to get file size from ~30 MB down to &lt;10</li>
  <li>Music now also loops a bit more appropriately</li>
  <li>Add hidden “Hard Mode” in Arcade/Daily Run</li>
  <li>Swap SFX quietened</li>
  <li>Added support for importing Custom Missions</li>
  <li>Fixed bug with “flip rotation” setting mid-game</li>
  <li>If all missions are beaten, the mission screen will now start at the beginning of the list instead of the end</li>
  <li>B button will now skip end card as well as A</li>
  <li>The crank can now be used to scroll through missions</li>
  <li>In a situation with multiple HEXAs, any with bombs will be de-prioritized to avoid unfortunate scenarios</li>
  <li>Added cranking deadzone of 5º</li>
  <li>Enhanced scene management optimization</li>
</ul>

<h2 id="version-200">Version 2.0.0</h2>
<h3 id="08132024">08.13.2024</h3>

<ul>
  <li>Added Mission Mode! 50 all-new challenges to complete across four unique game-modes!</li>
  <li>Adjusting round end behavior to fix potential soft lock.</li>
  <li>Pause preview is now hidden for time-sensitive game modes.</li>
  <li>Added additional “2:1” option for crank sensitivity.</li>
  <li>Removed brief timeout between Swaps</li>
  <li>Fixed bug where randomized tag would show up twice in ending card, in specific scenarios</li>
  <li>Hopefully fixing a bug with Daily Run metrics not saving.</li>
  <li>Commalizing best scores on Title screen</li>
  <li>Additional gameplay tweaks and fixes.</li>
</ul>

<h2 id="version-110">Version 1.1.0</h2>
<h3 id="08052024">08.05.2024</h3>

<ul>
  <li>Fixed a bug where restarting the game wouldn’t properly clear the timer.</li>
  <li>The user can now press A to skip the fanfare mid-way through, if “Skip Fanfare” setting is off.</li>
  <li>Added Jukebox, which cycles through the game’s music tracks randomly with a nice screensaver.</li>
  <li>Rewording How to Play section slightly to make some game rules more clear.</li>
  <li>Show scores for Arcade Mode and Daily Run on the Title screen, if applicable.</li>
  <li>Fixed a bug in Options where some SFX weren’t playing correctly.</li>
  <li>Added all-time Swap and HEXA tracking to the Options menu, starting with the release of v1.1.0.</li>
  <li>Fixed potential bug in Daily Run on-line score caching.</li>
  <li>Reworded “Local Scores” to “Local Stats” in Options; this function now clears Swaps/HEXA counts too.</li>
</ul>

<h2 id="version-100">Version 1.0.0</h2>
<h3 id="07302024">07.30.2024</h3>

<ul>
  <li>Initial release.</li>
</ul>

<p><br />
<a href="https://rae.wtf/games/hexa" class="button">Visit <i>HEXA</i>’s webpage</a></p>]]></content><author><name></name></author><category term="hexa" /><summary type="html"><![CDATA[]]></summary></entry></feed>