<?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="https://blog.roboinstruct.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.roboinstruct.us/" rel="alternate" type="text/html" /><updated>2025-07-26T18:44:17+00:00</updated><id>https://blog.roboinstruct.us/feed.xml</id><title type="html">Robo Instructus devblog</title><subtitle>Updates on the development of coding puzzler Robo Instructus</subtitle><entry><title type="html">Robo Instructus: 5 Years Old</title><link href="https://blog.roboinstruct.us/2024/07/16/5-years-old.html" rel="alternate" type="text/html" title="Robo Instructus: 5 Years Old" /><published>2024-07-16T00:00:00+00:00</published><updated>2024-07-16T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2024/07/16/5-years-old</id><content type="html" xml:base="https://blog.roboinstruct.us/2024/07/16/5-years-old.html"><![CDATA[<p>Robo Instructus was released 5 years ago today, time flies! Let’s take a look at the last 12 months.</p>

<p><img src="/assets/2024-07-16/update.jpg" alt="" title="1.35.1 Update &amp; 5th Anniversary" />
<!--more--></p>

<p>In the last year there have been just a couple of updates <a href="https://github.com/big-ab-games/robo-instructus/releases/tag/1.35">1.35</a> in December &amp; <a href="https://github.com/big-ab-games/robo-instructus/releases/tag/1.35.1">1.35.1</a> today. The game is fairly old now and I don’t expect to make any big changes to it other than continuing to maintain the game &amp; ensure it runs well.</p>

<p>This is probably the last year I’ll do this post publishing sales info, I think the first 5 years are probably more than enough to satisfy anyone’s curiosity.</p>

<table>
  <thead>
    <tr>
      <th>Sales by platform</th>
      <th> </th>
      <th>In the last year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Steam</td>
      <td>4882</td>
      <td>439</td>
    </tr>
    <tr>
      <td>itch.io</td>
      <td>45</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

<p>The vast majority of sales continue to be on Steam. Pretty similar to last year. 9% of sales coming in the 5th year actually seems a pretty good tail.</p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by region</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>United States</td>
      <td>33%</td>
    </tr>
    <tr>
      <td>Russian Federation</td>
      <td>9%</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>6%</td>
    </tr>
    <tr>
      <td>Brazil</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>Canada</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>Netherlands</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>France</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Australia</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Japan</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Other</td>
      <td>29%</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by OS</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows*</td>
      <td>86.0%</td>
    </tr>
    <tr>
      <td>Linux</td>
      <td>9.4%</td>
    </tr>
    <tr>
      <td>Mac</td>
      <td>4.6%</td>
    </tr>
  </tbody>
</table>

<p><em>* Steam doesn’t actually count Windows explicitly, so this tally is the sales that are <strong>not</strong> counted as Linux or Mac.</em></p>

<h2 id="feedback">Feedback</h2>
<p>On Steam the game is currently rated <strong>Very Positive</strong> with <strong>84% of 58</strong> user reviews. It’s always lovely to a see new positive user review appear.</p>

<h2 id="demo">Demo</h2>
<p>The game has always had a demo available since release, so why not also look at the demo install stats from Steam.</p>

<table>
  <thead>
    <tr>
      <th>Steam demo installs</th>
      <th>In the last year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22980</td>
      <td>5853</td>
    </tr>
  </tbody>
</table>

<p><strong>So after 5 years I can say Robo Instructus didn’t really make much money, but I’m proud of what I made.</strong>
<strong>To everyone that played my little game about programming: Cheers!</strong></p>

<p><em>You can play the Robo Instructus demo and buy the game on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>.</em></p>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Robo Instructus was released 5 years ago today, time flies! Let’s take a look at the last 12 months.]]></summary></entry><entry><title type="html">Robo Instructus: 4 Years Old</title><link href="https://blog.roboinstruct.us/2023/07/16/4-years-old.html" rel="alternate" type="text/html" title="Robo Instructus: 4 Years Old" /><published>2023-07-16T00:00:00+00:00</published><updated>2023-07-16T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2023/07/16/4-years-old</id><content type="html" xml:base="https://blog.roboinstruct.us/2023/07/16/4-years-old.html"><![CDATA[<p>Robo Instructus came out 4 years ago today. Let’s take a look at the last 12 months.</p>

<p><img src="/assets/2023-07-16/sales-heatmap.png" alt="" title="Steam sales heatmap" />
<!--more--></p>

<p>In the last year there have been just a couple of updates released <a href="https://github.com/big-ab-games/robo-instructus/releases/tag/1.34.1">1.34.1</a> &amp; <a href="https://github.com/big-ab-games/robo-instructus/releases/tag/1.34.2">1.34.2</a>. They each included fixes and optimisations.</p>

<p>To highlight a particular optimisation I added runtime detected AVX2/SSE4.2 optimisations to text rendering glyph rasterization (<a href="https://github.com/alexheretic/ab-glyph/pull/66">alexheretic/ab-glyph#66</a>). They make one part of the complex text rendering process significantly faster for ~99% of players. For those interested in SIMD optimisation in rust I wrote a piece on how I went about this work back in November: <a href="https://alexheretic.github.io/posts/auto-avx2/">Getting rustc to use AVX2 SIMD</a>.</p>

<p>I aim to continue to maintain the game ensuring it runs well and benefits from improvements in the wider OSS rust ecosystem.</p>

<table>
  <thead>
    <tr>
      <th>Sales by platform</th>
      <th> </th>
      <th>In the last year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Steam</td>
      <td>4436</td>
      <td>452</td>
    </tr>
    <tr>
      <td>itch.io</td>
      <td>44</td>
      <td>5</td>
    </tr>
  </tbody>
</table>

<p>The vast majority of sales continue to be on Steam. Down a little from 618 last year.</p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by region</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>United States</td>
      <td>30%</td>
    </tr>
    <tr>
      <td>Russian Federation</td>
      <td>9%</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>8%</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>France</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Netherlands</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Brazil</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Canada</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>China</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Japan</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Other</td>
      <td>31%</td>
    </tr>
  </tbody>
</table>

<p><img src="/assets/2020-07-16/os.jpg" alt="" title="Linux still has 100% share of my heart" /></p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by OS</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows*</td>
      <td>85.7%</td>
    </tr>
    <tr>
      <td>Linux</td>
      <td>10.0%</td>
    </tr>
    <tr>
      <td>Mac</td>
      <td>4.3%</td>
    </tr>
  </tbody>
</table>

<p><em>* Steam doesn’t actually count Windows explicitly, so this tally is the sales that are <strong>not</strong> counted as Linux or Mac.</em></p>

<h2 id="feedback">Feedback</h2>
<p>On Steam the game is currently rated <strong>Very Positive</strong> with <strong>83% of 55</strong> user reviews. Great to see some new user reviews appearing this year.</p>

<p><em>You can play the Robo Instructus demo and buy the game on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>.</em></p>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Robo Instructus came out 4 years ago today. Let’s take a look at the last 12 months.]]></summary></entry><entry><title type="html">Robo Instructus: 3 Years Old</title><link href="https://blog.roboinstruct.us/2022/07/16/3-years-old.html" rel="alternate" type="text/html" title="Robo Instructus: 3 Years Old" /><published>2022-07-16T00:00:00+00:00</published><updated>2022-07-16T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2022/07/16/3-years-old</id><content type="html" xml:base="https://blog.roboinstruct.us/2022/07/16/3-years-old.html"><![CDATA[<p>Robo Instructus came out 3 years ago today. Let’s take a look at the last 12 months.</p>

<p><img src="/assets/2022-07-16/sales-heatmap.png" alt="" title="Steam sales heatmap. I can't think what else to use as a header image for these..." />
<!--more--></p>

<p><em>To celebrate 3 years Robo Instructus is 50% off on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a> for the next 7 days.</em></p>

<p>The game has received a few updates over the year, the latest <em>1.34</em>. Notable improvements include full game translations in Español (es) &amp; 简体中文 (zh-CN) these were contributed by generous multilingual heroes to <a href="https://github.com/big-ab-games/robo-instructus-translation">the OSS translation repo</a> just under a year ago. I also added autocomplete configuration allowing completion using the return key <code class="language-plaintext highlighter-rouge">↲</code> &amp; improved the scroll bar usability in September.</p>

<p><img src="https://user-images.githubusercontent.com/2331607/127686072-b3a28e10-7472-4b91-9974-8485da7cc94d.jpg" alt="" title="zh-CN translation in action" /></p>

<table>
  <thead>
    <tr>
      <th>Sales by platform</th>
      <th> </th>
      <th>In the last year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Steam</td>
      <td>3984</td>
      <td>618</td>
    </tr>
    <tr>
      <td>itch.io</td>
      <td>39</td>
      <td>5</td>
    </tr>
  </tbody>
</table>

<p>The vast majority of sales continue to be on Steam. Down from 822 last year which is to be expected as the game ages.</p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by region</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>United States</td>
      <td>28%</td>
    </tr>
    <tr>
      <td>Russian Federation</td>
      <td>19%</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>7%</td>
    </tr>
    <tr>
      <td>Brazil</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>China</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Canada</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Sweden</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Ukraine</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>France</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Other</td>
      <td>26%</td>
    </tr>
  </tbody>
</table>

<p><img src="/assets/2020-07-16/os.jpg" alt="" title="Linux still has 100% share of my heart" /></p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by OS</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows*</td>
      <td>86.2%</td>
    </tr>
    <tr>
      <td>Linux</td>
      <td>7.9%</td>
    </tr>
    <tr>
      <td>Mac</td>
      <td>5.9%</td>
    </tr>
  </tbody>
</table>

<p><em>* Steam doesn’t actually count Windows explicitly, so this tally is the sales that are <strong>not</strong> counted as Linux or Mac.</em></p>

<h2 id="feedback">Feedback</h2>
<p>On Steam the game is currently rated <strong>Very Positive</strong> with <strong>80% of 50</strong> user reviews, nice to see the “very” qualifier there now! I guess having at least 50 reviews is a requisite.</p>

<h3 id="achievements">Achievements</h3>
<p><img src="/assets/2022-07-16/cheevos-2022.png" alt="" title="It's still hard" /></p>

<p>Looking at a couple of choice Steam achievements, <strong>The Gist</strong> which you get for completing the 4th level <em>(ie you’ve actually had a go at the game)</em> is 65%, up again from 63.6 last year. <strong>Open The Vault</strong> which you get for completing the game is at 0.7%, down from 0.8. So I guess a few more people have played the game this year, but struggle to complete the whole thing.</p>

<p><em>You can play the Robo Instructus demo and buy the game on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>.</em></p>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Robo Instructus came out 3 years ago today. Let’s take a look at the last 12 months.]]></summary></entry><entry><title type="html">Robo Instructus: 2 Years Old</title><link href="https://blog.roboinstruct.us/2021/07/16/2-years-later.html" rel="alternate" type="text/html" title="Robo Instructus: 2 Years Old" /><published>2021-07-16T00:00:00+00:00</published><updated>2021-07-16T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2021/07/16/2-years-later</id><content type="html" xml:base="https://blog.roboinstruct.us/2021/07/16/2-years-later.html"><![CDATA[<p>Today Robo Instructus is 2 years old. Let’s take a look at how it did in the last 12 months.</p>

<p><img src="/assets/2021-07-16/heatmap.png" alt="" title="Steam sales heatmap" />
<!--more--></p>

<p><em>To celebrate 2 years Robo Instructus is 50% off on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a> for the next 7 days.</em></p>

<p>The game has received 9 updates over the year, the latest <em>1.31.4</em>. Most notably the game completed a full German translation thanks to community contribution <em>(all translations are done in the open so anyone can help improve <a href="https://github.com/big-ab-games/robo-instructus-translation">them on github</a>)</em>.
The updates also brought QoL improvements like auto-scrolling to code errors/while debugging, along with bug fixes and code maintenance.</p>

<table>
  <thead>
    <tr>
      <th>Sales by platform</th>
      <th> </th>
      <th>In the last year</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Steam</td>
      <td>3366</td>
      <td>822</td>
    </tr>
    <tr>
      <td>itch.io</td>
      <td>34</td>
      <td>7</td>
    </tr>
  </tbody>
</table>

<p>The vast majority of sales continue to be on Steam.</p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by region</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>United States</td>
      <td>23%</td>
    </tr>
    <tr>
      <td>Russian Federation</td>
      <td>21%</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>9%</td>
    </tr>
    <tr>
      <td>France</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>China</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>Brazil</td>
      <td>3%</td>
    </tr>
    <tr>
      <td>Poland</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Canada</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Japan</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Other</td>
      <td>24%</td>
    </tr>
  </tbody>
</table>

<p><img src="/assets/2020-07-16/os.jpg" alt="" /></p>

<table>
  <thead>
    <tr>
      <th>Last year Steam sales by OS</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows*</td>
      <td>88.3%</td>
    </tr>
    <tr>
      <td>Linux</td>
      <td>9.0%</td>
    </tr>
    <tr>
      <td>Mac</td>
      <td>2.7%</td>
    </tr>
  </tbody>
</table>

<p><em>* Steam doesn’t actually count Windows explicitly, so this tally is the sales that are <strong>not</strong> counted as Linux or Mac.</em></p>

<h2 id="feedback">Feedback</h2>
<p>On Steam the game is currently rated <strong>Positive</strong> with <strong>84% of 45</strong> user reviews, a similar place to last year.</p>

<h3 id="achievements">Achievements</h3>
<p><img src="/assets/2021-07-16/cheevos.png" alt="" title="It's still hard" /></p>

<p>Looking at a couple of choice Steam achievements, <strong>The Gist</strong> which you get for completing the 4th level <em>(ie you’ve actually had a go at the game)</em> is 63.6%, up from 60.9 last year. <strong>Open The Vault</strong> which you get for completing the game is at 0.8%, up from 0.7. So more people have played, and a few have even managed to complete, the game this year. Good job!</p>

<p><em>You can play the Robo Instructus demo and buy the game on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>.</em></p>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Today Robo Instructus is 2 years old. Let’s take a look at how it did in the last 12 months.]]></summary></entry><entry><title type="html">Robo Instructus: 1 Year Later</title><link href="https://blog.roboinstruct.us/2020/07/16/1-year-later.html" rel="alternate" type="text/html" title="Robo Instructus: 1 Year Later" /><published>2020-07-16T00:00:00+00:00</published><updated>2020-07-16T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2020/07/16/1-year-later</id><content type="html" xml:base="https://blog.roboinstruct.us/2020/07/16/1-year-later.html"><![CDATA[<p>One year ago today Robo Instructus was released on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>. It has received regular updates since then, the latest version 1.28 landing in late May. <strong><em>But how did it do?</em></strong></p>

<p><img src="/assets/2020-07-16/sales-heatmap.png" alt="" title="Steam sales heatmap" />
<!--more--></p>

<table>
  <thead>
    <tr>
      <th>Sales by platform</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Steam</td>
      <td>2544</td>
    </tr>
    <tr>
      <td>itch.io</td>
      <td>27</td>
    </tr>
  </tbody>
</table>

<p>The vast majority of sales came from Steam. The Steam dashboard provides a couple of interesting breakdowns.</p>

<table>
  <thead>
    <tr>
      <th>Steam sales by region</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>United States</td>
      <td>29%</td>
    </tr>
    <tr>
      <td>Russian Federation</td>
      <td>14%</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>10%</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>7%</td>
    </tr>
    <tr>
      <td>France</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>China</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>Canada</td>
      <td>4%</td>
    </tr>
    <tr>
      <td>Netherlands</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Sweden</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Australia</td>
      <td>2%</td>
    </tr>
    <tr>
      <td>Other</td>
      <td>22%</td>
    </tr>
  </tbody>
</table>

<p>The majority of sales came from the US, not too surprising. Good sales from Russia &amp; Germany too.</p>

<p><img src="/assets/2020-07-16/os.jpg" alt="" /></p>

<table>
  <thead>
    <tr>
      <th>Steam sales by OS</th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows*</td>
      <td>89.7%</td>
    </tr>
    <tr>
      <td>Linux</td>
      <td>7.6%</td>
    </tr>
    <tr>
      <td>Mac</td>
      <td>2.7%</td>
    </tr>
  </tbody>
</table>

<p>The game was developed on Linux and launched with Linux &amp; Windows support. Mac support came a little later. Unsurprisingly, the majority of players use Windows.</p>

<p><em>* Steam doesn’t actually count Windows explicitly, so this tally is the sales that are <strong>not</strong> counted as Linux or Mac.</em></p>

<h3 id="sales-analysis">Sales analysis</h3>
<p>I don’t think too many conclusions can be drawn from a small game like this, but there is a fairly safe conclusion for indie game developers.</p>

<blockquote>
  <p>Make a Windows version and put it on Steam.</p>
</blockquote>

<h2 id="player-feedback--reviews">Player feedback &amp; reviews</h2>
<p>Sadly the game was largely ignored by the gaming press on release. However, it did feature on the front page of Steam for a full 24 hours. I’m still not sure why really, but this surely had the biggest impact on the getting this game noticed. Thanks Steam. No thanks press.</p>

<p>Right now the game is rated <strong>Positive</strong> on Steam with <strong>86% of 37</strong> user reviews. The number of these may be interesting relative to the sales numbers. I think this rating is often glanced at, so I’m grateful it’s positive. I’ll definitely be adding positive reviews for games I enjoy with sub-1000 reviews in future, it really helps.</p>

<h3 id="achievements">Achievements</h3>
<p><img src="/assets/2020-07-16/cheevos.png" alt="" title="It's hard" /></p>

<p>I’m not a huge fan of achievements, but I think a smaller number of them (that actually mean something) <em>can</em> add value overall. Each one of the above requires actual effort. For this kind of linear game they also show roughly how far players progressed.</p>

<p>It’s clear that players struggle to progress deeply into Robo Instructus with only <strong>5% completing act 2</strong> (of 4). That’s a shame as I was hoping more people would see the probe+robot concurrent programming of the 4th act. I’d really like to improve this, perhaps I can make changes to soften the difficulty curve and help more people enjoy the latter parts of the game.</p>

<p>On the other hand, of those 5% the drop off to completing the game isn’t too bad. Really, people have <strong>actually completed</strong> this hard as nails game I put out, programming in a language I made up. That’s pretty cool, there are some clever gamers out there for sure!</p>

<h2 id="final-remarks">Final remarks</h2>
<p>People mostly don’t publish sales figures, I guess it makes more business sense to be vague. But maybe these will be helpful or interesting in some way.</p>

<p>The ultimate personal takeaway was that the sales couldn’t justify me making yet more games full time as I did Robo Instructus. I went back to a regular software engineering job in October 2019.</p>

<p>I’m still convinced there’s legs in programming as a game mechanic. I really think Robo Instructus offers something that nothing else on the market quite does. I’d love to experiment more, I wonder where else <em>games-where-you-code</em> can take us?</p>

<h5 id="comment-on-twitter">Comment on <a href="https://twitter.com/bigabgames/status/1283813542613921797">twitter</a></h5>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[One year ago today Robo Instructus was released on Steam &amp; itch.io. It has received regular updates since then, the latest version 1.28 landing in late May. But how did it do?]]></summary></entry><entry><title type="html">Otf Font Rendering or: How I Should Have Learned To Stop Worrying And Love The Ttf</title><link href="https://blog.roboinstruct.us/2020/05/24/the-otf-journey.html" rel="alternate" type="text/html" title="Otf Font Rendering or: How I Should Have Learned To Stop Worrying And Love The Ttf" /><published>2020-05-24T00:00:00+00:00</published><updated>2020-05-24T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2020/05/24/the-otf-journey</id><content type="html" xml:base="https://blog.roboinstruct.us/2020/05/24/the-otf-journey.html"><![CDATA[<p>While developing Robo Instructus I spent an inordinate amount of time messing about with text rendering. After releasing the game last year, I’d thought my time diving into the glyph filled rabbit hole of <em>text</em> would be over… This was not to be, my text-retirement came to an end with a thought:</p>

<blockquote>
  <p><strong>How hard can it be to get otf fonts working?</strong></p>
</blockquote>

<p><img src="/assets/2020-05-23/top.png" alt="" title="glyph_brush text rendering" />
<!--more--></p>

<p>Robo Instructus is quite a “low-level” game in terms of its technology. It uses its own custom OpenGL engine written in rust. If you make a game like this then rendering text is not solved for you. You have to roll up your sleeves or find a library. Back in 2017 the libs that were available weren’t good enough in terms of features or performance. So I made my own <a href="https://github.com/alexheretic/glyph-brush">glyph_brush</a>. I wrote about some of the technical details of that in 2018.</p>
<ul>
  <li><a href="/2018/05/18/technical-look-at-text-rendering-in-robo-instructus.html">Technical Look At Text Rendering In Robo Instructus</a></li>
  <li><a href="/2018/05/25/technical-look-at-text-rendering-in-robo-instructus-ii.html">Faster Screen Text Rendering</a></li>
</ul>

<p>glyph_brush itself was based on a cool library that <em>was</em> available at the time <a href="https://gitlab.redox-os.org/redox-os/rusttype">rusttype</a>. rusttype handled the manipulation &amp; rasterization of individual glyphs but only supported ttf fonts, so glyph_brush only supported ttf fonts. So I just used ttf fonts in Robo Instructus and all was well.</p>

<h2 id="the-crease-in-the-sheet">The crease in the sheet</h2>
<p>In the later stages of development I was looking at supporting other languages, like Russian, but I found that not all the fonts I used could support things like Cyrillic glyphs &amp; Chinese. For the latter I used a whole separate set of fonts. For Russian I found a replacement font quite similar to what I was using for English (Exo.ttf) that <em>did</em> support Cyrillic glyphs: <strong>Exo2.otf</strong>.</p>

<p>Of course, the hitch was this was an otf font and it didn’t work with rusttype. At the time I found that adding otf support to rusttype meant tackling a whole bunch of stuff that I didn’t really understand. Parsing the font files themselves isn’t at all trivial, and didn’t look fun at all the code rusttype used was a mess of magic numbers. I didn’t fully understand rusttype’s rasterization logic either, but I could see it only supported lines and quadratic curves. To support otf it would need to support <a href="https://en.wikipedia.org/wiki/B%C3%A9zier_curve"><em>cubic bezier curves</em></a>.</p>

<p><img src="/assets/2020-05-23/q-c-beziers.png" alt="" title="left: ttf, right: otf" /></p>

<p>This was a bit much at the time. I decided to forget about all this and just use the best ttf fonts I could find and get the game done. So I did exactly that.</p>

<p>There were no complaints at the lack of cubic beziers in the games text. There were no issues in glyph_brush’s or rusttype’s repos asking for otf support. All was well.</p>

<p>Except I didn’t forget. This stuck in my mind as a crease in the sheet I couldn’t flatten yet. I had a vague ambition to “solve” this after the game’s release.</p>

<h2 id="the-call-to-arms">The call to arms</h2>
<p>In mid 2019 <a href="https://gitlab.redox-os.org/redox-os/rusttype/issues/137">an issue</a> appeared in rusttype’s repo about a new font parser crate <a href="https://github.com/RazrFalcon/ttf-parser">ttf-parser</a> that could parse otf &amp; ttf fonts. This presented a solution to half the problem, parsing the otf files properly.</p>

<p>When I tried migrating rusttype to ttf-parser I found more issues still. Just using it at all proved to be a challenge. I ended up having to handle a self-referential struct in rust, which isn’t really very nice. Having to crack out the dreaded <code class="language-plaintext highlighter-rouge">unsafe</code> keyword is something I try to avoid if I can.</p>

<h2 id="drawing-cubic-beziers">Drawing cubic beziers</h2>
<p>Enventually I did solve those issues and got rusttype working using ttf-parser, but the cubic bezier problem remained. I realised I just didn’t understand rusttype’s rasterization code. I’d written regression tests for it, benchmarks to track performance. I’d optimised it by removing hashing. But I’d never <em>really</em> understood exactly what it was really doing.</p>

<p>This is a problem if I want to try to draw a more complex curve. I started looking around elsewhere to see if this problem has been solved by cleverer people. I remembered reading about <a href="https://github.com/raphlinus/font-rs">font-rs</a> and its fast rasterization. When I dug into the code I found it didn’t support cubic curves either, but it was much smaller &amp; nicer code compared with rusttype’s rasterization. I mean I didn’t understand it 100% either, but at least there was <em>less</em> of it.</p>

<p>Rusttype was initially based on a c library <a href="https://github.com/nothings/stb/blob/master/stb_truetype.h">stb_truetype</a> and I was also aware that this lib now supported otf. So I figured there must be some cubic curve logic in there somewhere… Yes what’s this <code class="language-plaintext highlighter-rouge">stbtt__tesselate_cubic</code> that seems kinda cubic-y. If I squinted in the right way I could kinda see what it was doing too. It recursively approximated a cubic curve into lines.</p>

<p>This presented an opportunity to smoosh font-rs, which could draw lines &amp; quadratic curves, together with stb_truetype’s cubic curve approximation into lines (if I could translate that properly into rust). I was quite surprised when this actually worked. I had created <a href="https://github.com/alexheretic/ab-glyph/tree/master/rasterizer">ab_glyph_rasterizer</a> that could draw all 3 kinds of curves I needed for ttf &amp; otf fonts, and it was <em>fast</em>.</p>

<blockquote margin="auto" class="twitter-tweet tw-align-center" data-theme="dark"><p lang="en" dir="ltr">Hey it actually worked! OTF font support thanks to ttf-parser and a new rasterizer I&#39;m working on that can actually render those pesky cubic beziers. Coming soon to rusttype, glyph-brush &amp; Robo Instructus.<br /><br />Example: Exo2-Light.otf<a href="https://twitter.com/hashtag/rustlang?src=hash&amp;ref_src=twsrc%5Etfw">#rustlang</a> <a href="https://twitter.com/hashtag/gamedev?src=hash&amp;ref_src=twsrc%5Etfw">#gamedev</a> <a href="https://t.co/Q5OZxllGNX">pic.twitter.com/Q5OZxllGNX</a></p>&mdash; Big AB Games (@bigabgames) <a href="https://twitter.com/bigabgames/status/1247656705598590978?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="new-sheets-new-creases">New sheets, new creases</h2>
<p>I delivered otf support to rusttype 0.9 using ttf-parser &amp; my new rasterization crate. During this work I’d also found that rusttype’s API wasn’t really ideal for otf performance characteristics. rusttype is eager to use pixel bounds for glyphs, for otf fonts (in general) this is quite expensive. This meant otf layout performance was kinda bad compared to ttf.</p>

<p>Designing rusttype to <em>not</em> do this in a nice way was quite difficult. I ended up experimenting on a total rewrite to solve this and other performance issues I had with rusttype. <a href="https://github.com/alexheretic/ab-glyph/tree/master/glyph">ab_glyph</a> was born, like rusttype but otf was as fast as ttf overall <strong>~1.5-8.8x faster</strong> than rusttype for laying out glyphs in a paragraph.</p>

<p>This was great, but more work and churn for the libraries downstream of rusttype/ab_glyph. I rolled up my sleeves and converted glyph_brush and finally Robo Instructus itself.</p>

<h2 id="the-tragic-reveal">The tragic reveal</h2>
<p>Now, sometime after I’d got rasterization working for cubic curves I went looking for the <strong>Exo2.otf</strong> font that had ultimately been responsible for all this effort in the first place. I was going to be satisfying to see this font render now after all my work. On my search though, I found something <strong>horrifying</strong>. Next to the otf font folder i saw a … <strong>ttf</strong> folder.</p>

<p align="center">
  <img align="center" src="/assets/2020-05-23/exo2-dirs.png" title="Oh no..." />
</p>

<p>Yes the entire Exo2 family is available in ttf. It probably was all along. I could have, <em>should have</em> just downloaded and used these &amp; shrugged my shoulders about otf years ago.</p>

<p>You have to laugh at yourself when you’ve not only moved mountains to achieve the following, quite subtle, change (which is kinda funny anyway) but after everything you could have done it without any real work.</p>

<p align="center">
  <img align="center" src="https://user-images.githubusercontent.com/2331607/82735754-e7642800-9d1b-11ea-9a8f-d38a3621a1ea.gif" />
</p>

<p>At the end of the day otf support is still nice to have in the stack. I hope others find it useful. And if you ask, did I use the Exo2.ttf or Exo2.otf in the end? The bloody <strong>otf</strong> one of course!</p>

<h5 id="comment-on-twitter--reddit">Comment on <a href="https://twitter.com/bigabgames/status/1264557215693918209">twitter</a> | <a href="https://www.reddit.com/r/rust_gamedev/comments/gpsrkz/otf_font_rendering_or_how_i_should_have_learned/">reddit</a></h5>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[While developing Robo Instructus I spent an inordinate amount of time messing about with text rendering. After releasing the game last year, I’d thought my time diving into the glyph filled rabbit hole of text would be over… This was not to be, my text-retirement came to an end with a thought: How hard can it be to get otf fonts working?]]></summary></entry><entry><title type="html">Compare Against Your Friends</title><link href="https://blog.roboinstruct.us/2019/08/02/better-than-your-friends.html" rel="alternate" type="text/html" title="Compare Against Your Friends" /><published>2019-08-02T00:00:00+00:00</published><updated>2019-08-02T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2019/08/02/better-than-your-friends</id><content type="html" xml:base="https://blog.roboinstruct.us/2019/08/02/better-than-your-friends.html"><![CDATA[<p>Hot on the heels of last week’s score visualisation improvements, today brings Robo Instructus <strong>1.3</strong>. The big new feature is one I’ve been planning to have for a long time now, comparing your best scores against your friends.</p>

<p><img src="/assets/2019-08-02/top.jpg" alt="" title="Wtf! I made the game ffs!" />
<!--more--></p>

<p>This feature is a close one to my heart. <em>Being better than most of the world?</em> Nah I’m ok thanks, sounds hard. <em>Being better than your mates?</em> Let’s do it!</p>

<p><img src="https://user-images.githubusercontent.com/2331607/62379292-92fa7c80-b53e-11e9-8a79-4bd486edf725.jpg" alt="" title="Solution size is the true score really, honestly I can't really remember why I included the others now that I think about it. There's probably a bug too maybe. Plus I wasn't really trying anyway. These things don't bother me at all, I'm totally laid back about these things." /></p>

<p>Or maybe not.</p>

<p>Right now this is limited to Steam users, as I’m not sure there’s anything similar to the friend system over on Itch. Though it is implemented in a general purpose way that could work with other stores in future.</p>

<h2 id="global-best-score-capping">Global best score capping</h2>
<p>The game’s score graphs are generally doing their job well, particularly now outliers are filtered out. However, there is another area where I wasn’t satisfied with how they were being interpreted. When I published 1.1 I explained how the score bars work with this image.</p>

<p><img src="/assets/2019-08-02/1.1-graph.jpg" alt="" title="Scores ala 1.1 explained" /></p>

<p>This image explains that the score summaries group scores into ranges, or buckets, of scores to show approximately where most other players are. The it’s possible no player got the bottom of the range.</p>

<p>However, new players are still taking a look at these graphs and reading that their early solutions aren’t optimal when in some ways they might be. This really isn’t ideal so I set to thinking of simple ways to improve the clarity, particularly in the early levels.</p>

<p>I settled on tracking the global lowest score anyone has achieved and including this in the score summary. The graphs can then cap the left most bar to that global lowest score. This makes the graphs less uniform and could result in very thin left bars in some cases. However, it does add value now the graphs show the best score that anyone has got on all levels.</p>

<p><img src="/assets/2019-08-02/capped.jpg" alt="" title="Yep, you can solve this level with a solution size of 4 phrases. The other two are perfect though so chin up!" /></p>

<p>In the early levels it’ll much more clearly show you that yes your solution actually was optimal and it’s nice to see just how low people can get the scores even when yours isn’t the lowest (this is most of the time for me).</p>

<h5 id="comment-on-twitter--facebook">Comment on <a href="https://twitter.com/bigabgames/status/1157330395320541184">twitter</a> | <a href="https://www.facebook.com/bigabgames/posts/2587119501375421">facebook</a></h5>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Hot on the heels of last week’s score visualisation improvements, today brings Robo Instructus 1.3. The big new feature is one I’ve been planning to have for a long time now, comparing your best scores against your friends.]]></summary></entry><entry><title type="html">Released But Still Getting Better</title><link href="https://blog.roboinstruct.us/2019/07/26/released-and-improving.html" rel="alternate" type="text/html" title="Released But Still Getting Better" /><published>2019-07-26T00:00:00+00:00</published><updated>2019-07-26T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2019/07/26/released-and-improving</id><content type="html" xml:base="https://blog.roboinstruct.us/2019/07/26/released-and-improving.html"><![CDATA[<p>On the 16th July Robo Instructus was released on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a> for Linux &amp; Windows. But development is not over just yet. Today I’ll be releasing Robo Instructus 1.2 (<a href="https://github.com/big-ab-games/robo-instructus/releases/tag/1.2">release notes</a>).</p>

<p align="center">
  <img align="center" src="/assets/2019-07-26/best-comparison-time.jpg" />
</p>
<!--more-->

<h2 id="having-a-peek">Having a peek</h2>
<p>One cool thing about releasing a game in 2019, even a small one, is that you’ll be able to find videos of people playing it. This is really interesting &amp; valuable to me as I haven’t been able to observe as much playtesting as I’d have liked over the course of development. So I’ve been having a peek at the youtube &amp; twitch videos of the game.</p>

<p>Overall the game seems to be working pretty much as expected. I’m fairly happy with the difficulty curve through the crucial first act of the game. Of course this is a difficult game, even more so if you haven’t programmed before. But the determined <em>are</em> succeeding and it looks like the game is mostly communicating it’s concepts successfully. Of coures there were also some areas that I wanted to improve.</p>

<h2 id="you-didnt-read-it">You didn’t read it!</h2>
<p>When you unlock functions &amp; primer sections throughout the game, they can withstand being ignored. I expect some players to not read things up front in detail, instead return to a concept then they struggle. So the code reference and message archive store all unlocked information. There’s also a company inbox to re-read those messages.</p>

<p>One thing you can’t see again though is the overlay tutorial messages. I think mostly this is ok, but in at least one case this hasn’t been ideal.</p>

<p><img src="/assets/2019-07-26/change-speed.jpg" alt="" /></p>

<p>Knowing that you can change the game speed is really important. <em>Actually take note <strong>Sins of a Solar Empire</strong>, I played so many 100% slow speed games of you!</em></p>

<p>In v1.0 if you ignore earlier tutorials you could never even see this important UI tutorial. In v1.1 I fixed this in 1.1 so that it will always appear in the 2nd level… But players <em>still</em> missed it. So in the 1.2 this tutorial just won’t disappear until you click it.</p>

<h2 id="improving-optimisation">Improving optimisation</h2>
<p>Lots of players like optimising their scores and generally I’d say the scoring mechanism has gone over well. I wanted to make the feedback better for when you improve a solution and run it again. Currently it can be hard to know if the new solution was actually any better, you pretty much had to remember what it used to be.</p>

<p>So let’s say you’ve just solved <em>Use Your Powers Wisely</em> and you see a way to solve it faster. New in 1.2 when you run you’re new and improved solution you’ll see this.</p>

<p><img src="https://user-images.githubusercontent.com/2331607/61949715-a12b2480-afa3-11e9-9d2d-734cde91a79e.gif" alt="" title="Getting faster on Use Your Powers Wisely" /></p>

<p>As before your best scores are saved and shown in the graph. But now the game will remember your <em>previous</em> best score before the latest run and tell you if you did better. It’ll also show much more clearly if the new faster solution is a little worse than your best when it comes to <em>Solution</em> &amp; <em>Run</em> sizes.</p>

<h2 id="graph-squashing">Graph squashing</h2>
<p>There’s a bit of a flaw with the game’s graphs that never mattered too much with the smaller alpha &amp; beta communities. If someone gets a poor score it will be shown on the linear graphs with the rest, but if it’s a <strong>very</strong> poor score (or very optimised in another area perhaps) it’ll end up squashing the majority of the scores into the left of the graph.</p>

<p>It is interesting to see these extremely bad scores, but it also harms the ability for players to see how well they’re doing compared to others. My solution is to filter out scores more than 2.5 standard deviations worse than the mean. But this can also be disabled if you want to see the outliers.</p>

<p><img src="https://user-images.githubusercontent.com/2331607/61949239-0bdb6080-afa2-11e9-973c-7070471d555e.gif" alt="" title="Graph squashing on Use Your Powers Wisely" /></p>

<h2 id="so-how-did-the-release-go-then">So how did the release go then?</h2>
<p>You want to know if I’m a millionaire now my game’s out huh? Well I’m as baffled writing this as I’m sure you are reading it, but the answer is <strong>no</strong>. The first week after release was a bit mixed, one one hand the game was on the front page of Steam for over 24 hours and this is a huge deal, on the other hand Robo Instructus has unfortunately been largely ignored by the mainstream press.</p>

<p><img src="/assets/2019-07-26/ways-to-get-rich.jpg" alt="" title="Hmmm I don't see what I'm doing wrong..." /></p>

<p>The game has got a bunch of sales, most strongly in USA, Russia &amp; Germany. Then UK… <em>4th place UK come on? And after I came from you!</em> There are people really playing my programming game and that’s just amazing, even though I’ve had to cancel all my yacht orders.</p>

<h5 id="comment-on-twitter--facebook">Comment on <a href="https://twitter.com/bigabgames/status/1154750278568226816">twitter</a> | <a href="https://www.facebook.com/bigabgames/posts/2573953202692051">facebook</a></h5>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[On the 16th July Robo Instructus was released on Steam &amp; itch.io for Linux &amp; Windows. But development is not over just yet. Today I’ll be releasing Robo Instructus 1.2 (release notes).]]></summary></entry><entry><title type="html">Robo Instructus: Behind The Scenes</title><link href="https://blog.roboinstruct.us/2019/06/26/behind-the-scenes.html" rel="alternate" type="text/html" title="Robo Instructus: Behind The Scenes" /><published>2019-06-26T00:00:00+00:00</published><updated>2019-06-26T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2019/06/26/behind-the-scenes</id><content type="html" xml:base="https://blog.roboinstruct.us/2019/06/26/behind-the-scenes.html"><![CDATA[<p>On Monday 24th June the Robo Instructus beta phase came to an end, making way for a full release on 16th July. The release will mark 2 years of full-time development by a team of 1 (me). So who am I and why did I make Robo Instructus?</p>

<p align="center">
  <img align="center" src="/assets/2019-06-26/top2.jpg" />
</p>
<!--more-->

<p>I’m Alex Butler and I’ve loved programming since I started doing it in my 20s. Back when I first started, the aim was to get a better job and a nicer life. But I also promised myself that one day, when I knew my <em>const</em> from my <em>static</em>, I’d use these new powers to make my very own PC game.</p>

<p>I worked in enterprise programming in London, think <em>web-server-database</em> techs, for 7 years before I finally decided it was time to make good on the promise. I quit my job, gathered my savings and started making a game. While I was now a decent coder, my skills had come at a price. My time in industry had warped &amp; corrupted my mind to such an extent that instead of making a cool game about shooting lasers I made it <strong>actually <em>about</em> bloody programming</strong>.</p>

<p>You can still see the first footage of it in action: <a href="/2017/07/07/teaching-robots.html">Teaching Robots <em>July 2017</em></a>. In the two years that the game has taken form, I learnt to program <a href="https://www.rust-lang.org/">Rust</a> &amp; make OpenGL go. My wife and I got a little dog that now sits next to, or curls up under, me as I work. I’ve eaten countless bowls of rice and broken at least one coffee machine through plentiful use.</p>

<p><img src="/assets/2019-06-26/me+chips.jpg" alt="" title="She's called Chips" /></p>

<p>Though I’ve mainly worked as a solo developer, I’ve had some help on the way. Particularly Tom van de Merbel, who I contracted to handle the game’s art. He’s responsible for everything in the game that looks nice! Not forgetting Richard Thomson’s beautiful music and my story co-writers Iain Ure &amp; Gordon Walsh.</p>

<p>Robo Instructus has come a long way since March when the beta phase began, and an even longer way from my early game ideas. It is now the game I was going for, an approachable yet challenging algorithm coding game set in an interesting sci-fi universe. It looks, sounds &amp; runs the part thanks to 2 years of work.</p>

<p><img src="/assets/2019-06-26/maptheway-concept-vs-final.jpg" alt="" title="September 2018 vs June 2019" /></p>

<p>One thing that didn’t change, however, was the core gameplay. Typing in an actual programming language and watching it run, fail, get stuck in a loop and just maybe after improving &amp; fixing: successfully traversing the level. A process designed to capture &amp; concentrate the most satisfying parts of the real software engineering experience. Robo Instructus will offer an experience that is truly rare in PC gaming.</p>

<p>But rare probably for a reason. No matter the polish &amp; narrative, this just <em>won’t</em> be a game that everyone will want to play. Well I guess that’s true of every game, but particularly so here. The truth is I’m not sure if the number of people that <em>do</em> enjoy the game will be enough. The only way I can continue to make games full time is if Robo Instructus sells. I’ve put 2 years of my egg-savings into a single basket.</p>

<p>Success for Robo Instructus is not guaranteed, the biggest obstacle is the game just being lost underneath the pile of all the other PC games out there. Finding an audience is harder than ever thanks to the amazing quantity of great games that exist now. So if you, yes you at home, want to help please wishlist the game on Steam, share social media posts &amp; reviews, tell people you know about Robo Instructus.</p>

<p>I do believe the game can do well and find its audience. I am proud of what I’ve created. After release when the smoke clears I’ll be able to say “I made a game” and kept a promise.</p>

<p><em>Robo Instructus will be released on July 16th 2019 on <a href="https://store.steampowered.com/app/1032170/Robo_Instructus">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>.</em></p>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[On Monday 24th June the Robo Instructus beta phase came to an end, making way for a full release on 16th July. The release will mark 2 years of full-time development by a team of 1 (me). So who am I and why did I make Robo Instructus?]]></summary></entry><entry><title type="html">Dark Stages &amp;amp; The Fight Against Cheese</title><link href="https://blog.roboinstruct.us/2019/06/21/dark-stages.html" rel="alternate" type="text/html" title="Dark Stages &amp;amp; The Fight Against Cheese" /><published>2019-06-21T00:00:00+00:00</published><updated>2019-06-21T00:00:00+00:00</updated><id>https://blog.roboinstruct.us/2019/06/21/dark-stages</id><content type="html" xml:base="https://blog.roboinstruct.us/2019/06/21/dark-stages.html"><![CDATA[<p>Today the <a href="https://github.com/big-ab-games/robo-instructus/releases/tag/beta-3.3">final update</a> to the beta is coming out before this phase ends. The beta phase is ending to make way for the full game’s release. Robo Instructus will be released on the <strong>16th July 2019</strong> on <a href="https://store.steampowered.com/app/1032170">Steam</a> &amp; <a href="https://bigabgames.itch.io/robo-instructus">itch.io</a>. As you would expect with the game so close to release, I haven’t been working on new features and instead have been polishing &amp; optimizing the game.</p>

<video src="/assets/2019-06-21/dark.mp4" loop="" autoplay="" muted=""></video>
<!--more-->
<p>Psych! I’ve actually developed a major new feature called <em>Dark Stages</em>. All in the name of the fight against cheese.</p>

<h3 id="what-is-cheese">What is cheese?</h3>
<p>Firstly a bit of background. Each level in Robo Instructus is made up of multiple stages, each a variant of the same general problem. The game has multiple stages to require a general solution that can solve all of them. If you only had to solve a single stage it would be fairly easy to “brute force” a hardcoded solution with just <strong><em>robo_forward()</em></strong> &amp; <strong><em>robo_left()</em></strong>.</p>

<p>But how “general” does the solution have to be? If you can figure out exactly which of the stages the robot is currently on you can switch to an optimized hardcoded version that solves that stage in a dumb but efficient way. I’ll call this method “cheesing”.</p>

<p>Cheesing a solution, <em>instead</em> of solving it generally, isn’t really in the spirit of the game. But in the earlier levels it’s actually quite a bit harder to cheese a level than it is to solve it generally. When this is true I’m cool with cheesing,and this is also why I hadn’t really addressed it directly.</p>

<p>As the challenge offered by levels increases so does the difficulty in writing the “proper” solution. The relative difficulty of a cheese solution can make it start to look more attractive. Ultimately this is a problem because writing cheesy solutions in later levels just isn’t fun. Adding salt to the wound, cheesy solutions will probably score better than general ones.</p>

<h3 id="dark-stages">Dark Stages</h3>
<p>I want to encourage proper general solutions to the levels. With that in mind I’ve added <em>Dark Stages</em> to all the mid &amp; late game levels. These are extra stages very similar to the others, but their features are hidden. When you can’t see or analyse the layout of a level they become very difficult to cheese, yet a general solution to the visible levels will solve them without issue.</p>

<p>So if you’re already coding general solutions the new stages won’t hinder you at all. On the other hand let’s take a look at a cheesy solution to <em>Into The Unknown</em>, which is the first level with dark stages.</p>
<video src="/assets/2019-06-21/cheese.mp4" loop="" autoplay="" muted="" controls=""></video>

<p>You can write this sort of solution by appending stuff to a naive approach each stage, it’s pretty ugly but it will work. However, when you get to the dark stages it now becomes impossible to “see” how to modify it to pass the extra stages. This should encourage players to seek an algorithm that will solve all levels of the ilk of the visible stages.</p>

<p>So the dark stages are a powerful weapon against the cheesy solutions which damage the fun of the game. They do have a problem though. The dark stages are very similar, but they obviously aren’t <em>exactly</em> the same. If a player wrote a general purpose algorithm which just happens to have a flaw only uncovered in a dark stage it creates a quite unsatisfying game experience, the dark stages are necessarily difficult to debug.</p>

<p>To ease this issue while you cannot get a score without solving all stages, including dark ones, if you complete all the visible stages you <em>will</em> be able to progress to later levels. This means if you can’t debug your algorithm that fails in the darkness, you can at least still continue with the game. This detail should prevent too much frustration when the dark stages “go bad”.</p>

<h3 id="release">Release</h3>
<p>Oh yeah the game is releasing soon too. 16th July. Hopefully we’ll start seeing reviews and stuff about the game in the next month. Please wishlist the game on Steam to help it’s visibility there.</p>

<p><strong>Beta-3.3</strong> brings a bunch of performance optimizations and improvements to things like window resizing too. So I am polishing &amp; removing the game’s hard edges. I’ll continue to do this as the release approaches.</p>

<h5 id="comment-on-twitter--facebook">Comment on <a href="https://twitter.com/bigabgames/status/1142037787836932096">twitter</a> | <a href="https://www.facebook.com/bigabgames/posts/2509857912434914">facebook</a></h5>]]></content><author><name>Alex Butler</name></author><summary type="html"><![CDATA[Today the final update to the beta is coming out before this phase ends. The beta phase is ending to make way for the full game’s release. Robo Instructus will be released on the 16th July 2019 on Steam &amp; itch.io. As you would expect with the game so close to release, I haven’t been working on new features and instead have been polishing &amp; optimizing the game.]]></summary></entry></feed>