<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Game-Off on Tiziano Basile | Software Engineer</title><link>https://bstz.it/tags/game-off/</link><description>Recent content in Game-Off on Tiziano Basile | Software Engineer</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Tiziano Basile</copyright><lastBuildDate>Tue, 10 Nov 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://bstz.it/tags/game-off/index.xml" rel="self" type="application/rss+xml"/><item><title>Wild Shift Devlog #1: Your weapon is a byte</title><link>https://bstz.it/p/wild-shift-devlog-1/</link><pubDate>Tue, 10 Nov 2026 00:00:00 +0000</pubDate><guid>https://bstz.it/p/wild-shift-devlog-1/</guid><description>&lt;p&gt;It&amp;rsquo;s November again, which means GitHub Game Off. Last year I built &lt;a class="link" href="https://bstz.it/p/adding-interactive-cockpit-controls-to-grav-sync/" target="_blank" rel="noopener"
&gt;Grav-Sync&lt;/a&gt; in plain JavaScript; this year the theme is &lt;strong&gt;SHIFT&lt;/strong&gt; and my entry is &lt;strong&gt;The Debugger 0x03: Wild Shift&lt;/strong&gt;, a top-down boss rush made with Godot 4.7. You can follow it on &lt;a class="link" href="https://basteez.itch.io/wild-shift" target="_blank" rel="noopener"
&gt;itch.io&lt;/a&gt;, and this post is a mirror of the &lt;a class="link" href="https://basteez.itch.io/wild-shift/devlog/1767483/devlog-1-your-weapon-is-a-byte-building-the-register" target="_blank" rel="noopener"
&gt;first devlog I published there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The idea in one line:&lt;/strong&gt; your weapon is a bit register. Shift it left or right mid-fight, and the two leftmost bits become your two action buttons. A present-day developer and their rubber duck get pulled into a fantasy RPG where the monsters are literal software bugs: Infinite Loop, Null Pointer and Segfault.&lt;/p&gt;
&lt;h2 id="day-1-making-it-run-in-the-browser-epic-1"&gt;Day 1: making it run in the browser (Epic 1)
&lt;/h2&gt;&lt;p&gt;Before writing any gameplay, I wanted the boring stuff to work: a Godot 4.7 project that runs at a locked 60 Hz with pixel-perfect integer scaling, a web export that stays under 30 MB, and a CI pipeline that runs the tests on every pull request.&lt;/p&gt;
&lt;p&gt;Then the shell of the game:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;title screen with &amp;ldquo;press to start&amp;rdquo;&lt;/strong&gt;, because browsers won&amp;rsquo;t play audio before your first input&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Clearing&lt;/strong&gt;, the arena, framed by an IDE-style HUD: register panel on the left, log panel at the bottom, line numbers down the edge&lt;/li&gt;
&lt;li&gt;the whole scene flow with placeholders (Title → Intro → Fight → Harvest → … → Ending)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto-pause&lt;/strong&gt; when you switch tabs, so the boss doesn&amp;rsquo;t kill you while you read Slack&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="days-23-the-shift-has-to-feel-good-epic-2"&gt;Days 2–3: the shift has to feel good (Epic 2)
&lt;/h2&gt;&lt;p&gt;The goal of Epic 2 was simple to say and hard to do: &lt;em&gt;shifting should feel great in an empty arena, before there&amp;rsquo;s anything to fight.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The register is a ring.&lt;/strong&gt; &lt;code&gt;Q&lt;/code&gt; rotates it &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;E&lt;/code&gt; rotates it &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;. It only contains the bits you own, so you can never end up in a dead state. The HUD also shows its byte value, so your build is literally &lt;code&gt;0x03&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shift juice:&lt;/strong&gt; the register slides with a small overshoot bounce, a mechanical key-click (two different sounds for left and right), and your weapon inverts for 4 frames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ATTACK and DASH:&lt;/strong&gt; a 3-hit slash chain and an 8-frame invulnerable dash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ordered combos:&lt;/strong&gt; the order matters. &lt;code&gt;[A, D]&lt;/code&gt; (attack then dash) is &lt;strong&gt;Dash Strike&lt;/strong&gt;, &lt;code&gt;[D, A]&lt;/code&gt; is just a dash followed by a slash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hit feedback:&lt;/strong&gt; hit-stop, glyph particles flying off the target, and every hit printed as a &lt;code&gt;console.log&lt;/code&gt; line.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://bstz.it/p/wild-shift-devlog-1/slash-chain.png"
width="1280"
height="720"
srcset="https://bstz.it/p/wild-shift-devlog-1/slash-chain_hu_46f6b28a07312bd6.png 480w, https://bstz.it/p/wild-shift-devlog-1/slash-chain_hu_9369637b36e4d3a4.png 1024w"
loading="lazy"
alt="The 3-hit slash chain on the practice target"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The 3-hit slash chain on the practice target: glyph particles and damage logged to the console.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://bstz.it/p/wild-shift-devlog-1/dash-strike.png"
width="1280"
height="720"
srcset="https://bstz.it/p/wild-shift-devlog-1/dash-strike_hu_8a2070696764be3.png 480w, https://bstz.it/p/wild-shift-devlog-1/dash-strike_hu_682d7451ef1c86a9.png 1024w"
loading="lazy"
alt="The register after one shift, with the Dash Strike window active"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;After one &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; the active window is &lt;code&gt;[A, D]&lt;/code&gt;: J→K fires a Dash Strike.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Death and retry:&lt;/strong&gt; you have 5 HP, shown as &lt;code&gt;0b11111&lt;/code&gt;. When you die you get &lt;code&gt;Process exited with code 1&lt;/code&gt;, and one key puts you back at the start of the fight in under 2 seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A practice target:&lt;/strong&gt; &lt;code&gt;/* test */&lt;/code&gt;, with infinite HP and a frame counter, so I can check the combo numbers on screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://bstz.it/p/wild-shift-devlog-1/process-exited.png"
width="1280"
height="720"
srcset="https://bstz.it/p/wild-shift-devlog-1/process-exited_hu_2b46cea53c299ce5.png 480w, https://bstz.it/p/wild-shift-devlog-1/process-exited_hu_d38d10e0974effc2.png 1024w"
loading="lazy"
alt="The death screen: Process exited with code 1"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;p&gt;Under the hood the whole simulation is deterministic: it runs on a fixed 60 Hz clock, with seeded randomness and recorded input replays. That means a bug I find while playing can be replayed exactly in a test.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(The &amp;ldquo;FIGHT 1 / boss index 0&amp;rdquo; text in the screenshots is a placeholder: the arena is still waiting for its first boss.)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="how-its-made"&gt;How it&amp;rsquo;s made
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m making this solo, as director and playtester. The code is written by AI agents (Claude), following specs I write and approve with the &lt;a class="link" href="https://github.com/bmad-code-org/BMAD-METHOD" target="_blank" rel="noopener"
&gt;BMAD Method&lt;/a&gt;, the same workflow I described in &lt;a class="link" href="https://bstz.it/p/a-bmad-workflow-end-to-end-shipping-a-feature-the-spec-driven-way/" target="_blank" rel="noopener"
&gt;BMAD, end to end&lt;/a&gt;: game brief → GDD → architecture → one spec per story. Every story is a pull request with code review and automated tests (55 test files by the end of Epic 2). All the design docs are public in the &lt;a class="link" href="https://github.com/basteez/the-debugger-0x3-wild-shift" target="_blank" rel="noopener"
&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="next-up"&gt;Next up
&lt;/h2&gt;&lt;p&gt;The first real bug: &lt;strong&gt;Infinite Loop&lt;/strong&gt;, a snake made of code that repeats its attacks… until you find its weak window. Plus the rubber duck, who finally gets a voice, powered by &lt;a class="link" href="https://github.com/basteez/mumble-speech" target="_blank" rel="noopener"
&gt;mumble-speech&lt;/a&gt;, my own library: v0.3.0 added Godot web support, so the duck can talk in the browser too.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;</description></item></channel></rss>