<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[dpit devlog]]></title><description><![CDATA[dpit devlog]]></description><link>https://dpit.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 02 Nov 2026 23:51:17 GMT</lastBuildDate><atom:link href="https://dpit.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[ORBIT: Bingo Roguelite, my first released game, made solo in Godot 4.7 (UI drawn entirely in _draw())]]></title><description><![CDATA[A deterministic core with no nodes, an exact score preview checked by tests, and a UI drawn in code for 9 languages.]]></description><link>https://dpit.hashnode.dev/orbit-bingo-roguelite-my-first-released-game-made-solo-in-godot-4-7-ui-drawn-entirely-in-draw</link><guid isPermaLink="true">https://dpit.hashnode.dev/orbit-bingo-roguelite-my-first-released-game-made-solo-in-godot-4-7-ui-drawn-entirely-in-draw</guid><category><![CDATA[Godot]]></category><category><![CDATA[GameDev]]></category><category><![CDATA[IndieGame]]></category><dc:creator><![CDATA[dpit]]></dc:creator><pubDate>Wed, 14 Oct 2026 22:39:12 GMT</pubDate><content:encoded><![CDATA[<p>Hi everyone! My first game came out on Steam this week, and since it's built entirely in Godot I wanted to write up how it's made. I made it on my own (a few testers helped), and the launch has been quiet: 21 copies and 2 reviews so far. Both reviews are positive, and I've read them more times than I'd like to admit. So any feedback from fellow Godot devs means a lot.</p>
<img src="https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/5248520/3b7c352628ecc7cbdfe7daf1f110c16ab8aee97e/ss_3b7c352628ecc7cbdfe7daf1f110c16ab8aee97e.1920x1080.jpg" alt="In-game screenshot of ORBIT: Bingo Roguelite. Some of the art shown is AI-generated." style="display:block;margin:0 auto" />

<h2>What the game is</h2>
<p>It's a strategy roguelite on a bingo card. Instead of waiting for the caller, you pick the balls from a tray. The marks stay on the card between hands, so you set up rows, columns and diagonals over several turns and close them all at once. Before every play you see the exact score (CHIPS × MULT), no guessing. 77 jokers, 29 keepers that each bend one rule, 12 stops in 4 rooms per run, a daily seed and no timer. 9 languages, Windows and Linux.</p>
<p>Here are a few things from the build that might be useful to other Godot devs.</p>
<h2>1. A deterministic core with no nodes</h2>
<p>The rules live in a deterministic core with no nodes: plain scripts with a seeded RNG and exact save/restore of the whole state. With the same seed, a run always plays out the same way.</p>
<h2>2. The preview is the result, and the tests prove it</h2>
<p>The score preview is computed by the same engine without touching the state. The test suite checks <code>simulate(a) == apply(a)</code> across many seeds and random moves, so the number you see before you play is exactly the number you get.</p>
<img src="https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/5248520/0715dcf2c53880ff80d2c0d2c3a2c46602ac4776/ss_0715dcf2c53880ff80d2c0d2c3a2c46602ac4776.1920x1080.jpg" alt="The exact score (CHIPS × MULT) is shown before every play. Some of the art shown is AI-generated." style="display:block;margin:0 auto" />

<h2>3. The whole UI is drawn in code with <code>_draw()</code></h2>
<p>Buttons and panels are all drawn in code. That paid off when the game went to 9 languages: not a single image had to be redrawn.</p>
<h2>4. Chinese and Japanese fonts subset with pyftsubset</h2>
<p>The Chinese and Japanese fonts are subset from Noto Sans CJK with pyftsubset, keeping only the characters the game uses. Every time new text is added, a test checks that no character is missing.</p>
<h2>5. Coloured keywords inside plain Labels</h2>
<p>"+30 chips" in blue and "+1 MULT" in red inside plain Labels come from a tiny <code>canvas_item</code> shader over <code>get_character_bounds()</code> rects, so the text layout never changes.</p>
<h2>6. A trailer recorded with Movie Maker</h2>
<p>The trailer was recorded with Godot's Movie Maker by restoring real game states, so all 9 language versions share the same frames.</p>
<img src="https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/5248520/0375355551148fe6fee3585026fc2e0313c77ff4/ss_0375355551148fe6fee3585026fc2e0313c77ff4.1920x1080.jpg" alt="In-game screenshot: the shop. Some of the art shown is AI-generated." style="display:block;margin:0 auto" />

<h2>About AI</h2>
<p>AI disclosure: some of the art is AI-generated (many of the joker cards, most keeper portraits and the story illustrations), and so is the music (made with ACE-Step). The texts and the 9 translations are AI-assisted, and I build the game with AI coding agents (Claude and Codex) that I direct and review. The balls, the bingo cages, the mechanical keepers and some jokers are Blender renders, the UI is drawn in code, and the sound effects are synthesized by script. Nothing is generated by AI while you play.</p>
<h2>Wrapping up</h2>
<p>This is my first release and I'm still learning a lot. If something is confusing or broken, please tell me, and I'm happy to go deeper on any of the technical bits in the comments.</p>
<p>It's 9.99 USD, 20% off until October 21.</p>
<p>Steam: <a href="https://store.steampowered.com/app/5248520/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=lanzamiento1410&amp;utm_content=hashnode_1015">https://store.steampowered.com/app/5248520/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=lanzamiento1410&amp;utm_content=hashnode_1015</a></p>
]]></content:encoded></item></channel></rss>