<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://idbrii.github.io/notes/feed.xml" rel="self" type="application/atom+xml" /><link href="http://idbrii.github.io/notes/" rel="alternate" type="text/html" /><updated>2025-02-08T09:51:56+00:00</updated><id>http://idbrii.github.io/notes/feed.xml</id><title type="html">Brain-to-Text</title><subtitle>Hopefully helpful/interesting information.</subtitle><author><name>David</name></author><entry><title type="html">Basic Programming Introduction (talk)</title><link href="http://idbrii.github.io/notes/basic-what-is-programming/" rel="alternate" type="text/html" title="Basic Programming Introduction (talk)" /><published>2025-02-04T00:00:00+00:00</published><updated>2025-02-04T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/basic-what-is-programming</id><content type="html" xml:base="http://idbrii.github.io/notes/basic-what-is-programming/"><![CDATA[<p>Slides from a basic introduction to programming for elementary school students.</p>]]></content><author><name>David</name></author><category term="code" /><category term="techtalk" /><category term="slides" /><summary type="html"><![CDATA[Slides from a basic introduction to programming for elementary school students.]]></summary></entry><entry><title type="html">Designing for re-entry to get players back into the game</title><link href="http://idbrii.github.io/notes/designing-for-reentry/" rel="alternate" type="text/html" title="Designing for re-entry to get players back into the game" /><published>2023-07-13T00:00:00+00:00</published><updated>2023-07-13T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/designing-for-reentry</id><content type="html" xml:base="http://idbrii.github.io/notes/designing-for-reentry/"><![CDATA[<p>I saw this <a href="https://www.reddit.com/r/gamedev/comments/8sjaur/developers_say_twitch_and_lets_plays_are_hurting/e102a7d/">thread about let’s plays and long
games</a>,
and I wanted to write about some specific solutions we can implement to help
players who are short on time but still want to enjoy long games.</p>

<h1 id="problem">Problem</h1>

<p>People with small amounts of spare time have a hard time getting back to long
narrative games. Games tend to be designed to be a single long experience and
often have few affordances to redoing their onboarding. (You give the tutorial
at the start of the game and don’t retrigger it again.)</p>

<p>Let’s explore some ideas for improving the “haven’t played in a month” player experience.</p>

<h1 id="successful-examples">Successful examples</h1>

<ul>
  <li>the <a href="https://www.youtube.com/watch?v=dCfUE5wBkE0">Previously on Alan Wake</a> segments are effective: they summarize what happened before, the character’s current motivations, and they’re good opportunity for character-building. You get one Previously On segment between each chapter which makes them a great stopping point. (This is very expensive and needs to be integral to the game.)</li>
</ul>

<p><img src="https://github.com/idbrii/notes/assets/43559/b3d0bb45-6f31-458d-9b83-3e742ba2a1ac" alt="Previously on Alan Wake" /></p>

<ul>
  <li><a href="https://youtu.be/dwZsXHCCfs4?t=19s">Deus Ex: HR’s loading screens</a> summarize where you are in the quest (with multiple updates for each quest). It’s different information each time you load (assuming you made progress), but not information overload. (This is pretty cheap.)</li>
</ul>

<p><img src="https://github.com/idbrii/notes/assets/43559/69fe540b-c2d3-47da-b303-6f9e877dd790" alt="Deus Ex: HR's loading screens" /></p>

<ul>
  <li><a href="https://www.mobygames.com/images/shots/l/573259-batman-arkham-city-windows-screenshot-typical-loading-screen.jpg">Arkham City uses screen shots</a> on the loading screen to lay out objectives or summarize recent plot points.</li>
</ul>

<p><img src="https://github.com/idbrii/notes/assets/43559/a2018b0e-db13-4c7f-b847-f477f25bc1bd" alt="screen shots on Arkham City loading screen" /></p>

<ul>
  <li><a href="https://miro.medium.com/max/2000/1*qJT35zAc8KSl4z16AKpv7g.png">Dishonored 2’s Travel Log</a> documents the player’s journey with notes and photographs. This journal <a href="https://dishonored.fandom.com/wiki/Travel_Log_(Dishonored_2)">update after each mission</a>. Dishonored 2 also features a pinboard connecting the characters/locations to give the player some spatial overview of what’s progressing in the world.</li>
</ul>

<p><img src="https://github.com/idbrii/notes/assets/43559/b7214849-7f9a-4b75-9228-2865b09a9929" alt="Dishonored 2's Travel Log" /></p>

<ul>
  <li>Persona 5 has a few methods: a <a href="https://youtu.be/XZEkg_r5PDw?t=264">persistent countdown timer in the top right</a> to highlight your deadlines, frequently mention objectives in dialogue, show snippets of conversations and tweets (usually related to the objective), dungeon save points trigger companions to talk about the next dungeon objective.</li>
</ul>

<p><img src="https://github.com/idbrii/notes/assets/43559/847a0849-f83d-4298-8ae7-0ccf98da435f" alt="persistent countdown timer in the top right" />
<!-- [The UI Design of Persona 5](https://jiaxinwen.wordpress.com/2017/04/27/the-ui-design-of-persona-5/) seems to be a good breakdown, but doesn't highlight any of these features. --></p>

<h1 id="potential-solutions">Potential Solutions</h1>

<p>On a recent game, I pitched the loading screen as a mess of tweets about recent in-game accomplishments and plot points. It was age-appropriate to one of the characters, could convey character-building, and I thought a mix of pictures and text would be effective for keeping it fresh. (This is a bit expensive, but might be worthwhile for a long game.)</p>

<p>I’d like to try a tutorial pop up that occurs the second time you do an action unsuccessfully (the initial teach) and every time you fail three times in a row. So if you need to mash X during a grapple (in a scarce-UI scarce-tutorial game) and you keep forgetting, then the game can tell you what’s going wrong. If you come back after a long time, the game can remind you how to play. Need a careful balance between the game taunting the player on each failure. This logic can also push tips into the loading screen. (Probably worth the effort if avoiding hand holding tutorialization.)</p>

<p>Thanks to contributions from PiLLe1974 and Swiftster <a href="https://www.reddit.com/r/gamedev/comments/8sm4qi/ideas_for_designing_reentry_to_your_game/">in the original reddit thread</a>.</p>]]></content><author><name>David</name></author><category term="gamedev" /><category term="design" /><summary type="html"><![CDATA[I saw this thread about let’s plays and long games, and I wanted to write about some specific solutions we can implement to help players who are short on time but still want to enjoy long games.]]></summary></entry><entry><title type="html">Requirements for a bug reporting system</title><link href="http://idbrii.github.io/notes/bug-reporter/" rel="alternate" type="text/html" title="Requirements for a bug reporting system" /><published>2023-07-10T00:00:00+00:00</published><updated>2023-07-10T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/bug-reporter</id><content type="html" xml:base="http://idbrii.github.io/notes/bug-reporter/"><![CDATA[<p>Someone asked me about what I’d want in a bug reporting system, so I compiled
those thoughts here. I’ve written parts of these systems myself and certainly
used them a lot, so hopefully this is a decent spec.</p>

<p>Basic requirements for a bug reporting system:</p>

<ul>
  <li>Capture screenshot, machine info, in-game location, user-provided category, log, user data (arbitrary function returning a string), and upload to a server. Ideally I have the option of running my own instance of that server.</li>
  <li>Provide aggregation on the server (tag clouds, heatmaps, etc) to help narrow down which problems are most prevalent. <strong>Must be GDPR-compliant.</strong></li>
</ul>

<hr />

<p>For a general system, it’s important to think about how different games have different needs and figuring out how to provide the most value to your target market:</p>

<ul>
  <li>lots of worldgen makes some kinds of data (location) useless.</li>
  <li>static world makes other data (location) very useful.</li>
  <li>logs may be enormous (GB) and full of useless garbage. useful info is usually at beginning and end, but sometimes in the middle (followed by spam caused by the error).</li>
  <li>iOS has limited ability to access log files so a log buffer may be useful (was for us). Create a circular buffer and add each log print so they’re in memory.</li>
  <li>some platforms already have bug reporter that may access data that you cannot (like crash dumps) – how to get those into your system too.</li>
</ul>

<h1 id="what-data-should-it-upload">What data should it upload?</h1>

<ul>
  <li>date</li>
  <li>platform/proprietary user id</li>
  <li>game version: build type (editor/debug/release/optimized), steam beta branch, revision or commit hash</li>
  <li>hardware: CPU, GPU, RAM</li>
  <li>OS version</li>
  <li>game world location (name of level, camera/player position, camera direction) – enough to programmatically jump back to that exact location</li>
  <li>log file</li>
  <li>screenshot</li>
  <li>provided by player: summary/title, description, category (Gameplay, Graphics, etc)</li>
  <li>save file</li>
  <li>world seed (for procgen)</li>
  <li>callstacks for scripting errors</li>
</ul>

<p>Very specifically, the hardware info we grab <a href="https://docs.unity3d.com/ScriptReference/SystemInfo.html">using Unity’s SystemInfo</a>:</p>

<ul>
  <li>Environment.OSVersion.Version</li>
  <li>SystemInfo.graphicsDeviceName</li>
  <li>SystemInfo.graphicsDeviceType</li>
  <li>SystemInfo.graphicsMemorySize</li>
  <li>SystemInfo.operatingSystem</li>
  <li>SystemInfo.processorType</li>
  <li>SystemInfo.systemMemorySize</li>
</ul>

<h1 id="what-rate-of-bug-reports-do-you-expect">What rate of bug reports do you expect?</h1>

<p>We got 20 bugs last week. Looks like lots of different people, but some people send better bugs (more details, repro steps) and some send unhelpful bugs (just a screenshot with a title “where collectible?”). Some of the bugs are in other languages (our game is in 11 languages). We probably get lots of feedback about the same problem, but don’t any kind of automatic categorization (no heat maps, word similarity, etc).</p>

<p>I don’t have any tracking for who submits reports (like how many were reported by one user), but I have seen some names pop up multiple times.</p>

<p>I wish we had fancier tools to make it easier to recognize issues that are affecting a lot of players to help prioritize.</p>

<h1 id="ways-to-present-bug-reporter">Ways to present bug reporter</h1>

<ul>
  <li>Pause menu has a report bug option that opens an in-game screen for player to fill in title, description, and includes a screenshot of whatever’s behind the pause screen.</li>
  <li>Press a key from anywhere to open bug report screen with screenshot. Nice because it works for bugs on screens, but users have to remember that hot key.</li>
  <li>Console command that brings up a bug report screen (like BugIt in Unreal).</li>
  <li>External tool. Usually for internal use only.</li>
</ul>

<h1 id="where-to-store-bug-reports">Where to store bug reports</h1>

<ul>
  <li>Forum - as posts in a specific sub forum</li>
  <li>Slack - in a dedicate channel</li>
  <li>Bug tracker - like the open source <a href="https://www.redmine.org/">redmine</a></li>
</ul>

<p>In theory, users can comment on their bugs, but it’s much easier to report another bug.</p>

<p>Beware making users feel they can check the status of their bugs if you don’t intend to keep the status updated.</p>]]></content><author><name>David</name></author><category term="gamedev" /><category term="code" /><summary type="html"><![CDATA[Someone asked me about what I’d want in a bug reporting system, so I compiled those thoughts here. I’ve written parts of these systems myself and certainly used them a lot, so hopefully this is a decent spec.]]></summary></entry><entry><title type="html">Implement different storefront APIs in your game</title><link href="http://idbrii.github.io/notes/retailplatform/" rel="alternate" type="text/html" title="Implement different storefront APIs in your game" /><published>2023-05-01T00:00:00+00:00</published><updated>2023-05-01T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/retailplatform</id><content type="html" xml:base="http://idbrii.github.io/notes/retailplatform/"><![CDATA[<p>When you release a game on multiple storefronts, you often need to access their
APIs. Ideally, you do this without lots of special case code throughout your
game. You can do this by abstracting the retail platform’s API behind a common
interface.</p>

<p>There are a few ways you can go about this abstraction in C-like languages:</p>

<ol>
  <li>make a base interface that your platforms inherit</li>
  <li>make the platform-specific code the base class</li>
  <li>make platform-specific APIs all use the same name</li>
</ol>

<p>(1) is the most obvious:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// retailplatform.h</span>
<span class="k">class</span> <span class="nc">RetailPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">};</span>

<span class="c1">// steamplatform.h</span>
<span class="cp">#ifdef STEAM
</span><span class="k">class</span> <span class="nc">SteamPlatform</span> <span class="o">:</span> <span class="k">public</span> <span class="n">RetailPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">}</span>
<span class="k">typedef</span> <span class="n">SteamPlatform</span> <span class="n">ActualPlatform</span><span class="p">;</span>
<span class="cp">#endif
</span>
<span class="c1">// xboxplatform.h</span>
<span class="cp">#ifdef XBOX
</span><span class="k">class</span> <span class="nc">XboxPlatform</span> <span class="o">:</span> <span class="k">public</span> <span class="n">RetailPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">}</span>
<span class="k">typedef</span> <span class="n">XboxPlatform</span> <span class="n">ActualPlatform</span><span class="p">;</span>
<span class="cp">#endif
</span><span class="p">...</span>

<span class="n">RetailPlatform</span><span class="o">*</span> <span class="n">ThePlatform</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ActualPlatform</span><span class="p">();</span>
</code></pre></div></div>

<p>(2) is a bit weird, but because only one platform API will be defined at a
time, we can avoid duplicating function declarations in RetailPlatform and
using vtables:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// steamplatform.h</span>
<span class="cp">#ifdef STEAM
</span><span class="k">class</span> <span class="nc">SteamPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">};</span>
<span class="cp">#endif
</span><span class="p">...</span>

<span class="k">class</span> <span class="nc">RetailPlatform</span> <span class="o">:</span> <span class="k">public</span>
<span class="cp">#ifdef STEAM
</span>    <span class="n">SteamPlatform</span>
<span class="cp">#elif XBOX
</span>    <span class="n">XboxPlatform</span>
<span class="cp">#else
</span>    <span class="c1">// a fallback with mostly empty functions</span>
    <span class="n">StubPlatform</span>
<span class="cp">#endif
</span><span class="p">{};</span> <span class="c1">// empty!</span>

<span class="n">RetailPlatform</span><span class="o">*</span> <span class="n">ThePlatform</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RetailPlatform</span><span class="p">();</span>
</code></pre></div></div>

<p>I like this method also because it’s the easiest way to have a fallback else
case for a Stub. Having a Stub version of your abstraction is useful for
testing without connecting to your the storefront and as a starting point for
porting.</p>

<p>Also, with this method, we don’t even need virtual functions. Since only one
implemention of each function will exist per build of the game, they’re
unnecessary.</p>

<p>(3) feels a bit gross to me since the name isn’t specific, but it avoids
needing a typedef or ifdef’d creation:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// steamplatform.h</span>
<span class="cp">#ifdef STEAM
</span><span class="k">class</span> <span class="nc">RetailPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">};</span>
<span class="cp">#endif
</span><span class="c1">// xboxplatform.h</span>
<span class="cp">#ifdef XBOX
</span><span class="k">class</span> <span class="nc">RetailPlatform</span> <span class="p">{</span> <span class="p">...</span><span class="n">api</span> <span class="n">functions</span> <span class="n">in</span> <span class="n">here</span><span class="p">...</span> <span class="p">};</span>
<span class="cp">#endif
</span><span class="p">...</span>

<span class="n">RetailPlatform</span><span class="o">*</span> <span class="n">ThePlatform</span> <span class="o">=</span> <span class="k">new</span> <span class="n">RetailPlatform</span><span class="p">();</span>
</code></pre></div></div>

<p>You might look at this and say, “what about
<a href="https://en.cppreference.com/w/cpp/language/pimpl">pimpl</a>?!” However, pimpl
would look like (1) except RetailPlatform contains a pointer to
RetailPlatformImpl which follows the (1) subclass pattern. I doubt you see an
improvement to compile times since you can put platform headers in your pch.
Hard to see benefits of adding that extra complexity.</p>

<p><a href="https://www.reddit.com/r/gamedev/comments/1350bxg/how_do_you_manage_your_steam_versions_vs_nonsteam/jiigvym/?context=10000">ref</a></p>]]></content><author><name>David</name></author><category term="code" /><category term="gamedev" /><summary type="html"><![CDATA[When you release a game on multiple storefronts, you often need to access their APIs. Ideally, you do this without lots of special case code throughout your game. You can do this by abstracting the retail platform’s API behind a common interface.]]></summary></entry><entry><title type="html">Add Art Without Having Art Skills</title><link href="http://idbrii.github.io/notes/art-without-skill/" rel="alternate" type="text/html" title="Add Art Without Having Art Skills" /><published>2023-04-23T00:00:00+00:00</published><updated>2023-04-23T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/art-without-skill</id><content type="html" xml:base="http://idbrii.github.io/notes/art-without-skill/"><![CDATA[<p>New game makers often ask how they can make good-looking games when they don’t
have any art skills. There’s lots of advice out there on how to get better at
art, but here’s some ideas on making simple art that looks good.</p>

<p>For really basic art, <a href="https://www.youtube.com/watch?v=xMgNBP8yJeU">How to Make Your Game Look Good if You’re Not a Good Artist</a> from Miziziziz is a good video overview.</p>

<p><a href="https://giantlightstudios.com/gdc2022">An Approach to Game Art for Solo Devs, Small Teams, and Non-Artists</a> has a collection of materials and methods that favour shapes and code transformations over any drawing. (<a href="https://www.reddit.com/r/gamedev/comments/wwqe2x/an_approach_to_game_art_for_solo_devs_small_teams/">reddit thread</a>) It comes from a talk (<a href="https://www.reddit.com/r/gamedev/comments/vxbwbe/what_secrets_lurk_behind_the_gdc_paywall_read/ifvhy64/">summary stolen from here</a>):</p>

<blockquote>
  <ol>
    <li>Simple shapes. Squares, circles, triangles.</li>
    <li>Good color choices. Use color picking tools. Use less saturated colors.</li>
    <li>Lean on post processing and other full screen effects to “tie the room together” and make your game look polished and intentional.</li>
    <li>Learn a couple really simple code driven animation techniques to breath life into your characters and scenes.</li>
  </ol>
</blockquote>]]></content><author><name>David</name></author><category term="visuals" /><category term="gamedev" /><summary type="html"><![CDATA[New game makers often ask how they can make good-looking games when they don’t have any art skills. There’s lots of advice out there on how to get better at art, but here’s some ideas on making simple art that looks good.]]></summary></entry><entry><title type="html">Kirby’s 2D Gameplay Ideas in a 3D World (Talk)</title><link href="http://idbrii.github.io/notes/kirbytalk/" rel="alternate" type="text/html" title="Kirby’s 2D Gameplay Ideas in a 3D World (Talk)" /><published>2023-04-19T00:00:00+00:00</published><updated>2023-04-19T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/kirbytalk</id><content type="html" xml:base="http://idbrii.github.io/notes/kirbytalk/"><![CDATA[<p><a href="https://www.youtube.com/watch?v=cWdt07ncRxU">The Many Dimensions of Kirby</a> is
a GDC 2023 talk where <em>Kirby and the Forgotten Land</em>’s designers discuss how
they brought traditional Kirby gameplay into a 3D world. Kamiyama’s section of
this talk was great. Here’s some major points with timestamps.</p>

<p>A main point of the talk was designing for anyone. Since they’re making a 3D game, many issues arise from how to make things intuitive in the camera angles and movement freedom that 3D brings.</p>

<h2 id="aiming-projectiles">Aiming projectiles</h2>
<p><a href="https://youtu.be/cWdt07ncRxU?t=721"><em>12:01</em></a></p>

<p>Kirby is a sphere, so it’s hard to tell which direction he’s facing. Solution: sophisticated homing.</p>

<ul>
  <li>(13:20) Score enemies based on facing direction, distance, importance/priority.</li>
  <li>Distance is directional so it doesn’t catch airborne enemies when Kirby is grounded.</li>
  <li>Airborne aiming is hard, so homing is stronger when flying.</li>
  <li>Homing works in two stages. In the first frame, projectile facing snaps to target. After that, homing is limited. Goal is to make players feel like they’re successfully aiming instead of homing.</li>
</ul>

<h2 id="unique-hit-detection-system">Unique hit detection system</h2>
<p><a href="https://youtu.be/cWdt07ncRxU?t=940"><em>15:40</em></a></p>

<p>It’s difficult to get a sense of distances in 3D. If you’re aiming in the ground plane but viewing along that plane, it’s hard to tell when you’re shooting in front or behind objects. Solution: Apply hits based on whether it looks like they hit.</p>

<ul>
  <li>(16:53) Extend hit direction in the depth direction. Not just larger hitbox, but it’s extended in the depth direction using the camera position.</li>
</ul>

<h2 id="3d-cameras-are-challenging-for-beginners">3D cameras are challenging for beginners</h2>
<p><a href="https://youtu.be/cWdt07ncRxU?t=1141"><em>19:01</em></a></p>

<p>It’s hard to control both character and camera at the same time. It’s hard to be aware of your surroundings in 3D. Solution: Level designers configure cameras instead of player control.</p>

<ul>
  <li>Apply 2d level design knowledge.</li>
  <li>Shift camera to include relevant objects (hazards, paths).</li>
</ul>

<h2 id="hovering-out-of-bounds">Hovering out of bounds</h2>
<p><a href="https://youtu.be/cWdt07ncRxU?t=1238"><em>20:38</em></a></p>

<p>Kirby can fly so players will want to explore out of bounds. Solution: hint boundaries with camera.</p>

<ul>
  <li>(22:35) Camera object hits walls that prevent its movement. So when you walk right and hit a barrier, the barrier stays on the right side of the screen and Kirby can’t push the camera further right to see what’s there (there’s nothing there).</li>
  <li>Radially project from desired camera focus point to find camera boundaries and smoothly adjust the actual focal point. (Gotta watch because the explanation is not very technical.)</li>
</ul>

<p><a href="https://www.reddit.com/r/TheMakingOfGames/comments/12pnwol/kirby_and_the_forgotten_land_the_designers/">Posted on r/TheMakingOfGames</a></p>]]></content><author><name>David</name></author><category term="gamedev" /><category term="techtalk" /><summary type="html"><![CDATA[The Many Dimensions of Kirby is a GDC 2023 talk where Kirby and the Forgotten Land’s designers discuss how they brought traditional Kirby gameplay into a 3D world. Kamiyama’s section of this talk was great. Here’s some major points with timestamps.]]></summary></entry><entry><title type="html">Contacting Games Press</title><link href="http://idbrii.github.io/notes/contacting-press/" rel="alternate" type="text/html" title="Contacting Games Press" /><published>2023-03-12T00:00:00+00:00</published><updated>2023-03-12T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/contacting-press</id><content type="html" xml:base="http://idbrii.github.io/notes/contacting-press/"><![CDATA[<p>Over the years, I’ve found these suggestions for how to get your game noticed: both who/how to reach out and making a presskit.</p>

<p>Check out <a href="https://www.gamespress.com/nl/About-Games-Press">Games Press</a> for
posting press releases. Make sure you have a presskit so interested journalists
have screenshots and information.</p>

<p>Some articles to help with writing your press release:</p>

<ul>
  <li><a href="https://www.reddit.com/r/gamedev/comments/28a0u5/hey_indie_devs_heres_how_to_contact_the_press/">Hey indie devs, here’s how to contact the press!</a></li>
  <li><a href="https://buried-treasure.org/2020/10/getting-your-game-noticed-is-very-very-hard/">Getting Your Game Noticed (Is Very, Very Hard)</a></li>
</ul>

<p>If you follow any industry news or gaming websites, then you should keep track
of which people like games <em>similar</em> to yours so you can contact them directly
about your game since they’re more likely to be interested.</p>

<p>Check out something like
<a href="https://pixelnest.io/products/presskit.html/">presskit.html</a>. It’s like the
old presskit(), but as a static site so you can host for free as Github Pages
or any other hosting site. See <a href="https://www.gamesindustry.biz/the-blueprint-for-building-a-press-kit">The blueprint for building a press
kit</a> for
a thorough presskit explanation.</p>

<p><a href="https://www.reddit.com/r/gamedev/comments/11phhux/need_help_with_sending_info_about_my_game_to_the/jbyvxif/">ref</a></p>]]></content><author><name>David</name></author><category term="gamedev" /><category term="biz" /><summary type="html"><![CDATA[Over the years, I’ve found these suggestions for how to get your game noticed: both who/how to reach out and making a presskit.]]></summary></entry><entry><title type="html">Time travel, reverse stepping with data breakpoints, scm integration in Tomorrow Corporation’s engine (Talk)</title><link href="http://idbrii.github.io/notes/tomorrow-corp-engine/" rel="alternate" type="text/html" title="Time travel, reverse stepping with data breakpoints, scm integration in Tomorrow Corporation’s engine (Talk)" /><published>2023-02-22T00:00:00+00:00</published><updated>2023-02-22T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/tomorrow-corp-engine</id><content type="html" xml:base="http://idbrii.github.io/notes/tomorrow-corp-engine/"><![CDATA[<p><a href="https://www.youtube.com/watch?v=72y2EC5fkcE">Tomorrow Corporation demonstrated their engine features</a> in a video that I found remarkable.</p>

<p>I’ve never seen a custom engine that impressed me so much. They’ve built a whole tech stack so all parts are tightly integrated:</p>

<ul>
  <li>Custom language, compiler, runtime.</li>
  <li>Custom code editor and debugger.</li>
  <li>Custom game engine (obviously).</li>
</ul>

<p>Because those parts are custom they can:</p>

<ul>
  <li>Recompile on every keystroke without visible hiccups.</li>
  <li>Step through rendering code and see individual parts draw to the screen like RenderDoc or Unity’s Frame Debugger.</li>
  <li>Reverse step through code</li>
  <li>Run to breakpoint in reverse (or data breakpoint!!!)</li>
  <li>Stores a session file that tracks all of your input and code changes that’s portable so you can send to coworkers.</li>
  <li>Retrieve correct source version from version control so when you receive a session, it runs it with the correct code.</li>
  <li>Tag objects with a timestamp so you can jump entire program state to that time for stepping or inspecting.</li>
  <li>Profile, click on spike, click on timestamp on spiking function and it rewinds to that point with the debugger stopped at that function.</li>
</ul>

<p>I wonder how complex their game can be and maintain good performance with all of this debug enabled. Could they make something with as many moving pieces as Factorio?</p>]]></content><author><name>David</name></author><category term="code" /><category term="gamedev" /><category term="techtalk" /><summary type="html"><![CDATA[Tomorrow Corporation demonstrated their engine features in a video that I found remarkable.]]></summary></entry><entry><title type="html">Thinking About Sliding Puzzles</title><link href="http://idbrii.github.io/notes/sliding-blocks/" rel="alternate" type="text/html" title="Thinking About Sliding Puzzles" /><published>2023-02-01T00:00:00+00:00</published><updated>2023-02-01T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/sliding-blocks</id><content type="html" xml:base="http://idbrii.github.io/notes/sliding-blocks/"><![CDATA[<p>Thinking about the prevalence of sliding block puzzles. Not quite a list of
sliding puzzles, but <a href="https://www.giantbomb.com/block-puzzle/3015-362/">Giant Bomb’s block puzzle
concept</a> has a big list that
shows that this concept is common.</p>

<p>I think the reason these puzzles exist in many games is because either:</p>

<ul>
  <li>the team didn’t have time
    <ul>
      <li>Either they wanted something more interesting or they realized too late they needed a puzzle.</li>
      <li>They might have designed something, but cut it down to a simple block puzzle for scope and tutorialization reasons.</li>
      <li>They might have realized that they needed some additional challenge on special chests to make them feel more consequential.</li>
    </ul>
  </li>
  <li>Their designed puzzle was too hard
    <ul>
      <li>Playtesting showed a more interesting puzzle was too difficult for their target audience. Action gamers may not enjoy a challenging puzzle because they just want to shoot.</li>
      <li>This falls back to the first point: they didn’t have time to do something more interesting.</li>
      <li>Playtesting reveals shocking truths about some players. You have them walk into an area, turn the camera to look at the roof, have them stand in front of a van that’s half the roof height, and they’ll jump on the van, drive the van around, destroy it, but never guess they should get onto the roof. Many people don’t come to action games to think, so when you add mental challenges you will lose them.</li>
    </ul>
  </li>
</ul>

<p>Sliding block puzzles are safe.</p>

<ul>
  <li>They can usually be shuffled around randomly until they unlock</li>
  <li>There’s no fail state. You can always get back to the initial setup without any undo button.</li>
  <li>They’re familiar. Players know how they work.</li>
</ul>

<p>But they’re boring and I think we should all do better!</p>

<p><a href="https://www.reddit.com/r/gamedev/comments/10kwjy1/popularity_of_sliding_puzzles/j6te2wb/">ref</a></p>]]></content><author><name>David</name></author><category term="design" /><category term="gamedev" /><summary type="html"><![CDATA[Thinking about the prevalence of sliding block puzzles. Not quite a list of sliding puzzles, but Giant Bomb’s block puzzle concept has a big list that shows that this concept is common.]]></summary></entry><entry><title type="html">Escaping Tutorial Hell</title><link href="http://idbrii.github.io/notes/escaping-tutorials/" rel="alternate" type="text/html" title="Escaping Tutorial Hell" /><published>2023-01-23T00:00:00+00:00</published><updated>2023-01-23T00:00:00+00:00</updated><id>http://idbrii.github.io/notes/escaping-tutorials</id><content type="html" xml:base="http://idbrii.github.io/notes/escaping-tutorials/"><![CDATA[<p>Many new game makers get this feeling of being stuck in doing tutorial after
tutorial and that they don’t know how to do anything except follow tutorials.
My advice: <strong>Don’t stop at the end of a tutorial.</strong> Come up with your own small
tweaks and features and implement them. If you feel like you need another
tutorial then find smaller features to tackle and work your way up.</p>

<p>Take a tutorial <a href="https://pixelnest.io/tutorials/2d-game-unity/">like this one</a> and add more enemies. Add enemies that move in a different direction, have a different speed, or follow a sine wave. Try to do it without looking anything up. If that fails, scope down your plans. If it seems impossibly small and simple, google answers but not tutorials (stack overflow, reddit, etc). Try to piece together what people are saying and how to do it. If that fails, look up tutorials, watch, take notes, but don’t copy paste code. See if you can port their ideas to your code. If that fails, look yourself in the mirror and ask if you really tried hard enough to scope down and figure out this small step or if it just seemed too boring or too hard. If that fails, figure out how to motivate yourself to do hard and boring things (gamedev is full of them and they’re necessary).</p>

<p>I’ve worked in games professionally for more than a decade so it’s been a long time since I was stuck in tutorial hell. The above is my typical process when doing tutorials for a new engine or technology.</p>

<p><a href="https://www.reddit.com/r/gamedev/comments/10jcgh6/how_to_get_out_from_tutorial_hell/j5m6r26/">ref</a></p>]]></content><author><name>David</name></author><category term="code" /><category term="gamedev" /><summary type="html"><![CDATA[Many new game makers get this feeling of being stuck in doing tutorial after tutorial and that they don’t know how to do anything except follow tutorials. My advice: Don’t stop at the end of a tutorial. Come up with your own small tweaks and features and implement them. If you feel like you need another tutorial then find smaller features to tackle and work your way up.]]></summary></entry></feed>