<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: toolswithalex</title>
    <description>The latest articles on DEV Community by toolswithalex (@toolswithalex).</description>
    <link>https://dev.to/toolswithalex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4176259%2F694ed325-bc6b-40e7-bedb-0cfcdcbea3d1.png</url>
      <title>DEV Community: toolswithalex</title>
      <link>https://dev.to/toolswithalex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toolswithalex"/>
    <language>en</language>
    <item>
      <title>How Friday Night Funkin' Charts Work: A Developer's Tour of Rhythm Game Data</title>
      <dc:creator>toolswithalex</dc:creator>
      <pubDate>Wed, 14 Oct 2026 02:48:36 +0000</pubDate>
      <link>https://dev.to/toolswithalex/how-friday-night-funkin-charts-work-a-developers-tour-of-rhythm-game-data-166</link>
      <guid>https://dev.to/toolswithalex/how-friday-night-funkin-charts-work-a-developers-tour-of-rhythm-game-data-166</guid>
      <description>&lt;p&gt;If you've ever wondered what a rhythm game looks like under the hood, Friday Night Funkin' is the perfect specimen: it's open source, its chart format is plain JSON, and thousands of mods mean thousands of real-world examples to study.&lt;/p&gt;

&lt;h2&gt;
  
  
  The anatomy of a chart
&lt;/h2&gt;

&lt;p&gt;At its core, an FNF chart is a timeline of notes. Each note is essentially a tuple: &lt;em&gt;when&lt;/em&gt; it should be hit (in song milliseconds or beats), &lt;em&gt;which&lt;/em&gt; direction it is (left/down/up/right), and &lt;em&gt;how long&lt;/em&gt; it sustains. The engine converts beats to timestamps using the song's BPM, which is why BPM changes mid-song are the classic way modders create "gotcha" moments.&lt;/p&gt;

&lt;p&gt;A simplified note looks conceptually like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sustain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"normal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Direction is an index, time is milliseconds since song start, sustain is hold length. That's 90% of the format. Everything else — camera moves, character animations, dialogue events — rides on a parallel event track keyed to the same clock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this simplicity matters
&lt;/h2&gt;

&lt;p&gt;Because the format is this legible, the barrier to creating content is near zero. You don't need a proprietary editor or a compiled toolchain; a text editor and a metronome get you a playable song. That's the technical reason FNF has more community songs than any commercial rhythm game: the data format respects the creator's time.&lt;/p&gt;

&lt;p&gt;It also makes charts &lt;em&gt;analyzable&lt;/em&gt;. Want to rank songs by difficulty? Parse the JSON and compute notes-per-second, jump density (two directions at once), and sustain ratio. The community has effectively built an open dataset of what "hard" means in rhythm games.&lt;/p&gt;

&lt;h2&gt;
  
  
  A case study: Tricky
&lt;/h2&gt;

&lt;p&gt;The Tricky mod is famous for charts that feel unfair until you understand them. Look at the data and the design intent becomes clear: bursts of high note density separated by breathing room, with the camera zooms synced to phrase boundaries. The &lt;a href="https://fnfunkin.org/fnf/vs-tricky-full-hd" rel="noopener noreferrer"&gt;Tricky FNF mod&lt;/a&gt; is playable in the browser if you want to feel the difference between "random hard" and "designed hard" — the chart data tells you which is which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways for game devs
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable formats compound.&lt;/strong&gt; JSON charts turned players into tool-builders (auto-charters, difficulty analyzers, practice-mode hacks).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate timing from presentation.&lt;/strong&gt; FNF's event track means modders reskin visuals without touching gameplay logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism is a feature.&lt;/strong&gt; Same input seed, same chart, same result — which makes replays, leaderboards, and TAS-style analysis possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FNF didn't succeed &lt;em&gt;despite&lt;/em&gt; being technically simple. It succeeded &lt;em&gt;because&lt;/em&gt; its simplicity invited ten thousand collaborators.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>json</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Save States, Turbo Speed, and Full Screen: Getting the Most Out of Browser-Based GBA Emulation</title>
      <dc:creator>toolswithalex</dc:creator>
      <pubDate>Wed, 14 Oct 2026 02:48:24 +0000</pubDate>
      <link>https://dev.to/toolswithalex/save-states-turbo-speed-and-full-screen-getting-the-most-out-of-browser-based-gba-emulation-14h8</link>
      <guid>https://dev.to/toolswithalex/save-states-turbo-speed-and-full-screen-getting-the-most-out-of-browser-based-gba-emulation-14h8</guid>
      <description>&lt;p&gt;The Game Boy Advance is over twenty years old, but the games haven't aged nearly as much as the hardware needed to play them. Original cartridges suffer from dead save batteries, aging screens, and link cables nobody owns anymore. The good news: you don't need any of that hardware. A modern browser is a perfectly capable GBA.&lt;/p&gt;

&lt;p&gt;I've spent the last few weeks playing GBA titles entirely in the browser, and the experience is better than I expected — provided you actually learn the tools the emulator gives you. Here's the practical guide I wish I'd had.&lt;/p&gt;

&lt;h2&gt;
  
  
  Save states are the real game-changer
&lt;/h2&gt;

&lt;p&gt;Cartridge-era saving was punishing. You saved at fixed points, or not at all — many GBA action games expected you to finish in one sitting. Browser emulators change this completely with save states: a snapshot of the entire machine state you can create and restore at any moment.&lt;/p&gt;

&lt;p&gt;The habit to build: save state before every boss, every difficult jump sequence, every dialogue choice. On &lt;a href="https://playgba.org" rel="noopener noreferrer"&gt;PlayGBA&lt;/a&gt;, the save button sits right on the game page, and guests can save locally in the browser without an account. If you create a free account, saves sync to the cloud so you can start on your laptop and continue on your phone.&lt;/p&gt;

&lt;p&gt;One caution: save states are not the same as the game's built-in save. Use both. In-game saves protect you against browser data being cleared; save states protect you against everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controls: keyboard mapping matters more than you think
&lt;/h2&gt;

&lt;p&gt;The GBA had a D-pad, two face buttons, Start, Select, and two shoulder buttons. On a keyboard, the default mapping usually puts movement on the arrow keys and A/B on Z/X or similar. That works, but for platformers and action games, take two minutes to remap to whatever your fingers expect. Shoulder buttons (L/R) get heavy use in games like Mario Kart: Super Circuit and the Tony Hawk ports — map them to keys your pinkies can actually reach.&lt;/p&gt;

&lt;p&gt;On mobile, touch controls are serviceable for RPGs and turn-based games. For anything requiring precise platforming, pair a Bluetooth controller if you have one; most browsers pass gamepad input straight through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turbo speed: the underrated feature
&lt;/h2&gt;

&lt;p&gt;Turbo (fast-forward) is the feature that makes replaying long RPGs feasible as an adult. Grinding levels in Pokémon Emerald or farming in Harvest Moon no longer takes real-time hours. Toggle turbo during repetitive sections and turn it off for story beats and boss fights. It respects your time without removing the parts that made these games good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance and troubleshooting
&lt;/h2&gt;

&lt;p&gt;If a game stutters: use Chrome or Safari (best WebAssembly performance), close heavy tabs, and disable ad blockers on the game page — some blockers interfere with the emulator's asset loading. Full-screen mode isn't just cosmetic; it reduces compositing overhead on weaker machines.&lt;/p&gt;

&lt;p&gt;One more thing worth knowing: if you own ROM files, you can &lt;a href="https://playgba.org/games/upload-rom" rel="noopener noreferrer"&gt;upload your own ROM&lt;/a&gt; and play it directly in the browser. The file is read locally and never leaves your device — no installation, no account needed. Only load files you own or are authorized to use.&lt;/p&gt;

&lt;p&gt;The GBA library is one of the strongest in gaming history, and for the first time it's genuinely frictionless to revisit. No hardware hunting, no flash carts, no configuration rabbit holes. Just a browser and twenty minutes you were going to spend scrolling anyway.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>software</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
