<?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[Steven Henk Don | RSS Feed]]></title><description><![CDATA[Welcome to Steven Don's website of freeware and source code]]></description><link>https://www.shdon.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 01 Sep 2026 08:13:49 GMT</lastBuildDate><item><title><![CDATA[Congo Bongo Infinite Lives Trainer]]></title><description><![CDATA[SEGA's arcade classic Congo Bongo was ported to various home computers, and the IBM PC was not left behind. The IBM PC port (on a self…]]></description><link>https://www.shdon.com/congo-bongo-trainer/</link><guid isPermaLink="false">https://www.shdon.com/congo-bongo-trainer/</guid><pubDate>Sat, 02 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SEGA&apos;s arcade classic &lt;a href=&quot;https://www.mobygames.com/game/3955/congo-bongo/&quot;&gt;Congo Bongo&lt;/a&gt; was ported to various home computers, and the IBM PC was not left behind. The IBM PC port (on a self-booting) floppy disk was quite well done, in fact, and seems to be the only port that includes all four levels from the original arcade game. Nowadays, it can be played in DOSBox in glorious 4-colour CGA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oxofP01WU0U&quot;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It can be quite a tricky game to play, so I&apos;ve created a little patch for the two versions most commonly found on the internet. Congo Bongo is often found as a raw disk image (&lt;code class=&quot;language-text&quot;&gt;CONGO.IMG&lt;/code&gt;), or as a slightly patched disk image that is then loaded on real DOS with a simple launcher .COM file (&lt;code class=&quot;language-text&quot;&gt;CONGO.COM&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;GAME.DAT&lt;/code&gt;). This patch is a &lt;a href=&quot;/projects//patches#congo-bongo&quot;&gt;trainer for the game&lt;/a&gt; that enables infinite lives. Even this does not make the game easy by any stretch of the imagination, but at least you don&apos;t have to start over from the beginning when you run out of lives.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Sample Blog Post]]></title><description><![CDATA[Sample Blog Post This is a sample blog post to demonstrate the Gatsby site structure. Features Built with Gatsby and React Markdown support…]]></description><link>https://www.shdon.com/blog/</link><guid isPermaLink="false">https://www.shdon.com/blog/</guid><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;sample-blog-post&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sample-blog-post&quot; aria-label=&quot;sample blog post permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sample Blog Post&lt;/h1&gt;
&lt;p&gt;This is a sample blog post to demonstrate the Gatsby site structure.&lt;/p&gt;
&lt;h2 id=&quot;features&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#features&quot; aria-label=&quot;features permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Built with Gatsby and React&lt;/li&gt;
&lt;li&gt;Markdown support&lt;/li&gt;
&lt;li&gt;Code highlighting&lt;/li&gt;
&lt;li&gt;Responsive design&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; greeting &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;greeting&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This is just a sample post to get the site running.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Sample Note]]></title><description><![CDATA[Sample Note This is a sample note in the notes section. Learning Points Take notes regularly Document progress Share knowledge This…]]></description><link>https://www.shdon.com/notes/</link><guid isPermaLink="false">https://www.shdon.com/notes/</guid><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;sample-note&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sample-note&quot; aria-label=&quot;sample note permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sample Note&lt;/h1&gt;
&lt;p&gt;This is a sample note in the notes section.&lt;/p&gt;
&lt;h2 id=&quot;learning-points&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#learning-points&quot; aria-label=&quot;learning points permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learning Points&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Take notes regularly&lt;/li&gt;
&lt;li&gt;Document progress&lt;/li&gt;
&lt;li&gt;Share knowledge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This demonstrates how the notes section works.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Jumber Was Here!]]></title><description><![CDATA[figure img.photo { height: auto; max-width: 100%; width: 100%; } @media (min-width: 768px) { figure.float-left { float: left; margin-right…]]></description><link>https://www.shdon.com/jumber-was-here/</link><guid isPermaLink="false">https://www.shdon.com/jumber-was-here/</guid><pubDate>Fri, 24 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;figure img.photo { height: auto; max-width: 100%; width: 100%; } @media (min-width: 768px) { figure.float-left { float: left; margin-right: 1rem; padding-bottom: 0.5rem; width: 256px; } figure.float-right { float: right; margin-left: 1rem; padding-bottom: 0.5rem; width: 256px; } }&lt;/p&gt;
&lt;p&gt;Five years ago, I met and befriended a young man from the eastern European country of Georgia. He had come to the Netherlands seeking asylum. This was because he is bisexual, which is just not accepted there and he was in fear of his life. The authorities looked at a piece of paper that says that it is safe for LGBT people in Georgia, and told him that he would be sent back. I helped him evade deportation and he tried again in another country. That, &lt;a href=&quot;/i-may-have-broken-the-law-but-it-broke-my-heart-first/&quot;&gt;I have written about&lt;/a&gt; at the time. Unfortunately, they too looked at that same piece of paper and sent him back. He was deported to Georgia.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2023/11/jumber-and-steven.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jumber and I getting a drink together, just before he left the Netherlands&lt;/p&gt;
&lt;p&gt;In Georgia, my friend had nothing to go back to. His family didn&apos;t accept him and, in fact, his father was one of the major reasons he had fled in the first place. His mother had tried to support him, but died shortly thereafter under suspicious circumstances. Although my friend could not say for certain, he has always suspected that his mother died at the hands of his father, just for trying to help her son. Though he had had a business before he left, that business was taken by his father. So, when he went back, he had no family, no place to live, and no income.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2023/11/homeless.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;My friend kept in touch as best he could, sending me messages from internet cafes. This picture he sent, broke my heart. He was living on the streets of Tbilisi, with just a few pieces of cardboard and plastic to shield him from the cold. All day, he walked the streets looking for discarded bottles, which he could hand in to get the recycling deposit so that he&apos;d have some money to buy a little food. When there weren&apos;t enough bottles, he had to resort to stealing food.&lt;/p&gt;
&lt;p&gt;As soon as I could, I started sending him some money every month which enabled him to rent a small apartment in Tbilisi and to eat normally. Despite being depressed, he went looking for a job and took whatever work he could. The work was hard and physically exhausting and the pay was lousy. So lousy, in fact, that he remained dependent on what I sent him as it wasn&apos;t even enough to cover the rent of that small flat. But despite this, he was so glad and proud to be able to do something. And I was just as proud of him for not giving up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2023/11/jumber-in-the-hospital.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jumber in the hospital, after a brutal attack&lt;/p&gt;
&lt;p&gt;It was not to last. After working this job for a few weeks, he was spotted by somebody who knew him and why he&apos;d left Georgia in the first place. They returned with others and beat him up to within an inch of his life, damaging several internal organs. The photo above, taken in the hospital, is the last photo I have of him. To allow him to recover, I had set up &lt;a href=&quot;/jumber-gfm&quot;&gt;a crowdfunding campaign&lt;/a&gt;, which took care of the medical bills for his care and hospital stay. Mentally, he didn&apos;t truly recover, and he remained afraid to ever leave home, terrified as he was of another attack. Despite this, he always looked for odd jobs to get some income and to feel useful.&lt;/p&gt;
&lt;p&gt;We kept in touch, communicating via WhatsApp. When he attended protest marches against government corruption and the injustices in Georgian society, I was worried for his safety and he was arrested multiple times. I tried to get him to go to organisations standing up for LGBT people in Georgia, but as hate crimes were directed at such organisations and police looked the other way, he didn&apos;t dare. Especially after that attack, he never really trusted anybody other than me.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2023/11/waffle.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jumber trying a Belgian waffle when we met up again in Brussels&lt;/p&gt;
&lt;p&gt;Several times a week, we talked via WhatsApp. We talked about maybe getting to meet up again some day. We talked about finding a better life outside of Georgia. And we looked back fondly at the times we&apos;d spent together during his failed attempts for asylum in the EU. It made me smile when he told me about little things that made him happy, like when he had the opportunity to enjoy an icecream cone on a hot summer day. I remember how proud he was that he&apos;d managed to get a proper ID card again (and he sent me a photo of it). His messages were always full of love and hope and kindness.&lt;/p&gt;
&lt;p&gt;In July of 2022, just after I&apos;d sent him money for that month&apos;s rent, he told me not to send anything for the following month. I asked whether he was sure about that, whether he&apos;d be able to make rent and buy food, and he told me not to worry. At 12:43 on July 8th 2022, he messaged me &quot;thinking about you&quot; and when I responded, he read it and reacted with a ❤️ emoji. Just over 5 hours later, at 18:11 on that same day, I inquired about his health. That message, was not just unread, but remained undelivered in WhatsApp. For more than a year, I sent messages to him every few days, over 200 in total, but never did that single grey checkmark turn into a double, let alone blue.&lt;/p&gt;
&lt;p&gt;Yesterday morning, a friend suggested hiring a private investigator. That thought hadn&apos;t occurred to me before, but it was sound advice, which I promptly followed. I sent the detective the information that I had (the photo of that ID card came in handy) and it took them a little over a day to report back. The devastating reply: &quot;I&apos;m sorry but unfortunately this person died last year&quot;. Although more details will be sent later on, I&apos;m virtually certain that they will confirm my fears and that my friend has taken his own life. Every time I had looked back at his final communication to me, it always felt like he didn&apos;t want to burden me and was saying goodbye.&lt;/p&gt;
&lt;p&gt;Dear Jumber Kikacheishvili, you have suffered so much in the mere 32 years of your life, yet you never let hatred enter your heart. It was too full of kindness for that. You tried so hard to find a better life, giving up everything you had, and were rebuked. Regardless of the details of how you left this life, I feel you have been murdered by the system. This cruel world is a lesser place with you no longer in it. I hope with all my heart that I was able to let you know that there was at least one person who considered you a valuable human being. Even if nobody else cared about whether you lived or died, I did. My tears for you are real. For as long as I live, you will not be forgotten. I won&apos;t permit this world to be without evidence that you were here, and I&apos;ll remember you and tell your story to whomever will listen. Jumber, may you have found the rest and peace that you could never find in life. I remember the one Georgian word you taught me: ნახვამდის.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In memory of Jumber, I have set up a &lt;a href=&quot;https://www.inactievooramnesty.nl/fundraisers/steven-don&quot;&gt;fundraiser for Amnesty International&lt;/a&gt; and have requested that my employer donate my 15 year work anniversary gift there instead. It is too late to save the life of my friend, but perhaps others may be spared his fate.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Showing Off My Pixel Art]]></title><description><![CDATA[I'm hoping to practice and improve my pixel art skills. To that end, I'm aiming to do at least one of the Pixel Dailies a week (assuming…]]></description><link>https://www.shdon.com/showing-off-my-pixel-art/</link><guid isPermaLink="false">https://www.shdon.com/showing-off-my-pixel-art/</guid><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m hoping to practice and improve my &lt;a href=&quot;/projects/&quot;&gt;pixel art&lt;/a&gt; skills. To that end, I&apos;m aiming to do at least one of the &lt;a href=&quot;https://twitter.com/Pixel_Dailies/&quot;&gt;Pixel Dailies&lt;/a&gt; a week (assuming there is a theme that inspires me) and archiving them on my site. I&apos;m not a graphic artist by any stretch of the imagination, and quality may vary wildly. Consider these experiments and exercises.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2023/03/pixelart-wip.png&quot; alt=&quot;Using Corel PaintShop Pro 2018 to work on a pixel art ghost trap for the &amp;#x22;containment&amp;#x22; theme&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pixel art, as I see it, is digital art where the pixel structure is readily visible and where each pixel has been deliberately placed and coloured to contribute to the image in the most effective way. It often has a limited palette to achieve a clean look and a low resolution to make the pixels easily disinguishable. Although there are tools specifically designed for pixel art, such as &lt;a href=&quot;https://www.aseprite.org/&quot;&gt;Aseprite&lt;/a&gt; and &lt;a href=&quot;https://www.cosmigo.com/&quot;&gt;Pro Motion NG&lt;/a&gt;, my bitmap editor of choice is &lt;a href=&quot;https://www.paintshoppro.com/&quot;&gt;PaintShop Pro&lt;/a&gt;, mostly out of force of habit. And, to be honest, I find older versions of that software far more suitable than the current ones.&lt;/p&gt;
&lt;p&gt;An &lt;a href=&quot;/projects/&quot;&gt;archive of my attempts so far&lt;/a&gt; is now available on this site. If you&apos;d like to see new ones whenever I post them, you can follow me on Mastodon (&lt;a href=&quot;https://mastodon.gamedev.place/@shdon&quot;&gt;@shdon@mastodon.gamedev.place&lt;/a&gt;), Twitter (&lt;a href=&quot;https://twitter.com/shdon&quot;&gt;@shdon&lt;/a&gt;) or Instagram (&lt;a href=&quot;https://www.instagram.com/stevendon249/&quot;&gt;stevendon249&lt;/a&gt;).&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Review: SpaceVenture (backer release)]]></title><description><![CDATA[In 2012, the designers of the Space Quest series of adventure games, Mark Crowe and Scott Murphy a.k.a. the Two Guys from Andromeda, ran a…]]></description><link>https://www.shdon.com/spaceventure-backer-release/</link><guid isPermaLink="false">https://www.shdon.com/spaceventure-backer-release/</guid><pubDate>Mon, 19 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2012, the designers of the Space Quest series of adventure games, Mark Crowe and Scott Murphy a.k.a. the Two Guys from Andromeda, ran a Kickstarter campaign for creating a new game in the Space Quest vein. The campaign was narrowly funded. And now, a decade later, in September of 2022, SpaceVenture was released to backers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-title.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-title.jpg&quot; alt=&quot;SpaceVenture title screen&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m going to start out with some background information about the Kickstarter campaign and the game&apos;s development here. If you&apos;re only interested in what the game is like, feel free to skip ahead to &lt;a href=&quot;#review&quot;&gt;the actual review&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-happened&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-happened&quot; aria-label=&quot;what happened permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What happened?&lt;/h2&gt;
&lt;p&gt;During the campaign, the intended release date of SpaceVenture was late 2013. Having secured their funding (though no stretch goals), the Two Guys got to work writing and designing their new game, creating the art for it, doing the programming (of not just the game itself, but also a custom framework on top of Unity), securing voice talent etc. Unfortunately, with the one year period long gone by, SpaceVenture entered development hell. Updates slowed down and eventually ceased altogether, backers got upset (with a small but very vocal and truly contemptible minority spewing pure hatred in the Kickstarter comments, drowning out all positivity and encouraging words), and it seemed like the project was dead, despite the occasional claim that it was still being worked on.&lt;/p&gt;
&lt;p&gt;The Space Quest series that propelled Mark Crowe and Scott Murphy to adventure gaming fame was created at Sierra, with their in-house tools on the AGI and later SCI engines. These games commonly ran at a resolution of 320x200 pixels in 16 or 256 colours, with Space Quest IV marking the transition from 16 colour EGA to 256 colour VGA and from a text parser to a point and click interface. At the time, that was just making good use of the available technology. Nowadays, we tend to call the resulting art style &quot;pixel art&quot;. Many classic adventure game fans adore that pixel art (I do too!) and will dismiss anything that is somehow related to those classic games and isn&apos;t pixel art (that, I don&apos;t). Ron Gilbert can attest to this when he showed the art style for Return to Monkey Island. For SpaceVenture, that wasn&apos;t the case yet, though. And whether it was due to pressure from the backers or the Two Guys&apos; own ideas, the decision was made early on to go in a more contemporary art style with fully 3D animated characters, props, and, although I think the original intention was to have prerendered backgrounds with several 2D layers, there seems to be extensive use of a lot of 3D elements or background geometry to enable perspective shifts and pans or zooms.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-unity.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-unity.jpg&quot; alt=&quot;Screenshot of Unity being used in the development of SpaceVenture&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mark Crowe shared this image on an svrewards blog post in 2017.&lt;/p&gt;
&lt;p&gt;This precluded the use of systems like AGI or SCI and publicly available alternatives like AGS (Adventure Game Studio) and meant that the use of a proper 3D system was required. Mark Crowe, being the person to do most of the actual coding, settled on Unity. This may have been a major mistake. Not that Unity is a bad product in and of itself, but at the time, it wasn&apos;t really suitable for point and click style games, as extensions like Adventure Creator or Power Quest just didn&apos;t exist at the time. Switching from something like SCI to having to build a whole framework on top of a 3D engine is a &lt;em&gt;big deal&lt;/em&gt; and being great at one of those doesn&apos;t mean you&apos;ll be great at doing the other too. The choice to do things in Unity (and having to stick with an old version, because Unity is notorious when it comes to upgrade compatilibity with older projects) cost a ton of extra effort. Speaking as a hobbyist game programmer myself, I know enough to say that saving and loading game state is one of the hardest things in game development. And indeed, the save/load system has apparently been &lt;em&gt;the&lt;/em&gt; major headache for the last few years of SpaceVenture&apos;s development. Supposedly it was fixed and SpaceVenture could finally be released.&lt;/p&gt;
&lt;h2 id=&quot;so-whats-it-like&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-whats-it-like&quot; aria-label=&quot;so whats it like permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So, what&apos;s it like?&lt;/h2&gt;
&lt;p&gt;On Saturday morning, a download link for SpaceVenture appeared in my inbox. I downloaded it eagerly and played it through, twice. Completing the game once took me about 6-7 hours of playing time. Having to restart due to a bug after 2 hours or so meant that the actual time taken was quite a bit longer. The developers included a link to a walkthrough in case you get stuck. I referred to this a few times when stuck, where it mostly turned out that I had overlooked something, not noticing a hotspot. There were also a few times where I learned from the walkthrough that I&apos;d been having the right idea, but did it in a way the developers hadn&apos;t anticipated, or there was a glitch in the game. And that is worrying, both the bug that caused me to restart and the many, many glitches.&lt;/p&gt;
&lt;h2 id=&quot;whats-good&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-good&quot; aria-label=&quot;whats good permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s good?&lt;/h2&gt;
&lt;p&gt;First and foremost in an adventure game is the story and puzzles. There, I&apos;d say SpaceVenture gets things mostly right. While the story won&apos;t win any literature prizes, it is funny and absurd, just as would befit a Space Quest game. So, fans of Space Quest won&apos;t be disappointed in the story department. In fact, they will find plenty of references to the series and even a cameo by Roger Wilco (or at least his feet) who is taking one of his signature naps in a broom closet. And it&apos;s not just Space Quest references. Like in those games, the whole of science fiction gets lovingly parodied. You will find, among many other gags, things like Buzz Lightyear and a Wookiee in a bar, an Imperial Shuttle from Star Wars parked not far from Back to the Future&apos;s DeLorean, an Eagle from Space 1999, and even protagonist Ace Hardway acting out a scene from 2001 A Space Oddyssey. I have to admit that now, at almost 44, I am in a much better position to appreciate the humour and the references in the game than my teenage self was playing the original Space Quest games. This allowed me to really enjoy the story, the setting, and all the tongue in cheek references, visual gags and even the jokes in the dialogue much more than I could have as a youngun. Also, at 6-ish hours of play for a first playthrough (referring a few times to the provided walkthrough), I feel there&apos;s a decent amount of content.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-roger.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-roger.jpg&quot; alt=&quot;A broomcloset on the Nostrodomus, where a janitor with a very familiar uniform appears to be taking a nap.&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Roger Wilco (or at least his feet, smelly socks, and uniform) makes a guest appearance near the start of the game.&lt;/p&gt;
&lt;p&gt;Modern adventure gamers have very little patience for the moon logic and frequent deaths of the earliest adventure games. However, as Space Quest was (in)famous for the many gruesome deaths that Roger Wilco could die, it just wouldn&apos;t be right not to have at least some of those in its spiritual successor. And there are indeed some deaths in there that I&apos;ve encountered. For instance, the homicidal floor waxer roaming Vohaul&apos;s asteroid fortress in SQ2 has a few of its cousins working a hallway on the Nostrodomus and they will make short work of Ace if they catch him. Fortunately, the deaths that are there are easily avoided and mostly there for comedic effect. Dying doesn&apos;t mean game over, but just resets the scene you&apos;re in, so you can try again without too much fuss. And like unfair deaths, moon logic is mercifully absent from most of the game. There&apos;s a few things that aren&apos;t terribly sensible or could be signposted better, but on the whole, the puzzles are pretty logical and make sense in the game world. There&apos;s also some more direct object interaction by making using of a dragging mechanic. Not everybody&apos;s cup of tea, but I liked it and feel that it adds some novelty to the puzzles where it&apos;s used.&lt;/p&gt;
&lt;p&gt;Pixel art is now considered retro or having a timeless aesthetic, and has many fans. In the early days of 3D being used in adventure gaming (think King&apos;s Quest: Mask of Eternity, Simon the Sorcerer 3D, or even games that used 3D character models only, such as Escape from Monkey Island and Grim Fandango), the technology wasn&apos;t very mature, artists were still getting to grips with it, and the 3D graphics from those games haven&apos;t aged well. In the era since then, full HD graphics have become commonplace and 3D accelerators have improved tremendously. Graphics from the early 2010s have aged much more gracefully and I think SpaceVenture graphically holds up. In my personal opinion, the environments of the game look quite good, making very good use of static and 3D elements, even on simple screens like the title screen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-hangar.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-hangar.jpg&quot; alt=&quot;The hangar at Scraps&amp;#x27;s workshop&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The audio side of things is very well done too. Veteran Space Quest composer Ken Allen (whose score was arguably the best thing about the VGA version of SQ1) also did the original musical score for SpaceVenture and it fits very well. Sound effects are pretty much perfect, to the point that I never felt any sound effect to be inappropriate, jarring, or out of place. And finally the voice acting is done by some very talented people, with the least inspired performances actually coming from Mark and Scott voicing themselves in the game (understandable, as they&apos;re game developers, not voice actors). It&apos;s a pity Gary Owens died before he could record for the narrator. Ed Kelly did a great job lending a very Owens-esque quality to the narrator, though. There&apos;s even several songs in the game: an over the top performance by 3 habaneros at the Taco Nova restaurant (supposed to be annoying, but I actually found it quite catchy and amusing), and a rock song when Ace gets pulled over by a space cop.&lt;/p&gt;
&lt;h2 id=&quot;whats-not-good&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-not-good&quot; aria-label=&quot;whats not good permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What&apos;s not good?&lt;/h2&gt;
&lt;p&gt;Oh boy... here we go... I&apos;ve been dreading to write this part, because it saddens me. Although the game was &quot;released&quot; to backers and has been in development for 10 years, the truth is that this version of the game really is more of a semi-public beta. Even on the title screen shown at the top of this post, the &quot;Settings&quot; button does nothing and that is far from the only thing making the game feel unfinished. There may be some jerky transitions in animations or characters clipping through each other or the scenery, but I can forgive those as merely minor cosmetic issues. However, there are many, many glitches, some of which can lead you to be stuck on a screen through no fault of your own. The camera might zoom to a place and get stuck there, making it impossible to leave the screen. Sometimes, but not always, can you fix this with some vigourous maneuvering, sometimes by triggering another scene transition, sometimes there is no other way than to reload the scene. Actually, make that &quot;restart the scene&quot;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-saveload.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-saveload.jpg&quot; alt=&quot;Due to the complexity of this area, saving and loading here will start you at the beginning of this scene.&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yeah... no...&lt;/p&gt;
&lt;p&gt;As mentioned before, the save/load system caused the developers a lot of headaches and, although it was supposedly fixed, I would dispute that claim. Rather than a proper save/load, it is more like a checkpoint system and whenever you save the game, you will always see the above warning pop up. In practice, I haven&apos;t found this as much of an issue as it would seem to be, although having to redo a significant number of actions in a scene does discourage using the save system to experiment in the game world. This is a real pity and although saving and loading is admittedly a pretty hard thing to do and to get right, it&apos;s not impossible.&lt;/p&gt;
&lt;p&gt;Although I got used to it pretty quickly, I would definitely agree that the UI is unpolished and unintuitive. Knowing when you can drag an object, how to combine inventory items, or how to activate certain things is not always obvious. This was remarked on by many players during beta testing and I&apos;m surprised it&apos;s still an issue in this supposedly final product. There&apos;s one point where you are flying around Ace&apos;s ship as his dog/toolbox Rooter, trying to hit a certain location. The controls were so unintuitive that it took me over 15 minutes of orbiting and overshooting before I gave up, reloaded, and ever so slowly inched my way to the correct spot. While all other arcade style sequences in SpaceVenture are skippable (and that&apos;s a good decision to allow people who don&apos;t enjoy such things to get on with the game), this particular sequence cannot be skipped.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2022/09/sv-space.png&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/09/sv-space.jpg&quot; alt=&quot;Rooter flying around Ace Hardway&amp;#x27;s ship to find the source of a biowaste leak and fix it&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Be really, really careful when navigating. If you ever lose control and get a bit off course, it&apos;s virtually impossible to recover.&lt;/p&gt;
&lt;p&gt;It is also very easy to get the UI in an inconsistent state, with things overlapping in the wrong order. Hotspots are frequently not registered (or only register when you&apos;re standing in specific places, without so much as a classic Sierra &quot;you&apos;re not close enough&quot; message) and often don&apos;t make the cursor light up appropriately. Clicking the mouse to skip a line of dialogue you&apos;ve already heard (or even clicking some UI elements) also counts as a click on whatever scene element the cursor&apos;s currently on. That&apos;s bad and frequently leads to an annoyance where, instead of skipping the dialogue, it actually restarts that very same line because the game thinks you&apos;re performing the same action that triggered it in the first place. Quite a few lines are displayed as text only, with no voice-over playing; there&apos;s a few instances where the wrong line plays and doesn&apos;t match the text, and some where the text disappears before it can be read. Skipping lines of dialogue or entire cutscenes often doesn&apos;t work reliably, with the game basically waiting out the time it takes to complete the cutscene normally. Now, while these aren&apos;t game-breaking bugs per se, they do betray some major issues with the game&apos;s coding. And some do break the game. At one point, I made a creature disappear, probably by triggering something else before its animation had completed. This led to having to restart the scene as there was no way to progress otherwise. And the worst I encountered was the game not restoring player control after a cutscene. Not even reloading fixed that and the only thing I could do was restart entirely.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The backer release still very much feels like a beta. I didn&apos;t participate in beta testing, so I can&apos;t be sure, but nobody doing beta testing will have missed the issues I and others have encountered. One thing that can cause quality of a game to suffer is when those testing (usually the developers at first) know precisely how to play. If you play through the story again, knowing exactly how to proceed, you encounter few of those glitches. That&apos;s why it&apos;s important to have fresh eyes doing your testing... people who can&apos;t get to the end of the game with their eyes closed.&lt;/p&gt;
&lt;p&gt;Having played through the game multiple times, I have mixed feelings. On the one hand, I think there&apos;s a good adventure game at the core, I love the way it looks, and I did enjoy playing it very much. The game even got a few proper laughs (rather than just chuckles) out of me for references, jokes in dialogue or plain wackiness. On the other hand, it still very much feels like beta software and I feel the decade long development time should have been enough for it not to be this glitchy. On the whole, I&apos;m glad I finally got to play it, I don&apos;t feel cheated as a backer, I can appreciate the amount of effort that has gone in and I had fun.&lt;/p&gt;
&lt;p&gt;While SpaceVenture is so unfinished, I can understand the developers just wanting to be done with it and all the negativity surrounding the development, and get something in the hands of backers, which I appreciate as a backer and a fan. While I hope they will fix all the glitches and bugs, and the developers have said they are doing just that, working hard to solve all the problems backers are encountering, I&apos;m a bit skeptical about that. These things were known, and have been for years. Though I must admit to being positively biased into liking it, I don&apos;t think I can recommend the game to people who aren&apos;t die-hard SQ fans, at least not in this state. SpaceVenture is, in my opinion, not ready for public release. It wouldn&apos;t do the developers&apos; reputation any good, and they would get eviscerated in the reviews. That would be incredibly sad, especially after all the blood, sweat and tears these guys have already put in. I had a fun time playing, and I think there&apos;s a good adventure in there, but it needs a lot of tlc first.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[A baker's dozen AdvJam2022 entries you should try]]></title><description><![CDATA[Adventure Jam 2022 took place in June and had moved on to its new home on itch.io. Due to a lack of inspiration and mental energy, I was…]]></description><link>https://www.shdon.com/advjam2022-shout-outs/</link><guid isPermaLink="false">https://www.shdon.com/advjam2022-shout-outs/</guid><pubDate>Wed, 06 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Adventure Jam 2022 took place in June and had moved on to its &lt;a href=&quot;https://itch.io/jam/adventure-jam-2022&quot;&gt;new home on itch.io&lt;/a&gt;. Due to a lack of inspiration and mental energy, I was unable to participate myself this year, but I&apos;ve thoroughly enjoyed playing all the entries that I could... close to a hundred of them. My own preference is very much in the classical point and click style, with a few excursions, and you&apos;ll find that reflected in my picks of course (I&apos;m not claiming objectivity here). Here&apos;s this year&apos;s cream of the adventure crop, in alphabetical order:&lt;/p&gt;
&lt;p&gt;.shot-container { background: black; box-shadow: 2px 2px 5px black; height: 0; padding: 0 0 56.25%; position: relative; width: 100%; } .shot-container img.shot { bottom: 0; box-shadow: none; height: 100%; left: 0; margin: 0; object-fit: contain; position: absolute; right: 0; top: 0; width: 100%; } #content ul.compact li { margin-top: 0; }&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#fluffy&quot;&gt;Fluffy Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#gay-agenda&quot;&gt;The Gay Agenda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ghost-v&quot;&gt;Ghost V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#last-xmas&quot;&gt;Last Christmas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#gear-chest&quot;&gt;The Mysterious Gear Chest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#omg&quot;&gt;Oh My God&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#popochius&quot;&gt;Popochius&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rose-tics&quot;&gt;Rose and Tics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#shadow-morrigan&quot;&gt;Shadow of the Morrigan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stowaway&quot;&gt;The Stowaway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#telwynium&quot;&gt;The Telwynium: Book Two&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#where-wolf&quot;&gt;Where Wolf?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#witchs-lullaby&quot;&gt;The Witch&apos;s Lullaby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Definitely check out those, as well as the many other &lt;a href=&quot;https://itch.io/jam/adventure-jam-2022/entries&quot;&gt;entries&lt;/a&gt;. If you like adventure games, there will definitely be some cool stuff to your liking.&lt;/p&gt;
&lt;h2 id=&quot;fluffy-files&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fluffy-files&quot; aria-label=&quot;fluffy files permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fluffy Files&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/fluffy.png&quot; alt=&quot;I guess I should follow the headless chicken...&quot;&gt;&lt;/p&gt;
&lt;p&gt;Fluffy the hamster is a paranormal investigator who probably chose the wrong line of work. He&apos;s not really suitable for this, as he scares incredibly easily. That brings me to a quick warning if you want to play this game: &lt;strong&gt;turn down the volume on your speakers!&lt;/strong&gt; Fluffy&apos;s scream is blood-curdling and loud! The developer really did a lot with just a single room and you&apos;ll find plenty of insane stuff.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://boldmoves.itch.io/fluffy-files&quot;&gt;&lt;em&gt;Fluffy Files&lt;/em&gt;, by Bold Moves&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-gay-agenda&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-gay-agenda&quot; aria-label=&quot;the gay agenda permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Gay Agenda&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/gay-agenda.png&quot; alt=&quot;Mayor Cockburn... Come out of the closet please.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Although I&apos;ve not featured any of Vance Baryn&apos;s games in my main list before, that&apos;s not because of a lack of quality; his entries have consistently been impressive and unique even if they weren&apos;t always my cup of tea. His entry this time, however, really ticks all of my boxes. It has a funny story, quirky characters, simple but effective pixel art, and nice voice acting (including the talents of Paul Thomas and Jon Paul Sapsford both of whom I&apos;ve worked with before, even in the same game) delivering groanworthy puns.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://standoffsoftware.itch.io/the-gay-agenda&quot;&gt;&lt;em&gt;The Gay Agenda&lt;/em&gt;, by StandOffSoftware&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;ghost-v&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ghost-v&quot; aria-label=&quot;ghost v permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ghost V&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/ghost-v.jpg&quot; alt=&quot;A monster saying hello&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ghost V&lt;/em&gt; is based on a 1954 scifi short story which I haven&apos;t read, so I can&apos;t really tell how much of the writing is by Akril15 herself and how much is adaptation. What I &lt;em&gt;can&lt;/em&gt; tell is that the end result is a very effective and creepy interactive story with very well-drawn graphics. Akril15 has an awesome talent for art and game design and combining them into a coherent whole.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://akril15.itch.io/ghost-v&quot;&gt;&lt;em&gt;Ghost V&lt;/em&gt;, by Akril15&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;last-christmas&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#last-christmas&quot; aria-label=&quot;last christmas permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Last Christmas&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/last-christmas.jpg&quot; alt=&quot;Frankie has prepared the cottage living room for Christmas&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content warning!&lt;/strong&gt; This game will be shocking and deals with some very sensitive topics. I&apos;m almost sorry for having to write that disclaimer, however vague I may have written it, as it might reduce the emotional impact of the game. If you&apos;re up to it, help Frankie prepare the family cottage for the perfect Christmas with his girlfriend Betty. As polytely games put it on the game page: &quot;But things aren&apos;t as they seem...&quot;&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://polytelygames.itch.io/last-christmas&quot;&gt;&lt;em&gt;Last Christmas&lt;/em&gt;, by polytely games&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-mysterious-gear-chest&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-mysterious-gear-chest&quot; aria-label=&quot;the mysterious gear chest permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Mysterious Gear Chest&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/gear-chest.png&quot; alt=&quot;What does she say?&quot;&gt;&lt;/p&gt;
&lt;p&gt;You&apos;d be forgiven for thinking I include Marco Giorgini&apos;s games by default because of our friendship. But I genuinely think he has an amazing talent for telling stories with an epic scope. Once again, the story takes place in Italy and goes into a deep historical and religious lore, this time surrounding a mysterious chest that just appeared seemingly out of nowhere. Despite how much he&apos;s had to cut over time constraints, there&apos;s still a huge amount of content here and it&apos;s a compelling story with challenging puzzles.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://marcogiorgini.itch.io/the-mysterious-gear-chest&quot;&gt;&lt;em&gt;The Mysterious Gear Chest&lt;/em&gt;, by Marco Giorgini&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;oh-my-god&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#oh-my-god&quot; aria-label=&quot;oh my god permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Oh My God&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/oh-my-god.jpg&quot; alt=&quot;The marketplace is full of quirky characters&quot;&gt;&lt;/p&gt;
&lt;p&gt;The ancient Etruscan deity Sethlans has a bit of a problem... he&apos;s been forgotten. Not being worshipped makes a god fade away into oblivion. Sepia, the snackbar owner, also has a problem... business is bad. Perhaps they can help each other out. The Argonauts too have featured on my list every year they entered, and for good reason. This year is no exception. The game is pretty challenging (especially when figuring out the results of a certain chariot race), but definitely worth a try!&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://the-argonauts.itch.io/oh-my-god&quot;&gt;&lt;em&gt;Oh My God&lt;/em&gt;, by The Argonauts&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;popochius&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#popochius&quot; aria-label=&quot;popochius permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Popochius&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/popochius.png&quot; alt=&quot;The Popochius are odd little characters looking for their little brother&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Popochius&lt;/em&gt; are odd little characters who each have a special ability. Their young brother has gone missing and they need to find him, maybe even rescue him, because he might even have POOPED! Although otherwise a pretty standard point and click adventure, the unusual characters and some unusual mechanics make this a memorable game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://mapedorr.itch.io/popochius&quot;&gt;&lt;em&gt;Popochius&lt;/em&gt;, by Carenalga&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;rose-and-tics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rose-and-tics&quot; aria-label=&quot;rose and tics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rose and Tics&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/rose-and-tics.jpg&quot; alt=&quot;Roseline and Tics are about to enter Roseline&amp;#x27;s mum&amp;#x27;s place&quot;&gt;&lt;/p&gt;
&lt;p&gt;Roseline is, well, a rose. A talking one. The goblin Tics falls down literally from the sky above and they quickly become friends. Together, they travel the lands to find the three great seeds to save the dying garden. The cute pixel graphics and banter between Rose and Tics combine to make a very enjoyable RPG style adventure game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://aaarcade.itch.io/rose-and-tics&quot;&gt;&lt;em&gt;Rose and Tics&lt;/em&gt;, by Arcadev&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;shadow-of-the-morrigan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#shadow-of-the-morrigan&quot; aria-label=&quot;shadow of the morrigan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Shadow of the Morrigan&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/shadow-morrigan.jpg&quot; alt=&quot;The mysterious Alder tree stands in a druidic circle&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is a bit out of character for me, as I usually tend towards point and click gameplay and 2D pixel graphics. &lt;em&gt;Shadow of the Morrigan&lt;/em&gt;, however, is a full 3D environment with puzzles in the style of games like Myst. Even though it&apos;s different from my normal fare, I thoroughly enjoyed it and was only disappointed that it ended when it did... I wanted more.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://the-icehouse.itch.io/druidic-shadow-of-the-morrigan&quot;&gt;&lt;em&gt;Shadow of the Morrigan&lt;/em&gt;, by The Icehouse&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-stowaway&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-stowaway&quot; aria-label=&quot;the stowaway permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Stowaway&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/stowaway.png&quot; alt=&quot;Travis Walker&amp;#x27;s crewmate looks a little worse for wear&quot;&gt;&lt;/p&gt;
&lt;p&gt;George Broussard is probably best known for being a co-creator of the &lt;em&gt;Duke Nukem&lt;/em&gt; series (and to me personally also for the &lt;em&gt;Crystal Caves&lt;/em&gt;, &lt;em&gt;Pharaoh&apos;s Tomb&lt;/em&gt; and &lt;em&gt;Arctic Adventure&lt;/em&gt; series). I think this is the first time he&apos;s tried his hand at the adventure game genre. &lt;em&gt;The Stowaway&lt;/em&gt; is a classic point and click style adventure game with the type of inventory item puzzles I like. Protagonist Travis Walker reminds me very much of &lt;em&gt;The DIG&lt;/em&gt; character Boston Low, both in the way he&apos;s drawn and in voice acting.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://georgebroussard.itch.io/stowaway&quot;&gt;&lt;em&gt;The Stowaway&lt;/em&gt;, by George Broussard&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-telwynium-book-two&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-telwynium-book-two&quot; aria-label=&quot;the telwynium book two permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Telwynium: Book Two&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/telwynium.jpg&quot; alt=&quot;Connie Fairwright yells &amp;#x22;OUT OF MY KITCHEN!!&amp;#x22;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Telwynium: Book Two&lt;/em&gt;, as the name implies, is the second in a series, a direct sequel to last year&apos;s entry by Powerhoof. &lt;a href=&quot;/blog/2021/05/25/advjam2021-shout-outs#telwynium&quot;&gt;Everything I said then&lt;/a&gt; still applies. I loved seeing the story develop from that first game and learning more of the backstory and lore of the Telwynium universe. Here&apos;s hoping developer Dave Lloyd will turn it into a trilogy.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://powerhoof.itch.io/the-telwynium-book-two&quot;&gt;&lt;em&gt;The Telwynium: Book Two&lt;/em&gt;, by Powerhoof&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;where-wolf&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#where-wolf&quot; aria-label=&quot;where wolf permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Where Wolf?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/where-wolf.png&quot; alt=&quot;The nuns have distinctive moustaches and nicknames to match. Distinctive, but not politically correct&quot;&gt;&lt;/p&gt;
&lt;p&gt;Fabio Guggeri is another developer who consistently turns out funny and well-designed games. &lt;em&gt;Where Wolf?&lt;/em&gt; is the story of a werewolf who&apos;s been captured by a crazy bishop and finds himself in the dungeon underneath a convent populated by insane nuns. If that sounds bonkers, that&apos;s only because it is.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gugames.itch.io/where-wolf&quot;&gt;&lt;em&gt;Where Wolf?&lt;/em&gt;, by GuGames.eu&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-witchs-lullaby&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-witchs-lullaby&quot; aria-label=&quot;the witchs lullaby permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Witch&apos;s Lullaby&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/07/witchs-lullaby.png&quot; alt=&quot;I have come to seek your majesty&amp;#x27;s blessing.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Honza Vávra&apos;s an insanely talented artist and I wouldn&apos;t be able to create even a single background or animation as good as he does even if I spent the entire two weeks of the jam on it. He really went all out on this one, with probably the largest hand-drawn world I&apos;ve ever seen in a jam game. And it&apos;s not just style, there&apos;s also plenty of substance. An extensive story and sensible point and click style puzzles truly complement the gorgeous art.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://hvavra.itch.io/the-witchs-lullaby&quot;&gt;&lt;em&gt;The Witch&apos;s Lullaby&lt;/em&gt;, by Honza Vávra&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;honourable-mentions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#honourable-mentions&quot; aria-label=&quot;honourable mentions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Honourable mentions&lt;/h2&gt;
&lt;p&gt;There&apos;s a few more that didn&apos;t quite make my list for various reasons, but still stood out one way or another:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gwenckatz.itch.io/arbor&quot;&gt;&lt;em&gt;Arbor&lt;/em&gt;, by G.C.Katz&lt;/a&gt; — with its well-written and poignant story&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trianglh.itch.io/delivery-box&quot;&gt;&lt;em&gt;Delivery Box&lt;/em&gt;, by _Tirangl &amp;#x26; Nugget&lt;/a&gt; — a very well made (and punishingly difficult) puzzle platformer.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dialobic.itch.io/onironautilus-os&quot;&gt;&lt;em&gt;Oronautilus The Other Side&lt;/em&gt;, by Dialobic&lt;/a&gt; — for a uniquely artful way of telling a story.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://morphidragunny.itch.io/potion-making-with-morphi&quot;&gt;&lt;em&gt;Potion Making with Morphi&lt;/em&gt;, by Morphi / Hot-Gothics&lt;/a&gt; — which is so unfinished that it literally has no gameplay, but makes up for it with gorgeous characters and a very cute story.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://subhajit-adhikari.itch.io/unknown-deep&quot;&gt;&lt;em&gt;Unknown Deep&lt;/em&gt;, by Subhajit Adhikari&lt;/a&gt; — for a well-polished and gorgeous, if somewhat flawed, game. It&apos;s too far away from the adventure genre for me to include it on my main list, but too well made to ignore.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Porting Blood Nova to DOS]]></title><description><![CDATA[In January and February of 2022, I ran a Kickstarter campaign for a new retro style point and click adventure game Blood Nova. As one of my…]]></description><link>https://www.shdon.com/porting-blood-nova-to-dos/</link><guid isPermaLink="false">https://www.shdon.com/porting-blood-nova-to-dos/</guid><pubDate>Sun, 17 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In January and February of 2022, I ran a &lt;a href=&quot;https://bit.ly/blood-nova-campaign&quot;&gt;Kickstarter campaign for a new retro style point and click adventure game&lt;/a&gt; &lt;a href=&quot;https://bit.ly/blood-nova&quot;&gt;Blood Nova&lt;/a&gt;. As one of my responsibilities is to create the macOS and Linux builds, I thought that, just for fun, I&apos;d look into creating a build for MS-DOS too. Having worked on it as a side-project for a few weeks now, I&apos;m confident that such a port is possible. This post is intended to explain a little about the process and the challenges involved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/game-maker-studio.png&quot; alt=&quot;Blood Nova being created in Game Maker Studio.&quot;&gt;&lt;/p&gt;
&lt;p&gt;The primary build of Blood Nova is being made for Windows using &lt;a href=&quot;https://www.yoyogames.com/en/gamemaker&quot;&gt;GameMaker Studio&lt;/a&gt;, which also supports doing builds for macOS and Linux. MS-DOS, however, is not a supported target platform (imagine that!). As the game runs in 320x180 resolution with a very limited colour palette of just a few dozen entries, and doesn&apos;t rely on blistering fast animations, full motion video, or complicated 3D worlds, there isn&apos;t really anything about the game itself that precludes running on DOS. That, coupled with the fact that a point and click adventure like this requires only a small subset of the functions GameMaker provides, made me think that, rather than doing a full port with an entirely different codebase, I should look into creating a runtime environment for DOS that allows using the original codebase with only minor alterations. This, while slower than a true port, would tremendously simplify maintenance of the code and keeping the content and features of the main version in sync with the DOS version. So, think of this DOS version not so much as the &lt;em&gt;game&lt;/em&gt; being ported, but the &lt;em&gt;engine&lt;/em&gt;. What I&apos;ve created is similar to the ScummVM system allowing older games to run on modern systems, but the other way around.&lt;/p&gt;
&lt;p&gt;As not everybody will be interested in every aspect of the process, here is a quick table of contents allowing you to skip to the sections that you might be interested in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#bn-gml&quot;&gt;GameMaker Language&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#bn-gml-with&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;self&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;other&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bn-gml-shims&quot;&gt;Shims, redirects and stub functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bn-gfx&quot;&gt;Graphics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bn-sound&quot;&gt;Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bn-music&quot;&gt;Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bn-end&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gamemaker-language&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#gamemaker-language&quot; aria-label=&quot;gamemaker language permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GameMaker Language&lt;/h2&gt;
&lt;p&gt;GameMaker has its own custom scripting language, called GML, which is highly similar to JavaScript/ECMAScript. There are some differences (some of which are very significant), but much of the syntax is identical. There are several JS interpreters written in C that can be embedded in host programmes like the runtime environment I envision. Examples of such interpreters are &lt;a href=&quot;https://duktape.org&quot;&gt;Sami Varaala&apos;s Duktape&lt;/a&gt;, Fabrice Bellard&apos;s QuickJS and MuJS. For my current development efforts, I have used Duktape as I have experience with that because I use it in my other games. Its primary focus is not on speed, which may prove to be a problem especially on the now obsolete hardware that is appropriate for the DOS era. So in the future, I may have to replace it with QuickJS or MuJS, provided I can build them with &lt;a href=&quot;https://www.delorie.com/djgpp/&quot;&gt;DJGPP&lt;/a&gt; (a DOS port of the GCC compiler).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/djgpp-rhide.png&quot; alt=&quot;The RHIDE environment for developing using the DJGPP C++ compiler.&quot;&gt;&lt;/p&gt;
&lt;p&gt;One thing that is very confusing about GameMaker is that it has slightly different terminology for things than is common in the development world. What GM calls an &quot;object&quot; is what is normally referred to as a &quot;class&quot;. And the actual instances of those class are called &quot;instances&quot; (which isn&apos;t too confusing, as the rest of the world also often calls them instances, however, they are also often called simply &quot;objects&quot;, which leads to confusion with GM&apos;s use of that term). I will try to avoid the use of the word &quot;object&quot; and instead use &quot;class&quot; and &quot;instance&quot; only.&lt;/p&gt;
&lt;p&gt;The first thing I created is a separate translator programme. It has several tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Parsing all the GML scripts, classes and events into an AST which can then be output as text again in either GML form (outputting essentially the same as the input code, just stripped of all comments and with strictly uniform formatting) or JavaScript form (in many cases identical to the GML code, but with adjustments made for the differences between GML and JS)&lt;/li&gt;
&lt;li&gt;Keeping track of which GM functions are actively being used by the GML code in Blood Nova, so that I know exactly which subset of GM to implement in the runtime&lt;/li&gt;
&lt;li&gt;Injecting custom scripts to override certain GML behaviours and to manage the runtime. This is done in JavaScript as much as possible, rather than in the native C++ code of the runtime environment. That makes it a lot easier to switch to another JS interpreter if/when needed&lt;/li&gt;
&lt;li&gt;Precompiling the JS code to bytecode for the JS interpreter, to improve startup performance of the DOS runtime environment&lt;/li&gt;
&lt;li&gt;Converting all the metadata from the GM project into a format that is easier to handle for the runtime environment&lt;/li&gt;
&lt;li&gt;Converting graphics from PNG format to PCX to comply with the VGA palette and for ease of decoding as well as performance on DOS era hardware&lt;/li&gt;
&lt;li&gt;Converting sound effects from MP3 or OGG format to WAV format at a lower fidelity. Although they will take up more space in WAV format, this is offset by the reduced samplerate (11025Hz vs 44100Hz) and the reduced resolution (8bit vs 16bit). Still, the sound quality is lower&lt;/li&gt;
&lt;li&gt;Replacing the digital music tracks with MIDI versions, with custom versions for General MIDI and the venerable Roland MT-32&lt;/li&gt;
&lt;li&gt;Combining the results of all the above into a large packed data file, like a TAR archive (similar to a ZIP file, but without compression) for easier distribution, and to overcome the lack of long filenames on DOS&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;with-self-and-other&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#with-self-and-other&quot; aria-label=&quot;with self and other permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;self&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;other&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; construct deserves special mention, because it is one of the most radically different things between GML and JS, is being used extensively in pretty much any GML code and is absolutely crucial to have it working properly to be able to run anything.&lt;/p&gt;
&lt;p&gt;Even though GML has classes and instances, it&apos;s not a proper object-oriented language, lacking such features as constructors/destructors, method calls, encapsulation etc. What it does have is events like &lt;code class=&quot;language-text&quot;&gt;Create&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Destroy&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Step&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Draw&lt;/code&gt; at the class level, and potentially some instance creation code for a specific instance in a room. While those features are lacking, it does have other features that are very appropriate for game development. While most languages would require the developer to keep track of which instances are active in the game, and iterate over those as needed, GML provides a &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; construct that loops over all active instances of a class. This means that, whereas in, say, C++, you&apos;d have to do something like:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-typedef std::list &lt;calien *&quot;&gt; LIST_OF_ALIENS; LIST_OF_ALIENS active_aliens; LIST_OF_ALIENS::iterator itor = active_aliens.begin (); while (itor != active_aliens.end ()) { CAlien *a = *itor++; a-&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;to move all aliens to the right by 3 pixels, GML instead allows you to do simply:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;with (CAlien) x += 3;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;JavaScript doesn&apos;t keep a list of all instances created with the class. It does have a &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; construct, though unlike the GML version, it is not a loop, instead operating on a single instance. So instead, the runtime has an object corresponding to the class, which has a member &lt;code class=&quot;language-text&quot;&gt;$instances&lt;/code&gt; where it keeps references to all instances created. The reason for starting the variable name with a $ sign is simply that GML does not accept $ as part of an identifier, so there is no possibility of conflicting variable names when I prefix the automatically generated ones with that symbol. So, the above code gets translated into something like:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;_context_push (); for (var $itor in CAlien.$instances) { with (CAlien.$instances [$itor]) { $context = self; x += 3; } } $context = _context_pop ();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Since nested &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; blocks are possible, there must be a way to access either the inner or outer object explicitly. This done through the &lt;code class=&quot;language-text&quot;&gt;self&lt;/code&gt; keyword for the inner instance or whatever instance an event is operating on (the counterpart of JavaScript&apos;s &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; keyword) and &lt;code class=&quot;language-text&quot;&gt;other&lt;/code&gt; for the outer instance (the &lt;code class=&quot;language-text&quot;&gt;self&lt;/code&gt; at the scope above the current &lt;code class=&quot;language-text&quot;&gt;with&lt;/code&gt; block). An example use of this is to make all aliens move towards any player characters that are within 100 pixels of them:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;with (CPlayer) { with (CAlien) { if (point_distance (self.x, other.x, self.y, other.y) &amp;lt; 100) { move_towards_point (other.x, other.y, 5); } } }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To keep track of the current context and the &lt;code class=&quot;language-text&quot;&gt;other&lt;/code&gt; reference, a stack of contexts is kept and managed through the &lt;code class=&quot;language-text&quot;&gt;\_context\_push&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;\_context\_pop&lt;/code&gt; functions.&lt;/p&gt;
&lt;p&gt;Additionally, any functions in scripts that &lt;em&gt;aren&apos;t&lt;/em&gt; part of an event handler, are still executed with the scope of an object. To replicate this behaviour, my translator programme injects a &lt;code class=&quot;language-text&quot;&gt;with (this) { ... }&lt;/code&gt; to surround the body of every GML function after translation to JavaScript.&lt;/p&gt;
&lt;h3 id=&quot;shims-redirects-and-stub-functions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#shims-redirects-and-stub-functions&quot; aria-label=&quot;shims redirects and stub functions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Shims, redirects and stub functions&lt;/h3&gt;
&lt;p&gt;Because GML isn&apos;t object oriented in the way that JavaScript or most other modern language are, outside the classes and instances that are placed on the game screen, all of its functionality is in functions rather than method calls. As the things these functions do are for a large part trivial, there are many shims that can be trivially implemented in JavaScript directly, greatly simplifying the code of the runtime host programme. For example:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;function array_length(a) { return a.length; } function ds_list_delete (list, pos) { list.splice (pos, 1); } function variable_struct_get (struct, name) { return struct ? struct [name] : undefined; }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Others can be redirected directly to their JS counterparts entirely:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;json_encode = JSON.stringify;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And finally, some functionality being used is totally irrelevant to a DOS environment, so these functions are implemented by ignoring them:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;function application_surface_draw_enable (flag) {}&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;graphics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#graphics&quot; aria-label=&quot;graphics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Graphics&lt;/h2&gt;
&lt;p&gt;Blood Nova&apos;s backgrounds are drawn at a resolution of 320x180, to have a 16:9 ratio, which fits neatly into the 320x200 resolution of standard VGA mode 13h. The palette for the game&apos;s graphics contains just 42 entries, so that too is perfectly suitable for 8-bit colour, with enough space in the palette left over to do multiple versions of the base palette to enable blending.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/blood-nova-palette.png&quot; alt=&quot;The Blood Nova palette with multiple versions for blending.&quot;&gt;&lt;/p&gt;
&lt;p&gt;In game, there are several cases where blending is used to achieve translucency effects. The major ones are the semi-transparent black backgrounds behind the text, a dark background for the inventory grid, and a purple background for the map grid. Unfortunately, 8-bit colour doesn&apos;t allow for perfect blending of arbitrary colours. However, those three common instances of translucency can be reproduced perfectly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/blood-nova-blending.png&quot; alt=&quot;Showing off the blending effect behind the inventory panel.&quot;&gt;&lt;/p&gt;
&lt;p&gt;As you can see in the image above, the background of the inventory panel is translucent. Any other uses of blending (which amounts to fading sprites in and out, such as during a cutscene) have to be approximated through the use of dithering. Honestly, I was quite surprised to find that it doesn&apos;t look absolutely terrible. A good example of the dithering is the letters of the Blood Nova logo on the main menu screen fading in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/blood-nova-dithering.png&quot; alt=&quot;Showing off the dithering effect on the Blood Nova logo.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;sound&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sound&quot; aria-label=&quot;sound permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sound&lt;/h2&gt;
&lt;p&gt;There are plenty of sound effects in Blood Nova, all as high quality stereo recordings. Although it isn&apos;t a very common occurrence, it can happen that multiple sound effects play simultaneously, or that one-off sound effects play over a continuous background loop. This means that it won&apos;t do to just have those one-off sounds playing and cutting each other off if there is more than one at a time. To overcome that, continuous mixing of multiple channels is required. On a modern PC, this is handled by the sound hardware or even on the CPU with very little impact. On a DOS era computer, a Gravis UltraSound can handle the mixing in hardware, but for the much more common Sound Blaster family of cards, it has to be done in the CPU and the impact on performance is not insignificant. The lower the sound quality, the lower the aount of CPU power required. Additionally, the original sound effects are compressed MP3 files (and one OGG file), which requires yet more CPU power to decode.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/sound-blaster.png&quot; alt=&quot;The Creative Labs Sound Blaster card version 2.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Beside processing requirements, I&apos;m also looking to keep the disk space requirements as low as possible. This is to make it possible to have a set of physical install disks (or downloadable disk images) as a means for distributing the game. To make the sound system workable and use up as little disk space as possible, I ended up decreasing the sound quality to 11kHz 8bit mono. Yes, this doesn&apos;t sound nearly as good as the originals, but I feel it is an acceptable compromise and also adds a bit of a retro charm to the sound. Here&apos;s a short video demonstrating the sound playback.&lt;/p&gt;
&lt;p&gt;Writing (and especially debugging) the sound mixer code was an exercise in masochism, as the machine I&apos;m writing the code on isn&apos;t very powerful and doesn&apos;t have great sound capabilities. Also, when programming under DOS, the debugging facilities aren&apos;t nearly as advanced as when writing under a modern OS with modern tools. That, and interrupt handlers are notoriously difficult to debug. Still, the results are worth it. I have elected to support only version 2 of the Sound Blaster card or later, including the SB Pro, SB16, and SB AWE. This is because the 1.0 and 1.5 revisions don&apos;t support auto-initialising DMA, which can be worked around, but that can result in audible clicks.&lt;/p&gt;
&lt;h2 id=&quot;music&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#music&quot; aria-label=&quot;music permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Music&lt;/h2&gt;
&lt;p&gt;Blood Nova&apos;s soundtrack is composed primarily by Donovan Jonk of Megahammer Studios. It would be quite possible to just use the digital tracks from the mainline version and play them back using the sound mixer described above. However, this would require a significant amount of disk space for the sampled tracks, and it wouldn&apos;t be very common for a DOS game not distributed on CD to have a fully digital soundtrack. More appropriate for the era was the use of an AdLib or Sound Blaster for the lower end, a Gravis UltraSound in the mid-range or at the high end of the spectrum, a Roland MT-32 or one of its General MIDI successors.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/04/roland-mt-32.png&quot; alt=&quot;The Roland MT-32 MIDI module.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Therefore, the DOS version will also make use of a MIDI soundtrack. These tracks will be played back through the MIDI port through a General MIDI compatible synthesizer for best results, with a custom version being created for the Roland MT-32 (which has different instrument patches and velocity and panning response and different MIDI channel assignments). A cut-down version can be played through the OPL2 FM chip on the AdLib and Sound Blaster cards and I&apos;m also exploring the possibility of implementing a Gravis UltraSound driver.&lt;/p&gt;
&lt;p&gt;Note that the tune in the video above is from the Gravis UltraSound driver CD, played back through a Roland Sound Canvas MIDI synthesizer. The song is designed to show off the abilities of a MIDI synthesizer and, while it is great for demonstration purposes and testing whether the code works correctly, it sounds nothing like the actual Blood Nova sound track will. I can&apos;t take credit for writing this tune or for the sound quality of the Roland synth.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;One final thing to end on. To make the nostalgia experience complete, there should be a configuration utility to choose the sound devices and I opted to model mine on the old style Sierra SCi installers.&lt;/p&gt;
&lt;p&gt;I hope this will have given you a bit of insight into the process and the effort that goes into creating a DOS port of a modern retro game. The DOS version of Blood Nova will not be available separately, as I don&apos;t have the publishing rights for it, but will be freely available to people who have backed the game on Kickstarter, and may be offered as an extra download for the Steam and Itch versions too.&lt;/p&gt;
&lt;p&gt;If you haven&apos;t backed the project on Kickstarter, you will be able to get the game on Steam when it is released, so go right ahead and wishlist &lt;a href=&quot;https://bit.ly/blood-nova&quot;&gt;Blood Nova on Steam&lt;/a&gt;.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Pathfinding in point and click adventure games]]></title><description><![CDATA[There are multiple ways to do pathfinding. One commonly used method is having a navigation mesh or a graph of nodes and then running…]]></description><link>https://www.shdon.com/pathfinding-in-point-and-click-adventure-games/</link><guid isPermaLink="false">https://www.shdon.com/pathfinding-in-point-and-click-adventure-games/</guid><pubDate>Wed, 30 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are multiple ways to do pathfinding. One commonly used method is having a navigation mesh or a graph of nodes and then running &lt;a href=&quot;https://en.wikipedia.org/wiki/Dijkstra&amp;#x27;s_algorithm&quot;&gt;Dijkstra&apos;s algorithm&lt;/a&gt; or an &lt;a href=&quot;https://en.wikipedia.org/wiki/A*_search_algorithm&quot;&gt;A* search&lt;/a&gt; on that. In fact, A* is what I used for my adventure games until &lt;a href=&quot;/projects/&quot;&gt;It&apos;s Flot&lt;/a&gt;. Instead of a coarse mesh, the graph had a node for every pixel. With low resolution games, there can be just a few thousand nodes to check which can be done even on moderately powerful hardware in a fraction of a second. Unfortunately, for It&apos;s Flot, being in full HD, there could be a million or more walkable pixels, leading to a huge slowdown. In certain cases, it could take several seconds to compute a path. So to make the game playable, without having to replace the assets, I replaced the pathing algorithm with one I devised myself. I&apos;m sure I didn&apos;t invent something new, but as somebody asked, here&apos;s a short description of how it works.&lt;/p&gt;
&lt;h2 id=&quot;walkability-bitmap&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#walkability-bitmap&quot; aria-label=&quot;walkability bitmap permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Walkability bitmap&lt;/h2&gt;
&lt;p&gt;For all my backgrounds where the character can walk around the scene, I have a bitmap that marks every pixel a character can go. There can be multiple areas. For instance, in the image below which shows the walkability bitmap overlaid on the actual game display, the player can always walk to any of the green pixels, but can only move onto the blue pixels once they&apos;ve convinced the security guard to open the gate for them. The black pixels can never be reached by the player character.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2022/03/walkability.png&quot; alt=&quot;Bitmap defining walkable areas overlaid on the visible background from Spy Quest 2 - Operation: BOGROLL&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;set-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#set-up&quot; aria-label=&quot;set up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Set-up&lt;/h2&gt;
&lt;p&gt;The game state determines which (combination) of those areas is accessible. When the player clicks on a pixel to walk there, the first step is to create a buffer the exact size of the scene and to fill it with two possible values: &lt;code class=&quot;language-text&quot;&gt;MAX\_INT&lt;/code&gt; for every pixel the player can walk on, &lt;code class=&quot;language-text&quot;&gt;\-1&lt;/code&gt; for every pixel they can&apos;t walk on. This distance buffer will hold the shortest distance to the target point. This does mean that the elements in the buffer need to be large enough to hold the maximum possible distance (since memory is cheap these days, I just go with a 32-bit signed integer). After initialising that distance buffer, the last thing to set up before getting to the meat of the algorithm is setting up two empty stacks and pushing the target pixel onto one. In pseudo-code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/* Quick sanity check */ if (!allowed_at (destination.x, destination.y)) { /* Destination is unreachable by definition */ return; } /* Initialise the distance buffer */ int distance_buffer [width, height]; for (y = 0; y &amp;lt; height; ++y) { for (x = 0; x &amp;lt; width; ++x) { if (allowed_at (x, y)) { distance_buffer [x, y] = MAX_INT; } else { distance_buffer [x, y] = -1; } } } /* Prepare stacks of points to process */ STACK&amp;lt;point&gt; current; STACK&amp;lt;point&gt; next; current.push (destination);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;distance-calculations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#distance-calculations&quot; aria-label=&quot;distance calculations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Distance calculations&lt;/h2&gt;
&lt;p&gt;When the set-up is done, it&apos;s time to actually calculate the distance to each pixel neighbouring the ones on the &lt;code class=&quot;language-text&quot;&gt;current&lt;/code&gt; stack, then put all those pixels onto the &lt;code class=&quot;language-text&quot;&gt;next&lt;/code&gt; stack for the next iteration of the distance finding algorithm. Note that the calculated distance is not the true (Pythagorean) distance but the Manhattan distance. This requires only additions to fill the distance buffer. The way to visualise this is as a diamond-shaped flood fill from that target pixel. In pseudo-code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/* The destination point obviously has a distance of 0 */ int dist = 0; distance_buffer [destination.x, destination.y] = 0; while (true) { /* Next iteration, increase by 1 to get Manhattan distance */ dist++; /* Process all pixels on the current stack while (point p = current.pop ()) { /* Check to the left */ if (p.x &gt; 0 &amp;amp;&amp;amp; distance_buffer [p.x - 1, p.y] == INT_MAX) { distance_buffer [p.x - 1, p.y] = dist; next.push ({ p.x - 1, p.y }); } /* Check to the right */ if (p.x &amp;lt; width - 1 &amp;amp;&amp;amp; distance_buffer [p.x + 1, p.y] == INT_MAX) { distance_buffer [p.x + 1, p.y] = dist; next.push ({ p.x + 1, p.y }); } /* Check up */ if (p.y &gt; 0 &amp;amp;&amp;amp; distance_buffer [p.x, p.y - 1] == INT_MAX) { distance_buffer [p.x, p.y - 1] = dist; next.push ({ p.x, p.y - 1 }); } /* Check down */ if (p.y &amp;lt; height - 1 &amp;amp;&amp;amp; distance_buffer [p.x, p.y + 1] == INT_MAX) { distance_buffer [p.x, p.y + 1] = dist; next.push ({ p.x, p.y + 1 }); } } /* Nothing added to the next stack? Then we&apos;re done */ if (next.empty ()) break; /* The next stack now becomes the current stack */ current = next; next.clear (); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; although the &quot;up&quot; and &quot;down&quot; in the comments assume the origin is at the upper left (whereas some systems place the origin at the lower left), the code is completely agnostic to this. It is only in the comments for clarification of the process, in a way that matches my own use-case.&lt;/p&gt;
&lt;h2 id=&quot;path-tracing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#path-tracing&quot; aria-label=&quot;path tracing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Path tracing&lt;/h2&gt;
&lt;p&gt;After this step, the distance buffer will have a minimum distance for every pixel that is reachable from the target point. If the starting point does not have a proper value, but is still at the initial value of &lt;code class=&quot;language-text&quot;&gt;MAX\_INT&lt;/code&gt;, there is no possible path from the starting point to the destination. We can then trace a path from the start to the end by making sure we always go to the neighbouring pixel with the lowest value in the distance buffer.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dist = distance_buffer [start.x, start.y]; if (dist == INT_MAX) { /* Destination is entirely unreachable from start */ return; } /* The path list will hold all pixels along the path */ LIST&amp;lt;point&gt; path; point p = start; while (true) { path.push (p); /* Reached the destination? Then the distance should be 0 */ if (dist == 0) break; /* Next distance to look for is one less than the current one */ dist--; /* Allow diagonal movement also, which will have a distance of yet one less */ int diag = dist - 1; /* Check whether the four cardinal directions are allowed */ bool can_go_left = (p.x &gt; 0) &amp;amp;&amp;amp; distance_buffer [p.x - 1, p.y] == dist; bool can_go_right = (p.x &amp;lt; width - 1) &amp;amp;&amp;amp; distance_buffer [p.x + 1, p.y] == dist; bool can_go_up = (p.y &gt; 0) &amp;amp;&amp;amp; distance_buffer [p.x, p.y - 1] == dist; bool can_go_down = (p.y &amp;lt; height - 1) &amp;amp;&amp;amp; distance_buffer [p.x, p.y + 1] == dist; /* And go diagonal if possible */ if (can_go_left) { p.x--; if (can_go_up &amp;amp;&amp;amp; distance_buffer [p.x, p.y - 1] == diag) { dist = diag; p.y--; } else if (can_go_down &amp;amp;&amp;amp; distance_buffer [p.x, p.y + 1] == diag) { dist = diag; p.y++; } continue; } if (can_go_right) { p.x++; if (can_go_up &amp;amp;&amp;amp; distance_buffer [p.x, p.y - 1] == diag) { dist = diag; p.y--; } else if (can_go_down &amp;amp;&amp;amp; distance_buffer [p.x, p.y + 1] == diag) { dist = diag; p.y++; } continue; } /* Only directions remaining to check are straight up and down */ if (can_go_up) { p.y--; continue; } if (can_go_down) { p.y++; continue; } /* Never should get here */ }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;extra-simplification&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#extra-simplification&quot; aria-label=&quot;extra simplification permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extra: Simplification&lt;/h2&gt;
&lt;p&gt;After this, the &lt;code class=&quot;language-text&quot;&gt;path&lt;/code&gt; list should contain a list of pixels for the character to walk over in the shortest path from the start point to the destination point. We could consider the job done. I prefer to add several steps, though. The first is a simplication step, in which all the intermediate points on a straight line segment (either horizontal, vertical or diagonal) are removed. The path itself will be unchanged after this simplication, but will hold far fewer points.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/* Must be at least 3 points for simplication */ if (path.size () &gt;= 3) { /* Compare the current point and the two subsequent ones */ LIST&amp;lt;point&gt;::iterator it1 = path.begin (); while (true) { LIST&amp;lt;point&gt;::iterator it2 = it1.next (); if (it2 == path.end ()) break; /* Calculate direction */ point p1 = it1.get (); point p2 = it2.get (); int dx = p2.x - p1.x; int dy = p2.y - p1.y; while (true) { LIST&amp;lt;point&gt;::iterator it3 = it2.next (); if (it3 == path.end ()) break; p2 = it2.get (); point p3 = it3.get (); /* If there is a change in direction, skip to the next segment */ if (p3.x - p2.x != dx) break; if (p3.y - p2.y != dy) break; /* Remove the middle point */ path.remove (it2); /* The old end point becomes the new middle point */ it2 = it3; } /* The end point of the last segment becomes the start of the new segment */ it1 = it2; } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;extra-beautification&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#extra-beautification&quot; aria-label=&quot;extra beautification permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extra: Beautification&lt;/h2&gt;
&lt;p&gt;As the algorithm only checks along the four cardinal directions and the four diagonals, the path may look quite unnatural with the character walking only along those 8 directions, and making turns at odd points. Real people don&apos;t walk like that, making 45 or 90 degree turns after a few steps. So, there can be an additional step of &quot;beautifying&quot; the path. We can do this by checking each point along the path to see whether a beeline to there is possible from the earliest possible point. And, if so, eliminating any of the points in between. If it were a tile-based map we were checking where movement goes from the centre of one tile to the next, this step probably shouldn&apos;t be used at all, but if the character can walk along an arbitrary line, it greatly improves the path. For more natural paths, I also check smaller fractions of the line segments from the simplication step. If the simplification step hadn&apos;t been done, the beautification step would be very simple, but also would be more computationally expensive. Again, in pseudocode:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/* Must be at least 3 points for beautification */ if (path.size () &gt;= 3) { LIST&amp;lt;point&gt;::iterator it1; it1 = path.begin (); while (true) { LIST&amp;lt;point&gt;::iterator it2 = it1.next (); if (it2 == path.end ()) break; LIST&amp;lt;point&gt;::iterator it3 = it2.next (); if (it3 == path.end ()) break; /* Check whether a beeline between point 1 and 3 is possible. If so, point 2 can be dropped */ if (beeline_possible (it1.get (), it3.get ()) { path.remove (it2); continue; } /* NOTE: The following part is necessary only if the simplification step has been done, splitting up line segments into smaller parts */ point p1 = it1.get (); point p2 = it2.get (); point p3 = it3.get (); /* Get the distance between the 2nd and 3rd points */ int dx = p3.x - p2.x; int dy = p3.y - p2.y; float dist = sqrt (dx * dx + dy * dy); /* Don&apos;t bother with less than 10 pixels */ if (dist &amp;lt; 10) continue; /* Check beelines along at most 10 steps, of at least 5 pixels each */ float step_size = dist / 10.0; int num_steps = 10; if (step_size &amp;lt; 5) { num_steps = dist / 5.0; if (num_steps &amp;lt; 1) num_steps = 1; step_size = dist / num_steps; } /* Work backwards, the furthest one found should be it */ for (int i = num_steps - 1; i &gt; 0; --i) { point p4; p4.x = p2.x + (dx * i / num_steps); p4.y = p2.y + (dy * i / num_steps); if (beeline_possible (p1, p4)) { /* Move the middle point (where the line segments connect and change direction) to be this location */ it2.set (p4); } } /* NOTE: If you skipped the simplication step, continue from here */ /* Move on to next point */ it1 = it2; } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Implementation of the &lt;code class=&quot;language-text&quot;&gt;beeline&lt;/code&gt; function is left as an exercise for the reader. What it does is run a &lt;a href=&quot;https://en.wikipedia.org/wiki/Bresenham&amp;#x27;s_line_algorithm&quot;&gt;Bresenham line algorithm&lt;/a&gt; and check the values in the distance buffer for all the pixels along that line against the value &lt;code class=&quot;language-text&quot;&gt;\-1&lt;/code&gt; (where the &lt;code class=&quot;language-text&quot;&gt;is\_allowed&lt;/code&gt; function returned &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; during set-up). It returns &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt; if there are no non-allowed pixels and thus a beeline is possible. And conversely, it returns &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; if even a single pixel along the line is not accessible.&lt;/p&gt;
&lt;p&gt;After that beautification step, the path will already look far more natural. In my engine, I run the same algorithm again, but working the other way around (from destination point to starting point) to clean it up even further. I won&apos;t bother with showing that code, as it is literally the same as the first beautification phase, but with the path in reverse.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;There you have it, all the details of how I do pathfinding on a 2D pixel grid for my adventure games. Although the pseudo-code is relatively unoptimised (for instance: you could stop filling the distance buffer when assigning a distance to the starting point, which will be a bit quicker especially for shorter paths), the final implementation ended up being &lt;em&gt;much&lt;/em&gt; faster than my initial A* search and calculates a path even on a grid with a million walkable pixels at a rate fast enough for uninterrupted gameplay. At low resolutions, even 25 year old hardware doesn&apos;t break a sweat.&lt;/p&gt;
&lt;p&gt;The algorithm runs in almost constant time (for finding a path between any two pixels on the same walkability bitmap). The runtime is effectively linear with respect to the amount of pixels that are reachable from the destination pixel. Even the most pathological case, say a single-pixel-width spiral covering the entire screen should take virtually the same time as a straight line. (Although in my implementation, I do check the trivial straight line (beeline) case before going into the &quot;proper&quot; pathfinding).&lt;/p&gt;
&lt;p&gt;And finally, I&apos;m happy to report that implementation of this algorithm led to a speed improvement of 3 orders of magnitude (from over 20 seconds to 10 milliseconds) in pathfinding for the person who inquired. Check out &lt;a href=&quot;https://gitlab.com/mdurieu/2d-path-finding-unity&quot;&gt;their implementation on GitLab&lt;/a&gt;.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Compatibility with ancient hardware and software]]></title><description><![CDATA[Even compared to fixing bugs in 25 year old DOS games, this is possibly the most useless thing I've done all year, yet to me also one of the…]]></description><link>https://www.shdon.com/compatibility-with-ancient-hardware-and-software/</link><guid isPermaLink="false">https://www.shdon.com/compatibility-with-ancient-hardware-and-software/</guid><pubDate>Wed, 29 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Even compared to &lt;a href=&quot;/cosmo-chicken-patched/&quot;&gt;fixing bugs in 25 year old DOS games&lt;/a&gt;, this is possibly the most useless thing I&apos;ve done all year, yet to me also one of the most fun. During my time off for the holiday season, I set about making my most recent games run on two decade old hardware.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/winme.png&quot; alt=&quot;The Telescopium Incident running on a laptop with Windows Me and an underpowered ATi Rage Mobility M&quot;&gt;&lt;/p&gt;
&lt;p&gt;As I started development of my homegrown adventure game engine in the early 2000s, people were most commonly running Windows 98 Second edition or Windows Millennium Edition, with some actually opting for Windows XP&apos;s daddy Windows 2000 instead. In fact, the laptop I was developing it on is the very same I&apos;ve been using for these tests.&lt;/p&gt;
&lt;p&gt;This particular laptop is powered by a 550MHz Intel Celeron, with 320MB of RAM (expanded from the original 64), a whopping 5GB hard drive, and for this story the most important thing: an &lt;a href=&quot;https://en.wikipedia.org/wiki/ATI_Rage_series&quot;&gt;ATi Rage&lt;/a&gt; Mobility M graphics chipset running at 800x600. Even in its day, this wasn&apos;t a graphics powerhouse. But I figured that, as the engine started life on this laptop, it might be fun to see whether I could run the games I created with it recently on that now more than 20 year old piece of kit.&lt;/p&gt;
&lt;h2 id=&quot;what-had-to-change-to-run-on-windows-me&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-had-to-change-to-run-on-windows-me&quot; aria-label=&quot;what had to change to run on windows me permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What had to change to run on Windows Me?&lt;/h2&gt;
&lt;p&gt;Simply, nothing. I initially wrote the engine using Microsoft Visual C++ 5 and 6 using plain C++ and the bare Win32 API. Although current versions are compiled with Microsoft Visual C++ 2005, I&apos;ve not made significant use of any Win32 functionality more recent than what is provided in that old API, simply because I&apos;ve not had a need for it. The engine has even been programmed against DirectX 8 and that was readily available on Windows 9x (even a DirectX 9 is available for it).&lt;/p&gt;
&lt;p&gt;Although I don&apos;t have a Windows 98 (or even Windows 95) installation, as long as DirectX 8 or better is installed, and a graphics device/driver combination that supports the DirectX 8 API, it should work. And indeed, others have reported running the games working on a 233MHz Pentium MMX with an ATi Rage XL on Windows 98. Performance isn&apos;t great on those old machines, but it is definitely playable.&lt;/p&gt;
&lt;h2 id=&quot;what-had-to-change-to-run-on-the-old-ati-card&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-had-to-change-to-run-on-the-old-ati-card&quot; aria-label=&quot;what had to change to run on the old ati card permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What had to change to run on the old ATi card?&lt;/h2&gt;
&lt;p&gt;Despite targeting the DirectX 8 API (which can be expected to work properly with DX6 class hardware and later) there were a few shortcuts that I took over the years, mostly by virtue of having access to much better hardware than that mobile ATi Rage chipset, as my main machine at that time sported a GeForce 2MX and eventually a GeForce 3.&lt;/p&gt;
&lt;p&gt;Whereas since DirectX 11 there are well-defined &lt;em&gt;feature levels&lt;/em&gt; that specify what features a card must provide to be considered compliant with that version of the API, in the earlier versions it was all about the driver filling a large structure representing the capabilities of the hardware it could expose. Wanted to know whether cube maps were supported? Check &lt;code class=&quot;language-text&quot;&gt;D3DCAPS::TextureCaps&lt;/code&gt; for the flag &lt;code class=&quot;language-text&quot;&gt;D3D­PTEXTURE­CAPS\_­CUBEMAP&lt;/code&gt;. Quite a lot of hardware allowed only textures that were square (&lt;code class=&quot;language-text&quot;&gt;D3D­PTEXTURE­CAPS\_­SQUAREONLY&lt;/code&gt;) and/or had dimensions that were a power of 2 (&lt;code class=&quot;language-text&quot;&gt;D3D­PTEXTURE­CAPS\_­POW2&lt;/code&gt;). Not even alpha blending or depth buffering is guaranteed to be available! Heck, prior to the original &lt;a href=&quot;https://en.wikipedia.org/wiki/GeForce_256&quot;&gt;GeForce 256&lt;/a&gt;, the CPU was responsible for all the vertex processing calculations for transform and lighting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/dxcaps.png&quot; alt=&quot;DXCapsViewer displaying some of the ATi card&amp;#x27;s capability bits&quot;&gt;&lt;/p&gt;
&lt;p&gt;The DirectX Caps Viewer that came with the SDK provided a convenient way to check the capabilities in a human readable manner as shown above. When coding, you&apos;d have to check these programmatically and adjust your programme&apos;s behaviour to match (or just refuse to run at all).&lt;/p&gt;
&lt;p&gt;There&apos;s a few things that, while working properly on modern hardware (anything more recent than, say, 2003), just weren&apos;t necessarily supported on the graphics hardware from the late 1990s. And, since I hadn&apos;t bothered to check those capabilities, the games would crash or glitch when trying to make use of those. Fortunately, almost all of them were easily worked around.&lt;/p&gt;
&lt;h3 id=&quot;no-hardware-or-mixed-vertex-processing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-hardware-or-mixed-vertex-processing&quot; aria-label=&quot;no hardware or mixed vertex processing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No hardware (or mixed) vertex processing&lt;/h3&gt;
&lt;p&gt;With the introduction of the GeForce, touting &quot;hardware &lt;a href=&quot;https://en.wikipedia.org/wiki/Transform,_clipping,_and_lighting&quot;&gt;transform and lighting&lt;/a&gt;&quot; a significant part of the 3D pipeline could be accelerated with specialised hardware, offloading the vertex calculations from the CPU. When creating a Direct3D device, you can specify whether you want to have vertex processing take place in hardware on the GPU, in software on the CPU, or a mix of the two. The ATi card does not have support for hardware T&amp;#x26;L, so I added fallbacks from hardware to mixed and even software-only vertex processing.&lt;/p&gt;
&lt;h3 id=&quot;no-colour-write-masking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-colour-write-masking&quot; aria-label=&quot;no colour write masking permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No colour write masking&lt;/h3&gt;
&lt;p&gt;The backdrops in my adventure games consist conceptually of a visible 2D image, and 0 or more invisible layers of depth information. These depth layers are drawn into the graphics card&apos;s Z buffer as simple screen-sized quads with colour write disabled (so no visible pixels are drawn, only writes to the Z buffer are permitted).&lt;/p&gt;
&lt;p&gt;.layers-container { margin-left: auto; margin-right: auto; max-width: 640px; } .layers { height: 0; padding-bottom: 75%; position: relative; transform-origin: center; transform-style: preserve-3d; transition: transform 0.5s ease; width: 100%; } .layers .layer { height: auto; left: 50%; max-width: 100%; position: absolute; top: 50%; transform: translate(-50%, -50%); transform: translate(-50%, -50%) translateZ(var(--zofs, 0)); transition: box-shadow 0.25s ease, opacity 0.25s ease; } .layers:hover { transform: perspective(1250px) rotateX(-25deg) rotateY(-45deg); } .layers:hover .layer { box-shadow: 2px 2px 5px black; opacity: 0.25; } .layers:hover .layer.bkg { opacity: 0.75; } .layers .layer:hover { opacity: 1 !important; } @media (prefers-reduced-motion) { .layers, .layers .layer { transition: none; } }&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-bkg.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-6.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-7.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-9.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-10.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-11.png&quot; alt=&quot;&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/12/priorities-13.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Mouse over (or tap) the image above to see the layer structure.&lt;/p&gt;
&lt;p&gt;The ATi card didn&apos;t have the &lt;code class=&quot;language-text&quot;&gt;D3D­PMISC­CAPS\_­COLOR­WRITE­ENABLE&lt;/code&gt; capability bit set, so it would overlay the depth information over the visible image. The solution would have been to either write the visible image &lt;em&gt;after&lt;/em&gt; writing the depth buffer, with Z test disabled, or to fake disabling the colour writes. I picked the latter and chose to set the blend function to just retain what was already in the colour buffer and zero out the incoming data.&lt;/p&gt;
&lt;p&gt;This would have been a lot easier if things like depth textures had existed in DirectX 8. As it stands, this is actually one of the slowest aspects of the game engine, as there is potentially a lot of overdraw in this step and this hardware is capable of rendering a maximum of 75 million pixels/texels per second.&lt;/p&gt;
&lt;h3 id=&quot;no-stencil-buffer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#no-stencil-buffer&quot; aria-label=&quot;no stencil buffer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;No stencil buffer&lt;/h3&gt;
&lt;p&gt;The engine supports clipping the rendering of text and sprites and uses the &lt;a href=&quot;https://en.wikipedia.org/wiki/Stencil_buffer&quot;&gt;stencil buffer&lt;/a&gt; to allow arbitrary clipping areas. Unfortunately the ATi card supports only 16-bit depth buffers and no stencil buffers at all.&lt;/p&gt;
&lt;p&gt;In practice, this functionality is used only to clip to a single rectangle at any one time and this can also be achieved by simply adjusting the viewport, which is what I ended up doing.&lt;/p&gt;
&lt;h3 id=&quot;cant-render-to-32-bit-textures&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cant-render-to-32-bit-textures&quot; aria-label=&quot;cant render to 32 bit textures permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Can&apos;t render to 32-bit textures&lt;/h3&gt;
&lt;p&gt;Although the card isn&apos;t powerful enough to run the games in 32-bit colour mode, it can do 16-bit colour mode. The thumbnails for save games are generated by rendering to a texture and I had initially hardcoded the engine to render to 32-bit textures. This failed on the ATi card, but allowing for 16-bit render targets worked like a charm.&lt;/p&gt;
&lt;h2 id=&quot;why-bother&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-bother&quot; aria-label=&quot;why bother permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why bother?&lt;/h2&gt;
&lt;p&gt;Just because it was fun to do. I find there is something inherently cool about new games running on old systems. And as a side effect, I ended up improving performance of my engine in general, as well as fixing a few minor bugs.&lt;/p&gt;
&lt;p&gt;Of course, the chances of anybody actually running these games seriously, rather than just testing, on hardware and software that old is basically nil. I just figured: if I &lt;em&gt;can&lt;/em&gt; support these old systems with just a few lines of code without compromising the ability to run on modern systems, why wouldn&apos;t I?&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[DOS game "Cosmo Chicken" patched after 25 years]]></title><description><![CDATA[Some 25 years ago, I first released my game Cosmo Chicken and last updated it in 1998 to version 1.6. Earlier today, a quarter of a century…]]></description><link>https://www.shdon.com/cosmo-chicken-patched/</link><guid isPermaLink="false">https://www.shdon.com/cosmo-chicken-patched/</guid><pubDate>Tue, 26 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some 25 years ago, I first released my game &lt;a href=&quot;/projects/&quot;&gt;Cosmo Chicken&lt;/a&gt; and last updated it in 1998 to version 1.6. Earlier today, a quarter of a century later, version 1.7 was released. Why? Because it had a bug that made the game crash &lt;a href=&quot;https://www.dosbox.com/&quot;&gt;DOSBox&lt;/a&gt; when running in there. I doubt anybody will ever play the patched version, but it&apos;s a matter of pride for me to fix my bugs no matter how old they are and it was an opportunity for me to get back to basics and a good reason to write a nostalgic blog post as a postmortem.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/10/chicken.png&quot; alt=&quot;Screenshot of Cosmo Chicken&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-was-the-bug&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-was-the-bug&quot; aria-label=&quot;what was the bug permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What was the bug?&lt;/h2&gt;
&lt;p&gt;When run in certain versions of DOSBox (including the latest official version 0.74-3), whenever certain sounds would play, DOSBox would crash to the desktop. If you had the DOSBox terminal window up, you might see the error message &quot;Exit to error: DMA segbound wrapping (read)&quot;&lt;/p&gt;
&lt;p&gt;Earlier versions, such as 0.73, and indeed later versions of DOSBox, if any are ever released, as well as DOSBox-X would not crash, nor would real hardware, but that doesn&apos;t mean that there wasn&apos;t a bug in Cosmo Chicken&apos;s original code. It&apos;s just a happy circumstance that it wasn&apos;t a critical problem on there.&lt;/p&gt;
&lt;h2 id=&quot;segmentoffset-memory-addressing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#segmentoffset-memory-addressing&quot; aria-label=&quot;segmentoffset memory addressing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Segment:Offset memory addressing&lt;/h2&gt;
&lt;p&gt;To understand what happened, we need to take a look at how memory is handled in the 8086 CPU (and because of that, in the so-called &quot;real mode&quot; of all CPUs in the x86 family). This was the era of the infamous 640k memory barrier. The first x86 CPU had a 20-bit address bus, allowing it to address a maximum of 1 megabyte (1048576 bytes). In hexadecimal, that is &lt;code class=&quot;language-text&quot;&gt;0x100000&lt;/code&gt;, with the individual bytes being numbered linearly from &lt;code class=&quot;language-text&quot;&gt;0x00000&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;0xFFFFF&lt;/code&gt;. However, the registers on the 8086 were only 16 bits in size, which leaves them 4 bits short of being able to point to any address in memory using a single register.&lt;/p&gt;
&lt;p&gt;Thus, pointers had to be more than just 1 register and, the &lt;a href=&quot;https://en.wikipedia.org/wiki/X86_memory_segmentation&quot; title=&quot;Wikipedia page on x86 memory segmentation&quot;&gt;solution Intel chose&lt;/a&gt; was to have 2 registers forming a pointer. A segment register and an offset register. The segment registers were &lt;code class=&quot;language-text&quot;&gt;CS&lt;/code&gt; for the Code Segment, &lt;code class=&quot;language-text&quot;&gt;DS&lt;/code&gt; for the Data Segment, &lt;code class=&quot;language-text&quot;&gt;SS&lt;/code&gt; for the Stack Segment, and &lt;code class=&quot;language-text&quot;&gt;ES&lt;/code&gt; as an Extra Segment register. These registers were then coupled with an offset register to form pointers. &lt;code class=&quot;language-text&quot;&gt;CS:IP&lt;/code&gt; coupled the Code Segment and Instruction Pointer to point to the currently executing instruction, &lt;code class=&quot;language-text&quot;&gt;SS:SP&lt;/code&gt; coupled the Stack Segment and Stack Pointer to point to the top of the stack and generally, &lt;code class=&quot;language-text&quot;&gt;DS:DX&lt;/code&gt; would be used for reading and &lt;code class=&quot;language-text&quot;&gt;ES:BX&lt;/code&gt; for writing when transferring data around through memory, with the &lt;code class=&quot;language-text&quot;&gt;BX&lt;/code&gt; register allowing some slightly more advanced addressing modes.&lt;/p&gt;
&lt;p&gt;These register pairs weren&apos;t just concatenated to form a linear address, which would have allowed for 32-bit pointers for a total of 4 gigabytes of memory. That&apos;s something that didn&apos;t show up until the introduction of the 32-bit 386 processor family. For the 8086, that would have been overkill, and the architecture only had a 20-bit bus, so such pointers would have far exceeded the amount of memory physically addressable. So, instead, they took the segment register, shifted it left by 4 bits, and then added the value of the offset register to obtain a linear address. For instance, when &lt;code class=&quot;language-text&quot;&gt;ES&lt;/code&gt; has the value &lt;code class=&quot;language-text&quot;&gt;0x2409&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;BX&lt;/code&gt; has the value &lt;code class=&quot;language-text&quot;&gt;0x1978&lt;/code&gt; the address calculation would be&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;0x24090
0x01978
------- +
0x25A08&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As the lower three nibbles of the segment register and the upper three nibbles of the offset register overlapped in the calculation, there were actually 4096 different combinations of segment:offset values that all mapped to the same linear address. For example, &lt;code class=&quot;language-text&quot;&gt;ES=0x2499&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;BX=0x1078&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;ES=0x2408&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;BX=0x1988&lt;/code&gt; would point to the same linear address of &lt;code class=&quot;language-text&quot;&gt;0x25A08&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, the high nibble of the linear address (2, in this case) indicated that this address lay in a 64kB &quot;page&quot; numbered 2... that is, all the addresses ranging from &lt;code class=&quot;language-text&quot;&gt;0x20000&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;0x2FFFF&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sound-blaster-dma-transfer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sound-blaster-dma-transfer&quot; aria-label=&quot;sound blaster dma transfer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sound Blaster DMA transfer&lt;/h2&gt;
&lt;p&gt;The original IBM PC was not very well equipped in the sound department, having a small speaker hooked up to a channel on the Intel 8253 PIT chip that would generate square waves at various frequencies and nothing else. Now, some enterprising souls figured out that, by rapidly (hundreds or thousands of times per second) changing the frequency of the generated square wave, they could generate &lt;a href=&quot;https://youtu.be/V3wA-L7Uh2s&quot;&gt;far more complex sounds&lt;/a&gt;. This had to be done with very precise timing, though. As it all had to be done on that single CPU, it took a lot of the available processing power, leaving precious few cycles for actually running the game. Gamers wanted something better.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/10/sb.jpg&quot; alt=&quot;Picture of the original Sound Blaster&quot;&gt;&lt;br&gt;
Image credit: Wdwd, CC BY-SA 3.0 , via Wikimedia Commons&lt;/p&gt;
&lt;p&gt;In stepped Creative Labs with their &lt;a href=&quot;https://en.wikipedia.org/wiki/Sound_Blaster&quot;&gt;Sound Blaster&lt;/a&gt; card. They took the Yamaha OPL2 chip that had previously been used on the AdLib Music Synthesizer Card and expanded on it by adding a channel for digitally sampled audio to the existing FM music synthesis. It&apos;s fair to say that this was a major revolution in PC gaming.&lt;/p&gt;
&lt;p&gt;Now, to take the burden of reading the sound data from memory and outputting it over the DAC away from the CPU, the Sound Blaster used Direct Memory Access, or DMA for short. A chip called the Intel 8237 DMA controller would be set up to read from a certain area of memory and transfer the data onto a DMA channel. By default, the Sound Blaster would listen on DMA channel 1. As the DMA controller feeds the data to the DAC, the main CPU can go about its business and it will be informed of the transfer being completed by an interrupt request or IRQ. The default setting for early Sound Blasters was IRQ 7, but later models would default to IRQ 5.&lt;/p&gt;
&lt;p&gt;This brings me to the root cause of the bug that crashed DOSBox. When setting up the DMA controller for DMA transfer, it did &lt;strong&gt;not&lt;/strong&gt; take a standard segment:offset pointer for the source address. Instead, it took a page and an offset into that page. This is why I explained the x86 memory segmentation model before. Again using the aforementioned example address of &lt;code class=&quot;language-text&quot;&gt;0x25A08&lt;/code&gt;, the DMA controller required that to be specified as offset &lt;code class=&quot;language-text&quot;&gt;0x5A08&lt;/code&gt; (a 16-bit word value) and page &lt;code class=&quot;language-text&quot;&gt;0x02&lt;/code&gt; (an 8-bit byte value). And, here is the crucial part: &lt;strong&gt;it didn&apos;t allow the DMA transfer to begin in one page and end in another&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now, to be honest, I have no idea whether a DMA transfer straddling a page boundary caused any actual problems on real hardware, especially as by the time I wrote Cosmo Chicken, 386 and 486 machines were commonplace. Maybe they acted differently with more modern DMA controllers, or maybe they didn&apos;t. Perhaps the DAC would have garbage fed into it, which we&apos;d hear as static. Perhaps (and I consider this the most likely scenario) the offset counter would wrap around from &lt;code class=&quot;language-text&quot;&gt;0xFFFF&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;0x0000&lt;/code&gt; and this too could result in garbage being fed to the DAC. Perhaps the transfer would simply be aborted or not even started. And perhaps it would just work anyway. Whatever one of the faults it was, especially when the page boundary was overrun by just a few bytes, none of those scenarios would have been very noticeable if it wasn&apos;t an outright crash.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; there are actually some videos on YouTube of the game being played, a &lt;a href=&quot;https://youtu.be/Fp6KMMT5NEA&quot;&gt;short video&lt;/a&gt; and a &lt;a href=&quot;https://youtu.be/v6l50srz-6o&quot;&gt;longer one&lt;/a&gt; that demonstrate that my guess of wrapping around seems to be the correct one, at least on whatever they used to record it. Note that in those recordings, the bouncy sound when hitting the landing pad at too high a velocity is cut off and the explosion sound is played. Thanks to Rikki Daman for bringing those videos to my attention.&lt;/p&gt;
&lt;p&gt;So yeah, there you have it. As DOSBox&apos;s error message indicated, at least one sound effect was loaded into memory at a place straddling a page boundary and starting playback made DOSBox give up in utter terror to the point where the whole emulator crashed.&lt;/p&gt;
&lt;h2 id=&quot;the-fix&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-fix&quot; aria-label=&quot;the fix permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The fix&lt;/h2&gt;
&lt;p&gt;My game code did not make use of Turbo Pascal&apos;s memory allocator, preferring to use the DOS memory allocator instead. Explaining the details of the allocator would be well beyond the scope of this blog post, but for the most part, let&apos;s simplify it to DOS making allocations as sequentially as possible. Note: this bug would have occurred with the TP memory allocator too, just perhaps with a different sound - from the programme&apos;s point of view any given address handed out by either allocator may as well be random. But allocations happening one after the other with nothing being done in between (as commonly happens when loading data at game start) are not random. They tend to be sequential.&lt;/p&gt;
&lt;p&gt;So, the fix I ended up implementing was that, if the block of memory allocated for a sound happens to straddle a page boundary, the newly allocated block is shrunk to end on that page boundary, but not released. Then, the allocation is retried. This most likely results in this second allocated block starting &lt;em&gt;on&lt;/em&gt; the page boundary. Well, actually 16 bytes later, as there is an MCB header, but who&apos;s counting? It keeps doing this until an allocation succeeds and &lt;em&gt;doesn&apos;t&lt;/em&gt; straddle the page boundary or there is no memory available. This ensures that the block that ends up being definitively allocated for the sound always falls within a memory page. At this point, it can also release the memory blocks that were held in reserve during this algorithm.&lt;/p&gt;
&lt;p&gt;Problem solved... 25 years late.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[The Telescopium Incident]]></title><description><![CDATA[Like last year, I participated in the $105 Adventure Game Challenge (well, last year, it was technically the $104 Adventure Game Challenge…]]></description><link>https://www.shdon.com/telescopium-incident/</link><guid isPermaLink="false">https://www.shdon.com/telescopium-incident/</guid><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Like last year, I participated in the &lt;a href=&quot;https://itch.io/jam/105-adventure-game-challenge&quot;&gt;$105 Adventure Game Challenge&lt;/a&gt; (well, last year, it was technically the $104 Adventure Game Challenge). This year&apos;s assignment was to create a graphical adventure game from scratch in 14 days with the theme of &quot;An Escape&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/10/telinc-title.png&quot; alt=&quot;Title screen for The Telescopium Incident&quot;&gt;&lt;/p&gt;
&lt;p&gt;Despite already having made two jam games with that theme (&lt;a href=&quot;/projects/&quot;&gt;Escape from DIMANSION&lt;/a&gt; and &lt;a href=&quot;/projects/&quot;&gt;Jeffrey Jetsam&lt;/a&gt;), I obviously couldn&apos;t use those games and had to come up with something new. So, for The Telescopium Incident, I decided on doing a game with a sci-fi setting (my favourite ever since I got introduced to adventure games with Space Quest 1) where you play as a cute little droid who has to escape the gravitational pull of a black hole.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/10/telinc-midship.png&quot; alt=&quot;Droid CD-24 on the midship, the starting location of the game&quot;&gt;&lt;/p&gt;
&lt;p&gt;Having the droid as a floating character without any limbs allowed me to cut down on character animations and also served the mechanic of having different attachments for the droid to carry out various actions. The reduction in character animation work left me much more time to work on nice background graphics and other animations.&lt;/p&gt;
&lt;p&gt;In my personal opinion, it&apos;s one of my best looking games so far, partially because of the animations helping the backgrounds come alive, and because of investing in a graphics tablet so I don&apos;t have to draw with a mouse.&lt;/p&gt;
&lt;h2 id=&quot;want-to-play-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#want-to-play-it&quot; aria-label=&quot;want to play it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want to play it?&lt;/h2&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;The Telescopium Incident&lt;/a&gt; on this site, or the &lt;a href=&quot;https://shdon.itch.io/telescopium-incident&quot;&gt;itch.io page&lt;/a&gt; for it.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Nine plus three AdvJam2021 entries you should try]]></title><description><![CDATA[Adventure Jam 2021 concluded last Friday and, as there was quite a bit fewer entries than in previous years, I played through all the…]]></description><link>https://www.shdon.com/advjam2021-shout-outs/</link><guid isPermaLink="false">https://www.shdon.com/advjam2021-shout-outs/</guid><pubDate>Tue, 25 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Adventure Jam 2021 concluded last Friday and, as there was quite a bit fewer entries than in previous years, I played through all the entries in a couple of days. Many familiar faces have joined in the fun of making a game for the jam, as well as some new ones. In previous years, I selected a dozen or so of my favourites, but now I&apos;ve had to limit myself to a mere 9 (as well as some honourable mentions, of course). Again, shamelessly catering to my own tastes in adventure gaming, in alphabetical order, these are my favourites:&lt;/p&gt;
&lt;p&gt;.shot-container { background: black; box-shadow: 2px 2px 5px black; height: 0; padding: 0 0 56.25%; position: relative; width: 100%; } .shot-container img.shot { bottom: 0; box-shadow: none; height: 100%; left: 0; margin: 0; object-fit: contain; position: absolute; right: 0; top: 0; width: 100%; } #content ul.compact li { margin-top: 0; }&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#demons&quot;&gt;All Demons Must Go To Hell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cavern-echoes&quot;&gt;The Cavern Echoes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#coffin-valley&quot;&gt;Coffin Valley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#imagine&quot;&gt;IMAGinE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#long-tooth&quot;&gt;Long in the Tooth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#nebraska-smith&quot;&gt;Nebraska Smith and the Mask of Minkhamanna&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#pato-lobo&quot;&gt;Pato &amp;#x26; Lobo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#telwynium&quot;&gt;The Telwynium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#villa-apate&quot;&gt;A Weekend at Villa Apate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Definitely check out those, as well as the many other &lt;a href=&quot;https://gamejolt.com/c/adventuredev/advjam2021&quot;&gt;entries&lt;/a&gt;. Adventure game fans are sure to find something to like there! And of course, I&apos;ve also participated myself with the ridiculously long titled &lt;a href=&quot;/projects/&quot;&gt;The misadventures of Jeffrey Jetsam. Shouldn&apos;t that be flotsam? No, trust me on this one.&lt;/a&gt; .&lt;/p&gt;
&lt;h2 id=&quot;all-demons-must-go-to-hell&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#all-demons-must-go-to-hell&quot; aria-label=&quot;all demons must go to hell permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All Demons Must Go To Hell&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/demons.png&quot; alt=&quot;I&amp;#x27;m a robot cocktomatooo...&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nobody was more surprised to find out that this is on my list than the creators of this monstrosity. This game should come with a mental health warning label as it is designed to be aggressively user-hostile. You need a lot of determination to make it through, which the game aptly defines as &quot;the dogged inability to recognize and acknowledge impending failure&quot;. (Something I&apos;m sure the Space Quest Historian feels applies to programming the game). Why do I put it up here anyway? Because it is unique, surprising, and it made me laugh and my hair is too short for me to be able to tear out too much.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/demons/618553&quot;&gt;&lt;em&gt;All Demons Must Go To Hell&lt;/em&gt;, by The Adventure Think Tank&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-cavern-echoes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-cavern-echoes&quot; aria-label=&quot;the cavern echoes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Cavern Echoes&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/cavern-echoes.png&quot; alt=&quot;Just a table&quot;&gt;&lt;/p&gt;
&lt;p&gt;Creator Dom De Re was a bit worried he&apos;d spent too much time on fiddling with the graphics and didn&apos;t get enough done to make a proper jam game. But time pressure is a fact of life with game jams. This entry is nothing to be embarrassed or disappointed about. Sure, an extra week would have made the game truly amazing, but what is there is a cool story, with some good puzzles and a style of pixel art that I personally like very much.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/the-cavern-echoes/618372&quot;&gt;&lt;em&gt;The Cavern Echoes&lt;/em&gt;, by irreverentpixelfeats&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;coffin-valley&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#coffin-valley&quot; aria-label=&quot;coffin valley permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Coffin Valley&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/coffin-valley.png&quot; alt=&quot;The hero in the local bank&quot;&gt;&lt;/p&gt;
&lt;p&gt;The slightly misnamed Coffin Valley (play the game to find out why) takes place in a photorealistically rendered old western town full of quirky characters that are all fully voiced. You play as a new arrival in town who wants to become the sherriff&apos;s deputy and has to prove to the sherrif that he&apos;s up to the task. The scenery and characters are augmented by quite a number of puzzles that aren&apos;t too taxing, but never stray into the realm of moon logic. In all, a solid entry.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/coffinvalley/617758&quot;&gt;&lt;em&gt;Coffin Valley&lt;/em&gt;, by WocGames&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;imagine&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#imagine&quot; aria-label=&quot;imagine permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IMAGinE&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/imagine.jpg&quot; alt=&quot;Bob meets Lady Gwendolyn&quot;&gt;&lt;/p&gt;
&lt;p&gt;Last year, I had The Argonaut&apos;s previous entry, &lt;em&gt;Me and the Robot&lt;/em&gt; on the list because it was gorgeously drawn, very well polished and contained a good amount of story and puzzles. The Argonauts have gone for a repeat performance with IMAGinE (the title with its strange capitalisation is a pun). Some of the puzzles are fiendishly difficult and the team have toned down the difficulty a bit on at least one puzzle that took me 2.5 hours to solve. It is a testament to good design that I liked the game so much that I gladly persevered. Gorgeous graphics, good story, and well designed puzzles. What&apos;s not to like?&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/imagine/617244&quot;&gt;&lt;em&gt;IMAGinE&lt;/em&gt;, by The Argonauts&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;long-in-the-tooth&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#long-in-the-tooth&quot; aria-label=&quot;long in the tooth permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Long in the Tooth&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/long-in-the-tooth.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Long in the Tooth&lt;/em&gt; has some quality comedy writing, from the developer who is also working on &lt;a href=&quot;http://truthbetrolledgame.com&quot;&gt;Truth be Trolled&lt;/a&gt;. But what really made this short game stand out is the jawdropping quality of the graphics. Not just amazing backgrounds, but silky smooth animation that puts many a TV cartoon to shame. Honza wanted to put even more into the jam game, but there wasn&apos;t enough time. It&apos;s easy to see how that time was spent though and I&apos;m quite frankly astonished at how much they did put in at this level of quality.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/longinthetooth/618561&quot;&gt;&lt;em&gt;Long in the Tooth&lt;/em&gt;, by Honza_27&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nebraska-smith-and-the-mask-of-minkhamanna&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nebraska-smith-and-the-mask-of-minkhamanna&quot; aria-label=&quot;nebraska smith and the mask of minkhamanna permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nebraska Smith and the Mask of Minkhamanna&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/nebraska-smith.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nebraska Smith could be considered Indiana Jones&apos;s more muscular but also less intellectual cousin. Not just the name, but the logo and music are all very reminiscent of the famous archaeologist action hero. The puzzles are nicely inventive and the humour and character graphics are also top notch. Most of the background have had to be programmer art due to the intended backgrounds not being quite ready yet, but that doesn&apos;t detract from the fun of this game all that much.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/nebraska/617779&quot;&gt;&lt;em&gt;Nebraska Smith and the Mask of Minkhamanna&lt;/em&gt;, by GuGames&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;pato--lobo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pato--lobo&quot; aria-label=&quot;pato  lobo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pato &amp;#x26; Lobo&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/pato-lobo.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pato is a duck who is secretly in love with a wolf, Lobo (the names are the Spanish words for &quot;duck&quot; and &quot;wolf&quot; respectively). She has to work up the courage to talk to him, but she can only build up her confidence by daydreaming. Or perhaps she could disguise herself instead to get Lobo to notice her. This game is a tad light on puzzles, but the characters are cute beyond belief and the story is simply adorable. You simply have to play this entry, even if it is just to hear the sounds Pato and Lobo make.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/longinthetooth/618561&quot;&gt;&lt;em&gt;Pato &amp;#x26; Lobo&lt;/em&gt;, by Perro Viejo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-telwynium&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-telwynium&quot; aria-label=&quot;the telwynium permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Telwynium&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/telwynium.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Being a big fan of the Sierra adventures of the late 1980s and early 1990s, there was no way I could &lt;em&gt;not&lt;/em&gt; like a game created in that style. &lt;em&gt;The Telwynium&lt;/em&gt; feels like a hybrid of SCI0 style graphics (enhanced by an effective CRT shader) with the SCI1 point and click interface, wrapped around a fantasy story of greater scale than one would usually expect in a jam game. It certainly feels like a part of a bigger and possibly expanding universe. It&apos;s the first Powerhoof game I&apos;ve played that didn&apos;t have voice acting by Adrian Vaughan in it (I&apos;m guessing for authenticity&apos;s sake), but even without voice acting, this is yet another highly polished production by Powerhoof.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/Telwynium/618347&quot;&gt;&lt;em&gt;The Telwynium&lt;/em&gt;, by Powerhoof&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-weekend-at-villa-apate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-weekend-at-villa-apate&quot; aria-label=&quot;a weekend at villa apate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Weekend at Villa Apate&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/villa-apate.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The king of expansive storylines has to be Marco Giorgini. His games are consistly the ones with the most content in the Adventure Jam for all four of the editions I&apos;ve witnessed. &lt;em&gt;Weekend at Villa Apate&lt;/em&gt; is no exception, even if it&apos;s not quite as huge as last year&apos;s &lt;em&gt;Four Distant Daughters&lt;/em&gt;. By virtue of being a shorter (not short, just short&lt;strong&gt;er&lt;/strong&gt;) game, it is also obvious Marco was able to eliminate more bugs and polish the experience a bit more. The unexpected plot twists and the scale of the game, coupled with a cool musical score by Paco Diago (who is also the protagonist of the game, with developer Marco playing a supporting role) make &lt;em&gt;Villa Apate&lt;/em&gt; rank among my absolute favourites.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/AWeekendatVillaApate/615569&quot;&gt;&lt;em&gt;A Weekend at Villa Apate&lt;/em&gt;, by Marco Giorgini&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;honourable-mentions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#honourable-mentions&quot; aria-label=&quot;honourable mentions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Honourable mentions&lt;/h2&gt;
&lt;p&gt;Even with a mere 31 entries this year, there&apos;s still much more than I could cover here and I&apos;d be remiss not to at least mention the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/EchoesOfAcademe/618534&quot;&gt;&lt;em&gt;Echoes of Academy&lt;/em&gt;, by Stand Off Software&lt;/a&gt; — for... for... well... play it to understand. Play it multiple times to really understand&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/demvilla/617604&quot;&gt;&lt;em&gt;Dem Villa&lt;/em&gt;, by Jaggerspielt&lt;/a&gt; — for an artfully written choose your own adventure style game, completely narrated by the developer in his AdvJam debut. Especially good in his native German.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/shark-riders/616163&quot;&gt;&lt;em&gt;Shark Riders&lt;/em&gt;, by lcbgamestudio&lt;/a&gt; — for wonderful pixel graphics with an intense choose your own adventure style story.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[The misadventures of Jeffrey Jetsam. Shouldn't that be flotsam? No, trust me on this one.]]></title><description><![CDATA[Now there's a mouthful. And because the full title of this new game is so long, I'll just shorten it to "Jeffrey Jetsam" for convenience. It…]]></description><link>https://www.shdon.com/jeffrey-jetsam/</link><guid isPermaLink="false">https://www.shdon.com/jeffrey-jetsam/</guid><pubDate>Thu, 20 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Now there&apos;s a mouthful. And because the full title of this new game is so long, I&apos;ll just shorten it to &quot;Jeffrey Jetsam&quot; for convenience. It is my entry to the 2021 Adventure Jam which ran from 7 to 21 May. At the time of writing, it&apos;s actually still ongoing and I&apos;ve released the game with a little over 2 days left on the clock.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/jetsam-title.png&quot; alt=&quot;Title screen for Jeffrey Jetsam&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;about-the-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#about-the-game&quot; aria-label=&quot;about the game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;About the game&lt;/h2&gt;
&lt;p&gt;Inspired by the &lt;a href=&quot;https://www.screensaversplanet.com/screensavers/johnny-castaway-237/&quot;&gt;Screen Antics: Johnny Castaway&lt;/a&gt; screen saver published by Sierra in 1992, Jeffrey Jetsam places the eponymous anti-hero on a small desert island that he has to find a way off of. Although I&apos;d only ever seen screenshots of Johnny Castaway before, a fortuitously timed &lt;a href=&quot;https://youtu.be/E5lxiTJGqHw&quot;&gt;video by Nostalgia Nerd&lt;/a&gt; was the impetus to creating a small game based on the concept.&lt;/p&gt;
&lt;p&gt;When making a game for Adventure Jam, I like to focus on one or two key concepts. For &lt;a href=&quot;/spy-quest-1-mission-spectrum/&quot;&gt;Spy Quest 1&lt;/a&gt; and &lt;a href=&quot;/spy-quest-2-operation-bogroll/&quot;&gt;Spy Quest 2&lt;/a&gt; that was recreating the AGI and SCI1 style respectively and for &lt;a href=&quot;/escape-from-dimansion/&quot;&gt;Escape from DIMANSION&lt;/a&gt; it was puzzles that required thinking out of the box. For Jeffrey Jetsam, the focus was squarely on humour and the accompanying cute animations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/05/jetsam-start.png&quot; alt=&quot;Starting screen for Jeffrey Jetsam&quot;&gt;&lt;/p&gt;
&lt;p&gt;To help the jokes land and make the game come to life, I was extremely lucky to be able to make use of the voice talents of veteran voice actor &lt;a href=&quot;http://www.paul-thomas.net/&quot;&gt;Paul Thomas&lt;/a&gt; &lt;a href=&quot;https://twitter.com/PaulThomasXV&quot;&gt;Twitter&lt;/a&gt; &lt;a href=&quot;https://www.imdb.com/name/nm1831488/&quot;&gt;IMDb&lt;/a&gt; as Jeffrey, and in his voice acting debut, &lt;a href=&quot;https://twitter.com/JonPauLSapsford&quot;&gt;Jon Paul Sapsford&lt;/a&gt; as the narrator. Jon has also graciously composed a wonderful Caribbean style theme tune for the game.&lt;/p&gt;
&lt;h2 id=&quot;want-to-play-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#want-to-play-it&quot; aria-label=&quot;want to play it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want to play it?&lt;/h2&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;Jeffrey Jetsam&lt;/a&gt; on this site, or the &lt;a href=&quot;https://gamejolt.com/games/jeffrey-jetsam/614350&quot;&gt;Game Jolt page&lt;/a&gt; for it. And if you&apos;re an adventure fan, be sure to try the &lt;a href=&quot;https://gamejolt.com/c/adventuredev/advjam2021&quot;&gt;other entries&lt;/a&gt;, too. When I have finished playing all the games in the jam, I&apos;ll definitely write another blog post with a list of the ones I enjoyed the most.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[SQ2WTF - Space Quest 2 with a twist]]></title><description><![CDATA[.content tt { font-size: 16px; padding: 1px 4px; font-weight: bold; } Sierra AGI games had a limited vocabulary for their command parser…]]></description><link>https://www.shdon.com/sq2wtf/</link><guid isPermaLink="false">https://www.shdon.com/sq2wtf/</guid><pubDate>Tue, 27 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;.content tt { font-size: 16px; padding: 1px 4px; font-weight: bold; }&lt;/p&gt;
&lt;p&gt;Sierra AGI games had a limited vocabulary for their command parser, but they allowed some synonyms from their word list, including some common misspellings. They also tended to just carry the list of synonyms from one game to another, so there are references in there to other games. I decided to abuse that system to get through the game with some of the weirdest commands I could find.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/04/sq2wtf1.png&quot; alt=&quot;Who would &amp;#x22;rub berries on body&amp;#x22; when they could &amp;#x22;feel berrie everything own&amp;#x22; instead&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2021/04/sq2wtf2.png&quot; alt=&quot;&amp;#x22;turn dial&amp;#x22;? I&amp;#x27;m sure you&amp;#x27;ll agree that &amp;#x22;drop attitude hac&amp;#x22; makes much more sense&quot;&gt;&lt;/p&gt;
&lt;p&gt;There were many synonyms for common commands. For instance, one might expect &lt;code class=&quot;language-text&quot;&gt;pick up&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;take&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;get&lt;/code&gt; to be synonyms, but the games also accept &lt;code class=&quot;language-text&quot;&gt;acquire&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;gather&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;grab&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;pick&lt;/code&gt; (without &quot;up&quot;), &lt;code class=&quot;language-text&quot;&gt;rob&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;swipe&lt;/code&gt;. Some synonyms were marked for removal from the input. This includes many adjectives, articles and prepositions. This makes the parser a bit more user friendly and seem to be more intelligent than it actually is. Especially the words that are removed from the input basically allow you to inject those anywhere into a command and still have it work. For the parser &lt;code class=&quot;language-text&quot;&gt;the look over little a box an&lt;/code&gt; is absolutely identical to &lt;code class=&quot;language-text&quot;&gt;look box&lt;/code&gt; and will thus be accepted without issue.&lt;/p&gt;
&lt;p&gt;One thing for the Sierra AGI weirdness specifically is that these word list apply to the whole game. So, if one screen has a hunter that you could refer to as &quot;hunter&quot; or as &quot;man&quot;, yet another screen has a bartender that you could refer to as &quot;bartender&quot; or as &quot;man&quot;, that would make both &quot;hunter&quot; &lt;em&gt;and&lt;/em&gt; &quot;bartender&quot; synonyms of the word &quot;man&quot; and you could refer to the hunter as &quot;bartender&quot; or vice versa. Is there a security guard on another screen? Then most likely, you can also refer to both the hunter and the bartender as &quot;guard&quot; or &quot;security guard&quot;.&lt;/p&gt;
&lt;h2 id=&quot;frisk-eva-suit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#frisk-eva-suit&quot; aria-label=&quot;frisk eva suit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Frisk EVA suit&lt;/h2&gt;
&lt;p&gt;Normally, one would press the Tab key or even Ctrl-i to open the inventory, but it is also possible to just type &lt;code class=&quot;language-text&quot;&gt;inventory&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;search pockets&lt;/code&gt;. That latter one allows for some unusual synonyms, leading to probably the best command ever to display a list of what you&apos;re carrying: &lt;code class=&quot;language-text&quot;&gt;frisk eva suit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Apart from the synonyms for a game applying to every use of that word in the entire game, another thing Sierra did was to just carry a dictionary over from one game to the next, where they didn&apos;t seem to bother cleaning up the things that were specific to that game. This makes sense for things like all the synonyms to pick up an object, or to look at something, but things get weird when there are references to certain items or characters from that earlier game.&lt;/p&gt;
&lt;p&gt;Things carried over to Space Quest 2 from its predecessor are references to Keronians (the planet on which Roger ended up in the first game was called Kerona) and in that game you could &lt;code class=&quot;language-text&quot;&gt;redeem coupon&lt;/code&gt; which amounted to giving it to the salesman, which now makes it possible to &lt;code class=&quot;language-text&quot;&gt;redeem square&lt;/code&gt; rather than &lt;code class=&quot;language-text&quot;&gt;throw puzzle&lt;/code&gt; at the Labion Terror Beast.&lt;/p&gt;
&lt;h2 id=&quot;get-in-the-zone&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get-in-the-zone&quot; aria-label=&quot;get in the zone permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Get in the zone&lt;/h2&gt;
&lt;p&gt;To discover the strangest commands, I &lt;a href=&quot;https://pastebin.com/USgRZnPm&quot;&gt;dumped the dictionary&lt;/a&gt; and &lt;a href=&quot;https://pastebin.com/3x7sbvH5&quot;&gt;command list&lt;/a&gt; and went to work creating what I call &lt;a href=&quot;/blog/files/2021/04/SQ2WTF.txt&quot;&gt;the SQ2WTF walkthrough&lt;/a&gt;. Feel free to download it and try it out! If you prefer watching video playthroughs, enjoy what is probably the craziest way anybody has ever played Space Quest 2 right here:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the reason I don&apos;t get maximum points at the end is because I didn&apos;t linger on the jungle screen long enough for the hovercraft to show up. The 5 missing points are from hiding from it behind the large tree.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Review: Inspector Waffles]]></title><description><![CDATA[It's been years since I've reviewed a point and click adventure game, but the official release of Inspector Waffles on several platforms…]]></description><link>https://www.shdon.com/review-inspector-waffles/</link><guid isPermaLink="false">https://www.shdon.com/review-inspector-waffles/</guid><pubDate>Tue, 23 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s been years since I&apos;ve reviewed a point and click adventure game, but the official release of &lt;a href=&quot;https://www.golosogames.com/index.php/inspector-waffles/&quot;&gt;Inspector Waffles&lt;/a&gt; on several platforms, including &lt;a href=&quot;https://store.steampowered.com/app/1055850/Inspector_Waffles/&quot;&gt;on Steam&lt;/a&gt; and &lt;a href=&quot;https://www.gog.com/game/inspector_waffles&quot;&gt;on GOG&lt;/a&gt; today warrants one. I&apos;ve been following the game over the past 3 years or so and was extremely happy to have the opportunity to help out by beta testing as well as contributing some pixel art. So what is this game about?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/03/waffles-1.jpg&quot; alt=&quot;Inspector Waffles title screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;When wealthy industrialist Fluffy, the famous CEO of a box empire, goes out the window and doesn&apos;t land on his paws, something fishy must be going on. Cat Town&apos;s best man... er... cat... for the job, the brilliant detective Inspector Waffles is on the case. Waffles is a cat with a past that might just come back to haunt him as he matches wits with childhood bullies, shrewd antiques store owners and devious supermarket cashiers, while also breaking in an overenthusiastic new partner who seems to put a lot of faith in &quot;sniffing&quot;.&lt;/p&gt;
&lt;p&gt;The game takes place over 5 chapters against colourful pixel art backdrops with some lusciously hand-drawn cutscenes at various key points during the game. Personally, I love the style of both the pixel art and the paintings and the quality is consistently good throughout the game, also helped by the atmospheric music and good sound effects. The characters have a lot of personality. Waffles is a cynical street smart protagonist and his partner Spotty the dog is simply adorable in his enthusiasm. Police chief Patches and geeky Pixel the technician are among several other characters who also get fleshed out quite a bit more than is common for supporting characters in stories like these. All in all, the story goes surprisingly deep with some intriguing twists, quite a few of which I did not see coming (or at least not very far in advance) but which all made sense given the facts of the case. The puns and other humour are genuinely funny and made me literally laugh out loud at times.&lt;/p&gt;
&lt;p&gt;The observant player will find plenty of references to other adventure games or pop culture, past and present. There are even guest appearances by characters from other indie adventures &lt;a href=&quot;https://store.steampowered.com/app/1024160/Lord_Winklebottom_Investigates/&quot;&gt;Lord Winklebottom Investigates&lt;/a&gt;, &lt;a href=&quot;https://store.steampowered.com/app/1084640/Chicken_Police__Paint_it_RED/&quot;&gt;Chicken Police - Paint it RED!&lt;/a&gt; and &lt;a href=&quot;https://store.steampowered.com/app/865610/Backbone/&quot;&gt;Backbone&lt;/a&gt;. The early 2020s certainly seem to be bringing us plenty of anthropomorphic animal mystery solvers!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2021/03/waffles-2.png&quot; alt=&quot;Waffles&amp;#x27;s adventure takes him to a rest home to visit an old friend&quot;&gt;&lt;/p&gt;
&lt;p&gt;Investigating each scene thoroughly, you shouldn&apos;t need to do a lot of backtracking, even if you will end up repeating some conversations because of the way the dialogue system is structured. Even if you do miss something, you can always go back and pick up that vital clue or essential object. Some non-essential parts may be missed, but there are no dead ends in the game. Interrogating characters, presenting them with clues you&apos;ve found and getting new information from them in response is your primary way to advance through the game, along with the inventory based puzzles that are the staple of point and click adventure games. The puzzles are not overly hard, but pretty sensible with no moon logic and I expect a good 5-6 hours of solid entertainment on a blind playthrough for most players.&lt;/p&gt;
&lt;p&gt;Apart from the main case, there&apos;s even a sort of side quest involving collecting trading cards that will not only get you an achievement, but also unlocks a special reward at the end. Since these are optional, they can be missed and some of them are pretty hard to find or obtain, which does add an incentive to play through the game more than once, to ensure you find them all. In fact, I certainly hope you will do so as the collectible cards have been drawn by guest artists and yours truly has drawn card #8.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Having followed the game for so long, I was not disappointed in how the game has turned out and I can wholeheartedly recommend Inspector Waffles. Two thumbs up from me! At a mere €12 or $13, it&apos;s a steal. Get it from &lt;a href=&quot;https://store.steampowered.com/app/1055850/Inspector_Waffles/&quot;&gt;Steam&lt;/a&gt; or &lt;a href=&quot;https://www.gog.com/game/inspector_waffles&quot;&gt;GOG&lt;/a&gt;.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Setting up a swapfile on Linux]]></title><description><![CDATA[Computers only have a finite amount of RAM. When it runs out, they will "swap out" parts of memory that is not crucial to disk, soit can be…]]></description><link>https://www.shdon.com/setting-up-a-swapfile-on-linux/</link><guid isPermaLink="false">https://www.shdon.com/setting-up-a-swapfile-on-linux/</guid><pubDate>Mon, 01 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Computers only have a finite amount of RAM. When it runs out, they will &quot;swap out&quot; parts of memory that is not crucial to disk, soit can be read back in when necessary. As disks are much slower than RAM, even with modern SSD drives, having more RAM is always preferable to swapping, but it&apos;s still a good idea to have swap space available for when it is required. If you don&apos;t, you might find the &quot;oom killer&quot; has killed an important process to make some memory available to others. You really don&apos;t want your database getting killed just because PHP requires some extra memory because it&apos;s resizing a large image.&lt;/p&gt;
&lt;p&gt;If it is things like this where your system load is in need of a bit of extra memory only for a while and you can&apos;t just add in some extra RAM, it is good to have swap space available for those peak memory loads. Windows handles this automatically to the point where most users won&apos;t be aware of it. Linux will leave the configuration up to the user, and it is generally handled by setting up a swap partition when you install the distribution. If you (or the person who configured your Linux system) haven&apos;t done so, or your swap partition is of insufficient size, you might want to look into creating a swapfile. Here&apos;s how to do that.&lt;/p&gt;
&lt;h2 id=&quot;how-much-do-you-need&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-much-do-you-need&quot; aria-label=&quot;how much do you need permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How much do you need?&lt;/h2&gt;
&lt;p&gt;First, determine how much swap space you need in total. A good rule of thumb is to look at how much physical RAM you have (the &lt;a href=&quot;https://help.ubuntu.com/community/SwapFaq#How_much_swap_do_I_need.3F&quot;&gt;Ubuntu SwapFaq gives some rule of thumb&lt;/a&gt;). For the maximum amount of swap space, you generally shouldn&apos;t exceed twice the amount of physical RAM you have. For the minimum, if your RAM is 1GB or less, make the swap file at least that same size. For more, take the square root of your RAM size in GB and round it to the nearest gigabyte. Here&apos;s a table for common RAM sizes:&lt;/p&gt;
&lt;p&gt;RAM&lt;/p&gt;
&lt;p&gt;Minimum swap&lt;/p&gt;
&lt;p&gt;Maximum swap&lt;/p&gt;
&lt;p&gt;256MB&lt;/p&gt;
&lt;p&gt;256MB&lt;/p&gt;
&lt;p&gt;512MB&lt;/p&gt;
&lt;p&gt;512MB&lt;/p&gt;
&lt;p&gt;512MB&lt;/p&gt;
&lt;p&gt;1GB&lt;/p&gt;
&lt;p&gt;1GB&lt;/p&gt;
&lt;p&gt;1GB&lt;/p&gt;
&lt;p&gt;2GB&lt;/p&gt;
&lt;p&gt;2GB&lt;/p&gt;
&lt;p&gt;1GB&lt;/p&gt;
&lt;p&gt;4GB&lt;/p&gt;
&lt;p&gt;4GB&lt;/p&gt;
&lt;p&gt;2GB&lt;/p&gt;
&lt;p&gt;8GB&lt;/p&gt;
&lt;p&gt;8GB&lt;/p&gt;
&lt;p&gt;3GB&lt;/p&gt;
&lt;p&gt;16GB&lt;/p&gt;
&lt;p&gt;16GB&lt;/p&gt;
&lt;p&gt;4GB&lt;/p&gt;
&lt;p&gt;32GB&lt;/p&gt;
&lt;p&gt;32GB&lt;/p&gt;
&lt;p&gt;6GB&lt;/p&gt;
&lt;p&gt;64GB&lt;/p&gt;
&lt;p&gt;64GB&lt;/p&gt;
&lt;p&gt;8GB&lt;/p&gt;
&lt;p&gt;128GB&lt;/p&gt;
&lt;p&gt;You can check how much swap space has been set up with the &lt;code class=&quot;language-text&quot;&gt;swapon&lt;/code&gt; command without any further parameters. If this gives no output, that means no swap space was configured.&lt;/p&gt;
&lt;h2 id=&quot;making-the-swap-file&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#making-the-swap-file&quot; aria-label=&quot;making the swap file permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Making the swap file&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; all the commands here should be executed as root, either through a root shell, or through &lt;code class=&quot;language-text&quot;&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, use &lt;code class=&quot;language-text&quot;&gt;dd&lt;/code&gt; to create the actual file you want to use. For my example, I&apos;m going to be using &lt;code class=&quot;language-text&quot;&gt;/swapfile&lt;/code&gt; at a size of 2GB. As 2GB (technically 2GiB, but I hate the way that sounds) is 2048MB (again, technically MiB), make &lt;code class=&quot;language-text&quot;&gt;dd&lt;/code&gt; read zeroes from &lt;code class=&quot;language-text&quot;&gt;/dev/zero&lt;/code&gt; for 2048 blocks of 1MB:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dd if=/dev/zero of=/swapfile bs=1M count=2K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The breakdown of this command is as follows:&lt;/p&gt;
&lt;p&gt;dd&lt;/p&gt;
&lt;p&gt;dd is a command to copy data efficiently from one device to another&lt;/p&gt;
&lt;p&gt;if=/dev/zero&lt;/p&gt;
&lt;p&gt;set the input file (source) to be &lt;code class=&quot;language-text&quot;&gt;/dev/zero&lt;/code&gt; which supplies an endless stream of zeroes&lt;/p&gt;
&lt;p&gt;of=/swapfile&lt;/p&gt;
&lt;p&gt;the output file (destination) is &lt;code class=&quot;language-text&quot;&gt;/swapfile&lt;/code&gt;, the file we&apos;re creating&lt;/p&gt;
&lt;p&gt;bs=1M&lt;/p&gt;
&lt;p&gt;use a block size of 1M bytes (1048675 bytes, considering this is binary)&lt;/p&gt;
&lt;p&gt;count=2K&lt;/p&gt;
&lt;p&gt;repeat that block size 2048 times, making for a total of 2 gigabytes&lt;/p&gt;
&lt;p&gt;This will take a few seconds, after which the file will have been created. Then, you should make sure that it has the correct permissions, where only the root user can access it:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;chmod 600 /swapfile&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now that that is done, we can prepare the file to actually be used as swap space:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mkswap /swapfile&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And finally, it can be enabled:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;swapon /swapfile&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s really all there is to it, but keep reading.&lt;/p&gt;
&lt;h2 id=&quot;enabling-swap-on-boot&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enabling-swap-on-boot&quot; aria-label=&quot;enabling swap on boot permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enabling swap on boot&lt;/h2&gt;
&lt;p&gt;Whenever you reboot your system, the newly created swap file will not be used automatically, unless you configure the system to do so. For this, it should be added to the filesystem database in &lt;code class=&quot;language-text&quot;&gt;/etc/fstab&lt;/code&gt;. Use your favourite text editor (again, as root) to append a line to that file:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;/swapfile none swap sw 0 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The values have the following meanings:&lt;/p&gt;
&lt;p&gt;/swapfile&lt;/p&gt;
&lt;p&gt;The first column is the device name - in this case, the filename of the swapfile.&lt;/p&gt;
&lt;p&gt;none&lt;/p&gt;
&lt;p&gt;The second column is the mount point - it&apos;s not being mounted, so &lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt; is appropriate.&lt;/p&gt;
&lt;p&gt;swap&lt;/p&gt;
&lt;p&gt;The third column is the filesystem type, which is &lt;code class=&quot;language-text&quot;&gt;swap&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;sw&lt;/p&gt;
&lt;p&gt;The fourth column has the mounting options - for a swap partition, this should be &lt;code class=&quot;language-text&quot;&gt;sw&lt;/code&gt;. For a swapfile, it might also be &lt;code class=&quot;language-text&quot;&gt;defaults&lt;/code&gt;, but I prefer &lt;code class=&quot;language-text&quot;&gt;sw&lt;/code&gt; for consistency.&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;The fifth column is for use by the &lt;code class=&quot;language-text&quot;&gt;dump&lt;/code&gt; backup program, but backing up a swapfile is useless, so set it to 0.&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;The sixth and final column specifies the order in which to check the filesystem for errors. As the swapfile resides on another filesystem, it need not be checked for errors itself and the contents of the swapfile or partition are useless on system boot anyway so set that to 0 too.&lt;/p&gt;
&lt;h2 id=&quot;need-more-or-less&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#need-more-or-less&quot; aria-label=&quot;need more or less permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Need more or less?&lt;/h2&gt;
&lt;p&gt;If the swap size is insufficient, you can simply add another swapfile by repeating the steps above. Just be sure to give it a different name. You can also remove a swapfile by removing the entry in &lt;code class=&quot;language-text&quot;&gt;/etc/fstab&lt;/code&gt;, disabling the swapfile with the &lt;code class=&quot;language-text&quot;&gt;swapoff /swapfile&lt;/code&gt; command, and then the actual file can be removed.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[It's Flot]]></title><description><![CDATA[This year, I participated in the $104 Adventure Game Challenge to create a graphical adventure game from scratch in 14 days. The theme of…]]></description><link>https://www.shdon.com/its-flot/</link><guid isPermaLink="false">https://www.shdon.com/its-flot/</guid><pubDate>Sat, 03 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This year, I participated in the &lt;a href=&quot;https://itch.io/jam/104-adventure-game-challenge&quot;&gt;$104 Adventure Game Challenge&lt;/a&gt; to create a graphical adventure game from scratch in 14 days. The theme of the jam was &quot;A Delusion&quot;, meaning that the protagonist must be operating on a false belief, although the player must know that that belief is false. In my case, I opted to go for the story of a flat-earther teen who decides to build a rocket in his backyard to prove that the earth is flat. This is based loosely on the real life story of &quot;Mad Mike&quot; Hughes who &lt;a href=&quot;https://www.cbsnews.com/news/mad-mike-hughes-daredevil-and-flat-earth-theorist-killed-in-rocket-crash-2020-02-22/&quot;&gt;perished&lt;/a&gt; in February this year.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/10/its-flot-title.jpg&quot; alt=&quot;It&amp;#x27;s Flot title screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;Due to a busy time at work and celebrating my birthday, I had only 6 days to create this game. Despite that, it has a lot of firsts for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First time using 1080p resolution and all hand-drawn graphics&lt;/li&gt;
&lt;li&gt;First time having every line in the game voice acted (by &lt;a href=&quot;https://twitter.com/pringles_boy&quot;&gt;Jordan Hellier&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;First time having an original musical score (by &lt;a href=&quot;https://twitter.com/JonPaulSapsford&quot;&gt;Jon Paul Sapsford&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s still some rough edges, which will get cleaned up in a later release, but it should be enjoyable enough.&lt;/p&gt;
&lt;h2 id=&quot;want-to-play-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#want-to-play-it&quot; aria-label=&quot;want to play it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want to play it?&lt;/h2&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;It&apos;s Flot&lt;/a&gt; on this site, or the &lt;a href=&quot;https://gamejolt.com/games/its-flot/542360&quot;&gt;Game Jolt page&lt;/a&gt; or &lt;a href=&quot;https://shdon.itch.io/its-float&quot;&gt;itch.io page&lt;/a&gt; for it.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Windows 10 screen flickering every few seconds? Check for hacking attempts!]]></title><description><![CDATA[After updating to the Windows 10 Version 1903, I noticed that my monitors started flickering every few seconds. I've seen it happen every 3…]]></description><link>https://www.shdon.com/windows-10-screen-flicker-hackers/</link><guid isPermaLink="false">https://www.shdon.com/windows-10-screen-flicker-hackers/</guid><pubDate>Tue, 02 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After updating to the Windows 10 Version 1903, I noticed that my monitors started flickering every few seconds. I&apos;ve seen it happen every 38 seconds, every 17 seconds or every 15 seconds, but always regular as clockwork and annoying as heck. Rolling back to Windows 10 Version 1809 eliminated the flickering, but that is obviously not a sustainable solution. So what causes this flickering? Is it a Windows 10 bug? Yes. And no.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/06/event-log.png&quot; alt=&quot;Screenshot of Event View showing lots of 9027 events from the Desktop Window Manager&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-is-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-it&quot; aria-label=&quot;what is it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is it?&lt;/h2&gt;
&lt;p&gt;Checking the Application log in the Event Viewer revealed that, coinciding with each and every flicker, an event showed up from the Desktop Window Manager with Event ID 9027 and the description &quot;The Desktop Window Manager has registered the session port.&quot; which is rather unusual when you&apos;re actively using the computer, as this should only happen when a user logs on. Going into the Security log then show lots and lots of logon attempts to various system accounts, all coming from the network. Look for an Audit Failure event from Microsoft Windows security auditing with Event ID 4625 and find the Source Network Address. In my case, the dipshits attempting to log on from 87.251.75.179, which is an address in Russia. This is basically a bot trying to log on through RDP in an attempt to gain control of my system.&lt;/p&gt;
&lt;h2 id=&quot;why-only-after-the-update&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-only-after-the-update&quot; aria-label=&quot;why only after the update permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why only after the update?&lt;/h2&gt;
&lt;p&gt;The update from Windows 10 Version 1809 to Version 1903 (and later) apparently made the switch from the Windows XP display driver model (XPDM) to the Windows Vista display driver model (WDDM) for remote desktop by default, which is actually a good thing, as it enables better performance over RDP, including using hardware accelerated DirectX. It is this change that causes the display to flicker when there is a login attempt. It may even be related to whatever display adapter you have in your system (my system has an NVIDIA card).&lt;/p&gt;
&lt;p&gt;While I consider the flickering to be somewhat of a bug, the reality is that when Remote Desktop is being used properly, nobody will be around to notice the occasional flicker. The flickering actually turned out to be useful because it brought to light the hacking attempt which would otherwise just have been logged and silently ignored.&lt;/p&gt;
&lt;h2 id=&quot;how-to-stop-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-stop-it&quot; aria-label=&quot;how to stop it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to stop it?&lt;/h2&gt;
&lt;p&gt;Disabling remote access immediately stopped the flickering. If you don&apos;t need remote desktop, then disable it. Unfortunately, I can&apos;t disable remote desktop as much of my work on this system is remote (when not sheltering in place for a pandemic). So, instead, I created a rule in the Windows Firewall that blocked that IP address (or rather: the entire IP range). Better is to block by default and use a whitelist instead, if you can. Personally, I found myself wishing it would be possible to simply blacklist entire countries in the Windows Firewall.&lt;/p&gt;
&lt;p&gt;If you absolutely must have your RDP exposed to the internet at large, you can disable the WDDM driver and go back to the XPDM driver. I wouldn&apos;t recommend this, but it is possible by going into the registry editor, navigating to the key &lt;code class=&quot;language-text&quot;&gt;HKEY\_LOCAL\_MACHINE\\Policies\\Microsoft\\Windows NT\\Terminal Services&lt;/code&gt; and adding a DWORD value named &lt;code class=&quot;language-text&quot;&gt;fEnableWddmDriver&lt;/code&gt; with the value of &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[A baker's dozen AdvJam2020 entries you should try]]></title><description><![CDATA[Adventure Jam 2020 has ended, and I've managed to play all playable games. I've tremendously enjoyed playing all the entries and have voted…]]></description><link>https://www.shdon.com/advjam2020-shout-outs/</link><guid isPermaLink="false">https://www.shdon.com/advjam2020-shout-outs/</guid><pubDate>Tue, 19 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Adventure Jam 2020 has ended, and I&apos;ve managed to play all playable games. I&apos;ve tremendously enjoyed playing all the entries and have voted and left feedback and/or comments on every single one. There&apos;s been some great entries again and I think everybody can be proud of what they&apos;ve done. Some of the games are very short and can be completed in 2 minutes, others are astonishingly huge and sprawling full-length games that could take hours to puzzle your way to the end without a walkthrough. Here, shamelessly catering to my own tastes in adventure gaming, are my own favourites, in alphabetical order:&lt;/p&gt;
&lt;p&gt;.shot-container { background: black; box-shadow: 2px 2px 5px black; height: 0; padding: 0 0 56.25%; position: relative; width: 100%; } .shot-container img.shot { bottom: 0; box-shadow: none; height: 100%; left: 0; margin: 0; object-fit: contain; position: absolute; right: 0; top: 0; width: 100%; } #content ul.compact li { margin-top: 0; }&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#mock-orange-way&quot;&gt;616 Mock Orange Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#yddar&quot;&gt;Adventures of Yddar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#alien-science&quot;&gt;Alien Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#are-you-there&quot;&gt;Are You There?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cavern-evil-wizard&quot;&gt;Cavern of the Evil Wizard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chronicles-bruno&quot;&gt;Chronicles of Bruno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#creator-is-mean&quot;&gt;The Creator Is Mean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#four-distant-daughters&quot;&gt;Four Distant Daughters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#long-distance-coughing&quot;&gt;Long Distance Coughing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#me-and-the-robot&quot;&gt;Me and the Robot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#name-of-the-hose&quot;&gt;The Name of the Hose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#tales-from-the-road&quot;&gt;Tales from the Road&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#icebox&quot;&gt;You&apos;re Watching ICEBOX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Definitely check out those, as well as the many other &lt;a href=&quot;https://gamejolt.com/search/games?q=%23AdvJam2020&quot;&gt;entries&lt;/a&gt;. If you&apos;re an adventure game fan, you&apos;re certain to find something you like, even if your tastes are quite different from mine. And in case you&apos;re wondering, my own entry was &lt;a href=&quot;/projects/&quot;&gt;Spy Quest 2 - Operation: BOGROLL&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;616-mock-orange-way&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#616-mock-orange-way&quot; aria-label=&quot;616 mock orange way permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;616 Mock Orange Way&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/mock-orange-way.png&quot; alt=&quot;Screenshot showing Morgan and Hoyt in their appartment.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Akril15 did something quite different from her previous entries, forgoing detailed animations and colourful painted backgrounds in favour of monochrome line drawings with the occasional colourful detail surrounded by a classic Macintosh interface. Don&apos;t dismiss this entry based on that, as the art style is very much a deliberate choice and works well with the rich story. This is a very big game, which will take quite a while to get through. I wouldn&apos;t want to spoil it for anyone who hasn&apos;t played it yet, but I will say that the game rewards you for being observant.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/616mockorangeway/492966&quot;&gt;&lt;em&gt;616 Mock Orange Way&lt;/em&gt;, by Akril15&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;adventures-of-yddar&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#adventures-of-yddar&quot; aria-label=&quot;adventures of yddar permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adventures of Yddar&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/yddar.jpg&quot; alt=&quot;Screenshot showing the view over Alaskan Square.&quot;&gt;&lt;/p&gt;
&lt;p&gt;This demo of a full game, Mr. Bitmap&apos;s first entry in the Adventure Jam, is ambitious to say the least. Surprisingly, he&apos;s managed to pull it off with aplomb. Although the interface can use some polish (and I&apos;m sure it will be much improved by the time the full game is released without the time pressure of the jam), the world and the story are already quite expansive and the art that looks like pencil drawings with greyscale watercolour paint gives a very nice feel to the game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/adventuresofyddar/489256&quot;&gt;&lt;em&gt;Adventures of Yddar (demo)&lt;/em&gt;, by mr_Bitmap&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;alien-science&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#alien-science&quot; aria-label=&quot;alien science permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Alien Science&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/alien-science.png&quot; alt=&quot;Screenshot showing alien creature walking the main hub screen.&quot;&gt;&lt;/p&gt;
&lt;p&gt;In Phil Fortier&apos;s game, you play as an alien trainee who is learning how to properly study abducted specimens. Yes, this game features anal probes and plenty of other jokes (some subtle, some less so) related to various body parts. It&apos;s a text parser game with graphics that hearken back to the 16-colour Sierra adventure games that I remember fondly without actually adhering strictly itself to the limitations of those games, improving on them, but keeping the feel.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/alienscience/492833&quot;&gt;&lt;em&gt;Alien Science&lt;/em&gt;, by icefallgames&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;are-you-there&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#are-you-there&quot; aria-label=&quot;are you there permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Are You There?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/are-you-there.jpg&quot; alt=&quot;Screenshot showing the virtual computer with the text interface through which you play the game.&quot;&gt;&lt;/p&gt;
&lt;p&gt;This game is basically a text adventure and quite a long one. The story is essentially entirely linear, there is only a very limited number of actions you can take at any time and it would even get a bit repetitive. This meant that it took a while to get into the game, but when I did, I found the story quite compelling and this game manages to sail into my list of favourites by virtue of its narrative.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/areyouthere/493406&quot;&gt;&lt;em&gt;Are you there?&lt;/em&gt;, by vicimus&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;cavern-of-the-evil-wizard&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cavern-of-the-evil-wizard&quot; aria-label=&quot;cavern of the evil wizard permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cavern of the Evil Wizard&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/cavern-evil-wizard.png&quot; alt=&quot;Screenshot showing the player character getting hungry near the well.&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;ve ever seen the 1988 Tom Hanks movie &quot;BIG&quot; you might remember the scenes in which Josh played a 4-colour CGA adventure game on his PC, showing only the final screen in the game. The developer definitely remembered and sought to make the game as it might have been, culminating in a recreation of the screen from the movie. The game is very short and limited, but that actually goes really well with how text adventures with graphics might have been in the early 1980s. It&apos;s short, quirky, and fun.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/Cavernoftheevilwizard/493137&quot;&gt;&lt;em&gt;Cavern of the Evil Wizard&lt;/em&gt;, by MontieMongoose&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;chronicles-of-bruno&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#chronicles-of-bruno&quot; aria-label=&quot;chronicles of bruno permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Chronicles of Bruno&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/chronicles-bruno.jpg&quot; alt=&quot;Screenshot showing the (now half-)donkey walking the land.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bruno is a donkey who has to find help for his master, Sir Bleddyn, who has been bitten by a venomous serpent. All the action takes place on a single scrolling map drawn in the style one might see in a children&apos;s book. The adventure is pretty short, but the story and graphics are funny and cute, with nice characters and top notch voice acting.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/chroniclesofbruno/493454&quot;&gt;&lt;em&gt;Chronicles of Bruno&lt;/em&gt;, by simonreid&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-creator-is-mean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-creator-is-mean&quot; aria-label=&quot;the creator is mean permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Creator Is Mean&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/creator-is-mean.jpg&quot; alt=&quot;Screenshot showing the sentient drawing coming across an ant child playing with its kite.&quot;&gt;&lt;/p&gt;
&lt;p&gt;This game is thoroughly French in its story and puzzles. The French seem to have a penchant for absurd settings and puzzles (look at the Coktel Vision games for some great examples). In The Creator is Mean, you play as a drawing which gains sentience because his creator does a mean thing to him and you are out to get justice in a weird, weird world. The characters are fun and quirky and the story is a pretty good length.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/thecreatorismean/492965&quot;&gt;&lt;em&gt;The Creator is Mean&lt;/em&gt;, by Loïc Manglou&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;four-distant-daughters&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#four-distant-daughters&quot; aria-label=&quot;four distant daughters permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Four Distant Daughters&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/four-distant-daughters.png&quot; alt=&quot;Screenshot showing Isabel in her home.&quot;&gt;&lt;/p&gt;
&lt;p&gt;My friend Marco has made some of my favourite entries in previous years and he&apos;s done it again. If last year&apos;s The Darkest Tree was big, this game is positively gigantic, which is all the more amazing given the timeframe of the jam. With four playable characters in four different time periods, it took me several hours to see the end of this game and I thoroughly enjoyed every minute of it. I also appreciate the details like the habits the monks are wearing being based on historical fact, or the slightly transparent hologram having no shadow.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/four_distant_daughters/488839&quot;&gt;&lt;em&gt;Four Distant Daughters&lt;/em&gt;, by Marco Giorgini&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;long-distance-coughing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#long-distance-coughing&quot; aria-label=&quot;long distance coughing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Long Distance Coughing&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/long-distance-coughing.jpg&quot; alt=&quot;Screenshot showing the player getting help... in a while...&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Space Quest Historian and co-conspirator TorpedoBear went for the pixellated look last year with Brexit-Man, this time they went in the opposite direction with the entire game being made with full motion video, complete with cheesy 1990&apos;s FMV game acting and at least a metric fucktonne of over the top jokes, a hilariously absurd story, and even a smattering of puzzles.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/longdistancecoughing/493250&quot;&gt;&lt;em&gt;Long Distance Coughing&lt;/em&gt;, by The Adventure Think Tank&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;me-and-the-robot&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#me-and-the-robot&quot; aria-label=&quot;me and the robot permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Me and the Robot&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/me-and-the-robot.jpg&quot; alt=&quot;Screenshot showing appreciation for the presence of Nutella in the space ship supplies.&quot;&gt;&lt;/p&gt;
&lt;p&gt;In my opinion, this is the single most polished entry in the entire jam. They had a full team working on it, and it shows. The graphics are gorgeously drawn and well-animated, and there is a good amount of puzzles and a full length, well-written story with a handful of accessible locations. At this level of quality, I would not have been surprised if this had been a commercial game. The developers are even adding voice acting in a post-jam update. I was quite simply gobsmacked by this game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/meandtherobot/493241&quot;&gt;&lt;em&gt;Me and the Robot&lt;/em&gt;, by The Argonauts&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;name-of-the-hose&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#name-of-the-hose&quot; aria-label=&quot;name of the hose permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Name of the Hose&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/name-of-the-hose.jpg&quot; alt=&quot;Screenshot showing Bubbles&amp;#x27;s encounter with the sleeping frog.&quot;&gt;&lt;/p&gt;
&lt;p&gt;With high quality illustrations, that would not look out of place in a story book for kids and a story and characters to match, this is one of the cutest games in the jam. The backgrounds drawn by Matt Frith and characters by Joel Mayer go wonderfully well together. Playing as a mischievous pixie, you must find your way across the sea to defeat the monster threatening the village. I don&apos;t want to spoil the story for anybody who hasn&apos;t played it yet, but when you&apos;re looking for a quick and wholesome story, I will wholeheartedly recommend Name of the Hose.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/nameofhose/493239&quot;&gt;&lt;em&gt;The Name of the Hose&lt;/em&gt;, by Joel Mayer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;tales-from-the-road&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tales-from-the-road&quot; aria-label=&quot;tales from the road permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tales from the Road&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/tales-from-the-road.png&quot; alt=&quot;Screenshot showing Reginald D. Plunkett teasing Bartholomew Pittsworth with his name.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Durinde&apos;s game gives us the strange setting of a supernatural petrol station and throws in some Quantum Leap style &quot;putting things right that once went wrong&quot; in a short feel-good story. There&apos;s not a whole lot of content in there, but it&apos;s sweet and short and the isometric pixelart gives it a unique feel.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/TFTR/489155&quot;&gt;&lt;em&gt;Tales from the Road&lt;/em&gt;, by Durinde&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;youre-watching-icebox&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#youre-watching-icebox&quot; aria-label=&quot;youre watching icebox permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;You&apos;re Watching ICEBOX&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/icebox.png&quot; alt=&quot;Screenshot showing Reginald D. Plunkett teasing Bartholomew Pittsworth with his name.&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Adventure Jam would not be complete without an entry from Powerhoof. They limited themselves to just one location this year (also because their developer came straight out of Ludum Dare - check out their entry &lt;a href=&quot;https://seadads.itch.io/dunder&quot;&gt;Dunder&lt;/a&gt; from that, too), but managed to pack a lot of weird and wacky puzzles and humour into that. From the return of Dr. Kochbaum, the picky German dance group NIHILISTOBAHN to the wonderfully clueless divorce lawyer Bartholomew Pittsworth (whose name you keep deliberately mangling) and with the colourful graphics and great voice acting, there is nothing I didn&apos;t like about this game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/ICEBOX/493278&quot;&gt;&lt;em&gt;You&apos;re Watching ICEBOX&lt;/em&gt;, by Powerhoof&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;honourable-mentions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#honourable-mentions&quot; aria-label=&quot;honourable mentions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Honourable mentions&lt;/h2&gt;
&lt;p&gt;The ones above are not the only cool entries.. Other ones that I&apos;d like to at least mention are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/isolation/490145&quot;&gt;&lt;em&gt;Isolation&lt;/em&gt;, by HuntsersTON&lt;/a&gt; — for great improvement in skill over a year.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/disk-2-little-tasks/492853&quot;&gt;&lt;em&gt;DISK 2: Little tasks&lt;/em&gt;, by Valdram&lt;/a&gt; — for thoroughly confusing me.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/a_strange_alchemy_adventure/493453&quot;&gt;&lt;em&gt;A Strange Alchemy Adventure&lt;/em&gt;, by UomoFocaccina&lt;/a&gt; — for the hilarious mess.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/DrMoniLittleHospital/493336&quot;&gt;&lt;em&gt;Dr. Moni Little Hospital&lt;/em&gt;, by SalomBros&lt;/a&gt; — for a serious message in a cute setting.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/WanderOfWizardKind/488111&quot;&gt;&lt;em&gt;A Wanderer of Wizard Kind&lt;/em&gt;, by Resulka&lt;/a&gt; — for submitting something she knew wasn&apos;t finished, fixing bugs for me, and for extremely funny dialogue and voiceovers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/lockdown/497126&quot;&gt;&lt;em&gt;Lockdown&lt;/em&gt;, by Hardwidge&lt;/a&gt; — for making a great game despite missing the offical jam.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Spy Quest 2 - Operation: BOGROLL]]></title><description><![CDATA[A new year, a new Adventure Jam. Adventure Jam 2020 ran from 21 April to 5 May, during which the participants have to make an adventure game…]]></description><link>https://www.shdon.com/spy-quest-2-operation-bogroll/</link><guid isPermaLink="false">https://www.shdon.com/spy-quest-2-operation-bogroll/</guid><pubDate>Wed, 06 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A new year, a new Adventure Jam. Adventure Jam 2020 ran from 21 April to 5 May, during which the participants have to make an adventure game from scratch in 14 days. It was announced with very short notice, so there was almost no time to come up with a concept or do some design and planning ahead of the actual creation of the game. Unlike other years, this year there was a suggested (not mandatory) theme. Although the immediate themes didn&apos;t inspire me, they were all related to the pandemic that&apos;s going on, so I decided I would poke fun at that, specifically at the hoarding of toilet paper in my entry &quot;Spy Quest 2 - Operation: BOGROLL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/sq2ob-title.png&quot; alt=&quot;Title screen for Spy Quest 2 - Operation: BOGROLL&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;about-the-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#about-the-game&quot; aria-label=&quot;about the game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;About the game&lt;/h2&gt;
&lt;p&gt;Like in &lt;a href=&quot;/spy-quest-1-mission-spectrum/&quot;&gt;the previous game in the series&lt;/a&gt;, you play as Agent N of the HCA (Highly Clandestine Agency) and this time, you have been assigned the crucial task of ensuring a steady supply of toilet paper despite all the hoarding during the global norovirus pandemic of 2020 (NOVID-20). Something smells bad about this whole situation!&lt;/p&gt;
&lt;p&gt;Spy Quest 1 was a text parser game in Sierra&apos;s AGI style. Spy Quest 2 is ostensibly a point and click game in Sierra&apos;s SCI1 style, with an interface that borrows from that of Space Quest 4. However, some people prefer the added flexibility or nostalgia of a text parser. So, Operation: BOGROLL supports both.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/sq2ob-pnc.png&quot; alt=&quot;Screen shot showing the point and click interface&quot;&gt; &lt;img src=&quot;https://www.shdon.com/blog/images/2020/05/sq2ob-parser.png&quot; alt=&quot;Screen shot showing the text parser interface&quot;&gt;&lt;/p&gt;
&lt;p&gt;You don&apos;t need to choose which style you prefer, as both interfaces are always active. Just point and click to your heart&apos;s desire (the icon bar is hidden at the top of the screen), or simply start typing. The game can be completed fully whichever method of interaction you use or with any mixture of both.&lt;/p&gt;
&lt;p&gt;There are few extra hints in the parser responses to alert you to things that would only be visible in the dialogue selection box when using point and click, just so that parser users aren&apos;t at a disadvantage. Some fully optional actions can only be performed with the parser, but yield some hopefully humourous responses from the game.&lt;/p&gt;
&lt;h2 id=&quot;voice-acting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#voice-acting&quot; aria-label=&quot;voice acting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Voice acting&lt;/h2&gt;
&lt;p&gt;Like last year&apos;s &lt;a href=&quot;/escape-from-dimansion/&quot;&gt;Escape from DIMANSION&lt;/a&gt; I was able to integrate some voice acting from the lovely artists who volunteered their talents for the jam. A big thank you goes out to &lt;a href=&quot;https://twitter.com/GeminiDoesGames&quot;&gt;Jason Cryer&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/DurindePlays&quot;&gt;Durinde&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/ErikaSanderson&quot;&gt;Erika Sanderson&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/WinterNatters&quot;&gt;Natalie Winter&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/PaulThomasXV&quot;&gt;Paul Thomas&lt;/a&gt;, and my friend &lt;a href=&quot;https://twitter.com/Femko77&quot;&gt;Dirk M. Weger&lt;/a&gt; for helping to bring the characters to life.&lt;/p&gt;
&lt;h2 id=&quot;special-thanks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#special-thanks&quot; aria-label=&quot;special thanks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Special thanks&lt;/h2&gt;
&lt;p&gt;A special thank you goes out to Al Lowe for being a good sport and providing material to an easter egg in the game. Visit &lt;a href=&quot;https://www.allowe.com/&quot;&gt;allowe.com&lt;/a&gt; or follow &lt;a href=&quot;https://twitter.com/AlLowe&quot;&gt;@AlLowe&lt;/a&gt; on Twitter.&lt;/p&gt;
&lt;h2 id=&quot;want-to-play-it&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#want-to-play-it&quot; aria-label=&quot;want to play it permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Want to play it?&lt;/h2&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;Operation: BOGROLL&lt;/a&gt; on this site, or the &lt;a href=&quot;https://gamejolt.com/games/operation-bogroll/488679&quot;&gt;Game Jolt page&lt;/a&gt; for it. And if you&apos;re an adventure fan, be sure to try the &lt;a href=&quot;https://gamejolt.com/search/games?q=%23AdvJam2020&quot;&gt;other entries&lt;/a&gt;, too. When I have finished playing all the games in the jam, I&apos;ll definitely write another blog post with a list of the ones I enjoyed the most.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Literally stuck in LEGO Batman the Videogame or is it freezing? Try this!]]></title><description><![CDATA[In the second level in the first episode of LEGO Batman: the Videogame, you may get stuck being unable to walk up a wall or a pipe in Mr…]]></description><link>https://www.shdon.com/lego-batman-videogame-stuck-glitch-freeze/</link><guid isPermaLink="false">https://www.shdon.com/lego-batman-videogame-stuck-glitch-freeze/</guid><pubDate>Thu, 17 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the second level in the first episode of &lt;a href=&quot;https://www.gog.com/game/lego_batman_the_videogame&quot;&gt;&lt;em&gt;LEGO Batman: the Videogame&lt;/em&gt;&lt;/a&gt;, you may get stuck being unable to walk up a wall or a pipe in Mr. Freeze&apos;s hideout using the magnetic boots. If not there, you may encounter other similar glitches as well, even with the AI-controlled character getting stuck in those same locations in single-player mode. In other cases, the game may freeze (no pun intended) every few seconds. There is a simple workaround for this.&lt;/p&gt;
&lt;p&gt;If you&apos;ve experienced the glitch in the video above or something similar, you may want to try turning on &lt;em&gt;vertical sync&lt;/em&gt; in the graphics options menu whenever you encounter it. With vsync on, you should be able to progress beyond that point normally. I&apos;d recommend turning vsync back off immediately after, though. At least on my system, the game tended to freeze every few seconds with vsync enabled. To unfreeze, just Alt-Tab out of the game and back in immediately.&lt;/p&gt;
&lt;p&gt;That&apos;s a really weird bug and my best guess is that the game experiences a rounding error due to timing issues when the game runs at more than 60fps. The joys of running more than a decade old games on a Windows 10 system with faster hardware than was available when they were programmed. It might even be related to or exacerbated by the current NVIDIA graphics drivers and perhaps it is not an issue with other video cards or drivers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2019/10/lego-batman-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/10/lego-batman.jpg&quot; alt=&quot;The scene in LEGO Batman: the Videogame, episode 1, level 2, where the glitch first manifests itself&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; turn vsync off when you experience freezing, turn vsync on when you experience movement or AI glitches&lt;/p&gt;
&lt;h2 id=&quot;sidebar-what-is-vsync-anyway&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sidebar-what-is-vsync-anyway&quot; aria-label=&quot;sidebar what is vsync anyway permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sidebar: what is vsync anyway?&lt;/h2&gt;
&lt;p&gt;Back in the old days of CRT displays, the image on screen was drawn by an electron beam sweeping across the phosphorous coating on the inside of the picture tube. After a full frame had been drawn, the electron beam had to move back to the top of the screen (the electron gun being switched off so it didn&apos;t draw anything) to be ready to draw the next frame. This is called the vertical retrace.&lt;/p&gt;
&lt;p&gt;To ensure the smoothest graphics game software tended to wait for this vertical retrace to do all their drawing to the display buffer. If the game didn&apos;t do this, it might end up changing the display buffer whilst it was being drawn. This could result in the top part of the display showing one frame and lower parts of the display already showing the next intended frame. If there was motion between those two frames, this would show as a visible horizontal line. That artefact was called screen tearing.&lt;/p&gt;
&lt;p&gt;Synchronising to the vertical retrace (vsync) thus improved graphics quality, but it also came at a performance cost. If your computer was capable of processing all the graphics in the time it took to display a frame, let&apos;s say 1/60th of a second for 60fps, this was no problem. If, however, the game was graphically intensive enough in a way that your hardware couldn&apos;t finish drawing all the graphics in time, it would end up waiting for the next vertical retrace. If your hardware was only capable of displaying 59fps consistently, vsync would make it draw at 30fps instead. Then, it would be best to disable vsync, sacrificing a bit of graphical smoothness for more fluid gameplay. For a game with fast action, 59fps with a little tearing is usually preferred over a smoother 30fps.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[A baker's dozen AdvJam2019 entries you should try]]></title><description><![CDATA[.shot-container { background: black; box-shadow: 2px 2px 5px black; height: 0; padding: 0 0 56.25%; position: relative; width: 100%; } .shot…]]></description><link>https://www.shdon.com/advjam2019-shout-outs/</link><guid isPermaLink="false">https://www.shdon.com/advjam2019-shout-outs/</guid><pubDate>Thu, 27 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;.shot-container { background: black; box-shadow: 2px 2px 5px black; height: 0; padding: 0 0 56.25%; position: relative; width: 100%; } .shot-container img.shot { bottom: 0; box-shadow: none; height: 100%; left: 0; margin: 0; object-fit: contain; position: absolute; right: 0; top: 0; width: 100%; } #content ul.compact li { margin-top: 0; }&lt;/p&gt;
&lt;p&gt;This year&apos;s &lt;a href=&quot;https://www.advjam.com/&quot;&gt;Adventure Jam&lt;/a&gt; has yielded some great entries again. Those who, like myself, have entered get to vote on other people&apos;s submissions before they go on to the judges. I&apos;m trying to play every single other entry, vote, and leave constructive criticism and/or positive comments on each one. Every team or individual person who took on the herculean task of making an adventure game from scratch in a mere two weeks is to be commended. Whether gorgeous pixel art with full voice acting, a bunch of stick figures, or even a text-only adventure, everybody has a story to tell. Even those who had to drop out or had to submit something they knew was buggy or far from finished should be proud of their efforts.&lt;/p&gt;
&lt;p&gt;Of course, despite my appreciation for even the simplest and most unfinished projects, I can&apos;t help but have my own favourites or to be in awe at some of the most amazing entries and felt I have to give a shout-out to these. If you haven&apos;t yet checked out any of the games on offer, you definitely should. But please also don&apos;t neglect &lt;a href=&quot;https://gamejolt.com/search/games?q=%23AdvJam2019&quot;&gt;the other entries&lt;/a&gt;, because your taste could well be different from mine and I might have missed some absolute gems, or simply because I chose to limit myself to a mere 13 picks! Bearing in mind that my personal preference is for inventory-based point-and-click adventures, here are some of my favourites in alphabetical order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#amicus&quot;&gt;Amicus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#another-heaven&quot;&gt;Another Heaven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#brexit-man&quot;&gt;Brexit-Man in Airport-Land, the Re-Brexiting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#darkest-tree&quot;&gt;The Darkest Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#eternity-reflecting&quot;&gt;An Eternity, Reflecting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#coatrack&quot;&gt;The Inanimate Mr. Coatrack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#killer-frequency&quot;&gt;Killer Frequency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#mysterious-spaceship&quot;&gt;The Mysterious Spaceship&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#night-crescent-moon&quot;&gt;Night of the Crescent Moon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rustys-release&quot;&gt;Rusty&apos;s Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#starstruck&quot;&gt;Starstruck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stately-groan&quot;&gt;Stately Groan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#croak&quot;&gt;To Croak or not to Croak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, if you are interested in my own entry, you can find &lt;a href=&quot;/projects/&quot;&gt;Escape from DIMANSION&lt;/a&gt; right here on my site.&lt;/p&gt;
&lt;h2 id=&quot;amicus&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#amicus&quot; aria-label=&quot;amicus permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Amicus&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/amicus.png&quot; alt=&quot;Screenshot showing the goomba meeting his pet.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Starting off with something that is decidedly not an inventory-based point-and-click game, Amicus uses a platform mechanic and tells a story silently and wordlessly about an outcast little creature and his little pet. Although I had to give up partway through because of my lacklustre platforming skills and the controls leaving something to be desired, it is the aesthetic, the atmosphere and the story that really got to me and I really wish I could get further along the story and see whether this cute goomba gets a happy ending.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/amicusgame/421445&quot;&gt;&lt;em&gt;Amicus&lt;/em&gt;, by Fryon&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;another-heaven&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#another-heaven&quot; aria-label=&quot;another heaven permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Another Heaven&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/another-heaven.jpg&quot; alt=&quot;Screenshot showing the characters in a lush jungle landscape&quot;&gt;&lt;/p&gt;
&lt;p&gt;When Akril15 creates a game you know it will be absolutely gorgeous to look at and this was no exception. While short because of the 14-day limit of the jam, the story it tells is actually quite poignant about the place we humans have in the world. What really struck a chord with me was how one of the actions you have to perform actually foreshadows the moral of the story.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/another-heaven/421286&quot;&gt;&lt;em&gt;Another Heaven&lt;/em&gt;, by Akril15&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;brexit-man-in-airport-land-the-re-brexiting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#brexit-man-in-airport-land-the-re-brexiting&quot; aria-label=&quot;brexit man in airport land the re brexiting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Brexit-Man in Airport-Land, the Re-Brexiting&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/brexit-man.png&quot; alt=&quot;Screenshot showing the demonic magazine salesman&quot;&gt;&lt;/p&gt;
&lt;p&gt;Don&apos;t let the simplistic, decidedly 1990-ish graphics fool you, this game is far from amateurish. What this game &lt;em&gt;is&lt;/em&gt; is frickin&apos; hilarious with spot on voice acting for all the characters and a wonderfully absurd story. The dialogue made me literally laugh out loud several times, which is a rare thing indeed. Highly recommended little adventure from the twisted minds who brought us &lt;em&gt;Ramp It Up!&lt;/em&gt; last year.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/brexitman/421297&quot;&gt;&lt;em&gt;Brexit-Man in Airport-Land, the Re-Brexiting&lt;/em&gt;, by The Adventure Think Tank&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-darkest-tree&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-darkest-tree&quot; aria-label=&quot;the darkest tree permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Darkest Tree&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/darkest-tree.png&quot; alt=&quot;Screenshot of Paolo reaching the darkest tree&quot;&gt;&lt;/p&gt;
&lt;p&gt;Marco Giorgini created one of my favourite entries last year, &lt;em&gt;The Child of the Hill House&lt;/em&gt; and he&apos;s upped his game this year. Despite the rough edges, there is an astonishing amount of content in here and a well-written full-length story set in Marco&apos;s home country of Italy. Even though at first I thought I could see where he was taking the story, it turned out I was wrong and he managed to surprise me after all.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/thedarkesttree/418906&quot;&gt;&lt;em&gt;The Darkest Tree&lt;/em&gt;, by Marco Giorgini&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;an-eternity-reflecting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#an-eternity-reflecting&quot; aria-label=&quot;an eternity reflecting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;An Eternity, Reflecting&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/eternity-reflecting.png&quot; alt=&quot;Screenshot showing the girl looking out her father&amp;#x27;s home&quot;&gt;&lt;/p&gt;
&lt;p&gt;A beautiful story about a girl travelling home to see her estranged father for the first time since childhood. As she waits for him to get home, you find out more about what motivated him all those years ago. Beautiful pixel art and an unconventional way of moving about the scene allows the author to focus on telling the very moving story.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/AER/421186&quot;&gt;&lt;em&gt;An Eternity, Reflecting&lt;/em&gt;, by MattFrith&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-inanimate-mr-coatrack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-inanimate-mr-coatrack&quot; aria-label=&quot;the inanimate mr coatrack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Inanimate Mr. Coatrack&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/coatrack.png&quot; alt=&quot;Screenshot of Dr. Bernhard bringing his creation to life&quot;&gt;&lt;/p&gt;
&lt;p&gt;Powerhoof are a true powerhouse in the Adventure Jam consistently having highly ranked entries for the past few years. Their games tend to be wonderfully over-the-top dramatic with gorgeous pixel art putting the player in the most horrific situations they can think up. This year&apos;s entry starts out very much in character with a very Frankenstein feel, but quickly has a surprise for the player. The writing, art and voice acting (all voices done by the terrific Adrian Vaughan) are all as close to perfect as you could possibly hope to get.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/the-inanimate-mr-coatrack/421348&quot;&gt;&lt;em&gt;The Inanimate Mr. Coatrack&lt;/em&gt;, by Powerhoof&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;killer-frequency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#killer-frequency&quot; aria-label=&quot;killer frequency permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Killer Frequency&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/killer-frequency.jpg&quot; alt=&quot;Screenshot with the view of the radio studio control panel&quot;&gt;&lt;/p&gt;
&lt;p&gt;Last year, Adam Findlay impressed me with his unusual detective story &lt;em&gt;The Last Act&lt;/em&gt;. This year&apos;s entry is quite different, but no less amazing. You play as a 1980s radio host who has to contend with a serial killer in his small town. While you don&apos;t ever leave the studio, the story is told through incoming phonecalls from listeners. It is quite a novel approach and manages to get the heart thumping and adrenaline flowing.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/KillerFrequency/419748&quot;&gt;&lt;em&gt;Killer Frequency&lt;/em&gt;, by awfindlay&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-mysterious-spaceship&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-mysterious-spaceship&quot; aria-label=&quot;the mysterious spaceship permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Mysterious Spaceship&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/mysterious-spaceship.png&quot; alt=&quot;Screenshot of a text adventure&quot;&gt;&lt;/p&gt;
&lt;p&gt;The smallest game in my list, &lt;em&gt;The Mysterious Spaceship&lt;/em&gt; is a text adventure that has only a few images to go with the text, though you won&apos;t see most of these until you are almost at the end. Adventure games played with a text parser require some perseverance on the part of the player, but I found this one to be quite well done. The puzzles make sense and don&apos;t have any moon logic other than the literal kind.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/mysteriousspaceship/419056&quot;&gt;&lt;em&gt;The Mysterious Spaceship&lt;/em&gt;, by nereksnad&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;night-of-the-crescent-moon&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#night-of-the-crescent-moon&quot; aria-label=&quot;night of the crescent moon permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Night of the Crescent Moon&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/night-crescent-moon.png&quot; alt=&quot;Screenshot of a text adventure&quot;&gt;&lt;/p&gt;
&lt;p&gt;Another text adventure, albeit one without a parser and with the benefit of some scene graphics. The game is reminiscent of the kind of games I played on the 8-bit microcomputers in my childhood. By virtue of being a text adventure, the author could add some extra depth to the story and, even if I didn&apos;t catch every nuance, it felt quite epic. The game even includes multiple endings.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/night_of_the_crescent_moon/418833&quot;&gt;&lt;em&gt;Night of the Crescent Moon&lt;/em&gt;, by Roc Studios&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;rustys-release&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rustys-release&quot; aria-label=&quot;rustys release permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rusty&apos;s Release&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/rustys-release.jpg&quot; alt=&quot;Screenshot showing a robot visiting his doctor&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is sweetniche&apos;s first team outing and boy is it a doozy. &lt;em&gt;Rusty&apos;s Release&lt;/em&gt; is a highly polished point-and-click game with atmospheric and stylishly animated 3D graphics, and quality voice acting for all the characters. With quite a bit of content, this game tells a charming story about a little rusty robot who wants to escape the daily grind. I found myself unable to give this entry anything less than the maximum rating in all categories.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/RustysRelease/420832&quot;&gt;&lt;em&gt;Rusty&apos;s Release&lt;/em&gt;, by sweetniche&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;starstruck&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#starstruck&quot; aria-label=&quot;starstruck permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Starstruck&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/starstruck.jpg&quot; alt=&quot;Screenshot of the hero talking to one of the heads of Hydra&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every billion years, the constellations get to wake up, come alive, and have some fun. Tonight&apos;s the night! There&apos;s only 1 large, scrolling screen on which the entire story takes place, but there&apos;s still a surprising amount of content in that one screen. Even when I thought the story was over, there was still a bit to go. The graphics are beautifully drawn and the writing is very witty. If you have anything remotely resembling a sense of humour, you&apos;ll love this game.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/starstruck/421137&quot;&gt;&lt;em&gt;Starstruck&lt;/em&gt;, by chrisushko&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;stately-groan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#stately-groan&quot; aria-label=&quot;stately groan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Stately Groan&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/stately-groan.png&quot; alt=&quot;Screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;From the developer of last year&apos;s &lt;em&gt;Nine Survive&lt;/em&gt;, &lt;em&gt;Stately Groan&lt;/em&gt; is a new game in the same vein about a tour guide showing up for his first day of work at Didling Manor. This isn&apos;t your ordinary job or run-of-the-mill workplace though. There are some fiendishly difficult puzzles in there and you have to pay close attention to the information plaques throughout the manor. A wonderfully weird story that rewards your hard work with a crazy ending.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/statelygroan/421403&quot;&gt;&lt;em&gt;Stately Groan&lt;/em&gt;, by Giddy Plant&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;to-croak-or-not-to-croak&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to-croak-or-not-to-croak&quot; aria-label=&quot;to croak or not to croak permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To Croak or not to Croak&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/croak.jpg&quot; alt=&quot;Screenshot of an encounter with tourists in the master bedroom&quot;&gt;&lt;/p&gt;
&lt;p&gt;I almost overlooked this game even though it&apos;s the exact kind of game that I like the most. A cute story about Griseldis the witch who doesn&apos;t really enjoy turning people into frogs. You get to gather the ingredients with your trusty raven Morrigan and mix together some potions. The story is funny and well-written and the ending dialogue made me snicker.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://gamejolt.com/games/tocroak/421429&quot;&gt;&lt;em&gt;To Croak or not to Croak&lt;/em&gt;, by EsmeraldaW&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;honourable-mentions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#honourable-mentions&quot; aria-label=&quot;honourable mentions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Honourable mentions&lt;/h2&gt;
&lt;p&gt;I had to limit myself to the ones I wrote about above, but by no means are those the only great entries. Other ones that I&apos;d like to at least mention are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/TOTR/418580&quot;&gt;&lt;em&gt;The One That Remains&lt;/em&gt;, by Durinde&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/fleshworms/421081&quot;&gt;&lt;em&gt;Tales from the Outer Zone: Fleshworms&lt;/em&gt;, by TheOuterZone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/escapepong/420773&quot;&gt;&lt;em&gt;Escape Pong!&lt;/em&gt;, by Nico595&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/mvem_twotio/418477&quot;&gt;&lt;em&gt;Mon Village est Magique : The Whale of the Infinite Ocean&lt;/em&gt;, by The_Icehouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamejolt.com/games/teafortwo/421342&quot;&gt;&lt;em&gt;Tea For Two: A Detective Logan Case&lt;/em&gt;, by eri0o&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Escape from DIMANSION]]></title><description><![CDATA[Despite being short on time, I really wanted to participate in the Adventure Jam again, just like last year. In 2019, this ran from 8 to 2…]]></description><link>https://www.shdon.com/escape-from-dimansion/</link><guid isPermaLink="false">https://www.shdon.com/escape-from-dimansion/</guid><pubDate>Thu, 27 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Despite being short on time, I really wanted to participate in the Adventure Jam again, just like &lt;a href=&quot;/spy-quest-1-mission-spectrum/&quot;&gt;last year&lt;/a&gt;. In 2019, this ran from 8 to 22 June and once again the challenge was to make an adventure game basically from scratch in 14 days. This year, my entry &quot;Escape from DIMANSION&quot; should have a LucasArts vibe to it, at least from the interface and from having it impossible for the player to die or experience a dead-man-walking situation where they are unable to finish the game.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2019/06/dimansion-up-or-down.jpg&quot; alt=&quot;Screenshot of the protagonist looking up at a hatch on the ceiling of one of the rooms in the game&quot;&gt;&lt;/p&gt;
&lt;p&gt;This year, I decided to create all the graphics using Blender to get a more realistic graphical style. Although it wasn&apos;t allowed to do any actual development ahead of the jam period, I could at least use that time to plan the game and puzzles and to improve my 3D modelling skills. As an incredible opportunity for us independent developers, there was an amazing group of voice actors who volunteered theirs skills to make our entries come alive. I consider myself extremely lucky to have had access to the voice talents of &lt;a href=&quot;https://twitter.com/SQHistorian&quot;&gt;Troels &quot;Space Quest Historian&quot; Pleimert&lt;/a&gt; as the protagonist, the wonderful &lt;a href=&quot;https://twitter.com/spacecampgf&quot;&gt;Ivy Dupler&lt;/a&gt; as his lovely wife Linda, the versatile &lt;a href=&quot;https://twitter.com/VinceOmmen&quot;&gt;Vincent van Omen&lt;/a&gt; as Mephistopheles and Dr. Lucas, and the rumbling voice of &lt;a href=&quot;https://twitter.com/YeOldShrimpEyes&quot;&gt;Adrian Vaughan&lt;/a&gt; which gives me the chills. Thank you so much for giving life to my sub-par prose!&lt;/p&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;Escape from DIMANSION&lt;/a&gt; on this site, or the &lt;a href=&quot;https://gamejolt.com/games/dimansion/418494&quot;&gt;Game Jolt page&lt;/a&gt; for it. And if you&apos;re an adventure fan, be sure to try the &lt;a href=&quot;https://gamejolt.com/search/games?q=%23AdvJam2019&quot;&gt;other entries&lt;/a&gt;, too. Or check out my blog post with &lt;a href=&quot;/advjam2019-shout-outs/&quot;&gt;shout-outs to some of my favourites&lt;/a&gt;.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[I may have broken the law, but it broke my heart first]]></title><description><![CDATA[Enough time has now passed that I can write this without endangering somebody. A while ago, I met somebody who'd fled to the Netherlands…]]></description><link>https://www.shdon.com/i-may-have-broken-the-law-but-it-broke-my-heart-first/</link><guid isPermaLink="false">https://www.shdon.com/i-may-have-broken-the-law-but-it-broke-my-heart-first/</guid><pubDate>Tue, 04 Sep 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Enough time has now passed that I can write this without endangering somebody. A while ago, I met somebody who&apos;d fled to the Netherlands. This man had to leave everything behind... his home, family and friends, everything that he ever knew. Why? Because he&apos;s not straight. And where he comes from that means not just being discriminated against, but experiencing physical violence, with police looking the other way. So, this person took what little he could fit in a small backpack, left everything else behind, and came to the Netherlands. That&apos;s how I met this young man: his few remaining worldly possessions in the tiny backpack and, heart-wrenchingly, the scars on his arms betraying he had tried to find &quot;another way&quot; out of his living nightmare... yet there was a sheepish grin on his face, hoping he&apos;d finally be free here.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/09/seashells.jpg&quot; alt=&quot;Two seashells in a small padded box&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once here, he applied for asylum and he was placed in one of the centres for asylum seekers. In the meantime, the bureaucracy went to work in a way that only the bureaucracy can. All the communication from the immigration service to this gentleman, who couldn&apos;t even speak English, was in Dutch. That included an invitation to appear before the court. A court that was 180km from the shelter if you went by car. A 4-hour trip with public transport: 5 stopovers and 3 different modes of transportation. I probably would have some trouble with that even here in my own country. He could not appear in court and plead his case. The court-appointed lawyer who had been assigned to him was &lt;em&gt;on vacation&lt;/em&gt; and supposedly sent a substitute. I have no way of knowing whether this person did their job and did it well, or whether they even went to court. What I do know is that my new friend had to pay €150 in legal fees and he showed me a letter.&lt;/p&gt;
&lt;p&gt;It was, of course, in Dutch. He asked me to translate it for him, hoping for good news. I read the letter and my heart sank. Loosely translated and summarised, it said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your request for asylum has been denied. We are legally required to provide shelter for you for up to 30 days from the date of this decision. Please be at [... place, date, and time ...] for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There was some mention of what happened in case of an appeal, but no appeal had been filed. My friend had neither the money, nor the ability to navigate the bureaucracy to do so. It likely would not have been made much difference, as the country the young man came from had (in theory, at least) officially outlawed discrimination based on sexual orientation a scant few years ago. In practice... not so much. Not long after the letter above, but before the time mentioned in it, another document arrived. The message in that was not unexpected, yet still hit like a sledgehammer: &quot;leave the country within 24 hours or face deportation to your country of birth&quot;. I will spare you a description of the despair I witnessed. Even when using Google Translate to communicate, enough of it shone through that my heart broke.&lt;/p&gt;
&lt;p&gt;I&apos;d like to say my decision was quick, but it wasn&apos;t. I&apos;m just not that brave nor rebellious. But after hours of deliberation, my choice became clear: I had none. In the dead of night, I drove to the shelter and drove straight back home with a passenger carrying a tiny backpack. After getting stuck in the morning rush hour, back at my home I ordered an international train ticket. We went for a quick breakfast and a cup of coffee at the train station. This man, who had almost nothing, took the most valuable thing he did have, his wristwatch, and offered it to me as a thank you and remembrance. Even if I hadn&apos;t felt like a coward for taking so long to act, there is of course no way I would ever accept that and I had trouble getting him to accept some money that he would desperately need to survive.&lt;/p&gt;
&lt;p&gt;As we travelled to the final train station before the border, he took a little pouch out of the backpack. It contained some carefully wrapped seashells he&apos;d found at the beach and he almost begged me to at least take those. If you&apos;d been wondering why this post has a picture of two seashells... now you know. I stood on the platform, crying, as the train departed and quickly made its way across the border.&lt;/p&gt;
&lt;p&gt;Probably not in the way that they intended, but the authorities got their wish... an unwanted immigrant had left the country. Some people will doubtless consider me a fool at best, or a giver of false hope at worst. Truth be told, I don&apos;t know whether he has a better chance in the other country that he is in now, and I&apos;m not sure I could bear to learn. I also don&apos;t know whether my actions were legal, and I may have to face consequences for that. I do know that I did what my heart says was the right thing to do, and do not regret it at all.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Spy Quest 1 - Mission: SPECTRUM]]></title><description><![CDATA[Even though I'm a big adventure game lover, I hadn't known of AdvJam before. The jam is about creating an adventure game in a mere 14 days…]]></description><link>https://www.shdon.com/spy-quest-1-mission-spectrum/</link><guid isPermaLink="false">https://www.shdon.com/spy-quest-1-mission-spectrum/</guid><pubDate>Fri, 18 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Even though I&apos;m a big adventure game lover, I hadn&apos;t known of &lt;a href=&quot;https://www.advjam.com/&quot;&gt;AdvJam&lt;/a&gt; before. The jam is about creating an adventure game in a mere 14 days. This year, it ran from 4 to 18 May and I learned about it in time and was able to create an entry for it. &quot;Spy Quest 1 - Mission: SPECTRUM&quot; is my tribute to the older text parser adventure games as made in the 1980s by Sierra. Not actual Sierra AGI, but with the same kind of blocky low-res style of artwork in all the 16 glorious EGA colours. Party like it&apos;s 1988!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/05/sq1ms-crt.jpg&quot; alt=&quot;Running the game on an old 14&amp;#x22; CRT for that authentic feel&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;about-the-game&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#about-the-game&quot; aria-label=&quot;about the game permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;About the game&lt;/h2&gt;
&lt;p&gt;In the game, you play as Agent N of the HCA (Highly Clandestine Agency) and are on a mission to infiltrate Spectrum Enterprises&apos; corporate HQ to find out what nefarious scheme they are about to unleash on an unsuspecting world. Or have they perhaps already done so? Walk around the locations of the game world using the cursor keys and type commands like &quot;look painting&quot; to make the character perform the actions you want him to.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/05/sq1ms-title.png&quot; alt=&quot;Title screen for Spy Quest 1 - Mission: SPECTRUM&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;glorious-16-colour-ega&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#glorious-16-colour-ega&quot; aria-label=&quot;glorious 16 colour ega permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Glorious 16-colour EGA&lt;/h2&gt;
&lt;p&gt;When I started out making this game, I figured that, given the tight time constraints of AdvJam2018, making graphics in 16 colour low res (Sierra&apos;s AGI graphics were effectively 160x168 pixels, horizontally doubled to 320x168 pixels) would be a time saver. Now, I&apos;m not so sure.&lt;/p&gt;
&lt;p&gt;When a character&apos;s body is 3 pixels wide, how are you going to make it seem like they&apos;re wearing any sort of interesting clothes or give them any personality? The lack of colours also makes it far more difficult to create aesthetically pleasing or visually interesting backgrounds. There are little or no shading options and many colours (orange? dark brown?) just don&apos;t exist in the EGA palette, nor do you have enough resolution to make anything detailed. Having the &quot;full&quot; width of 320 pixels and/or even as little as 64 colours would make things so much easier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/05/sq1ms-start.png&quot; alt=&quot;A screenshot of the starting location for the game&quot;&gt;&lt;/p&gt;
&lt;p&gt;And that is without even mentioning the lack of sprite scaling AGI has leading making it very difficult to keep things from getting overly disproportionate with the scene perspective, especially in indoor locations. Working on AGI style graphics has left me with a renewed respect for Sierra&apos;s background artists who managed to make some very impressive backgrounds given the limited resources available to them.&lt;/p&gt;
&lt;h2 id=&quot;handling-failure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#handling-failure&quot; aria-label=&quot;handling failure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Handling failure&lt;/h2&gt;
&lt;p&gt;One of the most pronounced differences in game design between Sierra and LucasArts was that Sierra game designers seemed to take a near perverse delight in killing the player over the most trivial things, often as part of the humour, sometimes through arcade sequences, or even in Gold Rush through random chance. This meant: save early, save often.&lt;/p&gt;
&lt;p&gt;Even if you didn&apos;t always die, there were quite a few &apos;dead man walking&apos; situations (though, to be fair, there were a few deaths or DMWs in LucasArts adventures, too). I wasn&apos;t sure whether to avoid deaths and DMWs in my game altogether, or to keep them in to have that authentic Sierra feel. It was an easy decision to try to make sure that a DMW is not possible, but for deaths it wasn&apos;t quite so clear. So instead, I&apos;ve chosen to leave it up to the player:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/05/sq1ms-mode-selection.png&quot; alt=&quot;Dialog box asking the player to select between easy mode and hard mode&quot;&gt;&lt;/p&gt;
&lt;p&gt;That dialog box pops up at the start of the game and you, as the player, can decide whether you want the genuine retro experience with the chance of dying (or otherwise losing) or whether you just want to make your way through the game to see how the story turns out. To still give you some incentive to do the right thing, points will be deducted from the score in most cases when an otherwise lethal event would occur. But at least you can just continue playing.&lt;/p&gt;
&lt;h2 id=&quot;in-just-two-weeks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-just-two-weeks&quot; aria-label=&quot;in just two weeks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In just two weeks?&lt;/h2&gt;
&lt;p&gt;The 14-day time constraint is brutal. Especially as I had first started writing this engine 18 years ago, with the intention of making adventure games, but hadn&apos;t worked on it for at least 15 years and it wasn&apos;t up to the task without quite a lot of fixes and improvements. So I ended up both doing the game and bringing the engine up to snuff in those two weeks. I&apos;m quite proud of having created the game in that short time and putting in more detail and polish than I would imagine is typical of a one-person project created under such hectic conditions. And now, I need to get my heart rate down to triple digits or, in adventure game speak: &lt;code class=&quot;language-text&quot;&gt;initiate emergency shutdown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2018/05/sq1ms-shutdown.png&quot; alt=&quot;Scene from the game where a computer shows the &amp;#x22;emergency shutdown&amp;#x22; screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go ahead and check out &lt;a href=&quot;/projects/&quot;&gt;Spy Quest 1 - Mission: SPECTRUM&lt;/a&gt; on this site, or the &lt;a href=&quot;https://gamejolt.com/games/mission-spectrum/338198&quot;&gt;Game Jolt page&lt;/a&gt; for it. And if you&apos;re an adventure fan, be sure to try the &lt;a href=&quot;https://gamejolt.com/search/games?q=%23AdvJam2019&quot;&gt;other entries&lt;/a&gt;, too. It&apos;s truly amazing what people managed to produce in such a short time span!&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[5 Firefox about:config tips]]></title><description><![CDATA[Firefox can be virtually endlessly extended through all manner of extensions. But even without extensions, the browser has a plethora of…]]></description><link>https://www.shdon.com/5-firefox-about-config-tips/</link><guid isPermaLink="false">https://www.shdon.com/5-firefox-about-config-tips/</guid><pubDate>Wed, 27 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Firefox can be virtually endlessly extended through all manner of extensions. But even without extensions, the browser has a plethora of settings that are not exposed through the Preferences panel and hidden away in the &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt; system. When using Firefox, enter &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt; (no &quot;http://&quot; or &quot;www&quot; in there) into the address bar, take heed of the sensible warning and take a look around. Many of the settings are there by default, or changed through preferences (anything that isn&apos;t at default value is displayed &lt;strong&gt;in bold&lt;/strong&gt;) and still others have to be added manually. Most of these settings won&apos;t be very useful to the average user, but there are some hidden gems. Here&apos;s a few of my favourite ones.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2017/12/about-config.png&quot; alt=&quot;about:config warning&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;1-eliminate-the-dangerous-reset-prompt&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-eliminate-the-dangerous-reset-prompt&quot; aria-label=&quot;1 eliminate the dangerous reset prompt permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Eliminate the dangerous reset prompt&lt;/h2&gt;
&lt;p&gt;If you don&apos;t use Firefox frequently, or if you run it on a device that&apos;s rarely used, Firefox will display a bar on startup:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🛈&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It looks like you haven&apos;t started Firefox in a while. Do you want to clean it up for a fresh, like-new experience? And by the way, welcome back!&lt;/p&gt;
&lt;p&gt;Refresh Firefox... ×&lt;/p&gt;
&lt;p&gt;That is quite possibly one of the dumbest things in Firefox as it is intrusive and destructive: it will reset your profile, uninstall your extensions and undo all your customisations. I hate that prompt with a passion. To get rid of this stupid bar, create a new boolean in &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt; called &lt;code class=&quot;language-text&quot;&gt;browser.disableResetPrompt&lt;/code&gt; and set it to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;2-increase-the-time-between-session-saves&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-increase-the-time-between-session-saves&quot; aria-label=&quot;2 increase the time between session saves permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Increase the time between session saves&lt;/h2&gt;
&lt;p&gt;Firefox by default saves your current state (open windows, open tabs, scroll position inside the tabs etc) to disk every 15 seconds. If the browser or even the entire crashes, it can thus pick up where you left off when you start it up again. This can result in an awful lot of needless disk activity and may negatively impact the performance and lifespan of especially older SSDs. You can customise this interval to something a little more sane, at the risk of losing a bit more state in case of an actual crash. Adjust by setting the value of &lt;code class=&quot;language-text&quot;&gt;browser.sessionstore.interval&lt;/code&gt; to the number of milliseconds you want between subsequent saves. My personal preference is 300000 milliseconds (5 minutes).&lt;/p&gt;
&lt;h2 id=&quot;2-keep-video-full-screen-with-multiple-monitors&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-keep-video-full-screen-with-multiple-monitors&quot; aria-label=&quot;2 keep video full screen with multiple monitors permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Keep video full screen with multiple monitors&lt;/h2&gt;
&lt;p&gt;If you have multiple monitors and use Firefox to view a HTML5 video (using the &lt;video&gt; tag, such as in the YouTube HTML5 player) or perhaps have a WebGL game that runs full-screen, you will find that the moment you click away to another window on the other monitor, Firefox leaves full-screen mode. This makes it completely useless for watching video while doing something else. To fix that, create a new boolean called &lt;code class=&quot;language-text&quot;&gt;full-screen-api.exit-on-deactivate&lt;/code&gt; and set it to &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;3-print-without-a-dialog-box&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-print-without-a-dialog-box&quot; aria-label=&quot;3 print without a dialog box permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Print without a dialog box&lt;/h2&gt;
&lt;p&gt;I&apos;m using Firefox connected to a label printer to print visitor badges for events. When you need to print hundreds or thousands of labels on demand, you don&apos;t want to bother with the print dialog box. Firefox can skip the dialog and print immediately by creating a new boolean in &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt; called &lt;code class=&quot;language-text&quot;&gt;print.always\_print\_silent&lt;/code&gt; and setting it to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;4-allow-multiple-dialogs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-allow-multiple-dialogs&quot; aria-label=&quot;4 allow multiple dialogs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Allow multiple dialogs&lt;/h2&gt;
&lt;p&gt;When printing from JavaScript, it isn&apos;t possible to print multiple copies of the document other than by issuing multiple &lt;code class=&quot;language-text&quot;&gt;window.print()&lt;/code&gt; commands. You&apos;d probably want to do so in combination with the &lt;code class=&quot;language-text&quot;&gt;print.always\_print\_silent&lt;/code&gt; setting mentioned above. Still, Firefox would likely block the second and subsequent print commands because you&apos;d be bombarding the user with dialog boxes (despite the fact that you might have disabled them). With multiple &lt;code class=&quot;language-text&quot;&gt;window.alert()&lt;/code&gt; it will pop up a message allowing the user to &quot;prevent his page from creating additional dialogs&quot;. That&apos;s fine for general use, but when you have full control over the application it might not fit your usecase. Disable this behaviour by creating an integer in &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt; called &lt;code class=&quot;language-text&quot;&gt;dom.successive\_dialog\_time\_limit&lt;/code&gt; and set it to &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;5-show-the-shadow-dom-for-default-elements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#5-show-the-shadow-dom-for-default-elements&quot; aria-label=&quot;5 show the shadow dom for default elements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Show the shadow DOM for default elements&lt;/h2&gt;
&lt;p&gt;By toggling &lt;code class=&quot;language-text&quot;&gt;devtools.inspector.showAllAnonymousContent&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;, it is possible to see all the other elements Firefox creates hidden inside the default elements, such as scrollbars, the dropdown button etc. After toggling this, you need to close and re-open the Inspector panel. Reloading the page won&apos;t make a difference. Here&apos;s a preview of a simple &lt;code class=&quot;language-text&quot;&gt;&amp;lt;select&gt;&lt;/code&gt; element with a single &lt;code class=&quot;language-text&quot;&gt;&amp;lt;option&gt;&lt;/code&gt; element inside.&lt;/p&gt;
&lt;p&gt;pre.inspector { background: #2A2A2E; box-sizing: border-box; color: #D7D7DA; font-family: Consolas, monospace; font-size: 12px; overflow: auto; padding: 0.5ex 1ex; white-space: pre; width: 100%; } pre.inspector .tag { color: #75BFFF; } pre.inspector .attribute { color: #FF7DE9; } pre.inspector .value { color: #B98EFF; } pre.inspector .chevron { margin-left: -0.3em; position: absolute; } pre.inspector .ellipsis { border: 1px solid #D7D7DA; border-radius: 3px; display: inline-block; font-size: 75%; line-height: 1.5ex; margin: 0 0.25em; position: relative; text-align: center; top: -1px; width: 1.5em; }&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;devtools.inspector.showAllAnonymousContent&lt;/code&gt; enabled&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;select name=&quot;foo&quot;&gt;
  &amp;lt;option&gt;-- nothing --&amp;lt;/option&gt;
&amp;lt;/option&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;select name=&quot;foo&quot;&gt;
  &amp;lt;option&gt;-- nothing --&amp;lt;/option&gt;
  -- nothing --
  &amp;lt;button type=&quot;button&quot; tabindex=&quot;-1&quot;&gt;&amp;lt;/button&gt;
⏵  &amp;lt;scrollbar orient=&quot;vertical&quot; clickthrough=&quot;always&quot; curpos=&quot;0&quot; disabled=&quot;true&quot; maxpos=&quot;0&quot; pageincrement=&quot;14&quot; increment=&quot;51&quot;&gt;⋯&amp;lt;/scrollbar&gt;
&amp;lt;/option&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Personally, I think this should be a simple toggle in the Firefox developer tools, just as Chrome has a &quot;Show user agent shadow DOM&quot; preference.&lt;/p&gt;
&lt;p&gt;Have you got any tips for &lt;code class=&quot;language-text&quot;&gt;about:config&lt;/code&gt;? Go ahead and post them as a comment below.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[MIDI Selector tool updated]]></title><description><![CDATA[And then Windows 10 Creators Update came out. Along with all kinds of improvements came the reset of all customisation to default settings…]]></description><link>https://www.shdon.com/midi-selector-tool-updated/</link><guid isPermaLink="false">https://www.shdon.com/midi-selector-tool-updated/</guid><pubDate>Sat, 15 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;And then Windows 10 Creators Update came out. Along with all kinds of improvements came the reset of all customisation to default settings (ugh!). This included resetting the MIDI output to Microsoft&apos;s default and underwhelming &quot;Microsoft GS Wavetable Synth&quot;. I found my MIDI Selector tool was no longer completely effective on Windows 10 x64 and had a minor bug as well as some slight inefficiencies. Fixed version 1.0.1 has been posted on the &lt;a href=&quot;/tools#midisel&quot;&gt;tools page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2017/04/midi-selector.png&quot; alt=&quot;MIDI Selector screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;The source code has, of course, also been updated.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[Review: Projector Face]]></title><description><![CDATA[A cute new point and click adventure game was released through Steam last week. This particular adventure game is a bit different from most…]]></description><link>https://www.shdon.com/review-projector-face/</link><guid isPermaLink="false">https://www.shdon.com/review-projector-face/</guid><pubDate>Tue, 07 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A cute new point and click adventure game was released through Steam last week. This particular adventure game is a bit different from most modern ones in that there is no speech, only about a dozen screens, and you play not as a person, but as a... film projector... walking around magically? This is Projector Face, by &lt;a href=&quot;http://www.fluik.com/&quot;&gt;Fluik Entertainment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-attic-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-attic.jpg&quot; alt=&quot;Gameplay scene from Projector Face: The Attic&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The protagonist of Projector Face is a lonely film projector which somehow manages to emerge from a pile of clothes with a seemingly human body. Yeah, don&apos;t ask me how that works either. The projector is unable to speak, so he has to communicate in the only way available to him: showing movies. Armed only with good intentions, Projector Face sets out to find a friend. This proves to be a bit harder than you&apos;d imagine, not helped by the films he finds along the way. The theme of the silent movie is carried throughout the game, as both a plot point as well as the interface. Apart from simple yet nicely atmospheric music, the game is otherwise mute. Narration is done through the familiar silent film text cards.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-silent-movie-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-silent-movie.jpg&quot; alt=&quot;Gameplay scene from Projector Face: Silent movie style text card&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Having just 10 locations (and one close-up screen), the game can hardly be considered to be of an epic scale. Fluik have managed to make the most out of the limited size of the game world by making very clever use of the screens. Despite having only a handful of screens, your progress through the game is gated, with some areas only opening up as you complete certain tasks. What makes Projector Face unusual compared to many point and click adventures is how often you have to revisit the earlier screens in ways that still make sense. Several inventory items can be used multiple times and the game also allows you to use different objects to solve certain puzzles when it makes sense.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-well-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-well.jpg&quot; alt=&quot;Gameplay scene from Projector Face: Stuck down a well&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The locations, while few, are wonderfully drawn. The game world is very bleak as well as charming at the same time. You will see children playing, but you will also see the scene of an accident where the crashed car has been left to rust. Through the actions you take as a player, you will clean up the world slightly, which I interpreted as symbolic of the projector&apos;s good intentions, though I might be reading too much into that. While the animation is basic and not the most fluid, it does have character. A minor change to the main character&apos;s animation near the end of the game really does convey the appropriate emotions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-playground-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-playground.jpg&quot; alt=&quot;Gameplay scene from Projector Face: Showing a movie on the playground&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One final thing I&apos;d like to mention is that the videos the projector displays made me laugh out loud (literally out loud, which is very uncommon for game jokes as they usually only make me smile, at best) and with the third movie I found it quite funny to get some foreshadowing of what the twist would be from the last frame visible during the assembly. Designer Chris Cooke, who also made the movies, really does have a nicely warped sense of humour.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-prison-full.jpg&quot;&gt;&lt;img src=&quot;https://www.shdon.com/blog/images/2016/06/projector-face-prison.jpg&quot; alt=&quot;Gameplay scene from Projector Face: Stuck in prison&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is no moon logic in Projector Face and all the puzzles are perfectly logical, which is a good thing as the game will not have you frustrated. This is a short game and even a beginner should be able to finish the game in about an hour. You&apos;d be forgiven for thinking it&apos;s not worth the price of €4.99/$4.99 for &lt;a href=&quot;https://store.steampowered.com/app/431850&quot;&gt;Projector Face through Steam&lt;/a&gt;, but you&apos;d be wrong – the amount of time and effort that goes into making these is staggering and a movie ticket costs more while not having you nearly as entertained. Still, I wished the story had been a little longer. The quirkiness and charm of this game lead me to rate it 9 out of 10.&lt;/p&gt;</content:encoded><author>shd@earthling.net</author></item><item><title><![CDATA[HTTP Public Key Pinning]]></title><description><![CDATA[HTTPS sites are encrypted with a public/private key pair, being vouched for in a certificate by having that certificate signed by a trusted…]]></description><link>https://www.shdon.com/http-public-key-pinning/</link><guid isPermaLink="false">https://www.shdon.com/http-public-key-pinning/</guid><pubDate>Sat, 13 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTTPS sites are encrypted with a public/private key pair, being vouched for in a certificate by having that certificate signed by a trusted CA. However, it might be possible that somebody generates a certificate for your domain and has it signed by a fraudulent or compromised CA. Protection against this is provided by use of HKPK. But what keys should be &quot;pinned&quot; and why? I&apos;ve found information about this online to be lacking, so I did some research and here&apos;s the results.&lt;/p&gt;
&lt;h2 id=&quot;what-the-header-looks-like&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-the-header-looks-like&quot; aria-label=&quot;what the header looks like permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What the header looks like&lt;/h2&gt;
&lt;p&gt;The HPKP header is called &lt;code class=&quot;language-text&quot;&gt;Public-Key-Pins&lt;/code&gt; and lists base64 encoded hashes of the allowable public keys (&lt;code class=&quot;language-text&quot;&gt;pin-sha256&lt;/code&gt;), a time window (in seconds) during which the public keys are pinned (&lt;code class=&quot;language-text&quot;&gt;max-age&lt;/code&gt;), an optional flag to specify whether or not subdomains should be included in the pinning process (&lt;code class=&quot;language-text&quot;&gt;includeSubdomains&lt;/code&gt;) and an optional URL that accepts problem reports when a visiting browser detects a violation of the pins (&lt;code class=&quot;language-text&quot;&gt;report-uri&lt;/code&gt;). An example header would be:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Public-Key-Pins: pin-sha256=&quot;W4699GoENqakvlu1BsXHtgpHPGWLa+W3qAbv9Xr2aos=&quot;; pin-sha256=&quot;scQZPmZJuJTIThrWyW6hnYPHU3W+wUj18pb+1ZV86h4=&quot;; max-age=5184000&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In this example, two keys are pinned for 60 days from the moment the header is presented to the visitor&apos;s browser.&lt;/p&gt;
&lt;h2 id=&quot;at-least-2-keys&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#at-least-2-keys&quot; aria-label=&quot;at least 2 keys permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;At least 2 keys&lt;/h2&gt;
&lt;p&gt;Since HPKP marks only certain keys as trusted, any &lt;em&gt;other&lt;/em&gt; keys are effectively blocked, even if they are valid. However, there might be a valid reason to replace a certificate, such as a private key being compromised or a change in some metadata contained in the certificate. If you had only pinned your current certificate trust chain, that means replacing the key would be impossible until the pinning window has expired for all users of the site, which could be months or years. For that reason, you must always pin &lt;em&gt;at least two keys&lt;/em&gt;, one of which represents the trust chain you are currently using, the other of which represents a backup trust chain. This is actually mandated in the standard (and for very good reason) and can even be gleaned from the fact that the &lt;code class=&quot;language-text&quot;&gt;Public-Key-Pins&lt;/code&gt; header name is plural. Note that you can also have more than two keys pinned, which can be useful in certain circumstances, but you should always have a backup trust chain. That backup should, and this is very important, currently &lt;em&gt;not be used&lt;/em&gt; to serve any content. Its sole purpose is to be there to provide access to your site in case your primary trust chain can no longer be used.&lt;/p&gt;
&lt;h2 id=&quot;crt-or-csr-what-happens-when-i-renew&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#crt-or-csr-what-happens-when-i-renew&quot; aria-label=&quot;crt or csr what happens when i renew permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CRT or CSR? What happens when I renew?&lt;/h2&gt;
&lt;p&gt;Public key hashes can be generated from certificates or from the corresponding CSR. Since both contain the same public key, they will result in the same hash. The OpenSSL commands to retrieve the hashes are slightly different depending on whether you use a certificate or the signing request as input. To obtain the hash from a CSR, use the command:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;openssl req -pubkey -in example.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This performs the following operations in order: 1) parse the CSR and extract the public key as text, 2) convert the public key to binary format, 3) calculates the SHA-256 hash of the binary public key, 4) encodes that has in base64&lt;/p&gt;
&lt;p&gt;To obtain the hash from an existing certificate, replace the &quot;req&quot; command with &quot;x509&quot; so the command line becomes:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;openssl x509 -pubkey -in example.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you try these out, you&apos;ll see that the hashes obtained from the certificate and for the signing requests are indeed the same. This also means that, as long as you keep using the same CSR when renewing your certificates, the hash will not change. It depends &lt;em&gt;only&lt;/em&gt; on the public key.&lt;/p&gt;
&lt;h2 id=&quot;leaf-intermediate-or-root-certificate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#leaf-intermediate-or-root-certificate&quot; aria-label=&quot;leaf intermediate or root certificate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Leaf, intermediate or root certificate?&lt;/h2&gt;
&lt;p&gt;HPKP doesn&apos;t necessarily just pin a single certificate. You could pin your own active public key, which means your own (leaf) certificate is trusted, as well as any other certificates that are signed from the same CSR, regardless of which CA has signed them. This is basically what you do with your backup CSR. It is also the most secure option, as it means that it (and your backup key) are the only keys that can possibly be used for accessing your site. Aside from the best security, it also makes it possible to switch to another CA without having to update your key pins.&lt;/p&gt;
&lt;p&gt;Pinning a certain public key implies trust in the entire chain. Pinning a public key means that any certificates &lt;em&gt;signed&lt;/em&gt; by that key&apos;s corresponding private key are also trusted.&lt;/p&gt;
&lt;p&gt;So, instead of pinning your own certificate, you could also trust your CA&apos;s intermediate certificate which they used to sign your request. This means you could use any CSR, as long as it is signed by the same CA, which can be quite useful. Unfortunately, it is also (slightly) less secure, as it would enable any &lt;em&gt;other&lt;/em&gt; customer of that same CA to impersonate your site, but &lt;em&gt;only if&lt;/em&gt; they manage to trick your CA into signing their fraudulent certificate. That&apos;s the very problem HPKP was designed to prevent, yet at a smaller scale (i.e. it is limited to a specific single CA that has to be compromised, rather than there being a problem when &lt;em&gt;any&lt;/em&gt; CA is compromised).&lt;/p&gt;
&lt;p&gt;On the same note, you could trust the CA&apos;s root certificate (which they used to sign their own intermediate certificate, which in turn was used to sign your request). The slight advantage of this is that you would be able to switch to another class of certificate as long as it&apos;s with the same CA. For instance, you could go from having a DV to an EV certificate, which you might also do by simply pinning your leaf key. The downside is that, as with pinning an intermediate certificate, you would trust other customers of the CA. In fact, you wouldn&apos;t just trust the CA&apos;s other customers &lt;em&gt;in the same class&lt;/em&gt;, but you would effectively trust &lt;em&gt;all of them&lt;/em&gt;. Hence, pinning your CA&apos;s root certificate has no significant advantages, but bigger disadvantages and in short cannot be recommended.&lt;/p&gt;
&lt;p&gt;My personal preference is to pin only the leaf key and the backup key (which is also a leaf key), maybe adding in the CA intermediate key in advance when I foresee any changes.&lt;/p&gt;
&lt;h2 id=&quot;other-options&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#other-options&quot; aria-label=&quot;other options permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Other options&lt;/h2&gt;
&lt;p&gt;I haven&apos;t yet described the other two elements that may optionally be present in the &lt;code class=&quot;language-text&quot;&gt;Public-Key-Pins&lt;/code&gt; header: &lt;code class=&quot;language-text&quot;&gt;includeSubdomains&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;report-uri&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;includesubdomains&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#includesubdomains&quot; aria-label=&quot;includesubdomains permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;includeSubdomains&lt;/h3&gt;
&lt;p&gt;As is obvious from the name, if the &lt;code class=&quot;language-text&quot;&gt;includeSubdomains&lt;/code&gt; flag is present, the specified keys are pinned not just for the current hostname, but for any other subdomains in your domain as well. This can be a good idea in many cases. If you use several additional keys (possibly self-signed certificates) for example, with a webmail service or an admin panel such as phpMyAdmin, you would have to pin those as well. In that case, I would simply recommend ommitting the &lt;code class=&quot;language-text&quot;&gt;includeSubdomains&lt;/code&gt; flag.&lt;/p&gt;
&lt;h3 id=&quot;report-uri&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#report-uri&quot; aria-label=&quot;report uri permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;report-uri&lt;/h3&gt;
&lt;p&gt;Some browsers (presently only browsers based on Chromium 46 or later) allow you to specify an URL where they can report irregularities. If somebody visits your site using a browser that supports HPKP and is presented with a public key that &lt;em&gt;doesn&apos;t&lt;/em&gt; match one of the pinned keys, that is an indication of tampering. If the browser detects this and also supports reporting, it will submit a report in JSON format to whatever endpoint you have specified. A report would look like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
	&quot;date-time&quot;: date-time,
	&quot;hostname&quot;: hostname,
	&quot;port&quot;: port,
	&quot;effective-expiration-date&quot;: expiration-date,
	&quot;include-subdomains&quot;: include-subdomains,
	&quot;noted-hostname&quot;: noted-hostname,
	&quot;served-certificate-chain&quot;: [
		pem1, ... pemN
	],
	&quot;validated-certificate-chain&quot;: [
		pem1, ... pemN
	],
	&quot;known-pins&quot;: [
		known-pin1, ... known-pinN
	]
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is a caveat: the reporting endpoint cannot be on the same site if it is also served using HTTPS. That is because that very site cannot be reached precisely because the public key is not trusted. It would be possible to serve the reporting endpoint over plain old regular unencrypted HTTP as that is not subject to public key pinning. However, that is still not possible if the site has been served with HSTS. So, instead, you may want to put your reporting endpoint on another domain or forego it entirely. You could make use of the free service at &lt;a href=&quot;https://report-uri.io/&quot;&gt;report-uri.io&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;browser-support&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#browser-support&quot; aria-label=&quot;browser support permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Browser support&lt;/h2&gt;
&lt;p&gt;HPKP is supported by Mozilla Firefox since version 35, Google Chrome since version 46, and Opera since version 33 (as it is based on Chromium 46). Internet Explorer, Edge and Safari at the time of writing, do not support public key pinning. For Edge, the feature is &lt;a href=&quot;http://status.modern.ie/publickeypinningextensionforhttp&quot;&gt;under consideration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;further-reference&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#further-reference&quot; aria-label=&quot;further reference permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Further reference&lt;/h2&gt;
&lt;p&gt;If you want to read more, check out any of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning&quot;&gt;Public Key Pinning&lt;/a&gt; on the MDN&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timtaubert.de/blog/2014/10/http-public-key-pinning-explained/&quot;&gt;HTTP Public-Key-Pinning explained - The what, why, and how of RFC 7469&lt;/a&gt; by Tim Taubert&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scotthelme.co.uk/hpkp-http-public-key-pinning/&quot;&gt;HPKP: HTTP Public Key Pinning&lt;/a&gt; by Scott Helme&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ethitter.com/2016/01/creating-hpkp-public-key-pinning-headers/&quot;&gt;Creating Public Key Pinning headers (HPKP)&lt;/a&gt; by Erick Hitter&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>shd@earthling.net</author></item></channel></rss>