<?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" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Load-bearing Tomato]]></title><description><![CDATA[Revealing the unholy truths about game development.]]></description><link>https://loadbearingtomato.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Eyil!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd091b1c6-1037-4c89-893f-3034c4a1052f_297x297.png</url><title>Load-bearing Tomato</title><link>https://loadbearingtomato.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 16 Apr 2026 20:06:21 GMT</lastBuildDate><atom:link href="https://loadbearingtomato.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Christina Pollock]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[chhopsky@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[chhopsky@substack.com]]></itunes:email><itunes:name><![CDATA[Christina Pollock 死神]]></itunes:name></itunes:owner><itunes:author><![CDATA[Christina Pollock 死神]]></itunes:author><googleplay:owner><![CDATA[chhopsky@substack.com]]></googleplay:owner><googleplay:email><![CDATA[chhopsky@substack.com]]></googleplay:email><googleplay:author><![CDATA[Christina Pollock 死神]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Why chasing twitter's approval doesn't work]]></title><description><![CDATA[The opinions you believe are universal are being fed to you by an algorithm designed to show you what you want.]]></description><link>https://loadbearingtomato.com/p/why-chasing-twitters-approval-doesnt</link><guid isPermaLink="false">https://loadbearingtomato.com/p/why-chasing-twitters-approval-doesnt</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Thu, 12 Feb 2026 22:59:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!No3f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every few months on the video game discourse calendar, we get an entry like this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_dgz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_dgz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 424w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 848w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 1272w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_dgz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png" width="749" height="441" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:749,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60766,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/187781788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_dgz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 424w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 848w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 1272w, https://substackcdn.com/image/fetch/$s_!_dgz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc12b30e-1fdb-4897-9eb7-fbff94fcc7c1_749x441.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And every few months, a handful of people who&#8217;ve actually done the work on this have to explain why treating social media as an absolute source of truth is a mistake.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Here is a short and incomplete list of the reasons why doing what you think social media says is not the free win you think it is.</p><h1>Sampling Bias</h1><h4><strong>You&#8217;re listening in the least honest location</strong></h4><p>What people say is affected by who is listening.</p><p>People who do and say things on social media are doing so for social interaction, and these interactions are the driving reward behind it. We know that people will repeat opinions they don&#8217;t even hold so long as they believe that other people believe they are correct. We also know that people shy away from opinions that receive social punishment. The 2026 environment of gaming discourse on Reddit/social sense is dominated by Being Right About Games where the goal is not to discuss but to Know Things. This creates a problem, because feedback should be a personal experience, but instead, you&#8217;re rewarded for being Right and punished for being Wrong. There is no such thing as a wrong personal experience, so as long as it&#8217;s actually yours. </p><p>That&#8217;s where it gets tricky, because in that social space, content creator opinions get repeated by their fans as correct as part of a desire to affirm themselves as Knowing Things, and to affirm their creators as knowledgeable, despite the creator&#8217;s opinions rarely actually relating to the player at all, either through Elo or consumption habits. Of course a Challenger-ranked player is affected differently by a small change than a Bronze player. Of course someone who plays games on stream 8 hours a day runs out of content faster than someone who plays an hour a night.</p><p>Groupthink runs rampant in these kinds of communities once they convince themselves something is true. Remember the origin of &#8220;<a href="https://knowyourmeme.com/memes/we-did-it-reddit">We did it, reddit</a>&#8221;? A bunch of redditors convinced themselves they&#8217;d found the Boston Marathon bomber, and went after some random guy, who it turns out, killed himself.</p><h4><strong>Social media perspective differs per subject</strong></h4><p>So now everyone thinks they&#8217;re right because <em>everyone</em> agrees on a particular topic. </p><p>&#8230;until you bring algorithms into play, which divide opinions into clusters. You end up with multiple clusters of players on a social media site, <strong>all of whom believe their opinion is the one that&#8217;s universally held</strong>, because the software is specifically designed to feed you more of the opinions you want to see. </p><p>The things you believe are &#8220;universal&#8221; may very well just be the algorithm working as intended and showing you things you like. Your Twitter feed is not even representative of Twitter as a whole, let alone the player base.</p><h4><strong>The people you&#8217;re listening to aren&#8217;t even your players</strong></h4><p>Once something is being discussed in public, people get social rewards for discussing it and saying the right opinions. A staggering number of people will chime in about games they have never even played and repeat an opinion they believe to be Right, because again, Being Right About Games is what matters.</p><p>Let me be extremely clear about this. <strong>People who have never played your game will give you feedback about it.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XM6G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XM6G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 424w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 848w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 1272w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XM6G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png" width="753" height="1194" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1194,&quot;width&quot;:753,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:506832,&quot;alt&quot;:&quot;The 7 days to die official twitter account posts patch notes, and someone complains about jars being one time use. The official account responds and says they're refundable but suggests default. The user reveals he has never even played the game.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/187781788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The 7 days to die official twitter account posts patch notes, and someone complains about jars being one time use. The official account responds and says they're refundable but suggests default. The user reveals he has never even played the game." title="The 7 days to die official twitter account posts patch notes, and someone complains about jars being one time use. The official account responds and says they're refundable but suggests default. The user reveals he has never even played the game." srcset="https://substackcdn.com/image/fetch/$s_!XM6G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 424w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 848w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 1272w, https://substackcdn.com/image/fetch/$s_!XM6G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b9b6704-de0d-4c0a-b949-c83779ea1298_753x1194.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Thanks to <a href="https://bsky.app/profile/mxdoteliving.bsky.social">mxdoteliving</a> for this one.</figcaption></figure></div><p>This extends into Steam review bombing, where once a Correct Opinion has been formed, people who haven&#8217;t played the game will rush to Steam to punish it, again, despite not having actually played it. The feedback they provide is not about the game, it&#8217;s about an opinion they believe to be correct based on the crowd.</p><h4><strong>Even the ones that are your players are a minority of your real players</strong></h4><p>Every live service game learns this over time. League of Legends, Overwatch, Apex Legends, Dauntless&#8230; we all chased Reddit&#8217;s approval at the direction of product managers, then watched our player counts crumble. The stark reality is that only a tiny fraction of ANY player base is on social media, and the ones that provide feedback aren&#8217;t a representative sample of the overall player base. Even if you get past this selection bias, people complain after only slightly bad experiences, but an experience generally has to be great in order for someone to leave positive feedback, so you aren&#8217;t even getting a representative sample of the opinions of the group you are seeing. Treating what you hear there as a global consensus is a recipe to crater your game, and every game that tries this learns the hard way.</p><h1>Self-reporting Bias</h1><p>When you share an opinion or give feedback, you are telling a story about yourself. People want to share a story that they like, and that makes them feel skilled, or knowledgeable. They do not write the honest objective truth about themselves into these things. They write the version that they wish they were. We know this because we&#8217;ve surveyed a lot of players over the years and then compared their answers with their actual behavior data, and the two rarely have anything in common.</p><p>Whenever you give someone the opportunity to tell you a story, they&#8217;re telling you a story that reflects on them the way they want to be seen, and you need to take this into account when deciding what to take away from it.</p><h1>Frequently wrong about themselves</h1><p>Sure, there are complex psychological issues at play, but surely people can at least be trusted to tell you about themselves, right? Unfortunately not. </p><p><a href="https://bsky.app/profile/justicar.xyz/post/3merrlmzeik22">A particular AAA developer I know of</a> once sent surveys to 1000 players asking them which game they had played the most, then compared it with the data of what they had actually played. <strong>Not a single one answered correctly.</strong> </p><p><strong>Zero</strong> out of one thousand players could remember their own habits enough to tell which game they&#8217;d played the most. Player answers were so consistently wildly wrong that the team involved thought that their data must have been corrupted. Upon validating that it was in fact accurate, they went back to the players and told them what their actual most played games were, and every single one said something along the lines of &#8220;OH! Right. Well, that makes sense&#8221;.</p><p>When people tell you things they&#8217;re really telling you the stories they tell themselves about themselves, and those stories may not have <strong>anything at all</strong> to do with reality.</p><h1>Experiential projection</h1><p>If they can&#8217;t speak accurately about what they have experienced, how are they supposed to guess how they&#8217;ll feel about things they haven&#8217;t?</p><p>Turns out, people are terrible at telling how they&#8217;ll feel about something they haven&#8217;t experienced. This seems like a pretty obvious thing to say, but it goes wrong easily, because researchers often tend to treat a question about &#8220;how a player feels about something they&#8217;ve experienced&#8221; the same as &#8220;how they think they might feel about something new&#8221;. </p><p>This is a trap, because people who are offered a new option often fixate on what they would be losing if the old option went away, and because they haven&#8217;t experienced the benefits of the new one yet, they can&#8217;t actually place those two as equal. Those kinds of questions are great research for discovering what players are afraid of, not what they actually want. The classic case of this is <a href="https://www.polygon.com/features/2019/7/2/18651880/the-time-i-tried-to-ruin-halo-2-user-research/">The Guy Who Tried To Ruin Halo 2</a>.</p><p>In the lead up to Halo 2, players were asked what they think about queueing up instead of using fixed servers. Results were overwhelmingly negative, because they focused on losing the servers they were used to, but couldn&#8217;t preempt the benefit they&#8217;d receive from being able to queue, so they answered based on what they thought they&#8217;d lose, and said they didn&#8217;t want it. When Trueskill queue launched with the game, it was a huge success and it was so influential that it changed the landscape of online gaming forever. </p><p>It&#8217;s staggeringly easy to completely misinterpret what players are telling you if you&#8217;re not paying close to attention to the conditions under which you&#8217;ve asked.</p><h1>Subject matter expertise</h1><p>There was a time where in order to be a PC gamer, you needed to have a good grasp on technology. That time has passed. Most players have no expertise in computers or games. Unfortunately, they tend to believe that they do, and they have no idea that it isn&#8217;t true. With their whole chests, they will declare you stupid for not implementing their &#8220;easy solution&#8221; to a problem they believe exists in a game, and then when you look further you discover something that obviously, fundamentally cannot work. There isn&#8217;t a way around this.</p><p>I once saw a player in the top 0.5% of League ranks say that the fix for tanks doing too much damage was to <a href="https://x.com/brainofeu/status/1610544667728265217?s=20">put -10% damage output on Tank Mythic items</a>. </p><blockquote><p><em>Mythic items were a type of item in League of Legends. You could only have one &#8220;Mythic&#8221; item, and it would give extra stats or behaviors to every additional completed item. Tank mythics would give additional health or resistances, mage mythics would give extra ability power, etc. They have since been deprecated.</em></p></blockquote><p>This could never have worked <a href="https://x.com/chhopsky/status/1610776365846126592?s=20">for many reasons, listed in the thread</a>, but the short version is <em>&#8220;any change of this nature would create more problems without actually solving the problem it was trying to&#8221;</em>. Trying to make tanks less of a threat to glass cannon characters is a complicated problem, exacerbated by the fact that &#8220;doing damage to glass cannons&#8221; is actually the primary gameplay purpose of many LoL tanks, so you are also trying not to make an entire class useless. It is not actually a simple problem, but if you never throw your rock in the water, you never have to think about the splash.</p><p>People also make grand assertions about how rank, MMR and matchmaking should work, but those are mathematical systems, and when people approach them without considering the mathematics involved, they make suggestions that do not and cannot work. Most of the ones I&#8217;ve seen make things objectively, provably worse, which again, you can prove with math, if you do the math and don&#8217;t just wing it. But as long as people believe they understand the problem and the tools, they&#8217;re going to tell you about it.</p><h1>Problem identification</h1><p>Players are excellent at telling when there&#8217;s a problem. They&#8217;re useless at knowing how to fix it. Never mistake one for the other.</p><p>Secondarily, if your solution to basically anything seems simple, you can be assured that every other person on the team has also thought of this, because it is very simple. If you ever find yourself saying &#8220;I don&#8217;t understand why they don&#8217;t just [thing]&#8221; then your answer is right there: you don&#8217;t understand the problem.</p><p><strong>Instead of looking at something and deciding that people must be stupid to have done this, consider the thing you are seeing may not have been the desired result, and ask yourself what context might possibly exist that makes what you&#8217;re seeing the least bad option.</strong></p><p>It doesn&#8217;t occur to most players that result they see might not have been a compromise, but it&#8217;s actually incredibly common for things in games to work out differently than how they were planned. On every single game that has ever been made, either tech debt, design debt, timing, capitalism, or all of the above has forced developers to make something than they intended.</p><p><strong>You will find yourself right more often than wrong if you assume that everyone involved in a situation is smart and good at their job, and had no better alternative.</strong></p><h1>Combinations of the above</h1><p>When you start to combine the problems above, you can see pretty clearly that when you&#8217;re taking feedback from social media, you need to temper what you read, because:</p><ul><li><p>you&#8217;re sampling the wrong people</p></li><li><p>and they&#8217;re making bad suggestions</p></li><li><p>they&#8217;re making those suggestions based on things that aren&#8217;t even real</p></li><li><p>and that they likely don&#8217;t understand what they&#8217;re asking for</p></li></ul><p>You should definitely listen to players but you need to do so with intention, in deliberate ways, and then use their actual in-game behaviors and purchasing behaviors to supplement the things they told you. Every player will make suggestions they believe will benefit them, but it&#8217;s not their job to find solutions, it&#8217;s yours. Your job is to listen to their problems, then identify solutions that benefit the whole system, not just the ones quote tweeting <a href="https://x.com/drewlevin">Drew Levin</a>.</p><p><strong>Remember: &#8220;what people say&#8221; is data, not fact. It is a story they are telling you. That story has value, but only if you don&#8217;t blindly interpret it as canonical truth. It should be considered along side all other data.</strong></p><h1>The Skill-based matchmaking example</h1><p>SBMM has been a community sticking point in the COD community for a long time, for a lot of reasons ranging from &#8220;content creators want highlight reels&#8221; to &#8220;people making up conspiracy theories&#8221; and finally settling in &#8220;no matter what we do to matchmaking, nothing will make it be 2007 again, the community has been playing for 20+ years now&#8221;.</p><p>The goal of SBMM is to make fair matches that either team has a reasonable chance of winning. The community claimed to not want this, so <a href="https://www.activision.com/cdn/research/CallofDuty_Matchmaking_Series_2.pdf">as an experiment, Activision slightly reduced the weight of &#8216;skill&#8217; as a matchmaking input</a>.</p><p>Almost immediately, unfair unbalanced one-sided matches went up, people started quitting mid-match way more often, and then ultimately started quitting the game forever significantly more. The data was astoundingly clear that all but the top 10% of players hemorrhaged and quit excessively under these conditions.</p><p>The issue is, when you tell people this, they all want to think they&#8217;re in the top 10%, so it wouldn&#8217;t affect them. While this isn&#8217;t even true on it&#8217;s face for most players, the second order effect is that when players not in the top 10% quit, players who <strong>were previously in the top 10% fall out of the top 10%, and then also start quitting</strong>. It is a slowly recursive quitting cycle that causes people from 90% of your player base to quit more, until eventually you have no more players. </p><p>This is exactly what happened when XDefiant launched on the promise of NO skill-based matchmaking. Initially, people praised the variability in the match quality (this is a legitimate reason to detune SBMM, <a href="https://gdcvault.com/play/1034239/The-Evolution-of-Matchmaking-in">as noted by Samy Duc and Christophe Pierce in their GDC presentation on Apex Legends matchmaking</a>), and it received generally good reviews and player feedback. However, as time passed and the player stories gave way to reality, people started to quit in exactly the manner described by the Activision research, and they slowly bled off players until eventually the game was shut down. </p><h1>Media amplifies all of the above</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!No3f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!No3f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 424w, https://substackcdn.com/image/fetch/$s_!No3f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 848w, https://substackcdn.com/image/fetch/$s_!No3f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 1272w, https://substackcdn.com/image/fetch/$s_!No3f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!No3f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png" width="1402" height="1402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1402,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161016,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/187781788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!No3f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 424w, https://substackcdn.com/image/fetch/$s_!No3f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 848w, https://substackcdn.com/image/fetch/$s_!No3f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 1272w, https://substackcdn.com/image/fetch/$s_!No3f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586fcdba-7fc3-4425-8ece-e8f59ea7ce58_1402x1402.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Publishing media and content creators heavily monitor social media as a sentiment source because it&#8217;s public and easy to get clickable content from. This causes them to report on the things that people are saying on social, which then reinforces to their viewers and readers that these ideas are the objective truth, which makes more content creators and media post about the ideas, and before you know it, <strong>something that was just a guess is treated as a colloquially known truth</strong>. It doesn&#8217;t matter what the reality is, so long as people can point to something to justify their opinion and be Right About Games. </p><p>And remember, we&#8217;re dealing with something subjective. Both traditional media and content creators are incentivized to take the most inflammatory, controversial path they can, becausae that gets clicks. It&#8217;s in their best interests to get people angrily sharing their articles and videos. No-one goes viral for a nuanced and balanced take that explains everything without a bad guy. They&#8217;re never going to try to look for a truth to understand because they&#8217;re incentivized not to.</p><p><strong>It&#8217;s difficult to make people understand something when their livelihood depends on them not understanding it</strong>. If the devs are stupid then players have someone to get mad at, and they get to feel like they&#8217;d be really good at being a developer themselves. The content paints a picture that lets everyone tell a story about themselves that feels good, and clicks will flow.</p><p>These opinions will pass back and forth from audience to creator, and once the snake starts eating its own tail, the thing someone made up will be repeated forever to the point where <a href="https://x.com/chhopsky/status/2017843858529284408?s=20">players are incredulous if you question it</a>.</p><h1>Surely the truth comes out eventually?</h1><p>Generally speaking, no. Player opinions on design, marketing, operations, etc won&#8217;t ever actually be tested, and because all of these opinions exist in a frictionless vacuum, they get to remain pristine and untouched. It&#8217;s easy for someone to say &#8216;-10% on Tank Mythics&#8217; because they will never have to make a balance change or deal with the effects of their ideas, and so they&#8217;ll get to believe them indefinitely.</p><p>In the XDefiant/COD SBMM case we can even have mathematical proof that matching on skill provides a better experience, and that proof can be echoed by every matchmaking study ever done across every studio that ever made a PvP game, but some players will keep believing otherwise because they&#8217;ll either outright reject the data because it contradicts something they feel special for knowing, or they&#8217;ll argue for it anyway because that&#8217;s what high Elo players do, and they want to feel like they&#8217;re high Elo.</p><h1>So how can we try to be more right?</h1><p>The data you have about player behavior is probably correct, but remember: the story you tell about that data is the part you&#8217;re creating. Statistics are just numbers. The words are yours, and how you interpret the numbers is everything.</p><p>The real question you need to ask yourself is this:</p><p>Are you prepared to bet 8 figures, the jobs of all your friends, and four years of your life on being right?</p><p>The terrifying reality is that most game ideas seem good until they&#8217;re actually tested, and the appeal of spectating is that nothing you do will ever be scrutinized by players, so you never have to find out that you don&#8217;t know what you&#8217;re doing. Being more right involves exposing yourself to that failure, because game design is not <strong>knowing</strong>, it&#8217;s <strong>problem solving.</strong> It&#8217;s very easy to look at anything that didn&#8217;t work in hindsight and say &#8220;well they should have known&#8221; but every car that&#8217;s ever crashed was driving just fine until it wasn&#8217;t, and when you&#8217;re travelling at 60mph you can&#8217;t always bleed off that speed and stop safely.</p><p>That sucks, but it&#8217;s the reality of the industry, and all any of us can do is do our best work, theorycraft, problem solve, playtest, iterate, and hope that an insane hate mob determined to destroy what we&#8217;ve created doesn&#8217;t descend on us because of which trailer spot we occupied. We all try to make something we love that we think players will want, and we hope it works out.</p><h1>So how do we actually know what players want?</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aDhS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aDhS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aDhS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/beee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139414,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/187781788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aDhS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aDhS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeee369b-2a0c-48f0-8bde-ede9f6959dbb_1280x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The reality is that you do actually have to listen to all of the data you have available, and that data includes social media, but the important missing step is that all of that data must be viewed IN CONTEXT.</p><p>With the correct context, every bit of data can tell a true story about your game, but without it, you can take the entire wrong meaning away from it. Numbers don&#8217;t lie, but the stories people tell about numbers do, so be mindful and deliberate about the stories you tell and try to think through the human context behind everything you&#8217;re measuring.</p><p>And finally, if there&#8217;s ever a conflict between what people say and what they do, believe their actions. People say things that aren&#8217;t true all the time, but the way they use buttons that say <strong>Play Now</strong> and <strong>Uninstall</strong> tell their ultimate truth.</p><p>Until next time.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Possibility Space]]></title><description><![CDATA[What it means to start making a game, and to finish.]]></description><link>https://loadbearingtomato.com/p/possibility-space</link><guid isPermaLink="false">https://loadbearingtomato.com/p/possibility-space</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Sat, 08 Nov 2025 04:26:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7f837f3f-a6cc-4f21-9c18-9185cc0aae5a_3600x4800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Making a game always starts with an idea.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OoH1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OoH1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OoH1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2287215,&quot;alt&quot;:&quot;A landscape in space on an asteroid.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/178328229?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A landscape in space on an asteroid." title="A landscape in space on an asteroid." srcset="https://substackcdn.com/image/fetch/$s_!OoH1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OoH1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85053f-c6a3-4464-8a87-dd35c9594e05_2364x1569.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The instant that idea forms, the bounds of what it might become feel endless. As you design, ideate, and choose, the space begins to contract and take shape into something not quite so formless, and a meaningful possibility space is drawn. The number of possibilities shrinks from something unknowable to something that fits in a particular area, in a particular shape.</p><p>But as you start to fill in the details and explore the space, the number of possibilities begins to grow again. You learn about your space you&#8217;re mapping, and with that knowledge, you start widening the scope of what might be. The potential grows, and it keeps growing... until one day, it stops.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!joNT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!joNT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 424w, https://substackcdn.com/image/fetch/$s_!joNT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 848w, https://substackcdn.com/image/fetch/$s_!joNT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!joNT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!joNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4856901,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/178328229?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!joNT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 424w, https://substackcdn.com/image/fetch/$s_!joNT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 848w, https://substackcdn.com/image/fetch/$s_!joNT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!joNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbaa2df6-1f12-4139-a218-200fd36ef6aa_3263x1631.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Through either choices you&#8217;ve agreed to, budget, market forces, or all of the above, choosing what your game is forces you to also choose what it isn&#8217;t. The possibility space begins to contract. Edge by edge, the space where your game might be is refined and defined like marble becoming a statue. The cuts become more inevitable, each decision excluding possibilities it&#8217;s incompatible with. As we settle on what we must have, we inherently define what we cannot have and must not have, and we bury those possibilities. When we spend our time, the amount of time we have left dictates what we cannot spend the rest on. Eventually, the possibility space that began infinite has a definite singular form.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OB2A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OB2A!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 424w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 848w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 1272w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OB2A!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif" width="800" height="424" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:424,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5070819,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/178328229?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OB2A!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 424w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 848w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 1272w, https://substackcdn.com/image/fetch/$s_!OB2A!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd465cf20-bc3f-4731-869f-83571cbba78f_800x424.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you start a game, it can become anything. </p><p>When you finish, it is <strong>precisely one thing</strong>.</p><p>To finish is to mourn the death of infinite possibilities, and celebrate the birth of one new thing.</p><p>That is our Ambrosia Project, and today we celebrate the birth of <strong>Ambrosia Sky</strong>.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a210651f-c732-40a9-846f-faac9c70f8f4&quot;,&quot;duration&quot;:null}"></div><p>Available now on <a href="https://store.steampowered.com/app/3580160/Ambrosia_Sky/?utm_source=substack&amp;utm_campaign=chh_content&amp;utm_content=ambrosiaproject&amp;utm_medium=longform">Steam</a> and <a href="https://store.epicgames.com/en-US/p/ambrosiasky-0596ee">Epic Games Store</a>.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Burnout and Weightlifting]]></title><description><![CDATA[The last step in recovery.]]></description><link>https://loadbearingtomato.com/p/burnout-and-weightlifting</link><guid isPermaLink="false">https://loadbearingtomato.com/p/burnout-and-weightlifting</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Sat, 02 Aug 2025 00:34:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8a92e908-3731-4358-ae3c-6d4abf3c3b5b_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s been three and a half years since I wrote my now-infamous &#8220;<a href="https://loadbearingtomato.com/p/how-the-games-industry-hurts-people">How The Games Industry Hurts People</a>&#8221; article. A lot of the inspiration came from my time working on <a href="https://en.wikipedia.org/wiki/Dauntless_(video_game)">Dauntless</a> at <a href="https://phxlabs.ca/">Phoenix Labs</a>. It is the worst job I&#8217;ve ever had, and one of the worst things that&#8217;s ever happened to me.</p><p>I won&#8217;t regale you with tales I couldn&#8217;t prove in a courtroom, but I will say that I quit very soon after getting my permanent residence in Canada. I&#8217;m sure you can imagine how being an immigrant on a work permit might be a source of vulnerability in an employment conflict.</p><p>I mention this because today I&#8217;m here to talk to you about recovery, and in order to do that I need to tell the story of how I broke, the hole I found myself buried in, and how I dug myself out.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Last time, on LBT</h2><p>The original article went through all the different ways in which stress, trauma, conflict, thrash, crunch, nervous system activation, lack of psychological safety, and other byproducts of bad leadership take their toll on the body, the mind, and the emotions. A lot of people reached out to me to thank me or vent the flood of feelings they&#8217;d been hit with from finally having words to describe what they were experiencing. This felt like success to me since the point of the article was to help people understand what was happening to them, but it received criticism from some &#8212; including <a href="https://www.healthygamer.gg/dr-alok-kanojia">Dr. Alok Kanojia</a> aka &#8220;Dr. K&#8221; of HealthyGamer.GG &#8212; that it really didn&#8217;t really offer any solutions.</p><p>In truth, I didn&#8217;t cover the solution space because I don&#8217;t believe there is an effective universal approach to fixing the kind of damage you get when a game studio fucks you up. I still felt broken, so how could I help anyone fix themselves when I couldn&#8217;t fix myself? We know there are things that help in general, and you&#8217;ve all heard those a thousand times. Eat healthy, rest, exercise, blah blah blah. Those things are never going to hurt, but they can&#8217;t actually do anything on their own. Rest isn&#8217;t relaxing when you&#8217;re in a C-PTSD hole and can&#8217;t stop bouncing your legs on the balls of your feet. Exercise can technically help the body but even getting to exercise in the first place may be impossible, and it might not even help if you just spend the whole time thinking about work.</p><p>At the end of the article, I offered hope and posited that if there was a key to healing, it depended on redefining your relationship with the things that hurt you. And god damn, do I hate being right.</p><h2>Who hurt you?</h2><p>Effort. What hurt me was the concept of willpower itself, and the application of it as a means of solving my problems.</p><p>The launch of Dauntless in 2019 tore me to pieces over a month of 15-20 hour days, 7 days a week. We crunched through over 1700 deployments in that time.  <a href="https://cloud.google.com/blog/topics/customers/google-cloud-helped-phoenix-labs-meet-demand-for-dauntless">They wrote whitepapers about what we achieved</a>, and they were right to, because what we did and what it cost us was beyond human capacity. It has taken me the last six years to recover what I lost in that room.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G1BM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G1BM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G1BM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;https://storage.googleapis.com/gweb-cloudblog-publish/images/dauntless-artwork_switch_launch_malkarion_.max-2200x2200.jpg&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/dauntless-artwork_switch_launch_malkarion_.max-2200x2200.jpg" title="https://storage.googleapis.com/gweb-cloudblog-publish/images/dauntless-artwork_switch_launch_malkarion_.max-2200x2200.jpg" srcset="https://substackcdn.com/image/fetch/$s_!G1BM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G1BM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9fa1bd-39f2-41e5-94c9-5e5752cf8803_2200x1238.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">At least some people got to slay a cool dragon or whatever.</figcaption></figure></div><p>If we didn&#8217;t succeed, none of us would have jobs because the studio would close. But that was a manageable amount of pressure compared to the real Sword of Damocles that hung over my head.</p><div class="pullquote"><p>Author&#8217;s note: Always report medical issues in writing to ensure they are not used against you.</p></div><p>If I didn&#8217;t succeed to the arbitrary satisfaction of my employer, I would be fired and forced to leave the country. </p><p>The pressure was unfathomable, my health was already failing, and my life as I knew it hung on my ability and capacity to perform. </p><p>But I&#8217;d already uprooted my life the year before to escape the Trump administration&#8217;s destruction of the visa program, and staring down the barrel of being forced to move back to Australia, I decided that I would do <strong>whatever</strong> I had to do to succeed to the arbitrary satisfaction of my employer. It pushed me so far beyond the physical limits of my body that by the end of the second week I was throwing up several times a day, shitting my guts out, unable to sleep without whiskey, and unable to wake without a carton of Red Bull. I survived off fast food, granola, and soda, because it was what I could consume quickly and get back to work. I took Advil for the muscle spasms, Tylenol for the headaches, and Valium for the brain zaps. I stole swag from marketing because I didn&#8217;t have clean clothes. A friend flew in from the US to take care of me, who said I was, and I quote &#8220;not a person&#8221;.</p><h2>Seems bad</h2><p>I pushed myself beyond the limits of human endurance, physically and mentally. Every time my mind or body attempted to enforce a limit, I found a way to overcome that limit thanks to my seemingly-endless resolve and deep pit of rage built up over decades of a life I never should have been subjected to. Withholding details to maintain my G-rating, it is possible to force a person&#8217;s sympathetic nervous system into Fight or Flight and dump all the adrenaline it has into your body. I did this on purpose, multiple times a day, every day, for a month. That had a cost which I inevitably paid, and a limit which I inevitably hit. When the juice ran out, I hit a wall like a Toyota Tercel leaving the highway hits a pine tree.</p><p>When it was over, I couldn&#8217;t get out of bed. I tried. It didn&#8217;t work. I physically could not force the muscles to carry me. Later, doctors would theorize a number of reasons why this happened, all of them terrifying. I asked to take short term disability leave but was told to take PTO instead. I wasn&#8217;t functional enough to argue.</p><p>When I eventually returned to work, the person I had been before was gone. I felt nothing, I enjoyed nothing, and I did little outside of work except drink and talk to people I wished lived closer. Unable to quit because of my work permit, I stayed at PHX and tried to make the best of a bad situation for a further two years while I waited for my Permanent Residence (canadian green card). When it finally arrived, the situation at PHX was already deteriorating rapidly. After another few months of suffering, an <em>Incident</em> occurred. I walked out and emailed to say I would not be coming back.</p><p>Soon after, I took a job on Call of Duty with the intention of transitioning back into big tech and leaving game development forever. But then the strangest thing happened.</p><h2>Things got better</h2><p>It turns out, when a studio releases one game a year for basically fifteen years straight, they get pretty good at doing it sustainably. Working on COD was easily the best gamedev job I&#8217;d ever had. The values of the studio were codified in their practices, which reinforced all the things I&#8217;d theorized might be possible with competent leadership. It was organized, competent, management was aware of their responsibilities and worked with their team to create effective work environments.</p><p>Experiencing this and breathing a sigh of relief, I wrote the article you know and love after about six months there, having studied how Demonware worked with Treyarch, Infinity Ward, Sledgehammer, Raven, and High Moon in detail with people from every level of the orgs. I spent time with every level of leadership unpacking the structure, operation, and ideals behind all of it, and I&#8217;m being deadly serious when I say every single day was good. I did not have a single bad day at work in two years, including the launches. We released Vanguard, Modern Warfare 2, and Warzone 2.0, all the while doing maintenance work on Cold War, Black Ops 4, MW2019 and COD Mobile. The work was complex, and difficult but achievable, and there was always support from the team. It was truly one of the best things that&#8217;s ever happened to me.</p><p>After a couple of years I left to help <a href="https://bsky.app/profile/julesfern.gay">Jules</a>, <a href="https://bsky.app/profile/kaittremblay.bsky.social">Kait</a>, and <a href="https://bsky.app/profile/joelburgess.bsky.social">Joel</a> build <a href="https://softrains.games/">Soft Rains</a>, a new indie studio making <a href="https://store.steampowered.com/app/3580160/Ambrosia_Sky/">Ambrosia Sky</a>. We got to create the studio we&#8217;d always talked about and I think we&#8217;ve been very successful. Every day I wake up happy to work with my friends on a game I believe in and you should wishlist it.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;97f4b3f4-5006-46bb-b105-b3dbdfede4fa&quot;,&quot;duration&quot;:null}"></div><p>It&#8217;s a high pressure environment that I genuinely care about, but unfortunately, that revealed damage that had so far remained hidden.</p><h2>Oops! All trauma</h2><p>Working in a large AAA team, there&#8217;s a high degree of specialization and a high degree of redundancy. Working on a small indie team, there&#8217;s a high degree of generalization and almost no redundancy. Task domain changes constantly, and your colleagues are depending on you doing your work so they can do theirs. And because you have fewer colleagues and fewer teams, you spend less time on coordination and communication and more hours every day on the tools. Since no-one can possibly know every part of the engine, you constantly know less than you need to, and almost every task requires research into how to actually do it.</p><p>That is a lot of words to say that it was challenging, and it required me to, you know, try. Normal, right?</p><p>I didn&#8217;t know how to anymore. When I&#8217;d hit a wall and not know what to do, my brain began to lock up. I couldn&#8217;t focus, couldn&#8217;t think, couldn&#8217;t work. I&#8217;d stare at the IDE for hours, unable to even begin attacking the problems I was working on. It&#8217;s Unreal Engine, so the answer to every problem was in the source code somewhere, but past a certain point I couldn&#8217;t force myself to keep looking for them. No matter what, I couldn&#8217;t force myself to apply willpower, because last time I did that it broke me as a person and nearly killed me. It became a severely limiting factor in what I could do, because the only other time in my career I needed to spend this much of my time programming was the original Dauntless launch. I couldn&#8217;t write the amount of code that I needed to, and the answer I turned to last time scared me.</p><p>I feared that pushing the button in my head marked &#8220;generate willpower&#8221; might trigger the fight or flight that broke me, but more than that, I feared a much worse scenario: if in a moment of desperation, I reached for that old, dangerous button as a last resort, and it didn&#8217;t work. Knowing that I&#8217;d been pushed so far as to reach for my secret weapon, only to find that I didn&#8217;t have one? I knew that&#8217;d break me, so I stayed well away from anything that even <em>felt</em> like effort.</p><p>Just when I thought things couldn&#8217;t get worse, they did.</p><h2>Death of a friend</h2><p>A friend from my home town died. His name was Paul Wankadia, and when I was a kid he was the first person I knew who also Liked Computer. You might have known him as <a href="https://x.com/junyer">Junyer</a> from his contributions to <a href="https://github.com/google/re2">RE2</a>. He had a heart attack at work and later died recovering at home. Our lives didn&#8217;t look so different, and his killed him. Not too long after, a doctor would tell me that mine was going to kill me for the same reasons, and I needed to fix my shit. But with what? I was still cooked, I had no juice to spend on such a thing.</p><p>This put me in a bind. Before, I couldn&#8217;t apply effort because last time I did it nearly killed me. Now I was being told if I didn&#8217;t apply effort to change my life, it would <strong>definitely</strong> kill me.</p><p>It simplified the choice quite a bit. If death is likely either way, pick the one that&#8217;s least likely. So I changed my life, and committed to earning my health back, and that started with exercise. Aware of my propensity to go too hard too quickly and hurt myself, I started with light cardio and light dumbbells at home. When that stopped making me feel ruined for multiple days afterwards, I started going to the gym in my building, with a little more intense cardio. When that started being manageable, I very lightly started lifting, as I had at so many other points in my life. Weeks passed and the weights went up and down, but about a month in, as I began to approach failure, the strangest thing happened.</p><h2>Lifting the bar</h2><p>I felt my body weaken, my muscles ask for rest. At any point during the previous the past six years, I&#8217;d have listened. But an old, long dormant part of me began to whisper in guttural tones begging me to fight. A muscle memory I thought lost crept into the fibers and demanded I push, and together they spat fire into my lungs. Suddenly, there was one more rep left in me. Then another. Then another. Then ten more. And two more sets. It wasn&#8217;t until the end of the night as I sat alone on the floor of the gym, quietly sobbing, that I realized I had found a part of me that I&#8217;d thought had died in the fire of 2019. Applying effort to the weights was safe, and good for me, and something that would inherently reward me. Without realizing it, I&#8217;d been retraining my brain to remember that effort could lead places that weren&#8217;t just pain, disappointment, and burnout. After that day, I began to crave challenge again. I lifted heavier and heavier, and started to play games. I started to write for fun again, I went to the League of Legends Mid-Season Invitational, and started to join people for ARAMs. The days no longer ended with me collapsing in front of TV, ordering a burrito, drinking until it was time to sleep, and passing out, instead punctuated with social activities, exercise, and reading.</p><p>It&#8217;s been nearly a year since I started trying to fix my life, and I&#8217;m still going to the gym four or five days a week, for about an hour and a half per day. I&#8217;m regularly lifting three plates (315lb / 145kg) on my heaviest lifts in most of those sessions. I&#8217;m eating for the sole purpose of fueling my body for the next lift, and it is working. I am, quite frankly, strong as hell and ripped.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hZF4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hZF4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hZF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg" width="1456" height="1861" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1861,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2103276,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/169812118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hZF4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hZF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4106659a-eaea-445c-bc17-a633849f81d7_1765x2256.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But more than anything, I&#8217;m able to work to my fullest capacity again. Before weightlifting, I&#8217;d already done the work to change my relationship with employment and game development and I&#8217;d learned to trust that my team had my back. Despite that, the damage that prevented me from applying willpower had lurked in the background for years, sucking up my ability to do &#8230; well, just about anything. It took me until now to realize it, but that damage had widespread impacts over my life. It&#8217;s the reason I&#8217;ve barely even been able to play games or during most of this time period, because games are the application of effort towards a challenge and the idea of recreationally applying effort caused the exact same lock up that attempting to push through a problem at work did. I could barely read books because it required me to sit alone with my thoughts, and quite frankly that sounded like hell. It doesn&#8217;t, anymore. I&#8217;m reading Gideon the 9th right now, and it&#8217;s lovely.</p><h2>A better life</h2><p>I play games and read most days now. I wake up at 9, start work at 10, work until 6, then gym until 7:30, cook dinner, and spend the rest of the night playing. I eat 140 - 195g of protein a day, and buy a quite frankly unholy amount of chicken breast and eggs every week. I don&#8217;t really drink or smoke anymore. Not really intentionally, I just don&#8217;t want to. I have other priorities and things in my life that reward me more than they did, so I do not need them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bcLY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bcLY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bcLY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3452115,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/169812118?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bcLY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bcLY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd4dffdb-70b7-4d41-9a48-df56316fda29_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">315lb / 145kg</figcaption></figure></div><p>Even with a dream job, you can still be bleeding from old wounds.</p><p>I tell you this story &#8212; my story &#8212; to illustrate how insidious damage from the worst of our experiences can lurk beneath the surface, and to show how recovery is possible. It also serves to show how the recovery requirements are different for each of us. My damage was specific to the nature of the incidents that broke me, and so the work required to heal me meant addressing that. I was lucky (?) that external circumstances put me in a place where I accidentally discovered what I was stuck on. I hope that you are luckier than me in this regard.</p><p>Our brains are neural networks, and neural networks cannot simply be told how to  operate. Saying a space is safe doesn&#8217;t <strong>make</strong> it safe, nor does it make you <strong>feel</strong> safe. We must be shown that things are safe and have it demonstrated repeatedly until the pathways that process that information strengthen and we can trust that what we have seen and are seeing will continue to be seen. </p><p>We are players in the game of our own lives and we must train ourselves with input until our natural reactions are the ones we want. We must build the game such that our experiences retrain us simply by living in the core gameplay loops we have set out.</p><h2>Moving on</h2><p>On May 29th 2025, Dauntless died an unremarkable death and sank offline into an unmarked grave. A handful of people from the Phoenix Labs Survivor&#8217;s Support Group got together in a nearby park to mourn its passing. I was not one of them. It was a bad thing that happened to us, and its memory remains a warning for all that come after.</p><p>The last step in healing is saying goodbye to your pain, and moving past it. The people who did these things to us will never see consequences. You will have to make peace with that however you can, because the last step is leaving them behind altogether, and never thinking about them again. They cannot hurt you anymore; once we purge the damage they inflicted, their influence is gone forever.</p><p>You <strong>can</strong> heal from these terrible things. You <strong>can </strong>build a better life for yourself. You just have to figure out how, and no-one knows you better than you.</p><p>Good luck, old friend. I believe in you.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="pullquote"><p>If you worked at Phoenix Labs and need someone to talk to about the things you experienced, please reach out to me on any platform that I use. You&#8217;re not alone.</p></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Reading CSV files in UE5 C++]]></title><description><![CDATA[The documentation is wrong.]]></description><link>https://loadbearingtomato.com/p/reading-csv-files-in-ue5-c</link><guid isPermaLink="false">https://loadbearingtomato.com/p/reading-csv-files-in-ue5-c</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Wed, 23 Jul 2025 21:25:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kAMi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Short post today to get this one out of the knowledge banks and onto the internet.</p><p>There are a lot of reasons you may need to import text-based tables into UE5. You might be building your own editor modules. You might be using data assets instead of data tables. You might be building a VO pipeline and need to import and export states from the recording sheet. Fortunately, there&#8217;s a format for that!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kAMi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kAMi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kAMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png" width="512" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:512,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:14247,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://loadbearingtomato.com/i/169085659?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kAMi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!kAMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8e3e4fc-5a80-410d-a01f-4e3ecc8b3cf7_512x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">It&#8217;s CSV.</figcaption></figure></div><p>If you search for this in the official documentation, you&#8217;ll likely find this article in the official Unreal Learning Community: <a href="https://dev.epicgames.com/community/learning/tutorials/Eyz4/unreal-engine-csv-to-datatable-manipulation">CSV to Data Table manipulation</a></p><p>It details a method for reading from CSV files in C++. The only problem is: it doesn&#8217;t really &#8220;work&#8221;, so to speak. It might, but it probably won&#8217;t<strong>.</strong></p><p>It contains the following line of code:</p><pre><code>aString.ParseIntoArray(stringArray, TEXT(","), false);</code></pre><p>It will probably not work for you because it is a simple string split. If you have any commas in your text fields, they will be taken to be new fields. This is the correct and expected behavior for that function, but it was &#8220;fixed&#8221; to help with CSV files in UE4.5, and at an unknown time has been adjusted back to a basic string split. So the function itself is fine, but it&#8217;s not the right one to use because it can fail depending on your data.</p><p>Secondarily, when I tried the method it uses to load the CSV file, it failed every time:</p><pre><code>FFileHelper::LoadANSITextFileToStrings(*CsvFile, NULL, Lines);</code></pre><p>If you want it to actually work:</p><ol><li><p>Use <code>FFileHelper::LoadFileToString</code> to load the file into a string.</p></li><li><p>Use the <code>CsvParser</code> module to parse the string you just loaded.</p></li></ol><p>This is confirmed working on 5.3+, although be aware &#8220;Load File To String&#8221; will fail if the file is open in another program; it does attempt an exclusive read so please close/save your CSV before importing via this method.</p><pre><code>#include "Serialization/Csv/CsvParser.h"

FString CsvFile = *(FilePath + "\\filename.csv"); // filepath 
FString CsvString; // string to load csv into

if (FPaths::FileExists(CsvFile))
{
&#9;FFileHelper::LoadFileToString(CsvString, *CsvFile);
&#9;FCsvParser CsvParser = FCsvParser(CsvString);
&#9;TMap&lt;FString, TArray&lt;FString&gt;&gt; CsvData;
&#9;
&#9;for (auto&amp; Row : CsvParser.GetRows())
&#9;{
&#9;UE_LOG(LogCategory, Display, TEXT("1: %s\n2: %s\n3: %s\n4: %s\n5: %s\n"), Row[0], Row[1], Row[2], Row[3], Row[4]);
&#9;}
}</code></pre><p>And while you&#8217;re here, a quick sample for writing CSV files.</p><pre><code>FString CSVOutputFileContents = TEXT("Line_ID,Character,Dialogue Text,Status\n"); // CSV header row
TCHAR Format[35] = TEXT("\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n"); // format for printf

for (auto&amp; Row : SomeIterableThing)
{
CSVOutputFileContents += FString::Printf(Format, *Line_ID, *CharacterName, *DialogueText, *Status); // iterate over your things and write one row each here
}
FFileHelper::SaveStringToFile(CSVOutputFileContents, *(FilePath + "\\recording-export.csv")); // finally, save the file</code></pre><p>This took up way too much of my Tuesday. I write it down so as to potentially save yours.</p><p>Until next time.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Visual Studio Setup For Unreal Engine 5]]></title><description><![CDATA[The correct configuration items to compile the engine from source]]></description><link>https://loadbearingtomato.com/p/visual-studio-setup-for-unreal-engine</link><guid isPermaLink="false">https://loadbearingtomato.com/p/visual-studio-setup-for-unreal-engine</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Fri, 24 Jan 2025 18:40:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve set up UE5 and tried to compile from source, you&#8217;ve probably found that it didn&#8217;t work, and started fighting with Visual Studio in order to make it go.</p><p>Following the Epic <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/building-unreal-engine-from-source">Building From Source guide</a> won&#8217;t get you a compiling install. There&#8217;s one additional prerequisite step that&#8217;s not well-documented: Visual Studio setup. So, here are the steps I use to set it up.</p><h1>The Steps</h1><ol><li><p>The latest VS C++ toolchain doesn&#8217;t work with UE5.3 and below, but if you&#8217;re not actually using Visual Studio, you can install just the build tools for VS, fixed to a particular release. The version you want is 17.6 and it can be <a href="https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history">downloaded from the release page</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0xTZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0xTZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 424w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 848w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 1272w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0xTZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png" width="1092" height="482" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:482,&quot;width&quot;:1092,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50165,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0xTZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 424w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 848w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 1272w, https://substackcdn.com/image/fetch/$s_!0xTZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff081b32a-9a9d-4bed-9ffa-304ddf6dae1c_1092x482.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you do need to use VS then you&#8217;ll need Professional to pick your version, but if you&#8217;re still on 5.3 at this stage you&#8217;re likely a professional so you probably already have it. </p><p></p></li><li><p>When you run the installer, you&#8217;ll see a window like this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y639!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y639!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 424w, https://substackcdn.com/image/fetch/$s_!y639!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 848w, https://substackcdn.com/image/fetch/$s_!y639!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 1272w, https://substackcdn.com/image/fetch/$s_!y639!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y639!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png" width="1456" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a651049e-6090-43cb-ae39-e130476b9e89_1540x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:347249,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y639!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 424w, https://substackcdn.com/image/fetch/$s_!y639!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 848w, https://substackcdn.com/image/fetch/$s_!y639!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 1272w, https://substackcdn.com/image/fetch/$s_!y639!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa651049e-6090-43cb-ae39-e130476b9e89_1540x778.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p></li><li><p>From the two-column list of options on the left, make sure the following items are ticked:</p><ol><li><p><code>.NET desktop development</code></p></li><li><p><code>Desktop development with C++</code></p></li><li><p><code>Universal Windows Platform development</code></p></li><li><p><code>Game development with C++, plus the following optional items under this heading:</code></p><ul><li><p><code>C++ profiling tools</code></p></li><li><p><code>C++ AddressSanitizer</code></p></li></ul></li></ol></li><li><p>After you&#8217;ve selected the correct options, the window should look more like this. Please ignore the day/night mode swap.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q89_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q89_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 424w, https://substackcdn.com/image/fetch/$s_!q89_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 848w, https://substackcdn.com/image/fetch/$s_!q89_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 1272w, https://substackcdn.com/image/fetch/$s_!q89_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q89_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png" width="1456" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:521141,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!q89_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 424w, https://substackcdn.com/image/fetch/$s_!q89_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 848w, https://substackcdn.com/image/fetch/$s_!q89_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 1272w, https://substackcdn.com/image/fetch/$s_!q89_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8a3184c-9132-42d6-81aa-ea17d74a4eaf_1569x847.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p></li><li><p>Now, go to the <strong>Individual Components</strong> tab and ensure the following items are ticked:</p><ol><li><p><code>.NET Framework 4.8 SDK</code></p></li><li><p><code>.NET Framework 4.7.2 targeting pack</code></p></li><li><p><code>.NET Framework 4.6.1 targeting pack</code></p></li><li><p><code>MSVC v143 - VS 2022 C++ x64/x86 build tools (v14.36-17.6)</code></p></li><li><p><code>C++ v14.36 (17.6) ATL for v143 build tools (x86 &amp; x64)</code></p></li><li><p><code>C++ v14.36 (17.6) MFC for v143 build tools (x86 &amp; x64)</code></p></li><li><p><code>C++/CLI support for v143 build tools (14.36-17.6)</code></p></li><li><p><code>Windows 11 SDK (10.0.22000.0)</code></p></li></ol></li><li><p>Run Setup.bat in the source folder as administrator.</p></li><li><p>You&#8217;re done! Now you can follow <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/building-unreal-engine-from-source">the guide</a>.</p></li></ol><h1>Why is it like this?</h1><p>The official documentation doesn&#8217;t know anything about your setup and doesn&#8217;t want to, they have to account for everything and that&#8217;s all well and good but it&#8217;s still a problem you&#8217;d have to solve for yourself. Now you don&#8217;t have to.</p><p></p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Engineering Troubleshooting 101: Possibility Spaces and Proxies]]></title><description><![CDATA[Divide and conquer your assumptions.]]></description><link>https://loadbearingtomato.com/p/troubleshooting-101-possibility-spaces</link><guid isPermaLink="false">https://loadbearingtomato.com/p/troubleshooting-101-possibility-spaces</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Fri, 10 Jan 2025 02:36:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7a6eaa53-1039-46c7-84f6-4c774c0f4a2b_1656x1447.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In games, and indeed in all engineering, you will come across problems that baffle you at first glance. If you&#8217;ve never encountered a problem and just thought &#8216;damn I have no idea&#8217;, you&#8217;re lying or you&#8217;re simply too junior to have ever encountered anything really fucked.</p><p>Earlier this week, Network Engineering Influencer &#8220;TracketPacer&#8221; (presumably a <a href="https://en.wikipedia.org/wiki/Spoonerism">Spoonerism</a> of the Cisco network simulation tool &#8220;<a href="https://www.netacad.com/cisco-packet-tracer">Packet Tracer</a>&#8221;) posted a video of a network hub looped back on itself. Confusingly, this did not create a broadcast storm, as she&#8217;d hoped.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="bluesky-wrap outer" style="height: auto; display: flex; margin-bottom: 24px;" data-attrs="{&quot;postId&quot;:&quot;3lfbnjepirs2z&quot;,&quot;authorDid&quot;:&quot;did:plc:vcr4ry5765uyswp73f4mxvb7&quot;,&quot;authorName&quot;:&quot;TracketPacer&quot;,&quot;authorHandle&quot;:&quot;tracketpacer.bsky.social&quot;,&quot;authorAvatarUrl&quot;:&quot;https://cdn.bsky.app/img/avatar/plain/did:plc:vcr4ry5765uyswp73f4mxvb7/bafkreicqjdqkleiloqzveja5nhi2ag32yzoebhutxajgiebkgz5wnvawi4@jpeg&quot;,&quot;text&quot;:&quot;im losing my midn help&quot;,&quot;createdAt&quot;:&quot;2025-01-09T02:38:14.028Z&quot;,&quot;uri&quot;:&quot;at://did:plc:vcr4ry5765uyswp73f4mxvb7/app.bsky.feed.post/3lfbnjepirs2z&quot;,&quot;imageUrls&quot;:[&quot;https://video.bsky.app/watch/did%3Aplc%3Avcr4ry5765uyswp73f4mxvb7/bafkreiale5rlncbhoaojccwsnzkobn5lnrvoqewo63ihpcafrhjazkirkm/thumbnail.jpg&quot;]}" data-component-name="BlueskyCreateBlueskyEmbed"><iframe id="bluesky-3lfbnjepirs2z" data-bluesky-id="9663170554023732" src="https://embed.bsky.app/embed/did:plc:vcr4ry5765uyswp73f4mxvb7/app.bsky.feed.post/3lfbnjepirs2z?id=9663170554023732" width="100%" style="display: block; flex-grow: 1;" frameborder="0" scrolling="no"></iframe></div><p>For those of you not familiar with the dark arts of Network Engineering that underpin our entire online infrastructure, looping Ethernet switches or hubs usually creates a self-sustaining broadcast storm that very quickly consumes all available bandwidth. There are protocols designed to prevent this, but they&#8217;re usually only available on higher end &#8220;managed&#8221; switches. Her basic, unmanaged Netgear hubs didn&#8217;t have anything like that. They were arguably some of the dumbest network devices in existence.</p><p>And yet, when she fired up <a href="https://www.wireshark.org/">Wireshark</a> (a network capture program) to look at the network traffic and sent some pings out, she could only see <a href="https://en.wikipedia.org/wiki/Address_Resolution_Protocol">ARP requests</a> going out for the ping attempt, and nothing else. No storm, no flood, no nothing. So what gives?</p><p>It&#8217;s tempting to just dive in and start screwing around, but we&#8217;re professionals here, and we&#8217;re trying to be better professionals, so here&#8217;s a technique I like to call &#8220;Possibility Space Division&#8221;.</p><h1>Possibility Spaces</h1><p>A possibility space is a potential scenario that applies rules, limitations, or otherwise partitions off potential root causes of an issue into forking decision trees (n-way, or binary trees for the programmers) for evaluation and elimination.</p><p>What this means in practice is generally asking questions in the shape of &#8220;Either X is true or it is false&#8221;. Dividing our problems like this serves two purposes:</p><ol><li><p>To eliminate entire segments of potential causes at once</p></li><li><p>To help us track what potential problems we have eliminated</p></li></ol><p>Both of these serve a single goal: to help us drill down and identify the root cause as quickly as possible. </p><div class="pullquote"><p>Note on <a href="https://en.wikipedia.org/wiki/OSI_model">the OSI model</a>: IP addresses/routers exist at Layer 3, and switches/hubs exist at Layer 2. These layers stack on top of each other to provide end-to-end connectivity between devices on networks and the Internet. When we refer to &#8220;Layer 2&#8221; we are referring to switch/hub networks, and when we refer to &#8220;Layer 3&#8221; we are referring to routing between IP addresses.</p></div><p>So, let&#8217;s evaluate what we think we know about this problem. We have three pieces of information.</p><ol><li><p>There is a looped layer 2 network</p></li><li><p>Looped layer 2 networks, absent of an antiloop protocol, create broadcast storms</p></li><li><p>Wireshark didn&#8217;t show a broadcast storm</p></li></ol><p>You&#8217;ll notice that I didn&#8217;t say &#8220;there wasn&#8217;t a broadcast storm&#8221;. This is because of a second layer of troubleshooting that you need to be aware of as an engineer - that everything we do, trust, and rely on, is based on assumptions and proxies. We have to verify those assumptions. Our user story was &#8220;Broadcast storm should happen but doesn&#8217;t&#8221;. But do we actually know that it didn&#8217;t happen? Not yet. All we <em>really</em> know is that Wireshark didn&#8217;t show one.</p><p>So we have two possibility spaces:</p><ol><li><p>Either there wasn&#8217;t a broadcast storm, or;</p></li><li><p>There was a broadcast storm and Wireshark wasn&#8217;t displaying it</p></li></ol><p>We now have the root node of a binary tree of troubleshooting, and we get to choose which assumption we want to validate first, to determine which one we need to investigate. But which one should we investigate first?</p><p>That choice is simple: use Occam&#8217;s razor, and investigate the possibility with the fewest assumptions. Anything involving a PC is orders of magnitude more complicated than a network device, let alone one of the dumbest network devices on the planet. And yeah, there&#8217;s some low hanging fruit on Wireshark, but there are a million thing that could go wrong there. Driver error, usbpcap failure, OS failures, misconfigurations, promiscuous mode not enabled, all sorts of stuff. But the network is simple and these hubs are simple so we should look at the hubs because either we will find our answer quickly or we will eliminate them quickly.</p><h1>We Looked At The Hubs</h1><p>As it turns out, an enterprising user in the replies looked up the manual for the hub in question and found what the colors of the lights mean for it. There was a yellow light on the port, which if you consult the user manual for the device, indicate the port has been partitioned (separated for excessive collisions etc), and thus was not forwarding. So a storm had started, immediately created collisions, and been shut down by partitioning. Did you know that was a thing? Who among us has used a hub recently? Did anyone recognize the yellow light or remember that port partitioning existed, or that collisions would need to be handled? I didn&#8217;t, but <a href="https://www.manualslib.com/manual/472543/Netgear-Fe104-Hub.html?page=15#manual">if you check the manual</a>, it&#8217;s right there.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WCih!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WCih!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 424w, https://substackcdn.com/image/fetch/$s_!WCih!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 848w, https://substackcdn.com/image/fetch/$s_!WCih!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 1272w, https://substackcdn.com/image/fetch/$s_!WCih!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WCih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png" width="1200" height="622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/defa890b-8b00-4017-b02c-57605da65257_1200x622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:622,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66205,&quot;alt&quot;:&quot;Manual page showing yellow lights means partitioning and collisions&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Manual page showing yellow lights means partitioning and collisions" title="Manual page showing yellow lights means partitioning and collisions" srcset="https://substackcdn.com/image/fetch/$s_!WCih!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 424w, https://substackcdn.com/image/fetch/$s_!WCih!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 848w, https://substackcdn.com/image/fetch/$s_!WCih!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 1272w, https://substackcdn.com/image/fetch/$s_!WCih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdefa890b-8b00-4017-b02c-57605da65257_1200x622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the brief few seconds we saw the network devices, we could see two things.</p><ol><li><p>The ports themselves weren&#8217;t blinking with a lot of traffic</p></li><li><p>The ports had a secondary yellow light</p></li></ol><p>Now, you could write the not-blinking off as &#8216;the storm hasn&#8217;t started yet&#8217;, which might be reasonable in the video because they usually take a little bit to get going, but ultimately &#8220;port is partitioned&#8221; explained everything, and we never had to dig into the complex option of &#8220;what if Wireshark is lying to me?&#8221;</p><p>When dealing with possibility space division, simplicity is your friend, and speed of fork elimination is your other friend. This goes double during an outage.</p><h1>Why Does This Matter?</h1><p>Quite frankly, it matters because some of you are very, very bad at troubleshooting. </p><p>One time in recent history, a Computer Science Fundamentals course instructor I came across was having trouble with his web server. He was Not A Web Guy and got stuck quickly. He should have realized very quickly where his problem was, because all the information he needed was available, and he was continuing to attempt to re-check things that he had already validated. He was not respecting the fork, he wasn&#8217;t tracking what he&#8217;d validated, and so he wasted an entire day chasing the problem.</p><p>If you know anything about the internet, you know that a working website depends on a handful of things.</p><ol><li><p>A domain name pointing to an IP address</p></li><li><p>IP traffic being able to be routed to that IP address</p></li><li><p>Clients being able to look up that domain name and resolve the IP address</p></li><li><p>Clients being able to craft a HTTP request, and send it to that IP address</p></li><li><p>Those requests may need to be routed to the IP (load balancer, application layer firewall, etc)</p></li><li><p>A process on a server somewhere listening on a port must receive that request.</p></li><li><p>That request needs to be processed by the service process and then Stuff Happens to look up what the contents of the web page must be and return it</p></li></ol><p>Our instructor could ping the server by its DNS name, via a command like <code>ping mycompscicourse.com</code> and get responses back. This proves without a doubt two things:</p><ol><li><p>DNS is working. It was successfully resolving the IP address of the domain name.</p></li><li><p>Layer 3 (IP address) is working. Ping was successfully arriving on that IP and it was replying.</p></li></ol><p>At this stage, he should have been looking further down the stack of things that need to happen. The correct next step is to try to connect to the server by DNS name on the appropriate port and see if it worked.</p><p>If it did, then we can move further down and investigate the server process.</p><p>If it didn&#8217;t, then we need to validate that HTTP requests can reach the server.</p><p>However, he didn&#8217;t attempt to validate those. He wasn&#8217;t scientific about it, and didn&#8217;t bother to think through that he had actually validated DNS and IP already. This man wasted hours messing around with DNS configurations and all sorts of other things, but his initial testing had already validated DNS. He was re-investigating things that should have been cleared.</p><p>If it&#8217;s this easy for an <em>instructor</em> to fuck up, you better believe we&#8217;re all capable of it if we&#8217;re not tracking the depth and forking of our troubleshooting, or the assumptions that we&#8217;re making.</p><h1>Your Tools Can Lie</h1><p>The other reason that this is important is that there is a moment some time right before you become a senior where you realize that all your evidence for anything is based on assumptions and we all stand on the shoulders of giants.</p><p>When I was a Network Engineer, I got called out at 3am for a network that was down. I logged into the router and there was no evidence it was actually down except for the fact that it was definitely down. Every single tool reported that it should have been working. The one thing that stood out was that the CPU was kind of high, but the CPU on that router was kind of shitty so that wasn&#8217;t abnormal.</p><p>So, I began eliminating things and validating my assumptions. The routing table correctly showed that the internet was reachable out the Internet port and my customer was available out of the customer port. But no matter what I did, I couldn&#8217;t get ping responses through it. I wanted to reboot it, but it was carrying critical traffic for another customer and the provider said no. Fortunately, I carried a tool for these situations - a tiny but full-featured ethernet router, a Mikrotik RB750GL.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xCNT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xCNT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 424w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 848w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 1272w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xCNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png" width="1456" height="1272" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1272,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1914403,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xCNT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 424w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 848w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 1272w, https://substackcdn.com/image/fetch/$s_!xCNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20b14c13-bd25-4417-b3f2-ea78df8196e7_1656x1447.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I configured it as a packet sniffer to aggregate the inbound and outbound traffic into a single port and send them to my laptop where the awaiting Wireshark would be able to show me what was really happening. I set up another laptop nearby and started generating traffic so I could 100% confirm that traffic I was sending was traversing the router and coming out the other side.</p><p>Friends. It was not coming out the other side. It went out a different interface entirely. I sat baffled by a router that clearly said route X was going out interface A, but I could see it coming out interface B. So, first a few facts:</p><ol><li><p>The customer&#8217;s network could definitely not reach the Internet or vice versa</p></li><li><p>The router&#8217;s software reported correct routes for both customer and Internet</p></li><li><p>Packets traversing the router did not follow those routes</p></li></ol><p>So, back to the possibility spaces. Either:</p><ol><li><p>The router is telling the truth</p></li><li><p>Or it isn&#8217;t, and it needs to be rebooted or replaced</p></li></ol><p>Possibility space 2 is bad, interruptive, and at worst case, expensive, so let&#8217;s start with possibility space 1. &#8220;We know the routing table is wrong&#8221; is low hanging fruit, but we need to be precise with language here. </p><p>What we actually know, is that the output of &#8220;show ip route&#8221; doesn&#8217;t match the observed flow of packets. How could that happen? Where does &#8220;show ip route&#8221; gets information from, and how do packets actually traverse the router?</p><p>There lay the answer. This was a hardware accelerated router. Although it relied on its CPU to learn about routes and configuration, the actual packet forwarding happened in hardware. The process went something like this:</p><ol><li><p>A route is learned or configured in software</p></li><li><p>The routing table (RIB) is populated with that entry and a destination</p></li><li><p>The in-hardware forwarding table (FIB) that actually passes the packets around receives messages about RIB updates that tell it how to configure the actual forwarding</p></li></ol><p>So I queried the FIB, and sure enough, there were the entries that were punting all our client&#8217;s packets out the wrong interface. But then something jumped out at me - a single line in the output that said something like:</p><p><code>Queued updates: 51,239</code></p><p>I hit the command again and the number decreased slightly. Why would there be 50k+ queued updates? I went back to the logs again and found the source of all our woes - the internet link had been flapping furiously over the night. Up, down, up, down. Someone had likely disturbed a cable, so it would start and stop working over and over again. Problem was though, this was a BGP connection - it worked by sending the router instructions for how to reach every single network on the internet. At the time, the full global routing table was around 500,000 prefixes (destinations). Because of the magnitude of this kind of change, usually connections like this have some configuration on them to stop flapping from affecting them. This one didn&#8217;t. So when the internet connection started going up and down over and over, our poor little router was receiving an entire internet&#8217;s worth of destinations, then being told &#8220;oops no destinations, delete everything I just sent you&#8221;, then milliseconds later, an entire Internet&#8217;s worth of update again. This happened ~100,000 times, leaving our poor, tiny, underpowered router CPU with a queue of fifty billion route updates to process.</p><p>A few more refreshes and we could see the queue decreasing enough that napkin math said it would fix itself in 4 hours. I hacked up a workaround using the Mikrotik router, then came back in the afternoon to pick it up when the queue had emptied, and all was fine.</p><p>When I observed the RIB, I wasn&#8217;t looking at where the packets were going. I was looking at where the software intended them to go. It wasn&#8217;t until I looked at the FIB that I could see where the packets were actually going. Now most of the time, the RIB and FIB are in sync and that&#8217;s not an issue, so looking at the RIB as a <strong>proxy</strong> for the FIB is usually fine. Today it wasn&#8217;t. Every tool is querying something to get its information, and that query works in a particular way. Many of those ways can be broken, and choosing to ignore the ways in which they can break are the assumptions that we make our decisions on.</p><h1>What Did We Learn?</h1><p><strong>Lesson 1: By separating the possible failure conditions into binary tree spaces we can prune branches of troubleshooting and save a lot of time.</strong></p><p><strong>Lesson 2: Understand the difference between information and a proxy for information.</strong></p><p>My first thought was that the command &#8220;show ip route&#8221; lied to me. But it didn&#8217;t, not really. Through force of habit (and the fact that it&#8217;s usually true) I expected the output of the RIB to match how packets were forwarded, but that was an assumption on my part. It&#8217;s one that&#8217;s usually correct, but that day it wasn&#8217;t, and if I hadn&#8217;t been able to identify and interrogate that assumption, I would have never solved the issue.</p><p>I believed &#8220;show ip route&#8221; was showing me the way that packets would flow through the router, but it was a proxy for that - it sat upstream of the thing that actually did the forwarding.</p><p>Best of luck in your troubleshooting.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Getting Started With Unreal Engine 5 For Developers, Part 1: Building Blocks]]></title><description><![CDATA[Everything you need to know to get started in UE5.]]></description><link>https://loadbearingtomato.com/p/getting-started-with-unreal-engine</link><guid isPermaLink="false">https://loadbearingtomato.com/p/getting-started-with-unreal-engine</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Wed, 21 Aug 2024 16:03:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sBTy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In a world where it&#8217;s increasingly difficult to make a game, more studios are looking towards premade engines to get a head start. As Unity shoots itself in the foot repeatedly, Epic Games is going from strength to strength with <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-5-4-documentation">Unreal Engine 5</a>. If you&#8217;ve looked for a games job recently, you&#8217;ve probably seen more positions listing UE5 experience than at any time in the past.</p><p>Most of you have probably tried to follow an Unreal tutorial before and never really quite understood what was happening. </p><p>The issue with Unreal tutorials is that in order to learn to be functional quickly for the reward, they give you a hammer. After that, every problem looks like a nail. In reality, there&#8217;s an entire toolbox that&#8217;s equally accessible, but unless they know what else is in there, people keep reaching for the hammer.</p><p><strong>This is not a tutorial</strong>. It is a guided reference. It&#8217;s not intended to be memorized, it&#8217;s intended to be read at a high level, and referred back to as you need it.</p><p>What follows is a structured walk-through of what the tutorials don&#8217;t tell you about the things they get you to do, so that when you <em>do</em> follow a tutorial or try to build something, you understand the correct techniques to use, and where to use them.</p><p>In this part, we discuss the building blocks and how to use them.</p><p>In the next article, we&#8217;ll talk about how they all fit together in a game and go over common techniques and strategies for how to perform common tasks.</p><p>If I get enough questions about the first two parts, I&#8217;ll do a FAQ.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This method of learning UE5 <em>works</em>. I&#8217;ve brought developers up to speed and functional on various titles using this technique. We&#8217;re only dealing with Blueprint here. A lot of C++ exists underneath the Blueprint, but it&#8217;s beyond the scope of this primer. </p><p>I&#8217;m going to be using screenshots and examples from an old prototype of mine called THREADS, which looks <em>suspiciously</em> like single-player cyberpunk League of Legends.</p><h1>The Basics</h1><h2>Actors and Components</h2><p>The basic building blocks in Unreal are Actors, and Components.</p><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/actors-in-unreal-engine">Actors</a></strong> are the main building blocks of your game, and like most things in UE5 they are objects, in the <a href="https://en.wikipedia.org/wiki/Object-oriented_programming">Object Oriented Programming sense</a>. They exist in the game world somewhere - they have a <code>Transform</code> (location + rotation) in 3D space. Your player character, your NPCs, trees, even the ground itself, are all <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-actors-reference">types of Actors</a>.</p><p>This is an <code>Actor</code> (<code>BP_Enemy</code>).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sBTy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sBTy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 424w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 848w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 1272w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sBTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png" width="1456" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1639781,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sBTy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 424w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 848w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 1272w, https://substackcdn.com/image/fetch/$s_!sBTy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5fc618c-88f1-4e97-abc9-18ebaa72fdcf_2431x996.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/components-in-unreal-engine">Components</a></strong> are things that attach to Actors to provide specific functionality. When you add a component to an Actor in the Editor, it becomes attached, and follows the <code>Actor</code> around. These are some of the components attached to <code>BP_Enemy</code>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hguy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hguy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 424w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 848w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 1272w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hguy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png" width="1456" height="646" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:646,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1940659,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hguy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 424w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 848w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 1272w, https://substackcdn.com/image/fetch/$s_!Hguy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000c823e-feda-4c58-9790-9adc03c10fc1_2474x1097.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Where to start building</h2><p>If you&#8217;ve ever programmed anything, you know that you don&#8217;t want to write the same code twice. You want to write it once, then call that code when you need it, like with functions. The first thing you need to decide is where you want that code to live. Let&#8217;s start with something simple you&#8217;ve seen before. THREADS has combat, so I need to a place to store HP information, and to display a health bar. This needs to happen for the player, for enemies, and for destructible objects. I don&#8217;t want to write this code on the player, and every enemy. Instead, I make a <code>Component</code> for Health.</p><h3>The Health_Component</h3><p>Anything in THREADS that takes damage has a <strong>Health Component.</strong> It serves four purposes:</p><ul><li><p>Stores the max HP and current HP</p></li><li><p>Displays a health bar, colored for team</p></li><li><p>Receives notification of taking damage (or healing) from the <code>Actor</code> it&#8217;s attached to</p></li><li><p>Notifies the Actor when it is out of health, so it knows to die</p></li></ul><p>By putting this functionality in a <code>Component</code>, I can add the concept of Health and all the associated functions to support it to any <code>Actor</code> in the game. I just need to put code on the <code>Actor</code> to tell the <code>Health Component</code> when damage was taken, and code to program what happens when it dies. Even if different <code>Actor</code>s have different ways of receiving damage and do different things when they die, the health itself remains managed in the component.</p><p>But I also don&#8217;t want to have to write code over and over on every <code>Actor</code> to take damage, send it to the <code>Health Component</code>, and receive Death notifications. So what should I do? This is where Inheritance comes in.</p><h3>Inheritance</h3><p>Let&#8217;s say I want to create Enemies in the game. If I used an entirely separate <code>Actor</code> every time, I&#8217;d have to program the same interactions over and over. To avoid that, Unreal makes use of a common programming technique called <strong>Inheritance.</strong></p><p>Inheritance lets you add a new type of <code>Actor</code> as a child of a different type, called the Parent. Child classes have all the variables and code of their parent, but let you either <em>extend</em> the class by adding new variables and code, or <em>override</em> it by changing the implementation of the same code.</p><p>So, rather than building entirely new class for every enemy, I create a basic, generic enemy class called <code>BP_Enemy</code> and put a <code>Health_Component</code> on it. Unreal has a native concept of Damage, so the base class has an event &#8220;<code>AnyDamage</code>&#8221; that fires when it takes damage. So, when any damage occurs, we notify the <code>Health Component</code>, and play Damage Animation.</p><div class="pullquote"><p><strong>Events</strong> are functions that are triggered when a particular thing happens. They&#8217;re a safe way to inform other objects that something happened, and let them take action on it if they want.</p><p>In Blueprint, the <strong>White wires represent the flow of execution</strong> between nodes (functions), and the <strong>colored wires pass variables between nodes</strong>. Pins on the left of a node are inputs, and on the right are outputs. Drag variable connections between an input and an output to pass them.</p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8nlr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8nlr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 424w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 848w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 1272w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8nlr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png" width="804" height="337" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:337,&quot;width&quot;:804,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8nlr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 424w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 848w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 1272w, https://substackcdn.com/image/fetch/$s_!8nlr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92ffb856-b33e-48cd-b225-a4f5772caa4c_804x337.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I actually called the Health Component &#8220;Take Damage&#8221;.</figcaption></figure></div><p>Then, when I want to create a specific <em>type</em> of enemy - let&#8217;s say an Orc. <code>BP_Enemy</code> is a child class of Actor, so I&#8217;ll make a new child class of <code>BP_Enemy</code> called <code>BP_Enemy_Orc</code>. The resulting class has all the functions and variables for an Actor, plus the ones I added in <code>BP_Enemy</code>, plus any new ones I add for directly to the Orc. I can change also specific properties/variables that were set on <code>BP_Enemy</code>, like a new Max HP value on the component, replace the <code>Actor</code>&#8217;s Mesh with a new Orc model, and replace the Damage animation with one designed for Orcs. I repeat this process for every new kind of Enemy, just changing the parameters I need to be different, but with all the base variables and functions intact.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZEZA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZEZA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 424w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 848w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 1272w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZEZA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png" width="1248" height="421" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:421,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61410,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZEZA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 424w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 848w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 1272w, https://substackcdn.com/image/fetch/$s_!ZEZA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c05289f-611d-410f-9e04-bfa0bb46a9bc_1248x421.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Now we have a base class of Enemy that we can build different types of Enemy from, and a <code>Health Component</code> we can put on anything that needs HP.</p><blockquote><p><strong>Key takeaway:</strong></p><ul><li><p><strong>To put different behaviors/data in objects that are similar, use child classes. </strong>E.g. I want to make ten different kinds of Enemy.</p></li><li><p><strong>To put the same behavior in objects that are different, use components. <br></strong>E.g. I want to add Health to Enemies, Players, and Obstacles.</p></li></ul></blockquote><div class="pullquote"><p>Almost everything in Unreal inherits from something else. All actors inherit from AActor. All objects (including Actors) inherit from UObject. Almost everything you make in Unreal will inherit from some other class.</p><p>Even components can be children of another component class. They inherit from UActorComponent, and can be extended and overridden the same way.</p><p>Inheritance is also how Unreal&#8217;s C++ works to provide Blueprint classes. You can make classes in C++ and then make a child class from it in Blueprint to get it in the Editor.</p></div><p>Final note on adding how Actors and Components work: Every variable or function can be public or private, which determines whether it can be accessed from inside your Blueprint, or whether other Blueprints can access it. If you add a variable to your Actor or Component but can&#8217;t access it elsewhere in the code, check its visibility.</p><h1>How Stuff Works</h1><p>We started with <code>Actors</code> and Components because they&#8217;re the basic building blocks. Next, you need to actually write code in them. </p><h2>Places You Can Write Code</h2><p>There are four main ways that code executes in Unreal: <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/functions-in-unreal-engine">Functions</a>, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/event-dispatchers-in-unreal-engine">Events</a>, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/using-timers-in-unreal-engine">Timers</a>, and <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/actor-ticking-in-unreal-engine">Tick</a>. We&#8217;ll approach them in that order.</p><h3>Functions</h3><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/functions-in-unreal-engine">Functions</a> are a way to group a chunk of reusable code together that can be called on demand rather than rewriting it every place you need it. Functions can have inputs (arguments) and outputs (return values), but they don&#8217;t have to have either. </p><p>Here&#8217;s a function in THREADS with one argument, and no return value. It gets called when an Actor enters firing range, and the argument is a reference to that Actor called &#8220;Target Entering&#8221;. It checks if it&#8217;s targetable, then checks if it&#8217;s currently targeted, and if yes to both, alerts the Player Controller that it&#8217;s fine to start attacking.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I9bE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I9bE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 424w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 848w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 1272w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I9bE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png" width="1456" height="287" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:287,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157690,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!I9bE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 424w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 848w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 1272w, https://substackcdn.com/image/fetch/$s_!I9bE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F024c34ae-ca9b-4241-bdb9-b5efa05ef54b_1654x326.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><blockquote><p><strong>Key takeaway:</strong></p><p><strong>Use Functions when you need to execute the same code a number of times inside the same Blueprint.</strong> </p></blockquote><p>In Blueprint, functions are <strong>guaranteed</strong> to return on the same frame. This means you can&#8217;t use <code>Delay</code> nodes in them, because it would delay the <em>entire</em> current frame. So what do you do when you need to run code, but don&#8217;t need to wait for it to finish? </p><h3>Events</h3><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/event-dispatchers-in-unreal-engine">Events</a> (also called <a href="https://benui.ca/unreal/delegates-intro/">Delegates</a>) are asynchronous - fire and forget functions that won&#8217;t blow things up if the listening object goes away.</p><p>When you want to trigger actions on one or more objects in response to something happening, you probably want Events. All Unreal <code>Actors</code> have a tonne of Events built in from <code>AActor</code>. One that you&#8217;ll see frequently is <strong>&#8220;</strong><code>Begin Play</code><strong>&#8221;</strong>. It&#8217;s fired when an actor finishes spawning in the level. Here&#8217;s one for an enemy <code>Actor</code>. When it triggers, it sets the enemy&#8217;s team to Hostile, creates a health bar, and adds it to the enemy <code>Actor</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k9kl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k9kl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 424w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 848w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 1272w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k9kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png" width="1456" height="339" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:339,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:126892,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k9kl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 424w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 848w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 1272w, https://substackcdn.com/image/fetch/$s_!k9kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f6af8a9-d3e0-4172-99e7-3ff1c679c05c_1487x346.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Here&#8217;s another common pair: <strong>&#8220;On [Actor/Component] Begin Overlap&#8221;</strong>, which basically means &#8220;something else touched me&#8221;, and then <strong>On End Overlap</strong> for the opposite (that thing is no longer touching me). They&#8217;re generally used to trigger interactions between different Actors. Events can have arguments passed to them like functions - in this case, <strong>BeginPlay</strong> has no arguments, but when <strong>Overlap</strong> fires, it&#8217;ll pass in information about the overlap itself. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6AC8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6AC8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 424w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 848w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 1272w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6AC8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png" width="919" height="590" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:919,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:127469,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6AC8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 424w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 848w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 1272w, https://substackcdn.com/image/fetch/$s_!6AC8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91e8da06-9eb2-4123-92a8-8fa6b6dd1568_919x590.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These are Overlap Events from a <code>Collision Sphere</code> called &#8220;Interact Radius&#8221; on the <code>Player Character</code>. Collision volumes exist to identify when things collide, and"Begin Overlap&#8221; fires when something overlaps with it. When that happens, it calls the function &#8220;On Enter Interact Range&#8221; which enables interaction with another object in the game.</p><blockquote><p><strong>Key Takeaway:</strong></p><p>Use Events when you need to trigger code, but don&#8217;t need to wait for it to finish.</p></blockquote><p> You can also trigger Events asynchronously on a delay using..</p><h3>Timers</h3><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/using-timers-in-unreal-engine">Timers</a> do stuff after a delay. They return an object called a Timer Handle that holds information about the timer, like how much time is left. You can also do things like terminate early and do the stuff, or just kill it and do nothing.</p><p>Here&#8217;s an example of using Timers to make a weapon reload. The &#8220;Start Reload&#8221; event:</p><ol><li><p>Sets &#8220;Attack Available&#8221; variable to false, locking you out of shooting.</p></li><li><p>Starts a timer with length Reload Time. The event pin for the timer connects to the &#8220;Finish Reload&#8221; event.</p></li><li><p>When the timer expires, the &#8220;Finish Reload&#8221; event fires.</p></li><li><p>Sets current ammunition amount to the max size of the magazine</p></li><li><p>Then finally, re-enables Attack Available.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oprg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oprg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 424w, https://substackcdn.com/image/fetch/$s_!oprg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 848w, https://substackcdn.com/image/fetch/$s_!oprg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 1272w, https://substackcdn.com/image/fetch/$s_!oprg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oprg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png" width="969" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:969,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140679,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oprg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 424w, https://substackcdn.com/image/fetch/$s_!oprg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 848w, https://substackcdn.com/image/fetch/$s_!oprg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 1272w, https://substackcdn.com/image/fetch/$s_!oprg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f677d6e-339c-432c-9dea-c095d1eae140_969x533.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Tick</h2><p>Events: &#8220;A thing happened, let&#8217;s do stuff&#8221;. But what about things you want to be constantly updated? You use <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/actor-ticking-in-unreal-engine">Tick</a>.</p><p>Every <code>Actor</code> and <code>Component</code> has a <code>Tick()</code> function that, if enabled, runs every frame (sort of). Use it for anything you need to be calculated or updated every frame. </p><p>The Unreal Top Down Example project&#8217;s <code>Tick()</code> function to get the mouse cursor&#8217;s position, raycast down into the world, and render a decal on the ground underneath it.</p><p> In THREADS, there&#8217;s a particular component that I want to always be facing the camera. The tick code runs every frame to rotate it with <code>Set World Rotation()</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zfOr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zfOr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 424w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 848w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1272w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png" width="1309" height="479" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:479,&quot;width&quot;:1309,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zfOr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 424w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 848w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1272w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can also set the tick time to be slower, on an interval. If it&#8217;s not important that it happens <em>immediately</em> but is important that it happens <em>constantly</em>, you can set an Actor&#8217;s tick to happen at longer delays. If I have a system that&#8217;s constantly changing the time of day and adjusting the sun position and lighting, it might need to only run every five seconds, so I&#8217;d set the tick time to 5.</p><p>Tick is great, because it means things can be always updating themselves. However, Tick can also be bad, because again, the code will run <em>every frame</em>. Executing unnecessary or expensive code on Tick every frame is the fastest way to slow your game down. There&#8217;s a function &#8220;Get All Actors&#8221; which just &#8230; lists every actor in the game. There&#8217;s actually a warning on it that says &#8220;DO NOT CALL THIS ON TICK&#8221;. Yes, it&#8217;s in capital letters.</p><blockquote><p><strong>Key Takeaway:</strong></p><ul><li><p><strong>Use the On Tick function for things that must update constantly.</strong></p></li><li><p><strong>All Actors and Components can Tick</strong>.</p></li><li><p><strong>You can tick at a larger interval instead of every frame.</strong></p></li><li><p><strong>Also you can disable or enable Tick for any Actor or Component as needed.</strong></p></li><li><p><strong>A Component cannot tick if the Actor it is attached to has Tick disabled.</strong></p></li></ul></blockquote><p>More info in the docs on <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/actor-ticking-in-unreal-engine">Actor Ticking</a>.</p><p>So now we&#8217;ve got four methods of executing code. Where do we put that code?</p><h1>Tools</h1><h2>Pawns and Controllers</h2><p>A <strong>Pawn</strong> is an <code>Actor</code> that&#8217;s controlled by a <strong>Controller</strong> to make it do things. The Controller allows your game to issue commands to Actors, like &#8220;Move in this direction&#8221; or &#8220;Stop&#8221; or &#8220;Walk to this location&#8221;. </p><p>A <code>Controller</code> can take commands directly from code, but there are also two special kinds of controllers: <strong>Player Controllers</strong> and <strong>AI Controllers</strong>. They&#8217;re both children of the Controller class, and extend it in different ways.</p><p>A <code>Player Controller</code> receives inputs from the player (key presses, mouse, etc) and translates them into specific directions it can pass to the Pawn. It&#8217;s preconfigured with the inputs you configured for your project like mouse, gamepad buttons, or key presses.</p><p>An <code>AI Controller</code> has a bunch of tools on it for making AI for NPCs, like <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/behavior-tree-in-unreal-engine---quick-start-guide">Behavior Trees</a>, that let you program rules for how the Pawn should behave.</p><p><code>Pawns</code> don&#8217;t do a whole lot on their own. The code on the base <code>Pawn</code> class is mostly about taking commands. If you want an actual NPC in your game, there&#8217;s a child class called <strong>Character</strong> that has all the stuff you probably want.</p><ul><li><p>A <code>Mesh</code>, so it has a 3D model to display and animate.</p></li><li><p>A <code>Movement Component</code> that controls walking, running, falling, etc.</p></li><li><p>A <code>Capsule Component</code> for collision.</p></li><li><p>A bunch of networking / multiplayer code.</p></li></ul><p>That&#8217;s everything you need for an NPC, but a player-controlled character is going to need more. There&#8217;s a <strong>Player Character</strong> class that adds things like:</p><ul><li><p>Input from a <code>Player Controller</code></p></li><li><p>A <code>Camera Manager</code> for controlling the viewport</p></li><li><p>A UI / HUD Overlay</p></li><li><p>Force Feedback effects</p></li></ul><blockquote><p><strong>Key takeaway:</strong></p><ul><li><p><strong>A Pawn is an Actor controlled by a Controller</strong></p></li><li><p><strong>AI Controllers control Characters</strong></p></li><li><p><strong>Player Controllers control Player Characters</strong></p></li><li><p><strong>Create child classes of Character for NPCs</strong></p></li><li><p><strong>Create child classes of Player Character for players</strong></p></li><li><p><strong>Create a child class of Player Controller to customize input handling</strong></p></li></ul></blockquote><p>When a <code>Controller</code> takes control of a <code>Pawn</code>, this is called &#8220;possessing&#8221; it, which is definitely not creepy at all.</p><p>For more info, check out docs for <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/playercontroller?application_version=4.27">Player Controller</a> and <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/pawn?application_version=4.27">Pawn</a>.</p><p>If you want more info on how input is handled in UE5, try <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine">Enhanced Input</a>.</p><h2>Collision &amp; Traces</h2><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/setting-up-collisions-with-static-meshes-in-unreal-engine">Collision</a> is a means of checking if an <code>Actor</code> touched another <code>Actor</code>. There are two types of collisions available: <strong>Hits</strong> (blocking) and <strong>Overlaps</strong> (non-blocking). </p><p>An <code>Actor</code> has a collision <strong>Object Type</strong> - other types of <code>Actors</code> then configure how they should respond to collisions for that object type, and whether they should ignore them, fire an Overlap event, or block (collide) and generate a Hit event.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PKcd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PKcd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 424w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 848w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 1272w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PKcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png" width="846" height="957" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:957,&quot;width&quot;:846,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59720,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PKcd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 424w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 848w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 1272w, https://substackcdn.com/image/fetch/$s_!PKcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6397e2e3-2860-4a63-b275-113c3b87a3f3_846x957.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><strong>Use Collision to configure what kinds of </strong><code>Actors</code><strong> should pass through each other unnoticed, what should overlap, and what should stop. You might use Collision object types to let friendly fire pass through teammates, but hit enemies.</strong></p></blockquote><p>You can also do<strong> Traces</strong>, to check what something <em>might</em> run into. You can trace in a line, or in a shape, like a box. Traces occur on <strong>Collision Channels</strong> and instruct <code>Actors</code> on how they should respond to a particular type of trace.</p><blockquote><p><strong>Use Traces to measure what you might hit in a particular direction. You might use Traces to tell if there are interactable objects in your field of vision.</strong></p></blockquote><p>Collision is what triggers <code>Events</code> like the one I&#8217;m going to reference next, for one <code>Actor</code> overlapping another.</p><p>But when you test Collision, the function returns an <code>Actor</code> reference. You don&#8217;t know what the collided object is yet, so how do you find out, and do stuff relevant to it?</p><h2>Casting</h2><p>The answer is <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/casting-quick-start-guide-in-unreal-engine">Casting</a>. This one&#8217;s a bit complicated, and deals with Inheritance again.</p><p>In THREADS, items that can be picked up inherit from a base Pickup class, which inherits from <code>Actor</code>. An Ammo pack&#8217;s inheritance goes:</p><p><code>Actor</code> &#8594; <code>BP_Pickup_Base</code> &#8594; <code>BP_Pickup_Ammo</code></p><p>In the below code, I have an event that fires when any <code>Actor</code> enters an automatic pickup radius around the player. We want to pick up anything we have inventory space for, and show a warning instead if it&#8217;s full.</p><p>But you need to declare types of variables on functions and events, and the overlap function needs to return any <code>Actor</code>, so its output type is set to <code>Actor</code>.</p><p>We can pick up anything that inherits from <code>BP_Pickup_Base</code>, and the <code>Actor</code> we overlapped might be, but there are two problems:</p><ol><li><p>We don&#8217;t know if it IS a child of <code>BP_Pickup_Base</code>.</p></li><li><p>Even if it is, we can only access the properties of the <code>Actor</code> class, because that&#8217;s the <strong>Type</strong> we were given for this object reference. We can&#8217;t access the variable for how many inventory slots it takes up because we&#8217;re looking at it through a base <strong>Type</strong> lens.</p></li></ol><p><strong>Casting</strong> lets us solve both these problems at once by trying to treat the object as a different type.</p><p>An object reference&#8217;s class (type) is what lets Unreal know what variables and functions exist on an object, and where to find them. Our child class <code>BP_Pickup_Base</code> has an Inventory Slot Cost variable, but since the reference is currently of type <code>Actor</code>, we can&#8217;t see it. So we attempt to <strong>Cast</strong> our <code>Actor</code> to <code>BP_Pickup_Base</code>.</p><p>If it works, then it is a <code>BP_Pickup_Base</code> or a child of it, and then we can access the variables stored on <code>BP_Pickup_Base</code>, including the one we need: &#8220;Inventory Slot Cost&#8221;.</p><p>Since we now know that it is a pickup, we can retrieve the inventory slot cost and we can tell if we have enough inventory space for it and figure out whether to pick it up or just show a warning that inventory is full.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W3yu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W3yu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 424w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 848w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 1272w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W3yu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png" width="1456" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!W3yu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 424w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 848w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 1272w, https://substackcdn.com/image/fetch/$s_!W3yu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db06b10-9b67-479d-b419-a6ef28231c02_1552x448.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The object <em>always was</em> a <code>BP_Pickup_Ammo</code> - it was just originally referred to as an <code>Actor</code>, and then cast to <code>BP_Pickup_Base</code>. You could cast it to <code>BP_Pickup_Ammo</code>, or back to <code>Actor</code>, and it would work. The object itself remains unchanged, but the variables you could access would be different, because the type instructs how to access them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oH5I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oH5I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 424w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 848w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 1272w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oH5I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png" width="1434" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:1434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137977,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oH5I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 424w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 848w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 1272w, https://substackcdn.com/image/fetch/$s_!oH5I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14efacea-05fc-4f2c-a649-7c3dc34da55c_1434x453.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Internally, the <code>Event</code> is triggered by the <code>BP_Pickup_Ammo</code> object, but casts it to <code>Actor</code> before it fires since you need to declare the argument type when you create an event. If it didn&#8217;t, you&#8217;d need a separate event for every different child class of <code>Actor</code> you might overlap.</p><p>It&#8217;s kind of like a template for a business listing on Google. If a business is a restaurant, and Google has menu data for it, it will display that on the profile. But if the template for the profile is set to a generic business listing, even if Google has the menu data, there&#8217;s nowhere in the UI for it to display.</p><p>You will primarily use casting in two situations, both because generic functions/events tend to return base class type references.</p><ol><li><p>An overlap or collision event returns an <code>Actor</code> reference, which we may want to do something with, so we cast it to a type to do something.</p></li><li><p>A generic function like <code>Get Player Controller</code> returns the base Unreal player controller class, but if we&#8217;ve extended it to our own <code>Player Controller</code> class and are using it, we need to cast the returned player controller to our class to get access to the extra stuff on it. In the function we saw earlier, I get the player controller and Cast it to our actual player controller class <code>TopDownController</code>.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WlA_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WlA_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 424w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 848w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 1272w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WlA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png" width="1456" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:187405,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WlA_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 424w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 848w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 1272w, https://substackcdn.com/image/fetch/$s_!WlA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F490500f7-0f9b-4a69-be00-54778dd419ff_1594x283.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can cast an object to any type in its inheritance chain. Don&#8217;t worry, this is as Programmer as it gets, and there&#8217;s more info in the <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/casting-quick-start-guide-in-unreal-engine">Cast documentation</a>. </p><p>But what if you want to call the same function on two objects that don&#8217;t have a shared parent? There&#8217;s a tool for that called..</p><h2>Interfaces</h2><p>We talked about when you want similar objects to have different behaviors, and when you want different objects to have the same behaviors, but what if you want different things to react differently to the same interaction?</p><p>That&#8217;s what <code>Interfaces</code> are for. An interface is a virtual set of functions that you can apply to any object that give other objects a defined way to interact with them.</p><p>In THREADS, &#8220;Interact&#8221; does different things depending on what the object is. If it&#8217;s a person, it&#8217;ll start a conversation. If it&#8217;s an item, it will pick it up. To achieve this, we create an &#8220;Interact&#8221; interface, and define functions on it for <code>Interaction Start</code> and <code>Interaction End</code>, then add that interface to my <code>Pickup</code> base class and my <code>NPC</code> base class.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fHJb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fHJb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 424w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 848w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 1272w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fHJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png" width="1044" height="620" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ff07282-1f80-4545-b020-138723e497e4_1044x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:620,&quot;width&quot;:1044,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60051,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fHJb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 424w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 848w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 1272w, https://substackcdn.com/image/fetch/$s_!fHJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ff07282-1f80-4545-b020-138723e497e4_1044x620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note: One argument for &#8220;Initiator&#8221; to track what actor initiated the interaction, since enemy AI NPCs can also interact.</figcaption></figure></div><p>On the Pickup base class, I implement the Start Interaction function from the Interact interface, and write code to call the inventory pickup logic, and updates any quests that are listening that have a &#8216;pick up this thing&#8217; task.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9ECu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9ECu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 424w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 848w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 1272w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9ECu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png" width="896" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:896,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163455,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9ECu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 424w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 848w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 1272w, https://substackcdn.com/image/fetch/$s_!9ECu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce70f6bc-ead0-4c9b-ab7c-99f9dc57b8ba_896x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On the NPC base class, I implement the <code>Interaction Start</code> function from the <code>Interact</code> interface, and write code to trigger the UI for dialogue. I also implement the <code>Interaction End</code> event because I need to undo stuff if the player terminates the conversation early, like reset the camera position (Set View Target).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-T4n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-T4n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 424w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 848w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 1272w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-T4n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png" width="1327" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1327,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:288019,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-T4n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 424w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 848w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 1272w, https://substackcdn.com/image/fetch/$s_!-T4n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b92ab03-8676-4aa8-b8bd-4e34e7e98bb8_1327x726.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, when an object enters the interaction radius of the Player Character, instead of checking its type, I can simply check if it implements the Interact interface, and if it does, (after some other checks) call the <code>Interaction Start</code> function.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!et_5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!et_5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 424w, https://substackcdn.com/image/fetch/$s_!et_5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 848w, https://substackcdn.com/image/fetch/$s_!et_5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 1272w, https://substackcdn.com/image/fetch/$s_!et_5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!et_5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png" width="1456" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:168733,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!et_5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 424w, https://substackcdn.com/image/fetch/$s_!et_5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 848w, https://substackcdn.com/image/fetch/$s_!et_5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 1272w, https://substackcdn.com/image/fetch/$s_!et_5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265ca157-a392-46d7-8f5d-d6580767862d_1544x399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With that final method of calling code out of the way, we can get back to types of <code>Actors</code>.</p><h2>Volumes</h2><p><strong>Volumes</strong> are three-dimensional <code>Actors</code> (usually boxes) used to alter the behavior of areas within levels. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NfFE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NfFE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NfFE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A Spatial Audio Volume. It controls sound in an area.</figcaption></figure></div><p>Unreal includes a bunch of different types that do different things:</p><ul><li><p>Triggering <code>Events</code> when you walk into them.</p></li><li><p>Blocking <code>Actors</code> from walking into them.</p></li><li><p>Changing the way a level calculates its lighting or visibility.</p></li></ul><p>Use <code>Volumes</code> any time you care whether or not any <code>Actor</code> is inside of any particular space in your game.</p><p>For more information on the kinds of <code>Volumes</code> available out of the box, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/volumes-reference?application_version=4.27">check out the official documentation</a>.</p><h2>Brushes</h2><p>The geometry of a <code>Volume</code> comes from its parent class <code>Brush</code>. Brushes are an easy way to quickly make test level geometry. They can be Additive or Subtractive, meaning they either get used to place geometry, or act as a cutout for it. I&#8217;m going to show you where to find them because it&#8217;s hard to find.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!01Ho!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!01Ho!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 424w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 848w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 1272w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!01Ho!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png" width="664" height="696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50d65723-e722-4adf-9d14-c88e21a63300_664x696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:696,&quot;width&quot;:664,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132104,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!01Ho!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 424w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 848w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 1272w, https://substackcdn.com/image/fetch/$s_!01Ho!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d65723-e722-4adf-9d14-c88e21a63300_664x696.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is an example of two box brushes. One is set to &#8220;Additive&#8221; to make the box itself and set to Hollow so it&#8217;s just the walls. The other &#8220;Subtractive&#8221; to cut a hole out of it, which is highlighted.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jhgr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jhgr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 424w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 848w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 1272w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jhgr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png" width="1456" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1930883,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jhgr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 424w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 848w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 1272w, https://substackcdn.com/image/fetch/$s_!jhgr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa451666f-7ab9-44f7-ae0e-79e29bbb4440_1623x917.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These aren&#8217;t to be used in your final game. You&#8217;ll need to convert them to&#8230;</p><h2>Meshes</h2><p>If your Actor needs a 3D model, add a <code>Mesh Component</code>.</p><p>Meshes are 3D models. There are two kinds of Mesh: <code>Static Mesh</code> and <code>Skeletal Mesh</code>. <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/static-meshes">Static Meshes</a> don&#8217;t move or animate, but <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/skeletal-mesh-assets-in-unreal-engine">Skeletal Meshes</a> have a &#8220;skeleton&#8221; (rig) that controls how they move and animate. If an <code>Actor</code> has a 3D model in the game, it probably has a <code>Static Mesh</code> or <code>Skeletal Mesh</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yRC6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yRC6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 424w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 848w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 1272w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yRC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4049228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yRC6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 424w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 848w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 1272w, https://substackcdn.com/image/fetch/$s_!yRC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40b9e79e-e96f-4d03-991e-ec21fe72b3f9_2656x1496.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A Skeletal Mesh, with its Triangles and thigh bone visible.</figcaption></figure></div><h2>Animation</h2><p>The animation rig in a <code>Skeletal Mesh</code> lets parts of it move. A particular unique animation for a rig is called a Montage. The overall animation of a <code>Skeletal Mesh</code> is controlled by an <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/animation-blueprints-in-unreal-engine">Animation Blueprint</a>, which is a tool for telling what animations should play under what conditions, control the transitions between them, and how they can be blended together. In technical terms, you can think of it like a <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/state-machines-in-unreal-engine">State Machine</a>. It represents the state of your character (walking, running, standing, falling), defines animations for each state, and configures how to transition between other states.</p><p><code>Animation Blueprints</code> allow you to blend animations together - for example, you might have one animation for Walk and one for Run. As you speed up, they will slowly mix together to create a smooth transition. This is called a <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blend-spaces-in-animation-blueprints-in-unreal-engine">Blend Space</a>.</p><p>You can also layer animations together - like playing a cheering animation with the upper body while still running. Look up <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/additive-vs.-full-body?application_version=4.27">Additive vs Full Body</a> for more info.</p><h2>Widgets / UI</h2><p>UI in Unreal is basically made up of <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/widget-blueprints-in-umg-for-unreal-engine">Widgets</a>, which are objects that render a 2D image of some sort. They&#8217;re commonly used for menus, buttons, and overlays.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wDAU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wDAU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 424w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 848w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 1272w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wDAU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png" width="1456" height="557" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:557,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:451392,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wDAU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 424w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 848w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 1272w, https://substackcdn.com/image/fetch/$s_!wDAU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3293aa39-ec4e-4f73-856b-372cc5e2e5d8_1668x638.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A dialogue widget. Also, the health bar is a widget.</figcaption></figure></div><p>Widget editing has two pages, which you swap between in the top right: Designer, and Graph. The Designer page is where you create the layout, the Graph page is where you add your code, like a regular Blueprint.</p><p>You can add them to the viewport to become part of the UI.</p><p>To use a Widget, first Create it, then either add it to the viewport (screen), or assign it to a <code>Widget Component</code> on an Actor. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6B_t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6B_t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 424w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 848w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 1272w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6B_t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png" width="1330" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1330,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122614,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!6B_t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 424w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 848w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 1272w, https://substackcdn.com/image/fetch/$s_!6B_t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76078b3a-4d25-4b5f-8d35-7c150f9e02d4_1330x578.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This one pops up a dialogue screen using a widget I made called &#8220;BPW Simple UI&#8221;.</figcaption></figure></div><p>If you want to make a popup menu or clickable UI, you&#8217;ll need to give focus to the keyboard, and set input mode to UI only.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!91Ml!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!91Ml!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 424w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 848w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 1272w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!91Ml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png" width="1456" height="401" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:401,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121462,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!91Ml!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 424w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 848w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 1272w, https://substackcdn.com/image/fetch/$s_!91Ml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d02ad7-7e55-4218-abef-ca93c57b2505_1532x422.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When destroying your menu, don&#8217;t forget to bring back input mode and unpause:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7tpc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7tpc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 424w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 848w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 1272w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7tpc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png" width="1456" height="367" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:367,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123206,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!7tpc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 424w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 848w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 1272w, https://substackcdn.com/image/fetch/$s_!7tpc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0d17dfa-24ee-46e3-a5c8-674a9f858e65_1577x397.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can also add Widgets to Actors using a <code>Widget Component</code>. This is good for character nameplates or health bars. Widgets attached to Actors can exist in &#8220;Screen Space&#8221; (2D, drawn over the top) or &#8220;World Space&#8221; (3D, part of the game world). </p><p>If you want to do Screen Space widgets, you may need to do line traces to the camera occasionally, to check if they should be seen, otherwise far away characters will draw over the top of the rest of your game.</p><p>The alternative that I use in THREADS is that they&#8217;re in World Space, so they can be occluded by the environment. I use the Tick function to manually face them towards the camera by getting the camera rotation, then flipping it 180 degrees.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zfOr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zfOr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 424w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 848w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1272w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png" width="1309" height="479" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:479,&quot;width&quot;:1309,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144298,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!zfOr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 424w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 848w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1272w, https://substackcdn.com/image/fetch/$s_!zfOr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F455fdc7c-fbd4-49b5-8231-f94df3d62107_1309x479.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For more info, check out the <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/creating-user-interfaces-with-umg-and-slate-in-unreal-engine">Building UI</a> page.</p><h2>Sound</h2><p>Unreal actually has a pretty complicated sound system out of the box, and the documentation is incomplete. Don&#8217;t feel bad if you&#8217;re struggling. There&#8217;s a short guide to importing .wav files into your game <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/audio-system-overview?application_version=4.27">here</a>.</p><p>Once you have a sound in, you&#8217;re probably going to want to use it for one of four things:</p><ul><li><p>2D sounds like menu clicks</p></li><li><p>3D sounds that occur in the game world</p></li><li><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/using-dialogue-voices-and-waves?application_version=4.27">Dialogue</a> (can have subtitles attached)</p></li><li><p>Ambient sounds, that play when you&#8217;re in a space</p></li></ul><p>It&#8217;s difficult to find documentation on Unreal sound, so <a href="https://uehow.web.fc2.com/Contents/Eng/UE4/BluePrint/NodeReference_Root/BPNodeReference_All.html#anchor_Audio">here&#8217;s a list of all the Blueprint nodes you can use related to sounds</a>.</p><p>You can play sounds either using <code>Gameplay Statics</code> that are unrelated to any <code>Actors</code>, or you can add an <code>Audio Component</code> to an <code>Actor</code> and have sound &#8220;emit&#8221; from it.</p><p>The best way to learn sound is to just try it, and it&#8217;s the one of two things in this primer that I&#8217;m going to tell you to just get in editor and mess with the functions listed above, and see what happens.</p><blockquote><p><strong>Key Takeaway:</strong></p><ul><li><p><strong>Sound is hard but there&#8217;s probably an engine function for your use case</strong></p></li></ul></blockquote><h2>VFX</h2><p>The other thing you should just get in and play with is VFX, which is done through <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-niagara-effects-for-unreal-engine">Niagara</a>. The Niagara documentation is similarly incomprehensible if you don&#8217;t already understand it, so we&#8217;re going to simplify it down to &#8220;how to use what it ships with&#8221;. </p><p>Niagara displays VFX in the game world, like smoke, particles, or fluids - things that would be too complex and expensive to simulate in regular actors.</p><p>Niagara works in two parts: <strong>Systems</strong>, and <strong>Emitters</strong>.</p><p>A System is a controlling actor - it doesn&#8217;t actually do anything on its own. It exists to control Emitters, which are the things that actually make the particles you&#8217;re simulating. A system can have multiple emitters - the Fire systems below might have one Emitter for the fire effects, and another Emitter for the smoke. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sCcB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sCcB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 424w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 848w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 1272w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sCcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png" width="869" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:869,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113621,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sCcB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 424w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 848w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 1272w, https://substackcdn.com/image/fetch/$s_!sCcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F957b6edb-b184-4ba5-aad7-39e116d1c800_869x368.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most premade assets will be a System with Emitters preconfigured on it, and the controls available on the System generally set things like how long the particles hang around for and how far they travel. If you want use one of these Fire systems, and you want more fire and less smoke, you&#8217;d likely configure that on the System itself rather than going in and editing the Emitter directly.</p><p>To get started, first you have to <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/how-to-enable-the-niagara-effects-plugin-in-unreal-engine">enable the Niagara plugin</a>, then add a System to your level or actor. There are premade systems you can use like the Fire ones above, or you can download more. The details of Niagara are too complex to cover here, but you can learn more by editing existing Systems to see how they work.</p><blockquote><p><strong>Key Takeaway:</strong></p><ul><li><p><strong>Niagara Systems are controllers for Emitters.</strong></p></li><li><p><strong>Emitters are the things that actually make the particles / fluids / etc.</strong></p></li><li><p><strong>Particles don&#8217;t entirely exist in the game world because this is GPU magic.</strong></p></li></ul></blockquote><h1>Data</h1><p>The last piece of the puzzle is data itself - how variables are stored. Data in Unreal functions similarly to most other programming languages, and there is no way around how Programmer-ey this is. </p><p>You may find yourself glazing over during this last section, as it&#8217;s almost purely technical. Don&#8217;t worry, we&#8217;re nearly done. This is mostly a reference so you can look up the details if you need them.</p><h2>Variable types</h2><p><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-variables-in-unreal-engine">Variables</a> are ways to store data, like references to actors, or integers (whole numbers), but they can be organized in different kinds of containers.</p><ol><li><p><strong>Properties</strong>, which are just actual stored variables on an object.</p></li><li><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/set-and-get-an-actor-reference?application_version=4.27">References</a></strong>, which link to a stored variable somewhere else. Functions in Unreal pass objects with by value (copies the whole object) or reference (link to the original). Most variables in Unreal are passed by reference. Changing a copy doesn&#8217;t affect the original. Changing a referenced object does.</p></li><li><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-arrays?application_version=4.27">Arrays</a></strong>, which are a list of a particular type of variable you can iterate over or access certain slots in. The items in the list have an explicit order. </p></li><li><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-maps?application_version=4.27">Maps</a></strong>, which uses a key of one variable type to store or retrieve another. They are unordered and fast. If you have a very large array you need to find one particular value in, you might want a <code>Map</code> so you can look it up directly.</p></li><li><p><strong>Class references</strong>, which treats the class type AS a variable. Useful for storing what type of object to spawn.</p></li></ol><p>We mostly care about <strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-arrays?application_version=4.27">Arrays</a></strong>, because they&#8217;re the most common in the engine.</p><p>Many built-in functions that need to return multiple results like &#8220;Get All Overlapping Actors&#8221; will return an <code>Array</code>. Your inventory might just be an <code>Array</code> of items. They are ordered, and can also be sorted. Searching an <code>Array</code> requires inspecting every value manually, so it can be slow for large numbers of entries if you don&#8217;t know which entry you need.</p><p>Individual items in an <code>Array</code> are accessed by &#8220;index&#8221;, which is basically just a count of &#8216;how many items along are they&#8217;. The first item is 0, second is 1, etc. Adding or deleting items from an <code>Array</code> will cause other array items to change their index. If you loop over an <code>Array</code> containing fruit, and in each loop, delete the current item, this will happen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dWF9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dWF9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 424w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 848w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 1272w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dWF9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png" width="1062" height="355" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:355,&quot;width&quot;:1062,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34077,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dWF9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 424w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 848w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 1272w, https://substackcdn.com/image/fetch/$s_!dWF9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b27c03-9b0d-442a-bdf0-8cdae9ad5775_1062x355.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pear moves up to slot 1, which has already been evaluated, so it never gets checked. Index 3 no longer exists.</figcaption></figure></div><div class="pullquote"><p>Tip: If you&#8217;re iterating over an array of items and you plan to remove any of them, iterate over it backwards - from last item to first, using a <strong>Reverse ForEach loop</strong>. If we had walked the array from the end, rather than the start, this would not have happened, as removal would not cause indexes to shift.</p></div><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-maps?application_version=4.27">Maps</a></strong> work on keys, so they don&#8217;t have this problem. When you add an item to a <code>Map</code>, you provide a specific <code>Key</code> to retrieve it, and set the <code>Value</code> for that key to your data. Here&#8217;s the same operations from before, but performed on a <code>Map</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5KTh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5KTh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 424w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 848w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 1272w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5KTh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png" width="881" height="314" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:314,&quot;width&quot;:881,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37577,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5KTh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 424w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 848w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 1272w, https://substackcdn.com/image/fetch/$s_!5KTh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69a686e3-ec1d-4f8c-bb81-745fd455bbd6_881x314.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This may sound like an argument to use <code>Maps</code> all the time instead of <code>Arrays</code>, but <code>Arrays</code> are ordered - you can shuffle the elements around, and the order can mean something, like which slot in an Inventory something is in. <code>Maps</code> are unordered, but they&#8217;re good for looking up one specific thing. </p><p>You might use a <code>Map</code> to keep track of every line of dialogue in the game, by having the <code>Key</code> be its line ID, and the Value be the text itself. You couldn&#8217;t do this with an <code>Array</code>, because if you were storing which line was associated with which index, every time you delete a line, you&#8217;d renumber the rest of them. Neither is better or worse than the other, they&#8217;re just used for different things.</p><p>Here&#8217;s <a href="https://couchlearn.com/how-to-use-loops-and-arrays-unreal-engine-4/">an article on how to use Arrays</a> in more detail.</p><h2>Structs and Enums</h2><p><strong><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-struct-variables-in-unreal-engine">Structs</a></strong> are a way of grouping a number of variables that are commonly used together into a single object, so they can be passed together. They&#8217;re like classes, but with less functionality. </p><p>A common example of a struct: When you Trace for collision, you don&#8217;t just want info about what you hit, but also other info like the location of the collision, and whether it was a block or an overlap. It would be bothersome to have separate variables for every possible bit of information you might need separately, so all Traces returns a single <code>HitResult</code> struct containing all the variables you need. Then, it&#8217;s easy to pass that data around as a single unit relating to that &#8220;hit&#8221;.</p><p>To access the individual variables inside a Struct, you &#8220;Break&#8221; it to expand them out and get one pin each. To create a Struct, you &#8220;Make&#8221; it, which takes all the variables individually and outputs them as a single struct variable.</p><p><strong><a href="https://couchlearn.com/enums-in-unreal-engine-4-blueprints/">Enums</a></strong> are a particular variable with a number of preset options. They&#8217;re good for making dropdowns, or handling the same object differently depending on which of the preset values it has. Use them for Types of other things. </p><p>Here&#8217;s an example: I have a <code>Data Table</code> (like a spreadsheet), and when I request a row from it, I get a Struct containing a variable for each column.</p><p>In this screenshot, each row in the <code>DT_Pickupable</code> table contains a single <code>Pickupable Struct</code> with all the information about a pickup. I retrieve a single <code>Pickupable Struct</code> from a table, and &#8220;break&#8221; it to access the variables - specifically the <code>Pickup_Type Enum.</code></p><p>I use a Switch node to reroute the code depending on what the value of the <code>Pickup Type Enum</code> is, to execute different code for each pickup type.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7HWh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7HWh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 424w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 848w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 1272w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7HWh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png" width="1368" height="427" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:427,&quot;width&quot;:1368,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117056,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7HWh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 424w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 848w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 1272w, https://substackcdn.com/image/fetch/$s_!7HWh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85aa2b58-96d6-4f4d-a488-6040af9b332d_1368x427.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>That&#8217;s The End Of Part 1</h1><p>These are all the basic moving parts of Unreal Engine 5 that you&#8217;ll need to make a prototype of something. If you&#8217;ve followed any tutorial, you&#8217;ve probably been asked to use some or most of these, but not understood what they did or why. I hope this clears it up. There&#8217;s a lot more - this is just the basics.</p><p>Stay tuned for Part 2, where we&#8217;ll take all the elements we just learned about, learn how they fit together in the game, and teach you how to apply these tools to solve common problems.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How Sound Works In Games]]></title><description><![CDATA[A game audio primer with Wwise and UE5.]]></description><link>https://loadbearingtomato.com/p/how-sound-works-in-games</link><guid isPermaLink="false">https://loadbearingtomato.com/p/how-sound-works-in-games</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Tue, 06 Aug 2024 23:27:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ponder for a second what <em>sound</em> is: thousands of vibrations in the air, traveling at ~332m/s, bouncing and diffracting off objects and their surfaces, all of which vibrate, absorb, and reflect in different ways, and at frequencies up to 20,000 times per second.</p><p>There&#8217;s a reason that accurately simulating something like aerodynamics requires supercomputers &#8212; reality is <em>complicated.</em> There are so many variables and processes that need to run, and they need to run at such small intervals they can&#8217;t run in real time. </p><p>Games also need to run simulations, but unlike the simulations that keep our planes in the air, they <em>must</em> run in real time. In order for that to be achievable, we need to optimize reality and make systems that instead <em>simulate a simplified approximation of it</em>.</p><p>In order to hold 60fps, each frame must complete in 16.6ms. That&#8217;s not a lot of time. We can simulate semi-realistic physics with large objects in that timeframe, and hand a lot of it off to the GPU, but simulating the actual physical reality of sound in a game is impossible to do on desktop hardware in a matter of milliseconds. So instead of simulating it physically, we approximate it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>The Absolute Basics</h1><p>This primer will use terminology and functions from <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-5-4-documentation">Unreal Engine 5</a> and the <a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=index.html">Wwise sound engine</a> from AudioKinetic. </p><p>So <strong>how do we simulate sounds?</strong> </p><p>We start with two basic Actor Components from Wwise:</p><ol><li><p><strong>Emitters</strong>, which tell the game world a sound is being played (<code>AkComponent</code>)</p></li><li><p><strong>Listeners</strong>, which receive the sounds being played (<code>AkAudioListener</code>)</p></li></ol><div class="pullquote"><p><strong>Unreal note:</strong> <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/basic-components-in-unreal-engine">Components</a> attach to an object in the game (their parent) and are used to add similar functionalities to different kinds of Actors. For example: You could create a &#8220;health&#8221; Component that includes functionality for displaying a health bar, or for destroying Actors when their health reaches zero. You could then attach that to any Actor that you want to be able to take damage.</p></div><p>In a very basic setup, you&#8217;d have a Listener component on the player character (or camera), and Emitter components on anything that creates a sound. The Emitter components get fed sound files, and the Listener component gets hooked up to the output audio device, so when an Emitter signals that it is playing a sound, the Listener receives that signal and plays the sound on your computer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j9rk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j9rk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j9rk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42252,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j9rk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!j9rk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a245411-b074-45d3-b352-d8747b26beb7_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">An Emitter plays a sound. A Listener knows it can hear that sound, and outputs it to the output audio device. <a href="https://www.flaticon.com/free-icons/listen">Listen icons created by Flat Icons</a>.</figcaption></figure></div><p>But if we stop here, all sounds in the game will be heard at the same maximum volume &#8212; as if you&#8217;d just hit play on the sound file.</p><div class="pullquote"><p><strong>Unreal note:</strong> Location information is stored as a <strong><a href="https://thebookofshaders.com/glossary/?search=vec3">Vector 3</a></strong> (<code>vec3</code>) which is three float values jammed into the same data structure. <code>vec3</code> is useful for storing location information because it&#8217;s the same size as the x, y, and z values for an object. A <code>vec3</code> can also be used for rotation information, as the same three floats can be used for pitch, yaw, and roll. What&#8217;s important to remember is that it is just <strong>a container that stores three numbers</strong> &#8212; it&#8217;s up to us to decide what those numbers represent.</p></div><h2>Attenuation</h2><p>In order to simulate the fact that sounds that happen further away appear quieter to the listener, the game engine feeds <strong>Location</strong> information for both the Emitter and the Listener into the sound engine. Knowing these two locations lets it figure out how far away they are from one another. </p><p>Sounds are physical waves in the air, and those waves decay as they travel. Since we&#8217;re not actually <em>simulating</em> the waves in the air, we need a method to approximate how much they tail off between the two locations. The amount that a sound decays between two points is called <strong>attenuation</strong>, which is basically &#8216;how much does the volume decrease&#8217;. To calculate the decrease, each sound has an <strong>attenuation curve</strong>, which is a 2D graph mapping Distance to Attenuation. Wwise gets the distance between the Listener and the Emitter, then looks up the attenuation curve &#8212; for distance <em>x</em>, it uses the value <em>y</em> to determine how much quieter to make the sound.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wAXa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wAXa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 424w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 848w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 1272w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wAXa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png" width="786" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00051988-09bb-4249-b350-15db36b0a833_786x446.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:786,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Learn Wwise | Audiokinetic&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Learn Wwise | Audiokinetic" title="Learn Wwise | Audiokinetic" srcset="https://substackcdn.com/image/fetch/$s_!wAXa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 424w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 848w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 1272w, https://substackcdn.com/image/fetch/$s_!wAXa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00051988-09bb-4249-b350-15db36b0a833_786x446.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The important thing to grasp is that a Listener isn&#8217;t receiving an audio stream of the actual sound from an Emitter the way a microphone does. It&#8217;s simply being told that the Emitter sound should play to this Listener at a certain volume level, which is dependent on distance.</p><p><em>(All numbers in the diagrams that follow are made up for illustration purposes.)</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pGBW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pGBW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pGBW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62441,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pGBW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!pGBW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5226cd3-53bc-49a5-a70c-c74fa37fb4e3_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">An Emitter with a 100m attenuation plays a sound 50m away, which you can tell with math should be at 50% volume. <a href="https://www.flaticon.com/free-icons/listen">Listen icons created by Flat Icons</a>.</figcaption></figure></div><p>But there&#8217;s one more value to calculate to finish the basics.</p><h2>Balance</h2><p>If we only use location information, we will hear the sound in both ears the same volume. But a sound playing to our right should be heard more loudly in the right ear than the left, and so we also need <strong>Rotation</strong> information to calculate how much sound should be played in each ear. By taking the rotation of the camera in 3D space, and calculating the &#8220;look at rotation&#8221; &#8212; how much we&#8217;d need to turn to be facing the sound directly &#8212; the sound engine can calculate how much to balance the sound between the Left and Right audio channels. This won&#8217;t necessarily drop a channel to zero either, as sounds usually make it to both ears &#8212; they&#8217;re just louder in the ear they&#8217;re closest to.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1LdD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1LdD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1LdD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81612,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1LdD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!1LdD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c59e7b2-5249-4f6a-91bd-f37a34c132f8_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Attenuation adjusts the signal based on distance from an Emitter, while balance adjusts it based on direction. <a href="https://www.flaticon.com/free-icons/listen">Listen icons created by Flat Icons</a>.</figcaption></figure></div><div class="pullquote"><p><strong>Wwise note:</strong> The raw sound file for playback needs metadata to store the attenuation curve, balance, 3D configuration, and other information needed to calculate all this. In Wwise, this object is predictably called a Sound. You can group sounds together in a Bus in the <a href="https://www.audiokinetic.com/en/library/edge/?source=WwiseFundamentalApproach&amp;id=the_project_hierarchy">Actor-Mixer hierarchy</a> to apply the same rules to all of them, or selectively override bus settings for individual sounds.</p><p>You do not have to use either of these settings. You can make any sound play at the same volume or balance regardless of distance or direction (e.g. helmet radio comms) by disabling attenuation and 3D position/balance.</p></div><p>Remember, this is all just calculation. The sum total of playing sounds is only mixed down to an actual output waveform when it&#8217;s finally played by a Listener.</p><p>So that&#8217;s the basics of simple 3D sound setup - the locations become attenuation, and the rotation becomes balance. Put them together, and your player can hear sounds relative to their position from you. It&#8217;s a great start! But it&#8217;s still only the beginning. If you want to make your sound <em>immersive</em>, you need to start simulating how sound travels through the environment.</p><h1>The Environment</h1><p>If you just recoiled in horror thinking about how to simulate sound in a complex physical environment without actually simulating the sound waves&#8230; good. It is very, very complicated. We need to:</p><ol><li><p>Mimic the behaviors of the real world while:</p><ol><li><p>Making sure the right sounds can be heard, and;</p></li><li><p>Processing sounds based on the game world to ensure realism.</p></li></ol></li><li><p>Optimize away anything we can cull, simplify, or eliminate, because step 1 can be CPU and RAM intensive.</p></li></ol><p>Wwise provides a number of tools for this, and groups some of them together using Volumes in a building block called a <strong>Spatial Audio Volume</strong> (<code>AkSpatialAudioVolume</code>).</p><div class="pullquote"><p><strong>Unreal note:</strong> A <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/volume-actors-in-unreal-engine">Volume</a> in Unreal is an object that represents a box (or other shape) in 3D space, inside of certain coordinates. Their main job is to understand when things are inside them, and then take specific actions depending on what&#8217;s inside or outside, or entering or exiting the space. A simple example is a Trigger Volume, which fires an event to make something happen when you walk inside of it.</p></div><h2>Spatial Audio Volumes and Acoustic Portals</h2><p>A <strong>Spatial Audio Volume</strong> is a Volume that has a number of specialized components on it that let Wwise do <em>stuff</em> and make calculations. Spatial Audio Volumes are used to divide the world up into smaller chunks, to both define behaviors of sound within them and how it travels between them. Without them, the engine would have to evaluate every sound in the game world individually to see if you can hear it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NfFE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NfFE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:210161,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NfFE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NfFE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445d87b8-ce49-4b51-b3a0-43b06249cd65_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A Spatial Audio Volume in a test level.</figcaption></figure></div><p>A <strong>Spatial Audio Volume provides three functions</strong>, which can all be provided separately if their components are attached to any Volume:</p><ol><li><p>A <strong>Surface Reflector Set</strong> component, to reflect and transmit sound at the edges.</p></li><li><p>A <strong>Room</strong> component, to contain and group sounds together.</p></li><li><p>A <strong>Late Reverb</strong> component, to calculate and route reverb to other buses.</p></li></ol><h2>Surface Reflector Sets</h2><p>Wwise keeps its own internal 3D geometry of the shape of your levels to track how sound should travel through and bounce off objects and the environment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P5tX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P5tX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 424w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 848w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 1272w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P5tX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png" width="900" height="593" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:593,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P5tX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 424w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 848w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 1272w, https://substackcdn.com/image/fetch/$s_!P5tX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfdec71b-2fa1-44c2-90cc-4198543eb409_900x593.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A Surface Reflector pushes an Actor&#8217;s geometry into Wwise so it can make calculations about what should happen when sound hits it.</p><p><strong>Surface Reflector Sets</strong> in a Spatial Audio Volume automatically construct reflectors around the boundaries of the Volume so you can configure the behavior of the room as a unit. This allows you to adjust things like:</p><ol><li><p>How much sound &#8220;leaks&#8221; through the edges of the room (Transmission Loss)</p></li><li><p>How sound bounces off the walls and is absorbed, reflected, etc. (Acoustic Materials)</p></li></ol><p>Example: A room in your game that&#8217;s an airlock might have its Transmission Loss set to 1 (no transmission through walls) and have Materials that mostly absorb sound. A tiled bathroom might have moderate transmission loss because of its wall thickness, but its Materials (primarily tile) would reflect back most frequencies.</p><div class="pullquote"><p><strong>Unreal tip:</strong> If you want to make regular in-game objects participate in audio calculations (e.g. you want sound to be quieter when a player is behind cover), you can add an <code>AkGeometry</code> component to any other Actor.</p></div><p>At its core, a Surface Reflector Set is pure 3D geometry and nothing more. It defines audio boundaries in the game world and what happens when sounds interact with them. We don&#8217;t (usually) want to hear sounds from the entire game world. But in order to cull those world sounds so they&#8217;re not &#8220;playing&#8221; unnecessarily and consuming CPU, we need to figure out what we <em>should</em> hear in a given space. We also don&#8217;t want to be processing every sound in the game world separately, so we need an organizational concept that lets us group them together for more efficient culling or activation.</p><p>This is why we have <strong><a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=using_rooms_and_portals.html">Rooms</a></strong><a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=using_rooms_and_portals.html"> </a><strong><a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=using_rooms_and_portals.html">and</a></strong><a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=using_rooms_and_portals.html"> </a><strong><a href="https://www.audiokinetic.com/en/library/edge/?source=SDK&amp;id=using_rooms_and_portals.html">Portals</a></strong>.</p><h2>Rooms And Portals</h2><p>Internally, Wwise keeps an adjacency map of which Spatial Audio Volumes are connected to each other using Rooms and Portals. You can think of rooms and portals as links in a chain - a &#8220;propagation path&#8221; which will be walked and added up to calculate the total path between Emitter and Listener, so the Listener knows what the volume, balance, reverb, and other effects should be when the sound finally plays to the mix.</p><p><strong>Rooms</strong> contain sounds, and they transmit sounds within them to other rooms via <strong>Portals</strong>.  </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pyuf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pyuf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pyuf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:208635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pyuf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pyuf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267d53b9-4ffb-4b03-885c-5cb0eb282cd3_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Rooms</h3><p>A Spatial Audio Volume &#8220;becomes&#8221; a room because it is a Volume that has a Room Component. A Portal is an entirely separate Actor (<code>AkAcousticPortal</code>) with an <code>AkPortalComponent</code>. You can create your own Room or Portal actors by adding an <code>AkRoom</code> or <code>AkPortalComponent</code> to any Volume.</p><p>Wwise uses the Room Component (<code>AkRoom</code>) to provide a few core behaviors:</p><ol><li><p>Transmitting the sounds that occur inside it to other Rooms via Portals (or in the absence of a Surface Reflector Set, through its boundaries).</p></li><li><p>Defining oriented reverb within a space. (more on that later)</p></li></ol><h3>Portals</h3><p>A Portal acts as a bridge between two rooms, and alters the values to be applied to a sound for the next room. In this example, the Portal lets the sound in Room 1 (left, <em>r1</em>) be heard in Room 2 (right, <em>r2</em>). The sound will appear in Room 2 (r2) from the location of the Portal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DEA-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DEA-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DEA-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2527481,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DEA-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!DEA-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d73643e-c6bc-42f2-83b7-90da732dfd59_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A sound in one room, transiting a Portal, is heard by a player in the other room from the Portal&#8217;s location. <a href="https://www.flaticon.com/free-icons/listen">Listen icons created by Flat Icons</a>.</figcaption></figure></div><p>The <strong>process of a sound traveling between Rooms</strong> goes something like this:</p><ol><li><p>An Emitter plays a sound within Room 1 (<em>r1</em>).</p></li><li><p>The distance (and other acoustic properties) between the Emitter and the Portal (<em>p1</em>) is calculated.</p></li><li><p>If the sound would be &#8220;audible&#8221; to the Portal (<em>p1</em>) based on how far it&#8217;s allowed to travel, the Portal &#8220;hears&#8221; the sound.</p></li><li><p>The Portal (<em>p1</em>) adjusts the sound&#8217;s location to be coming its own location as it enters Room 2 (<em>p2</em>) with its new values, and optionally, lowers its attenuation if it is partially closed.</p></li><li><p>The Listener on the player receives the sound, calculates the total attenuation and balance from the chain, and the player hears the sound as coming from the Portal (p1) in the second Room (r2).</p></li></ol><h3>Optimization</h3><p>Now let&#8217;s take a look at what happens when a Portal is closed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q0bN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0bN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q0bN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2524318,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q0bN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0bN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef699c64-56fb-483d-8378-917431c7a9d6_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.flaticon.com/free-icons/listen">Listen icons created by Flat Icons</a>.</figcaption></figure></div><p>In the image above, the engine knows there are three sounds in the first Room (<em>r1</em>). It also knows sound does not leak through the walls. It knows that the Portal (<em>p1</em>) between Room 1 (<em>r1</em>) and the Room the player is in (<em>r2</em>) is closed, so it determines not to play those sounds. The engine is able to temporarily ignore anything in Room 1 (<em>r1</em>) by evaluating <em>just</em> the state of Room 1 (r1) (no wall transmission) and the Portal (<em>p1</em>) (closed).</p><p>By evaluating these choke points in our tree of connected Rooms and Portals (propagation path), we can cull entire areas of the map from audio that we know aren&#8217;t relevant &#8212; and stop any processing on them &#8212; with math alone.</p><h3>Ambient Sounds</h3><p>We talked about sound emitting from locations and about sound distance from Portals, but what if we don&#8217;t want sounds to play from a specific location? What if we want the quiet hum of an air conditioner to play gently anywhere in a Room? This is called &#8220;Ambient Sound&#8221; and it&#8217;s treated a special way inside Rooms.</p><p>Usually, an Emitter (<code>AkComponent</code>) has a specific position in 3D space that a sound plays from, and its volume and balance are calculated for the Listener relative to that location.</p><p>Ambient sounds played on a Room play at a consistent volume and balance no matter where you are in the Room. Attenuation profiles on a sound playing inside a room will not apply <em>until that sound exits the room via a Portal</em>. After it exits via a portal, it behaves as in the earlier example - a Portal (<em>p1</em>) that &#8220;hears&#8221; an ambient sound in one room (<em>r1</em>) will then rebroadcast that sound with itself as the origin point. So, if you&#8217;re standing in the adjacent room (<em>r2</em>), you will hear the ambient sound as coming from the Portal (<em>p1</em>), as the volume and balance to the Listener on the player/camera calculate it from the location of the Portal.</p><div class="pullquote"><p><strong>Wwise note:</strong> In Wwise, you don&#8217;t actually trigger sounds directly &#8212; you post an <a href="https://www.audiokinetic.com/en/library/2024.1.0_8570/?source=SDK&amp;id=concept_events.html">Event</a> which references the sound and tells it how to play. Events can be used to start or stop specific sounds, play loops, or trigger other arbitrary actions. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fjRq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fjRq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 424w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 848w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 1272w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fjRq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png" width="833" height="447" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b81e2bae-798a-4766-974e-9e23d696dd13_833x447.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:447,&quot;width&quot;:833,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fjRq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 424w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 848w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 1272w, https://substackcdn.com/image/fetch/$s_!fjRq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb81e2bae-798a-4766-974e-9e23d696dd13_833x447.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">From the Wwise Event documentation.</figcaption></figure></div></div><p>If you want a sound to play ambiently in a room, there&#8217;s a field in the <code>AkRoom</code> for an <code>AkEvent</code> which triggers playing a sound. Optionally, there&#8217;s a checkbox for &#8220;auto-post&#8221; which means it will post the event when the game starts (on <code>BeginPlay</code>). </p><div class="pullquote"><p><strong>Unreal/Wwise note:</strong> Events must be posted to a Game Object, which is just a way of recording different things Wwise knows about in your game.  If the Actor in Unreal has an <code>AkComponent</code> capable of playing the sound, it will use that as the Game Object source. If the Actor does not have one, one will be created dynamically for playback.</p><p><strong>Important:</strong> If you want to play a sound ambiently later on, <strong>you need to post the event to the </strong><code>AkRoom</code><strong> component</strong>, NOT the <code>AkSpatialAudioVolume</code> actor. Posting it to the Actor makes it look for an <code>AkComponent</code> to play from, and since an <code>AkRoom</code> is not an <code>AkComponent</code> it will create <code>AkComponent</code> in the middle of the volume and play sound from there spatially instead of ambiently. You almost certainly do not want this!</p></div><h3>Ambient Spaces Outdoors</h3><p>If you want a particular space to have an ambient sound in and around it, there&#8217;s an option in the <code>AkRoom</code> to make it a &#8220;Reverb Volume&#8221;, which changes the rules a little. The sound will play ambiently inside the space, but emit outwards in all directions from the room <em>without</em> connecting Portals to do so. This is useful for outdoor spaces where you want an area to have some particular sounds (like birds coming from non-specific trees in one area in the park), and also want that to tail off smoothly as you walk away.</p><div class="pullquote"><p><strong>Unreal note:</strong> The Wwise plugin provides an <code>AkReverbVolume</code> actor for things like this. It is basically the same as an <code>AkSpatialAudioVolume</code> but with presets optimized for reverb volumes and the surface reflector set disabled.</p></div><h2>Other Rules About Rooms</h2><ul><li><p>Rooms have a priority value to allow you to nest Rooms inside of other Rooms (highest wins). For example: You might have one Room volume for the entire inside of a warehouse, with another Portal and Room inside it in the corner representing the inside of an office.</p></li><li><p>If a sound is played and it&#8217;s not inside a Room, it will fall back to the default &#8220;Outdoors&#8221; Room.</p></li></ul><h3>Late Reverb</h3><p>The final feature of a Spatial Audio Volume is Late Reverb, which is mostly beyond the scope of this article. It lets you calculate reverbs and echoes that occur within the Volume, and send the resulting sounds to a separate bus output so you can control how and when it&#8217;s heard. This is useful during the later stages of tuning how your level sounds.</p><h1>The Core Lesson</h1><p>The thing to really get across here is that <strong>we are defining &#8212; in software &#8212; a logical chain of objects and their properties between an Emitter and the Player</strong>. Traversing this list allows the sound engine to:</p><ol><li><p>Determine if a sound can be heard, and do nothing if it can&#8217;t.</p></li><li><p>Build a list of property changes and effects to be applied to the sound when it is finally played.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UdMH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UdMH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 424w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 848w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 1272w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UdMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png" width="1055" height="244" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:244,&quot;width&quot;:1055,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;rays_direct&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="rays_direct" title="rays_direct" srcset="https://substackcdn.com/image/fetch/$s_!UdMH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 424w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 848w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 1272w, https://substackcdn.com/image/fetch/$s_!UdMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F782e08ee-cf23-463a-9675-cf4b5ab87186_1055x244.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The &#8220;Markers_Test&#8221; sound is attenuated -18.9db and played on the Master Audio Bus. The sound also hits the Room reverb, then the Outside reverb, and that reverb hits the Master Audio Bus at normal volume.</figcaption></figure></div><p>The sound is <em>never actually played</em> unless Wwise logically determines that it can be heard by a Listener that can play it to an output. All we are ever doing is feeding the sound engine the information it needs to make those calculations and apply the appropriate changes/effects during final playback.</p><h2>Unreal Audio Tips</h2><p>Here&#8217;s some other stuff you might find useful as you start to get into it:</p><ul><li><p><strong>If you want to play a sound from a particular Actor</strong>, post the Play Event to the Actor.</p><ul><li><p>If the Actor has a child <code>AkComponent</code>, it will play back from the first one found.</p></li><li><p>If there is no existing <code>AkComponent</code>, one will be created on the Actor&#8217;s root component.</p></li></ul></li><li><p><strong>If you want to play a sound from a particular Actor Component</strong>, post the Play Event to the Component. An <code>AkComponent</code> will be created if one does not exist as a child of that Component.</p></li><li><p><strong>If you have a reference to a specific </strong><code>AkComponent</code><strong> that you want to play sound from</strong>, you can post the event directly to that <code>AkComponent</code>.</p></li><li><p><strong>Destroying an actor that has a sound playing from a child </strong><code>AkComponent</code><strong> will stop any sound currently playing from it</strong>, because the Game Object Id playing back the sound no longer exists.</p></li><li><p><strong>You don&#8217;t actually need one </strong><code>AkComponent</code><strong> for every possible place you might need to play sound from.</strong> There is nothing stopping you from simply moving one <code>AkComponent</code> around programmatically instead of having one at every location.</p><ul><li><p>For example: If you have a large segment of electrical wire that you want to emit an electrical &#8220;buzz&#8221;, instead of placing Emitters all the way along the cable, you might have three Emitters that move along it with the player so that the whole thing <em>appears</em> to be buzzing.</p></li></ul></li><li><p><strong>You can also just play a sound at any random location using the Post Event At Location</strong>. This plays from a temporary Wwise Game Object which is immediately destroyed, and no <code>AkComponent</code> is created because there is no parent actor. This is a cheap way of playing a lot of short-lived sounds with little overhead.</p></li></ul><h2>Unfortunately, It Gets Way More Complicated</h2><p>You now have the basics on how to play sound and how to structure your levels to get approximately the result you want. The issue, however, is that <strong>in the real world, sound is far more complicated</strong>. Ever thought about how sound reflects more off tiles than it does wooden walls? Or how the bass from a car stereo travels further than treble? What about how a car backfiring in the city can echo back several times as it hits different buildings?</p><p>There are <em>so many things</em> you can simulate in order to make things sound &#8220;real&#8221;.</p><p>The simplest is <strong>diffraction</strong> &#8212; how sound moves around the edges of objects in the audio geometry. It too can be calculated with math.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xv7U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xv7U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 424w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 848w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 1272w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xv7U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xv7U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 424w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 848w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 1272w, https://substackcdn.com/image/fetch/$s_!Xv7U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c34ab2e-a513-4cde-b025-de5524395cb0_1820x955.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The pink lines show a sound passing around an object and how much the volume drops in each path.</figcaption></figure></div><p>What about moving through large environments like a city, where different buildings and obstacles are meaningful distances from your sound source, like a gunshot? Sound takes time to travel, so the reflections of that sound are going to arrive back at different times and with different properties.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZPlz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZPlz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 424w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 848w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 1272w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZPlz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png" width="1014" height="545" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:545,&quot;width&quot;:1014,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;SoundPressure&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="SoundPressure" title="SoundPressure" srcset="https://substackcdn.com/image/fetch/$s_!ZPlz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 424w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 848w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 1272w, https://substackcdn.com/image/fetch/$s_!ZPlz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9bde56d-eca2-4c27-9cd3-00e1ab83fa27_1014x545.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Graph of reverb over time.</figcaption></figure></div><p>If you have a system that simulates and adds rain noise when you&#8217;re outside, it won&#8217;t be enough simply to add an ambient &#8220;rain&#8221; sound to the outside volume. If your game has objects that you can shelter under (e.g. bridges, bus stops), you may also need to be checking line of sight to the sky every frame, then use Real Time Parameter Controls to adjust the properties of the rain sound to dampen them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9shF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9shF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 424w, https://substackcdn.com/image/fetch/$s_!9shF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 848w, https://substackcdn.com/image/fetch/$s_!9shF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 1272w, https://substackcdn.com/image/fetch/$s_!9shF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9shF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png" width="1447" height="583" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:583,&quot;width&quot;:1447,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;RTPC And Simulation Variables&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="RTPC And Simulation Variables" title="RTPC And Simulation Variables" srcset="https://substackcdn.com/image/fetch/$s_!9shF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 424w, https://substackcdn.com/image/fetch/$s_!9shF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 848w, https://substackcdn.com/image/fetch/$s_!9shF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 1272w, https://substackcdn.com/image/fetch/$s_!9shF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f1a98c-1071-4126-93d1-541c852b956d_1447x583.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Adjusting sound based on &#8220;Canopy&#8221; calculations with real time parameters.</figcaption></figure></div><p>Do you have plants that would absorb sound in your level, like the indoor park in Prey (2018)? Can you fit them all in the geometry that you send to the sound engine with the amount of RAM you have available? Will you need to use simplified geometry for sound purposes? How will that be stored?</p><p>If you&#8217;re doing something sufficiently complex, you&#8217;re going to run into the limits of your hardware way faster than you expect. If you just place an <code>AkComponent</code> on everything that could ever make sound, you&#8217;re going to run out of memory and CPU fast. You may need to start writing your own code to optimize, cull, emulate, and manage what you can afford to keep in memory and executing in CPU.</p><p><strong>If you want to dive deeper into </strong><em><strong>just how wild</strong></em><strong> game audio can get, I recommend checking out the GDC talk by David Osternacher and Alex Riviere, <a href="https://gdcvault.com/play/1034294/Everything-is-Connected-Ambient-Sound">Everything is Connected: Ambient Sound in 'Avatar: Frontiers of Pandora'</a>.</strong> They have <em>thousands</em> of emitters making sound throughout a forest, and the level of detail is quite frankly stunning.</p><p>And if you haven&#8217;t gone completely insane by the end of all this (or you don&#8217;t have access to the GDC Vault), check out <strong>Robert Bantin&#8217;s talk <a href="https://www.youtube.com/watch?v=I555fw_K9iQ">Finding Space for Sound: Acoustics in 'Avatar: Frontiers of Pandora'</a></strong>, which digs into techniques for creating realistic, immersive in-game sound through reverb, diffraction, and a tonne of other things you can simulate.</p><p>The rabbit hole of game audio is as deep as you decide is important for your game.</p><h1>Summary</h1><p>We&#8217;ve covered a lot here, but it should be enough for you to at least get started using Wwise with Unreal.</p><p><strong>To recap, here&#8217;s a quick hit list of the most important stuff:</strong></p><ul><li><p>Sounds play by having an Event posted to a game object.</p></li><li><p>Sound play notifications come from Emitters and are received by Listeners that play the actual sound.</p></li><li><p>Wwise calculates how sound travels between the Emitter and the Listener using math, instead of simulating the reality of sound.</p></li><li><p>The path can be affected by geometry that the sound engine has been informed about by <code>AkGeometry</code>, Surface Reflectors, Spot Reflectors, or Surface Reflector Sets.</p></li><li><p>Rooms organize and group sounds together to make it more efficient to determine what the player can hear and unload / not process anything that they can&#8217;t.</p></li><li><p>Rooms can contain Emitters and also be Emitters for ambient sound.</p></li><li><p>Portals create a propagation path so they can bridge sound between rooms.</p></li><li><p>Posting an Event to an <code>AkRoomComponent</code> will make it play ambiently inside the room.</p></li></ul><p>Until next time.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How People Experience Things]]></title><description><![CDATA[A state machine framework for player-aware game design.]]></description><link>https://loadbearingtomato.com/p/how-people-experience-things</link><guid isPermaLink="false">https://loadbearingtomato.com/p/how-people-experience-things</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Thu, 04 Jul 2024 19:47:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I came to design organically and without training or skills. As a millennial child growing up in the era of the tumultuous teens of the web, my adolescent explosion into the world of creation occurred at a time when the tools themselves were discovering new form and function. They were certainly not teaching application design in high school - at best, there was an &#8220;Information Programming &amp; Technology&#8221; class, but I&#8217;d been programming since primary school.</p><p>I could make programs and web sites, but the user logs I was seeing for my creations were baffling. I did not understand why people clicked the things they did, typed the things they did. I tried things, watched what happened, guessed why, but consistently made fundamental attribution errors. I would add features but was often wrong about what the results would be and could not understand why. By the time I was 20, it became obvious to me that I needed to understand how people worked before I could ever hope to understand why they were doing the things that they were doing. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The more I studied psychology and learned about the brain, the more I came to understand that despite the differences in individual people, there are commonalities in how people work. By seeking to understand how people experience the things we make, we give ourselves formal tools to both predict how people will react, and to fix it when our design intent doesn&#8217;t match the effect.</p><p>Today we&#8217;re going to go through the State Machine Model &#8212; one such tool for understanding how people experience things and react &#8212; and learn how to use it in practice to solve game design problems both pre-emptively and reactively. With any luck, you&#8217;ll be ready when you hear someone in Insights mutter the most cursed sentence in game development:</p><p><em><strong>&#8220;Why are players DOING that?&#8221;</strong></em></p><p>Let&#8217;s start with a real world example we can learn from.</p><h4>Elden Ring</h4><p>Elden Ring was the first FromSoft game for many players. There is a tutorial that you get to by jumping in a hole early in the game. However, in the initial network test, they found that many players were missing the tutorial and immediately struggling to play because they never learned how to do basic combat. They knew FromSoft games were &#8220;difficult&#8221;, so they just assumed their struggles with combat were intended, and they were absolutely not. It was intended that new players would jump in the hole, but the hole was very deep and with no sense of how much fall damage they take, many people just didn&#8217;t think that was even an option.</p><p><a href="https://www.youtube.com/watch?v=VT7sYgauSy0&amp;t=299s">This is a video of the first closed network test</a>. From 4:59, you can see the player reads a message &#8220;The Cave Of Knowledge lies below&#8221;, has no idea what it means, can&#8217;t see the hole, and walks straight past the tutorial.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IJiE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IJiE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 424w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 848w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 1272w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IJiE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:657032,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IJiE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 424w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 848w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 1272w, https://substackcdn.com/image/fetch/$s_!IJiE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7d3251-67d7-43de-a5ab-96d87f460b8c_2973x1653.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Network test tutorial start</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rn57!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rn57!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 424w, https://substackcdn.com/image/fetch/$s_!rn57!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 848w, https://substackcdn.com/image/fetch/$s_!rn57!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 1272w, https://substackcdn.com/image/fetch/$s_!rn57!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rn57!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png" width="1456" height="570" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rn57!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 424w, https://substackcdn.com/image/fetch/$s_!rn57!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 848w, https://substackcdn.com/image/fetch/$s_!rn57!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 1272w, https://substackcdn.com/image/fetch/$s_!rn57!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ebac25-bb01-4944-a62c-4b5f3f87fe83_1520x595.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.youtube.com/watch?v=PN7YFKHOR9Y&amp;t=368s">This is the version that was released on launch day with 1.0</a>, and you can see how much this area has changed, and how much more it&#8217;s been flagged.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cX_6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cX_6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 424w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 848w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 1272w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cX_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1449424,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cX_6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 424w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 848w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 1272w, https://substackcdn.com/image/fetch/$s_!cX_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a9cebb-f66e-4db7-a417-72d842171903_3087x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">1.0 tutorial start</figcaption></figure></div><p>The basic work that was done here:</p><ol><li><p>Added an NPC ghost that said <em>&#8220;Brave tarnished. Take the plunge. Of learning, and remembrance. Recall the arts of war. And your warrior's blood.&#8221;</em></p></li><li><p>Additional lighting to let you see the lip of the hole.</p></li><li><p>(not visible in this pic) More rocks were added below the drop to imply that the jump could be made without dying.</p></li></ol><p>This helped the problem, but didn&#8217;t fix it, and players took to social media to complain about not being taught the basic mechanics. When they found out they&#8217;d missed a tutorial, many were annoyed.</p><p>Some people read that text and didn&#8217;t think &#8216;tutorial in hole&#8217;. Other new people read it and they&#8217;d heard that FromSoft NPCs lied to you, and assumed it was a trick. Between vagueness and knowledge obtained outside of the game, they did not understand the choice being offered, and subsequently missed it.</p><p>Whenever there is a gap between the intent of a design and the effect of a design, we need to deconstruct the problem in a way that gives us tools to map both of those things so we can find what the gap was. The State Machine Model gives us tools to identify these gaps by modeling players as a kind of <a href="https://www.itemis.com/en/products/itemis-create/documentation/user-guide/overview_what_are_state_machines">state machine</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What Is A State Machine?</h2><p>A state machine is a representation of a process that is &#8220;stateful&#8221;. A stateful system has memory - past actions of the system can affect future actions of the system. Games can be considered to be state machines, as can the individual actors within them with their various AIs or health pools or etc. This is in contrast to a &#8220;stateless&#8221; system like a static web site where every click on a link returns a fixed web page, and it does not matter which order I click on them - the same input will always return the same output.</p><p>State machines are a common computer science problem, and so to model player behavior as a state machine, we need to track their personal states, the inputs they receive (images and sounds), the knowledge they hold, and understand the processes that happen in order for them to perform output (pressing buttons). Most importantly, the thing people are currently experiencing can affect this process, and also affect future responses to things that they experience.</p><p>The entire process a person goes through when receiving the output of a game looks something like this. This is a simplified version:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JVqt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JVqt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 424w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 848w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 1272w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JVqt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png" width="960" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62558,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JVqt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 424w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 848w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 1272w, https://substackcdn.com/image/fetch/$s_!JVqt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F682ae493-4320-4236-b39c-af6d0cd52df6_960x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first step in understanding this model is one of the first things we learn as children: discovering that people are different from each other.</p><h2>Theory Of Mind</h2><p>Before we can get to the model itself, we need to start with <a href="https://en.wikipedia.org/wiki/Theory_of_mind">Theory of Mind</a>. Theory of mind is, at its core, the fundamental understanding that <strong>different people hold different knowledge</strong>. Children generally begin developing an understanding of Theory of Mind around age five, and there is a very simple test you can perform that will determine whether a child has gained this understanding.</p><blockquote><p>Acquire two children, somehow. Set them five feet apart, then show the first child this box, and ask them what they think is in it. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PUGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PUGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PUGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg" width="532" height="287.28" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:324,&quot;width&quot;:600,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Smarties Regular - 45g 24/BOX (8) (84857)&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Smarties Regular - 45g 24/BOX (8) (84857)" title="Smarties Regular - 45g 24/BOX (8) (84857)" srcset="https://substackcdn.com/image/fetch/$s_!PUGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PUGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc91dd2e1-5b19-4c19-a0f6-b1c73c22dd93_600x324.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></blockquote><blockquote><p>They will answer &#8220;Smarties, of course&#8221;, and probably feel quite proud of themselves.</p><p>Then, open the box to reveal a surprise - it is not in fact Smarties. It is full of pencils. Then ask that child what they think the <em>second</em> child, who has not seen inside the box, thinks is inside it.</p><p>If they answer &#8220;Smarties&#8221;, they have passed the test, having gained the understanding that another human who has observed different things can hold different knowledge based on those observations. If they answer &#8220;pencils&#8221;, they have failed, because they have not yet come to separate their consciousness from that of others.</p></blockquote><p>This test triggers a knowledge change in a child that grants them understanding they previously did not have, and asks them to remember their previous state, then project that onto a second person.</p><p>But people are more complex than their knowledge, so Theory of Mind alone is insufficient for explaining player behavior.</p><p>While we like to think of ourselves as in control of our own minds, the <a href="https://en.wikipedia.org/wiki/Classical_conditioning">classical conditioning of Pavlov&#8217;s Dog</a> applies to people as well as it does animals - if you ring a bell every time before you feed a dog, its mouth will begin watering upon hearing the bell, because the brain has learned to associate the sound of the bell with receiving food.</p><p>In a past relationship, I lived in a small apartment with my now-ex, and our computer desks were behind the couch. She&#8217;d tap the back of my chair twice to let me know she needed to get past, and I&#8217;d pull my chair in. Years later, someone at work tapped the back of my chair twice to get my attention while I was coding, and I instinctively pulled my chair in without even thinking, because I&#8217;d unconsciously trained that reaction. I didn&#8217;t even realize I&#8217;d done it until they mentioned it later.</p><p>The most important thing here is that we don&#8217;t automatically <em>know</em> why we react the way we do. In the moment our brains and bodies simply react due to our past experiences. We can learn about ourselves, our patterns, our habits, and then apply that information to understand why we felt something, or did something, but it is a reverse-engineering process. And since we don&#8217;t inherently know why our brains respond the way they do, it means that we need to learn about ourselves through observing our own output, and the output of others, in order to understand why we react the way we do. And while everyone is different, there are commonalities to human experiences that we can use to help us make better designs. </p><p>Much like our Elden Ring new players in the network test, we need to watch how players act, react, and observe their output in order to understand why they reacted the way they did.</p><p>But in order to understand why people react, first we need to understand <em>how</em> they react. </p><h2>Part 1: Stimulus and Perception</h2><p>The Theory of Mind test has prerequisites - for example, knowing what smarties are (or at least being able to read), being able to see, and not having done the test before. </p><p>When we think about perception, we tend to think of merely seeing something and skipping straight to understanding, but there are two parts to it, which are demonstrated through two problems. </p><p>Imagine that we show two adult humans a painting. One <em>art</em>.</p><p>Problem 1: Bodies are different. You can show two different people the exact same picture, but differences in their physiology can mean that the image they receive is not actually the same.</p><p>Problem 2: Even if their eyes are identical, and the image their brain receives is the same, people&#8217;s brains filter the stimulus they receive differently. We will all notice different things about the painting based on our experiences.</p><p>Finally, we react to the thing we&#8217;ve seen. We might have learned something, or felt something, and our state changes based on the result of that.</p><p>In its simplest terms, the brain <em>interprets</em> input while also <strong>being changed by it</strong>. Two people with different experiences of the world have had their brains trained differently and thus will extract different versions of what is important in the raw input they have just seen, and react differently, and learn different things from their reaction.</p><p>An artist may see a painting and may instinctively notice the framing, the construction of the characters, and the use of light to guide the eye. A narrative designer who saw the exact same thing may not notice those implementation details but have a greater understanding of the <em>vibe</em> and what it does to a person.</p><h2>Part 2: Response and emotional state</h2><p>What if the child is familiar with the test? They may experience a sense of excitement at a problem they are aware of, and feel a burst of satisfaction, dispensing dopamine and other happy chemicals. A child unfamiliar with the test may experience similar excitement thinking they&#8217;re getting Smarties, followed by disappointment when they learn that there are no Smarties waiting for them. </p><p>The child, having perceived the input, has an unconscious and immediate reaction that is different depending on their past experiences. We can see again that how we&#8217;ve been trained can dictate the emotional response, which in turn affects our state, and how all of our internal mental processes behave.</p><p>This can be tested on almost any gamer of a certain age by playing them the scream of the Poison Head Crabs in Ravenholm from Half-Life 2, on any engineer who&#8217;s been on-call by playing the Pagerduty alert sound, or on any developer by playing them the <em>tak-tak </em>sound of an incoming Slack message. Before they&#8217;ve had a chance to think about what they&#8217;ve heard, they&#8217;re already experiencing stress, or fear, which by experiencing it again strengthens the brain&#8217;s pathway that triggered that response, and makes it easier to experience again.</p><p>Thing is, this response can affect a person&#8217;s physical state as well, and our physical state affects how our brains work. In the famous <a href="https://www.straight.com/article-373746/vancouver/local-landmark-perfect-love-laboratory">Capilano Bridge Experiment</a>, researchers found that men who encountered an attractive woman in a situation where their heartrates were elevated were more likely to call her afterwards. The response to the situation affected their physicality affected their emotional state, which affected their behavior.</p><p>We can see on the diagram of the state machine that our Response flavors the current action, and future actions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ldYd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ldYd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 424w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 848w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 1272w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ldYd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png" width="960" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70755,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ldYd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 424w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 848w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 1272w, https://substackcdn.com/image/fetch/$s_!ldYd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d76e2d7-cf87-41b3-bb6a-a4c52c79c536_960x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Part 3: Accessing and adding to knowledge</h2><p>You need to know something in order to consciously analyze it. The act of perceiving something may add new knowledge to a person&#8217;s total knowledge pool, which then can be used for Analysis.</p><p>However, the Capilano Bridge Experiment shows, the Response step can give rise to emotional stimulation which affects the state of the brain, and again, colors what Knowledge can and will be accessed, and can change a person&#8217;s behavior. Stress often causes reduced access to memory, and thus the accessible knowledge may be reduced. In some people it can cause more acute memories. We always arrive at Knowledge, but how we arrive there is colored by our Response and what we already Know.</p><p>If I watch a movie I&#8217;ve already seen, I may find myself noticing things I didn&#8217;t notice the first time, because my Knowledge component isn&#8217;t as fixated on absorbing the core of the what&#8217;s being presented, and may let me focus on different details.</p><h2>Part 4: Analysis</h2><p>Now, having received input, translated that into brain input, felt a certain way about it, and had it collide with things we know, finally we arrive at Analysis. This too is not always a conscious process - we are not rational actors nor are we perfect information analyzing machines.</p><p>We&#8217;ve been trained by the things we&#8217;ve experienced in the past and our state has been flavored by the thing we&#8217;re currently experiencing <em>with</em> the context of those past experiences. When making games, we have players who usually have experience with other games that they will bring to ours. We have to be aware of conventions, because if you suddenly make a traffic light &#8220;red&#8221; mean &#8220;go&#8221; instead of stop, you&#8217;re asking people to unlearn a lifetime of &#8220;red light means stop&#8221;. </p><h2>Part 5+: Action</h2><p>Finally, our stimulus gets converted to action. If you&#8217;re playing Half-life 2 and you see a red dot on the ground near you, you know there&#8217;s a rocket launcher being trained on you, and might immediately begin moving the mouse to preemptively return fire or run for cover.</p><p>All of this happens automatically, and near-instantly. Depending on our level of immersion in the game (or whatever we&#8217;re experiencing), we&#8217;re taking action in sub-second intervals. In League of Legends you may be clicking six times per second, but the instant you hear the telltale sound effect of Morgana firing a Dark Binding (crowd control skillshot) at you, your next click is likely perpendicular, moving horizontally away to avoid it. You may even instinctively flash if your experience tells you that the binding is unavoidable, and that being hit by it will result in your death, so you need to use a high-cooldown blink to escape.</p><p>Here&#8217;s a hypothetical example in which we understand that some CC is coming at us, and we need to dodge it immediately.</p><ol><li><p>Intent</p><ol><li><p>What happens: My brain has output a course of action that I will now attempt to take. This is based on all of the previous steps and modifiers.</p></li><li><p>Outcome: &#8220;I need to flash to dodge this!&#8221;</p></li></ol></li><li><p>Unconscious Actions</p><ol><li><p>What happens: My body reacts to the input without me consciously planning to do so.</p></li><li><p>Outcome: Tensing my shoulders in response to the danger, perhaps gasping from surprise.</p></li></ol></li><li><p>Instruction To Act</p><ol><li><p>What happens: Conscious actions to convert Intent into Physicality</p></li><li><p>Outcome: Attempting to move the mouse perpendicular to the incoming CC, and attempting to move my finger from hovering E to pressing F. This may happen very quickly because I&#8217;ve flashed a binding a hundred times, or it may happen very slowly because I need to think about it because I&#8217;m new and this isn&#8217;t muscle memory yet</p></li></ol></li><li><p>Action Taken</p><ol><li><p>What happens: The combination of 2 and 3; what the body <em>actually</em> did. Because I&#8217;ve now moved my muscles, this can also affect the body&#8217;s physical ability to respond by tiring or training them, so I may respond differently in future intentionally or strain my wrist and slow future movement. Or my hands might just not do what I told them because I&#8217;ve been tensing for 20 minutes because it&#8217;s a stressful game ie. affected by past Responses.</p></li><li><p>Outcome: My right hand moved up and to the left. My left hand pointer moved from E to F and pressed the key to Flash out of the way.</p></li></ol></li></ol><p>Our final physical reaction is a byproduct of all of the states and processes up to and during the current thing that&#8217;s happening.</p><h2>The Final States</h2><p>If you&#8217;re still reading, good for you. This is an insane amount of detail into something most people do not simply ever think about, and if you&#8217;re still here you&#8217;re either really into understanding people, or really committed to making better video games. Good for you, probably.</p><p>Now that we&#8217;ve learned about what processes people go through:</p><ol><li><p>Perception</p></li><li><p>Response</p></li><li><p>Analysis</p></li><li><p>Action</p></li></ol><p>And, that there are three states that are affect those processes.</p><ol><li><p>Physical</p></li><li><p>Emotional</p></li><li><p>Knowledge</p></li></ol><h2>Game Design For The Human State Machine</h2><p>By focusing on which of these we plan to affect and when, we can design games that impact people. As a case study, I like to use a very simple game of mine: <a href="https://chhopsky.itch.io/an-easy-fix">An Easy Fix</a>.</p><p>An Easy Fix is a simple twine game about a very bad day that I had trying to fix a time-critical bug, and engineers all over the world have cursed at me for raising their blood pressure.</p><p>It has one input: choosing what to do or say in any given passage.</p><p>It has two outputs:</p><ol><li><p>What happened based on my last choice</p></li><li><p>What time is it currently (ie. how much time is left before everything is ruined)</p></li></ol><p>When a choice makes something happen, new knowledge is added to the player&#8217;s Knowledge pool. When a choice causes time to pass, the clock ticks up, closer to the deadline. This creates an Emotional reaction of time pressure, which affects Physicality via stress.</p><p>On my first pass making the game, it was frustrating (intentional) but kind of boring (unintentional). It didn&#8217;t reproduce the actual tension of that day. I realized that this wasn&#8217;t the fault of the writing, it was simply the missing the component that actually made the day tense: a countdown to failure against a task of unknowable complexity.</p><p>When I added the timer, everything changed, and suddenly it was doing <em>exactly</em> what I&#8217;d intended. I had only been adding to the Knowledge Pool, but I needed to be incrementally adjusting the knowledge pool to affect the Emotional state. When retroing this, I realized I could have added the slack message sound to stress people out further, which was my intended experience. It was a valuable lesson.</p><h2>Training, Onboarding, and the First Time User Experience</h2><p>The first time that you play Dance Dance Revolution, you are probably standing in the center of the mat, like the tutorial showed you.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jabZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jabZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 424w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 848w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 1272w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jabZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp" width="600" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;thumbnail&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="thumbnail" title="thumbnail" srcset="https://substackcdn.com/image/fetch/$s_!jabZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 424w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 848w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 1272w, https://substackcdn.com/image/fetch/$s_!jabZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f5cf986-25c6-475e-ab88-94ba21788e8f_600x400.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you see an arrow coming up the screen, you might notice that, realize you have to stomp on an arrow, look down to see where the pad is in relation to your foot, then move your foot to it, then move it back to the middle.</p><p>The tenth time, you might have realized it&#8217;s not tenable to make three movements per arrow, and instead start with your feet on the pads. You might be used to alternating which foot moves so it&#8217;s more like dancing, left right left right, rather than simply moving the same foot over as new players do.</p><p>The hundredth time you&#8217;ve played it, you might recognize entire patterns of moves which you know to be Ladders or Crossovers. You might be able to glance at this screenshot and know that Player 2 (right) is hitting the down arrow with their left foot, because their right needs to hit the next Up arrow in order to set up the walk for the rest of the pattern on-screen, otherwise they&#8217;d need to either hit two successive notes with their left foot and break their rhythm, or spin around backwards to continue alternating, which looks very cool but is harder.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pPUA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pPUA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pPUA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg" width="640" height="448" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:448,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dance Dance Revolution Max 2 for PlayStation 2 - Screenshots&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dance Dance Revolution Max 2 for PlayStation 2 - Screenshots" title="Dance Dance Revolution Max 2 for PlayStation 2 - Screenshots" srcset="https://substackcdn.com/image/fetch/$s_!pPUA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pPUA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa705fa22-9165-41ea-b639-632b79765fa2_640x448.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even the default ordering of songs in DDR is intentional - each subsequent song at each difficulty adds new Knowledge about these patterns and what they mean for us. There&#8217;s also an obvious Physical component - a new player who hasn&#8217;t had these muscles trained isn&#8217;t going to be able to jump into higher difficulty songs because they might just not be fit enough to keep up with the stomping requirements. On an individual song design, you need to think about which sections are uptime (high intensity), which are downtime (space to recover), how we&#8217;ll manage our player fitness, and when and where to test it. </p><p>An easy-to-read but high-step-count set of Ladders might push our player Physicality while groups of skipping with high variance in rhythm might test their Perception in mapping those to actions.</p><h4>Helldivers 2</h4><p>You might then load up Helldivers 2 and despite a lifetime of Dance Dance Revolution, struggle with reading lists of arrows that are horizontal instead of vertical. You might also make that conversion quickly, and find yourself calling down Stratagems faster than anyone else on your second session.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!irAR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!irAR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 424w, https://substackcdn.com/image/fetch/$s_!irAR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 848w, https://substackcdn.com/image/fetch/$s_!irAR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 1272w, https://substackcdn.com/image/fetch/$s_!irAR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!irAR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp" width="640" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Helldivers 2: Stratagem Codes, listed - Dot Esports&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Helldivers 2: Stratagem Codes, listed - Dot Esports" title="Helldivers 2: Stratagem Codes, listed - Dot Esports" srcset="https://substackcdn.com/image/fetch/$s_!irAR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 424w, https://substackcdn.com/image/fetch/$s_!irAR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 848w, https://substackcdn.com/image/fetch/$s_!irAR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 1272w, https://substackcdn.com/image/fetch/$s_!irAR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9148ec67-0f14-4ece-82a0-b3e00fd451ca_640x360.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can see pretty quickly that when we&#8217;re dealing with games, we&#8217;re almost always dealing with precedent, because most people who buy a game are not buying their first game, so they come with the knowledge they learned playing other games. You have to design both for players with different sets of pre-existing knowledge.</p><h4>An Imaginary ARPG I Just Made Up: SwordJammers</h4><p>Say you&#8217;re working on the initial design for an upcoming ARPG called &#8220;<strong>SwordJammers</strong>&#8221;. You want to use combos in a particularly new and innovative way, and you&#8217;re trying to figure out if it&#8217;s worth it. A player new to the genre may pick <em>every</em> version of how combos work at roughly the same speed because they have to learn something new anyway, but an existing player may have <em>transferrable knowledge</em> that speeds up the process. </p><p>That same existing player may experience friction between their existing knowledge if they&#8217;re used to them working differently, as now they have to adjust the muscle memory they&#8217;ve already built up in other games. This friction may be increased if <strong>SwordJammers</strong> is the third in a series, and you&#8217;ve spent two whole games training fans to play a certain way then pulled the rug out from under them. Figuring out what knowledge exists in the player and what their expectations are is part of the challenge of teaching people your game. </p><p>This becomes increasingly more complex when you realize that sometimes, training people to know how to do what they need to before they need to do it may not actually be the goal.</p><p>Say you have particularly complex combos that need to be performed quickly in certain situations. If those skills and responses haven&#8217;t been trained and ingrained in the player, they may not be able to perform those complex moves, and you might find out that in the moments they really NEED powerful combos, that most players are simply not using them because they don&#8217;t have the muscle memory built up. You may only discover this through telemetry when you realize they&#8217;re not leveling up those abilities because they just don&#8217;t use them.</p><p>So what do you do? You may decide that in the area before these become mandatory, you will put in a handful of enemies that encourage and repeat the action of inputting complex combos in low-pressure situations such that the brain and hands are ready to go when the moment calls for it. However, you might also decided the opposite - that it&#8217;s the <em>concept</em> of combos that need to be taught, and that the challenge is supposed to be looking up, planning out, and mastering the right ones.</p><p>Will I add Knowledge? Will I try to increase recognition during Perception? Will I train their Physicality to have muscle memory? Do I need to give them a rest so they&#8217;re relaxed Physically and not tested Analytically right before the big fight? Will I try to increase Analysis? Which of these systems are being tested, how much, and why?</p><p>There is no Right Answer that universally applies, because every answer produces a different experience. Deciding what experiences to create and figuring out how to create them IS the job.</p><h2>Tracking The Human State Machine</h2><p>Wherever you go, the sky is the sky, and people are people. All people are different, which means that creating a universal experience is impossible. This is part of the reason that I say writing well is more difficult than programming well, because programming has a predictable deterministic compiler, but writing must be passed through the ad-hoc conceptual maps of reality created for themselves by an infinite number of different people with different versions of the core parts of life training their brains while equally infinite numbers of good and bad things randomly occur.</p><p>If you are making a game for everyone, you are making a game for no-one. Your game has target demographics and it has people it&#8217;s designed to appeal to. While serving each of these cohorts you will make assumptions about their Knowledge Pool, their Emotional state, and their Physicality. If you are releasing a new MOBA, you can assume that some portion of players will be bringing their Knowledge and Physicality over from League of Legends and DOTA2, but you&#8217;ll also have new players unfamiliar with the genre. But for all of them, you can determine that by 40 minutes into the game when people are getting one-shot by assassins, they will be emotionally tense. You must onboard people from whatever states you decide are worth your effort to invest in.</p><p>Tracking this in an absolute, objective manner is impossible. You&#8217;ll never have the exact same response from any two people, but by speaking in generalities about the <em>kinds</em> of people, the demographics, the cohorts, you can begin to figure out how to create what you want to create. Games are a special case for this, because unlike a film or a song where you can at least be assured that everyone is experiencing roughly the same stimulus, player actions change what they see and hear. For most, it&#8217;s impossible to guarantee that any two players will even experience the same stimulus.</p><p>Everything we get our players to experience affects their knowledge pool, their emotional state, and often their physical state. We are training their brains to respond in the ways we want, to deliver the experience we want to create. The challenge, then, is to design our games and systems such that we induce the results we want in the people that we want them from.</p><p>And that, dear reader, is on you to solve.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Social Game Design: Party Edition]]></title><description><![CDATA[A case study in social dynamics, and games that occur outside the computer.]]></description><link>https://loadbearingtomato.com/p/social-game-design-for-parties</link><guid isPermaLink="false">https://loadbearingtomato.com/p/social-game-design-for-parties</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Tue, 21 May 2024 21:23:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ASPn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I was a kid, my birthday was always during the state championships for hockey, so as a result, I never got to have birthday parties, not proper ones. So when I grew up, I went hard in the other direction and went absolutely HAM making the greatest parties I could imagine. They were legendary, and people hung out for what the concept was going to be every year.</p><p>One year, there was a Nintendo party where I got a heap of old consoles and emulators and set them up all over the house, something like 10 screens in total, everyone came in costume of their favorite Nintendo characters. Another year, I ran a mini-festival, invited four bands, and after they played their sets, they started taking requests. &#8220;Who knows [such and such a song]&#8221; and people from various bands would jump on whatever instrument and try to play it from memory.</p><p>If these seem like they have divergent audiences, it&#8217;s because they did. I had my friends who played video games and tabletop, my music friends who played in bands, and my work friends who were all network engineers, and I noticed that even in these party situations, the groups rarely interacted with each other. </p><p>That&#8217;s what sparked the idea for a social game party that would encourage them to mix.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ASPn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ASPn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ASPn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg" width="1456" height="755" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:755,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:347938,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ASPn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ASPn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde1eab26-3b30-4cd8-8daa-7b6151d54646_1456x755.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>A Social Rock-Paper-Scissors Battle Royale</h2><p>I made hundreds of badges, each with a picture of either Rock, Paper, or Scissors, and put them in buckets behind a desk by the door. As people arrived, they were issued three badges, either Rock, Paper, or Scissors.</p><p>The rules were simple:</p><ul><li><p>You may challenge someone with a badge that your badge &#8220;beats&#8221; to a game of Rock Paper Scissors.</p><ul><li><p>You &#8220;bet&#8221; your badge against your opponent&#8217;s badge.</p></li><li><p>Best of three wins the opponent&#8217;s badge.</p></li><li><p>A challenge could not be refused.</p></li></ul></li><li><p>The beaten party could request a rematch, but had to bet double the previous bet ie. playing for two badges.</p><ul><li><p>A rematch request <em>could</em> be refused.</p></li><li><p>Any type of badge could be bet on a rematch.</p></li><li><p>This could continue to happen as long as people wanted, each time doubling the number of badges on the line.</p></li></ul></li><li><p>The winner would be the person with the most badges at the end of the night.</p></li></ul><h2>The Twist</h2><p>This is where it got sneaky.</p><p>When you started, you got three badges of the same type. By selectively weighting which types of badges were distributed to people from which social circle, I was able to make it so that while it was possible to play a little within your own group, you needed to go outside it to get a lot of matches. This worked exactly how I&#8217;d imagined - groups played within themselves at first, but quickly found themselves exhausting their pool, and looked for more opponents. The groups began to mix, and the previously disparate social groups drank, competed, and bet more and more against each other.</p><p>If you lost all your badges and wanted to keep playing, you could request more from the secret stash behind the counter.</p><h2>The Outcome</h2><p>By the end of the night, all of the reserve badges were gone, and almost all the badges were concentrated on two people, creating a massive grand final surrounded by drunken cheering, and both went all-in on one final best-of-three.</p><p>I don&#8217;t remember who won. It wasn&#8217;t important. What was important was that the design of the game was explicitly crafted around affecting player behavior to influence movement around the house and which other players they interacted with. When it was over, we did what we did at the end of every party and fell back to the one activity that sated every ground: playing Rock Band on a full suite of instruments.</p><p>It was a success by every metric. By the end of the night, the badges were ALL gone, everyone had played the maximum amount possible and aside from the badges people stole for posterity, the game ended with no-one else able to challenge the winner.</p><p>That night formed many new friendships (and a few hookups &#128536;) and represented a major social shift in the social makeup of the groups. The music crew and the gaming crew partially merged and began to hang out outside of my gatherings. The tech crew didn&#8217;t integrate as well, but did have some fringe overlap with the gaming crew, and that also formed some new friendships. The more introverted folks took more time to join the fray than others, but after a few drinks and a few matches, still mingled outside of their circles, which didn&#8217;t usually happen.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><h2>The Retro</h2><p>This was a rousing success, but that doesn&#8217;t mean there weren&#8217;t lessons to be learned. I retro&#8217;d this, because of course I did, to see what I could have done better, and figured out a few missed opportunities.</p><ul><li><p><strong>Learned:</strong> People had a bias towards which badge they wanted to start with. </p><ul><li><p>This makes sense as most people default to a particular move in RPS.</p><ul><li><p><strong>Do differently (Art):</strong> I could have influenced this by doing better badge design to appeal to each intended group e.g. album-art themed for scissors for music, D&amp;D themed for rock, tech-themed for paper.</p></li></ul></li></ul></li><li><p><strong>Went poorly:</strong> There were not enough snacks.</p><ul><li><p><strong>Do differently (MTX):</strong> I could have encouraged people to bring snacks by offering snack tokens to exchange for additional badges, which people wanted.</p><ul><li><p>This would require getting something previously unavailable so perhaps needed to add a time gate like &#8216;no replacement badges in the first hour except for via snack token&#8217;.</p></li><li><p>That would need to feel optional so as not to appear greedy or demanding.</p></li></ul></li></ul></li><li><p><strong>Learned (via Feedback):</strong> The idea of not being able to refuse a challenge made some of the more introverted people uncomfortable, but ultimately they came to enjoy it.</p><ul><li><p>This was primarily a perception issue but could have been a trust &amp; safety issue if I had less trustworthy friends.</p></li><li><p>Fortunately everyone was reasonably socially competent so they tended not to bother people who didn&#8217;t want to be bothered.</p></li><li><p><strong>Do differently (Social):</strong> I needed a mechanism via which people could set themselves to be &#8216;off the table&#8217; for challenges.</p><ul><li><p>Perhaps &#8216;visible badges&#8217; and you could hide them with a coat?</p><ul><li><p>Brisbane winter is cold enough that indoor coat usage is viable.</p></li></ul></li><li><p>Alternately, a flippable state badge for red/green. This would have required more effort and for me to start this process more than two days before the event.</p></li></ul></li></ul></li></ul><h2>How This Applies To Game Development</h2><p>Wherever you go, the sky is the sky and people are people.</p><p>Changing the method of the game adjusts your tooling. When designing physical games, you no longer have a computer to track state and enforce rules. Instead, state is tracked physically and rules are enforced cognitively. Both of these things create player burden.</p><p>A game for drunk people in a social setting needed to have rules that were trivial to enforce, and state that was trivial to track. The known mechanics of Rock-Paper-Scissors required no learning, so there were only two new systems for players to learn:</p><ol><li><p>Matchmaking</p></li><li><p>Progression</p></li></ol><p>When designing player-facing game systems, you have to think through how players are going to:</p><ul><li><p>Interpret what they&#8217;ve been presented with</p></li><li><p>Think using that interpretation</p></li><li><p>Feel about that interpretation</p></li><li><p>Act based on those thoughts and feelings</p></li></ul><p>I call this &#8220;human state machine modeling&#8221;, and it relies on the fundamentals of how people experience things to create experiences. It&#8217;s the fundamental way that I approach design, and it applies to everything from game design to copywriting to internal process design.</p><p><s>Stay tuned for a deep dive into that in a future post here on Load-bearing Tomato.</s></p><p>The future delivered: &#8220;<a href="https://loadbearingtomato.com/p/how-people-experience-things">How People Experience Things</a>.&#8221;</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA["We Only Hire Seniors", And Other Mistakes]]></title><description><![CDATA[How structure creates sustainable velocity.]]></description><link>https://loadbearingtomato.com/p/we-only-hire-seniors-and-other-mistakes</link><guid isPermaLink="false">https://loadbearingtomato.com/p/we-only-hire-seniors-and-other-mistakes</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Thu, 16 May 2024 22:38:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, May 16th 2024, employees of Phoenix Labs (makers of Dauntless and Fae Farm) reported on Linkedin that the company had shutdown unexpectedly, and would be laying off nearly everyone. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e078!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e078!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 424w, https://substackcdn.com/image/fetch/$s_!e078!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 848w, https://substackcdn.com/image/fetch/$s_!e078!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 1272w, https://substackcdn.com/image/fetch/$s_!e078!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e078!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png" width="1184" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e078!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 424w, https://substackcdn.com/image/fetch/$s_!e078!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 848w, https://substackcdn.com/image/fetch/$s_!e078!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 1272w, https://substackcdn.com/image/fetch/$s_!e078!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4538edb-1bd1-4479-a9ae-8c118fd74a5b_1184x364.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It is fitting then that I chose today to talk about staffing, and specifically, a phrase I heard for the first time at on Dauntless.</p><blockquote><p><strong>&#8220;We only hire seniors.&#8221;</strong></p></blockquote><p>On the surface, this sounds like it could be a sensible policy in a AA studio. With a limited maximum headcount, surely you want the most capable individual contributors? </p><p>I counter this logic with one single question.</p><p><strong>&#8220;When was the last time you saw a major failure in game development caused by a lack of skill in a individual contributor?&#8221;</strong></p><p>Was it&#8230; never? I can&#8217;t think of a single instance. When I look back over my long and storied career spanning both tech and games, I can point to failures caused by poor organizational management, disorganized operations, failures of individual managers, communication issues, production issues, lack of leadership, lack of defined processes, but <strong>not a single time</strong> where I&#8217;ve lamented having a junior.</p><p>In order to talk about what happens when you only hire seniors, we need to first talk about how game studios (and software development companies in general) are structured, and why.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The Normal Structure</h2><p>All companies run on hierarchy. If a company claims to have a &#8216;flat structure&#8217;, they&#8217;re lying. They have a hierarchy, it&#8217;s just undocumented. Here is a non-exhaustive hierarchy of my hypothetical game company &#8220;40 More Servers Studios&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IDvj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IDvj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 424w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 848w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 1272w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IDvj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png" width="1456" height="956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:956,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:295298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IDvj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 424w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 848w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 1272w, https://substackcdn.com/image/fetch/$s_!IDvj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F018ad940-99fc-4370-8f0b-af4f983b0466_2225x1461.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Obviously there&#8217;s more disciplines, roles, and departments than this, but you get the idea.</p><p>A vertical line indicates seniority - a relationship whereby the people below a role&#8217;s seniority are bound to the decisions made by the level above it. </p><p>Decisions fall into one of three categories:</p><ol><li><p>Identifying a required outcome</p></li><li><p>Deciding what to do to achieve that outcome</p></li><li><p>Deciding how to do it</p></li></ol><p>The Game Director might decide &#8220;we need two playable characters: one who is out of place, and one who is local to the world&#8221;. </p><p>The Narrative Director might decide &#8220;We are going to make a Black samurai, and a Japanese ninja.&#8221; </p><p>The manager of the character narrative team might then assign the Senior Narrative Designer to naming these characters and designing their backstories.</p><p>The Narrative Designers might then be assigned writing the individual barks, dialogue, and lines for the characters to bring them to life, in line with the design decisions made above them.</p><p>If we use <a href="https://monday.com/blog/project-management/raci-model/">the RACI model (Responsible, Accountable, Consulted, Informed)</a> we can see that at each level, the lower level is <strong>Responsible</strong> for doing the work, and the higher level is <strong>Accountable</strong> for the work getting done. The narrative director is <strong>Accountable</strong> for the creation of characters that serves the game&#8217;s needs, and the narrative designers below them are <strong>Responsible</strong> for bringing them to life.</p><p>Every time you traverse down a level on the chart, the scope of the decisions you need to make narrows. They become more focused. You are bound by the decisions that occur above you, but you have the agency to make decisions within your area of responsibility and perform that work.</p><h2>But We Only Hire Seniors?</h2><p>People like the idea of &#8220;only hiring seniors&#8221; because seniors are experienced enough to make decisions, and execute on those decisions. As a senior, you often receive vague requirements and requests, and must not only translate the need you&#8217;ve been given into an action for your discipline, but also figure out how that action will be taken. There are many decisions to be made, so hiring a lot of people who can make decisions makes sense, right?</p><p>No. Let&#8217;s look at an alternative chart, where you only hired seniors.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JbMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JbMS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 424w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 848w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JbMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png" width="1456" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:267358,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JbMS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 424w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 848w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!JbMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a9226c5-b4e6-4430-9a58-653937aed25b_2282x1238.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Anyone who&#8217;s worked somewhere &#8220;We only hire seniors&#8221; already knows where this is going. There are three massive problems here.</p><ol><li><p>There are fewer decisions arriving downwards.</p></li><li><p>The number of people that you need consensus from for a decision on your level has gone up by a lot.</p></li><li><p>The people making those decisions are also the ones responsible for doing the work.</p></li></ol><p>Decisions that people should have been empowered to make now affect all of seniors, so they&#8217;re no longer empowered to make decisions. In the RACI model, you now have a large group of peers who need to be <strong>Consulted</strong> about your decisions. Every decision is everyone&#8217;s problem.</p><p>Seniors are great because they have a lot of experience, and no two people&#8217;s experience is the same. But without agency, this strength becomes a weakness because no two people&#8217;s experience is the same, so the &#8216;best&#8217; thing to do and the &#8216;best&#8217; way to do it can appear to be very different to different seniors. They also care more, because they are going to have to be the ones to do it. While everyone is generally very good at their craft at this level, if they don&#8217;t have management experience they are not going to know how to handle this disagreement, and will resort to the one tool they have in their toolbelt: meetings.</p><p>And all of a sudden, the calendar time to implement anything has gone up. Despite the Manager being <strong>Accountable</strong> for a task, and any particular worker <strong>Responsible</strong>, all of your peers need to be <strong>Consulted</strong>. For tasks above a particular size that may require multiple workers, the worker that is <strong>Responsible</strong> now requires people they have no seniority over to also participate in that work. Your velocity grinds to a crawl, as even things that should be simple require a lot of effective communication on, with no clear structure to define how that should happen, or who can tell anyone else what to do or how to do it.</p><p>Look at what has happened to your decision inheritance. You&#8217;ve taken a perfectly functional headcount and given it anxiety.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><h2>Does It Actually Work This Way In Real Life?</h2><p>Yes. It&#8217;s common for studios to build a game, release it, and then take most of the workers off the original game, leaving only a maintenance crew to keep the game going, keep it patched, make DLC, etc.</p><p>One thing that I&#8217;ve observed with terrifying consistency is that in senior-only environments, <strong>every time a team shuffles workers off for new title teams, the work output of the team increases</strong>. I don&#8217;t even mean &#8220;per person&#8221;, I mean <em>total completed work</em>.</p><p>This sounds insane until you remember that seniors are smart people who work best when empowered to make decisions in areas they are responsible for. Large teams of seniors around them create roadblocks that everyone within them must clear in order to perform work they should have just been able to do.</p><p>Some examples:</p><ul><li><p>A team of services engineers reduced from 7 to 2 more than doubled their work output, as measured by delivery time of requests for new services, and changes to existing services</p></li><li><p>An engine programmer who had always run into roadblocks around addressing the root cause of high server costs and poor performance no longer having anyone to tell him to address &#8220;low hanging fruit&#8221; first was able to prioritize the medium-sized task of reworking the server core and reduced costs by millions of dollars per year.</p></li><li><p>A designer who was able to design and implement entirely new gameplay features on their own faster than with a team, for simply not having to have so many meetings about it.</p></li><li><p>A delivery specialist (packaging, compilation, distribution) who lost two senior peers and gained two interns able to bring forward the &#8220;drop dead date&#8221; of last call for content by multiple days by simply having people they could tell what to do, who then did it.</p></li></ul><p>One side effect of this problem is decision paralysis. When Seniors who are used to making decisions just go ahead and do that, it creates problems when their peers disagree with the methodology. So you yank the emergency brake to set up meetings about work that&#8217;s already in flight, and have to discuss whether you&#8217;re going to undo it or keep going. It doesn&#8217;t take long for this to train everyone on the team that they&#8217;re <strong>unable to make decisions without everyone&#8217;s input</strong>, which again, creates delays and disempowers the people who <em>should</em> be making decisions.</p><p>It also creates an institutional knowledge problem, because instead of formal responsibilities for particular systems or areas of the game, people can fall into undocumented roles where they&#8217;re &#8220;the audio person&#8221; or &#8220;the one that knows about player blobs&#8221;. Organizationally, it looks like there&#8217;s redundancy, but corporate can&#8217;t see this when they&#8217;re getting ready to do layoffs, and the next thing you know, the only person who knew how your ambient sound emitters operate just got booted from the company slack.</p><h2>Juniors In Action</h2><p>Fresh graduates coming out of universities and colleges these days are shockingly good. They know significantly more than I did when I graduated, and they&#8217;re better with their tools. What they lack is experience in the workplace &#8212; how to operate in teams, how to communicate, how to use collaboration tools, good practices for being functional in a company full of moving parts.</p><p>You just need to tell them what to do, with occasional guidance on how to do it. This necessitates good documentation practices, since you can no longer count on ten years of experience to &#8216;figure it out&#8217;; you have to plan. Seniors in these situations have more than once said to me that they refused to write documentation or comment code, because &#8220;we only hire seniors&#8221; so it&#8217;s fine because people would figure it out. I do not need to explain why this is bad.</p><p>Games take more work to make than they ever have. Engines are more complex. Server infrastructure has to handle larger player counts. Players expect longer play time and higher graphical fidelity. The amount of raw work that needs to be performed has gone up by so much that Doom (2016) had over 100x more workers than the original Doom (1993).</p><p>By giving seniors who are empowered to make decisions juniors to instruct and direct, you allow them to take horizontally-scalable action on those decisions. Those juniors will probably not work as quickly or effectively as an appropriately skilled senior, but they will receive far more specific instructions and be able to act on them quickly and in parallel with other juniors on their team.</p><p><strong>By removing decisions as a choke point in a broad senior level you increase velocity using juniors to act on those decisions.</strong></p><p>They&#8217;re also just cheaper per person in pure labor cost! By a lot!</p><h2>Also, We Want The Future To Be Bright</h2><p>The final, obvious problem with only hiring seniors is that you&#8217;re breaking your progression pipeline.</p><p>Seniors are generally pretty capable, and there are very few paths for advancement in these broad teams. Most organizations don&#8217;t have advanced individual contributor tracks, and sending people who are subject matter experts straight into management is part of the reason we ended up in this mess in the first place. Knowing &#8216;how to Make A Good Art&#8217; is very different skillset from &#8216;how to get a team of ten to Make Many Good Arts&#8217;.</p><p>This shortsightedness blinds people towards how unsustainable this is for the industry at large. If you are not bringing juniors into the industry and giving them experience, they do not ever <em>get</em> to be seniors. You and I will get older, we will burn out, we will retire, we will move into other industries when we get sick of layoffs, and there will simply not be enough experienced people to replace us. <strong>The attitude of only hiring seniors shoots itself in the foot with unsustainability because it prevents the kind of people you want to hire from existing.</strong></p><p>&#8220;We only hire seniors&#8221; is a red flag of pointless meetings, thrash, and low-velocity low-satisfaction work environments, and should be treated as such. </p><p>Stay tuned for next time, where we&#8217;ll be learning about how to use the Wwise audio engine with Unreal Engine 5 by addressing the basic concepts and objects involved, and how to avoid the undocumented pitfalls that await you within.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What Is Yak-shaving?]]></title><description><![CDATA[A miserable little pile of secrets.]]></description><link>https://loadbearingtomato.com/p/what-is-yak-shaving</link><guid isPermaLink="false">https://loadbearingtomato.com/p/what-is-yak-shaving</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Wed, 15 May 2024 20:00:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dnLW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yak-shaving is a reasonably common term in the old tech world, but like many of the old wisdoms, it has been used and misused, and largely failed to make the jump into games.</p><p>The term had existed for some time when it was popularized by Seth Godin with his 2005 blog post &#8220;<a href="https://seths.blog/2005/03/dont_shave_that/">Don&#8217;t Shave That Yak</a>&#8221;, in which he described a series of increasingly bizarre tasks that diverge further and further from the task you&#8217;re actually trying to complete.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><pre><code>&#8220;I want to wax the car today.&#8221;

&#8220;Oops, the hose is still broken from the winter. I&#8217;ll need to buy a new one at Home Depot.&#8221;

&#8220;But Home Depot is on the other side of the Tappan Zee bridge and getting there without my EZPass is miserable because of the tolls.&#8221;

&#8220;But, wait! I could borrow my neighbor&#8217;s EZPass&#8230;&#8221;

&#8220;Bob won&#8217;t lend me his EZPass until I return the mooshi pillow my son borrowed, though.&#8221;

&#8220;And we haven&#8217;t returned it because some of the stuffing fell out and we need to get some yak hair to restuff it.&#8221;

And the next thing you know, you&#8217;re at the zoo, shaving a yak, all so you can wax your car.</code></pre><p><br>I prefer a shorter definition.<br></p><blockquote><p><br>&#8220;When the prerequisites for a task recursively generate more prerequisites.&#8221;<br></p></blockquote><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dnLW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dnLW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dnLW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg" width="1200" height="691" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:691,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dnLW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dnLW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F900241f7-f3cf-43e4-b759-aaeb25fb806c_1200x691.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Illustration by David Revoy of the webcomic &#8220;<a href="https://www.peppercarrot.com/">Pepper &amp; Carrot</a>&#8221;</figcaption></figure></div><p>Yak-shaving occurs for one singular reason.</p><h2>Lack of pre/intra-task scoping evaluation</h2><p>Yak-shaving can occur when the depth of the recursion required for the original task is <strong>unknown</strong>. In practice, the first sign of yak-shaving is often having to go back after sprint planning to report &#8220;actually this task is much more complex than I first thought, and now I have to do <strong>[OTHER TASK]</strong> in order to start&#8221;. If this happens more than once in the chain of tasks spawned by the original task, you are probably yak-shaving.</p><p>The root cause of yak-shaving is a lack of understanding of the chain of dependencies involved, and those dependencies not being raised during grooming or planning when your task was prioritized and scheduled.</p><p>What should happen:</p><ol><li><p>A need for a particular task is raised.</p></li><li><p>A subject-matter expert flags that the task has prerequisite that prevent the work from being completed.</p></li><li><p>An optimized chain of work is created, with each task listed as a blocker or sub-task of it&#8217;s parent.</p></li></ol><p>What actually happens?</p><h2>A Real World Example</h2><p>This is a paraphrasing of a real yak-shaving incident that I was the sole participant in.</p><ul><li><p>I wanted to distribute an app in the Mac app store.</p></li><li><p>So I needed to sign my code. (known)</p></li><li><p>So I applied for a code signing certificate from Comodo. (known)</p></li><li><p>Comodo needed to validate my business entity, which they wouldn&#8217;t do because that entity was not locally registered. <strong>Everything past this point was unknown work outside of scope.</strong></p></li><li><p>So I needed to gather materials for personal validation instead.</p></li><li><p>I had changed my name when I got married, and the name on my locally-verifiable identity had not been updated yet, so I needed to go to the DMV to get a new driver&#8217;s license.</p></li><li><p>The DMV would not accept my name change certificate because it was issued out-of-state, and because as an immigrant, my &#8220;foundational document&#8221; was my green card.</p></li><li><p>My green card had also not been updated with my new name, and in order to do that, I needed an FBI background check.</p></li><li><p>In order to get an FBI background check, I needed to get my biometrics (fingerprints) verified to make sure I wasn&#8217;t a criminal, so I had to go to a third-party fingerprinting business.</p></li><li><p>To park outside the fingerprinting business, I needed to use a particular app, but that app was rejecting my credit card information, so I had to call my bank, and it turned out my card had been flagged for fraud and blocked.</p></li></ul><p>And that&#8217;s how I ended up trawling my transaction history to validate my purchases, so I could unblock my credit card, so I could pay for parking, so I could get my fingerprints taken, so I could get a background check, so I could get a new green card, so I could get a new driver&#8217;s license, so I could validate my identity, so I could get a code signing certificate, so I could publish a completed app to the app store.</p><h2>The Real Truth About Yak-shaving</h2><p>Yak-shaving, at it&#8217;s core, is the <strong>recursive resolution of technical debt</strong>. That debt can occur in many forms. It can be as simple as that the process you&#8217;re attempting to undertake has simply not been done before, and you are unaware the dependencies of what you&#8217;re attempting to do.</p><p>Since we can&#8217;t simply wish our way into complete knowledge of the world and our code-bases, instead we must have strategies to <strong>manage</strong> yak-shaving. In practice, this means <strong>identifying when you are experiencing task prerequisite recursion</strong> as early as possible. </p><p>In my example, if I&#8217;d understood the depth of the recursion, I would have just registered a local business entity the second that Comodo told me I needed one. It would have been faster and easier. Instead, I went down a rabbit hole that recursively opened up further rabbit holes, and the rest of those tasks could have been completed at my leisure <strong>without blocking app publication</strong>.</p><p>Yak-avoidant scoping opens up new possibilities for how to achieve your goals. You might be able to assign multiple engineers to work on parts of the chain concurrently, allowing you to still deliver on time. You might discover that it isn&#8217;t worth the amount of time you&#8217;d have to spend fixing the system, and instead make the call to rewrite it or replace it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><h2>What About When The Chain Is Unavoidable?</h2><p>When I was working on Dauntless, I needed to add a new type of Hunt to a player menu. Three weeks later, I was tearing the codebase apart, pulling out 30+ references to a kind of daily/weekly challenge system that had not been used in years, of a chain of dependencies in the software that necessitated decommissioning the system in order to update three more levels of system that all needed changes to allow for an alternate data source. It took six times longer than we&#8217;d budgeted, and it was pure technical debt. This was unavoidable, but it shouldn&#8217;t have been unknown. The work was &#8220;punted over the fence&#8221; to me by the design team, who simply wanted to be able to selectively show or hide new types of Hunts.</p><p>What I <strong>should</strong> have done was push back on the original task, and instead set up an investigation task to correctly scope the work. If I&#8217;d taken the time to evaluate it properly, since I was unfamiliar with the systems involved I would have contacted the original UI engineer who built the menu system, and they could have correctly scoped that work. </p><p>What I <strong>actually</strong> did was just start work on it, and sequentially run head first into the limitations of each of the four layers of systems that constructed the menus.</p><p>The fix is the same: Correctly scope the work so know what you&#8217;re signing up for, so you can correctly set your stakeholder expectations.</p><h2>Don&#8217;t Shave That Yak</h2><p>We&#8217;ve discussed technical debt before <a href="https://chhopsky.substack.com/p/premature-optimization-and-rapid">in the context of rapid prototyping</a>. Technical debt should be resolved at the point at which the outcome that resolving it justifies the work involved in resolving it.</p><p>These four statements will help you identify if you are yak-shaving:</p><ul><li><p>The work <strong>must</strong> depend on tasks that were not known during scoping.</p></li><li><p>Attempting those tasks <strong>must</strong> generate additional tasks.</p></li><li><p>The work <strong>may not</strong> be delivered in the expected timeframe.</p></li><li><p>The work <strong>may not</strong> be the the optimal path to resolution of the initial task.</p></li></ul><p>Using this criteria during retros will assist you in identifying yak-shaving incidents, and once you&#8217;ve done that, you can start adjusting your workflow to prevent them.</p><h2>How Do We Avoid This, Organizationally?</h2><p>A short, but non-exhaustive list:</p><ul><li><p>Design your codebase in a way that takes knowability into account.</p><ul><li><p>Remember, if you have a live game and a junior cannot fix a bug in your code at 3am without you, you are signing yourself up to be called at 3am.</p></li></ul></li><li><p>Publish high level dependency charts of how your game fits together.</p><ul><li><p>Don&#8217;t forget to include historical context of how and why particular systems and arrangements came to be. This can be valuable and is often missed.</p></li></ul></li><li><p>Think through the entire process of a task and what it touches before you start to generate a list of dependencies.</p><ul><li><p>What systems in the codebase does the thing I&#8217;m touching rely on?</p></li><li><p>Are there things outside the game code this depends on? Kubernetes, services, and deployment environments often get forgotten here.</p></li></ul></li><li><p>Be aware when you are making assumptions about how a system works.</p></li><li><p>Have your processes allow for flagging of those assumptions for validation.</p></li><li><p>Keeping an eye out for tasks that are recursing, and flagging it early.</p></li></ul><p>&#8212;</p><p>Stay tuned for next time, when we&#8217;ll discuss my favorite red flag: </p><p>&#8220;We only hire seniors&#8221;.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Premature Optimization and Rapid Prototyping]]></title><description><![CDATA[Is 'working' good enough?]]></description><link>https://loadbearingtomato.com/p/premature-optimization-and-rapid</link><guid isPermaLink="false">https://loadbearingtomato.com/p/premature-optimization-and-rapid</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Tue, 23 Apr 2024 20:50:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gabP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On April 22nd 2024, a screenshot from the lua code for the hit new indie game <a href="https://store.steampowered.com/app/2379780/Balatro/">Balatro</a>, a poker roguelike deckbuilder, was posted on Twitter, and people collectively lost their minds.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gabP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gabP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gabP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gabP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gabP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gabP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:780418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gabP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gabP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gabP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gabP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079904f5-1acf-4653-8388-cf5b4543d5f3_1536x2048.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Balatro gameplay logic lua code</figcaption></figure></div><p>There is a 4717 line file called <code>card.lua </code>that contains all of the gameplay logic. A lot of people who have not done a lot of game development are laughing at this.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Rapid Prototyping</h2><p>The thing is, games do not pop into existence fully formed. There&#8217;s a pitch, sure, but that&#8217;s just an idea; a space where a game might come to be. In order to discover what your game <em>might</em> be, you need to experiment, and in order to do that, you need to write code that will allow you test ideas quickly and easily. The process of doing this is called <strong>&#8220;Rapid Prototyping&#8221;</strong>, and it&#8217;s a vital part of the process of exploring your game idea and finding the details of the reality.</p><p>A lot of things that sound good actually just aren&#8217;t that fun in practice. Other times, things you never imagined in the pitch come to you while you&#8217;re experimenting and you pivot. Being able to pivot your design quickly is key to being able to make those discoveries. The real skill of gameplay programming during R&amp;D is being able to find a balance between &#8220;what lets us test ideas quickly&#8221; and &#8220;what limits our ability to move forward&#8221;.</p><p>If you actually look at what this code is doing, it&#8217;s not something a simple &#8220;switch&#8221; case could necessarily do, and Lua doesn&#8217;t even have a switch case. This block of code is looking for a single sub-block to return, but the value match sometimes comes with one or more validation checks that prevent it from entering the sub-block if the preconditions aren&#8217;t met, and the work performed in each sub-block is not necessarily static either. It&#8217;s setting a couple of different variables and performing per-card functionality ONLY once the card precondition has been satisfied. A look-up table (LUT) alone won&#8217;t satisfy this as it must have configurable precondition checks and post-check actions. You are routing. You need a system.</p><p>Systems design can be tricky. Every person&#8217;s strengths and weaknesses as a developer and as a programmer will give them different approaches. Systemizing too early has several drawbacks:</p><ol><li><p>You need to commit to a significant amount of development before you can start designing</p></li><li><p>Increasing design reliance on engineering resources to perform basic experiments if the system is not appropriately extensible</p></li><li><p>Failure to correctly predict where design will need to go can limit the execution options your designers have and shoehorn them into behaviors supported by the system, affecting design outputs</p></li></ol><p>You need to make sure that you provide tools that allow designers as much freedom as they can have without breaking fundamental engineering pillars, and they need to be able to experiment quickly. When you systemize, you add constraints, and these constraints can mean that your designers either can&#8217;t do what they want without help, or worse; that they start working around your systems in ways that will cause later breakage as your assumptions are invalidated.</p><p>While I&#8217;d feel confident building a card system that could extend to the necessary potential outcomes while leaving room for experimentation, I come from a data-driven background so that&#8217;s the methodology that makes sense to me, and I have a lot of experience coming at problems from that angle. I&#8217;ve worked on a lot of F2P live service games so I&#8217;m always going to be thinking about maintenance and effectiveness, and it&#8217;s trivial for me to write those kind of systems.</p><p>But even then, I don&#8217;t always write them as a first option. Outside of my day job, I help out on indie games. The other day I was making footstep audio, and the first-pass version was to simply place sound emitters approximately where the player character&#8217;s feet are, and trigger some manual logic in the animation blueprint to fire events when the animations stepped. It passed through a series of if/then branches to figure out which footstep sound to play, and voila.</p><p>The sound designers are unblocked now, and can work on creating and tuning the footstep sounds as they see fit. It will not work for non-bipedal creatures, or anything that doesn&#8217;t share the humanoid animation blueprint. It will also need refactoring if footstep location needs to accurately reflect bone placement. But presently, the game does not need those things, and if either of them become a priority, that is the trigger for refactoring. If neither of those things occur, that simple branching logic will probably ship, because it is <em>good enough.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Good Enough</h2><p>People talk about &#8220;good code&#8221; but what does that mean? </p><p>In junior infrastructure interviews, I like to ask the following question.</p><blockquote><p>&#8220;You have a task to write a program to retrieve, process, and analyze game data logs (telemetry) and upload the output to a server. There are two approaches you can take to this task.</p><p>The first (hacky) will take an hour to write and four hours to run.</p><p>The alternative (structured) will take four days to write and ten minutes to run.</p><p>Which approach should you take?&#8221;</p></blockquote><p>The answer, is that there is not enough information to answer the question,  and in fact to ask two other questions:</p><ol><li><p>How often does it need to run?</p></li><li><p>What does execution time scale off, and what is the rate of change of that thing?</p></li><li><p>What are the repercussions of it not executing in time / can two of them run concurrently?</p></li></ol><p>If this task only needs to run daily, and it scales off records which are doubling every 12 months, then the hour-long hack version can happily be in place for 3+ years before needing to be replaced. If the output doesn&#8217;t need to be available the same day, it may never need to be replaced.</p><p>Conversely, if two instances cannot run simultaneously then it MUST be replaced after three years. If you can&#8217;t even approximately guess how the scaling factor will change, and it could potentially 6x overnight, then you MUST write the long version.</p><p>Also .. do you have four days of development time available to prioritize it? If nothing else is on the table or urgent, maybe you just do the good version straight away and never worry about it again.</p><p>It&#8217;s the dreaded senior answer: &#8220;<strong>it depends</strong>&#8221;. Code needs only be good enough for its requirements, both operational and developmental.</p><h2>What Is Good Enough For Your Game?</h2><p>Same answer again. It depends. Apex Legends shipped without any skill-based matchmaking. Respawn had a skill-based matchmaking engine for Titanfall 2 they could have used for Apex Legends, and decided not to. When it became apparent that new players who found matches too difficult OR too easy were quitting more than players who had an average challenge, they successively shipped small changes that siphoned these players off to give them an appropriate challenge, and retention improved. It wasn&#8217;t for a full three years that they hit a point in the game where it was worth bringing in a full skill-evaluative model, and even then they found that a full performance analysis produced about the same effect as rating players on &#8216;damage dealt&#8217;. Because Apex has a high TTK and is latency tolerant, it was good enough.</p><p><strong>So was this good enough for Balatro</strong>? All signs point to &#8220;yes&#8221;. The code isn&#8217;t running frequently, it&#8217;s easy to read, easy to maintain, and the game seems to be reliably handling 50+ status effects active simultaneously. In fact, I can&#8217;t think of any bugs I&#8217;ve seen anyone talk about that might be related to this code.</p><p>Would I have done it that way? No.</p><p>Would I, upon reaching the inflection point where there&#8217;s been significant investment in that method, advise refactoring? Also no.</p><p>It&#8217;s not efficient from a Big-O perspective, but why does it need to be? It&#8217;s within spec, and it was efficient from a design perspective because it allowed for rapid prototyping of cards before the design was locked in. And it scaled well enough to last to completion of the game. The code <em>did what it needed to do</em> at every stage of development.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nXNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nXNv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nXNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg" width="1440" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:416,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113161,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nXNv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nXNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc27526ac-93f7-4645-8b92-6c84d8e08b6e_1440x416.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A big chain of &#8216;if then else&#8217; calculating values</figcaption></figure></div><p>So when people say it&#8217;s &#8220;bad&#8221; and say it should be <code>[alternative solution]</code>, I have to ask; why do you need to? At any point in a development cycle, you should be doing the most valuable work that you can. At what point would refactoring that be the most valuable work, and what would be the benefit?</p><p>These are questions you should be asking yourself about every piece of work you commit to. This is not a college assignment where you get marks for approach. You are shipping a game. Do the work that enables you to achieve that.</p><p>Until next time.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/p/premature-optimization-and-rapid?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thank you for reading Load-bearing Tomato. This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/p/premature-optimization-and-rapid?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/p/premature-optimization-and-rapid?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Parable Of The Woman And The Gate]]></title><description><![CDATA[On making changes without context.]]></description><link>https://loadbearingtomato.com/p/the-woman-and-the-gate</link><guid isPermaLink="false">https://loadbearingtomato.com/p/the-woman-and-the-gate</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Mon, 18 Sep 2023 18:27:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1u-9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1u-9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1u-9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1u-9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg" width="1200" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Southeast Australia temperate forests - Wikipedia&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Southeast Australia temperate forests - Wikipedia" title="Southeast Australia temperate forests - Wikipedia" srcset="https://substackcdn.com/image/fetch/$s_!1u-9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1u-9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8331b180-d90b-4145-aa4d-903f7987c9bb_1200x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A woman was taking a walk through the forest when she came across a gate blocking her path. It stood four feet high, and from either side, a fence disappeared into the brush. She tried to climb over the gate, but as she did, her pants caught on a burr and tore, cutting her thigh. She cursed in pain, falling to the ground on the other side clutching her bleeding leg.</p><p>"This is stupid", she cursed aloud, "Why is there a gate in the middle of the forest? It is no taller than a child anyway, and on public land we should be allowed to move freely."</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So annoyed was the woman that rather than continuing her journey, she decided to do something about the gate. Taking a deep breath out, she wrapped a hand around the pendant on her necklace and offered a prayer to Liber, god of wine and freedom, that she would impart the gift of freedom to whomever might find the gate. She picked up a nearby rock, and began smashing at the gate's hinges. After a few exhausting minutes, she had broken the gate from its mounting, and it fell to the ground with a crashing thud that echoed through the trees. Puffing, she dragged the broken gate to the side of the path, and collapsed on the leafy ground, exhausted.</p><p>"This gate was so heavy! Why would anyone build a gate like this in the middle of nowhere!?"</p><p>But over her pounding heart and churning breath, she began to hear another sound - the galloping thuds of a beasts hooves. She sprang to her feet and looked up the path, finding herself facing down a wild pig, five hundred pounds and four feet high, the same height as the gate, running at full speed directly towards her. Immediately realizing her folly, she began wrenching and tugging at the now-fallen gate, to try to reattach it, but it was too late. The hog slammed into her at full speed, sending her tumbling like a rag doll as it escaped its enclosure, heading towards the freedom Liber had offered it.</p><p>As she lay on the forest floor, half-unconscious and delirious in pain, she quietly offered a prayer to Feronia, the goddess of wildlife and health, that she would never again tear down a gate until she knew why it had been erected in the first place.</p><p><em>// for those we have lost<br>// for those we can yet save</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How To Recover Your Perforce Admin Account]]></title><description><![CDATA[Bypassing all perforce security and authentication when you can't log in at all.]]></description><link>https://loadbearingtomato.com/p/how-to-recover-your-perforce-admin</link><guid isPermaLink="false">https://loadbearingtomato.com/p/how-to-recover-your-perforce-admin</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Sat, 18 Feb 2023 19:43:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a4fece6-bbb3-45bb-ad53-33a95901753f_889x587.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Some real, practical advice: A how-to for when you screw up.</p><p><strong>Hobbyists: you will lock yourself out of your Perforce server.</strong></p><p>Anyone who&#8217;s been even remotely adjacent to any kind of programming has probably heard the name &#8220;github&#8221;, or at very least &#8220;version control&#8221;. Version control is a way to collaboratively store work and edit history on files to allow many people to work on the same thing at the same time while tracking changes.</p><p>In game development though, we mostly use Perforce, because of how it handles large files, and that much of our work involves binary files rather than plain text.</p><p>Hobbyists and people getting their first projects set up can get away with a default local perforce server, but if you want to start working on something from other locations, or get your friends to join in, then you&#8217;re going to need authentication.</p><p>&#8220;Sounds great&#8221;, you say, &#8220;I&#8217;m in&#8221;.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Perforce is really easy to set up and get going because it&#8217;s default settings are very open. A user will be automatically created for you if you try to do anything. Passwords aren&#8217;t required. That&#8217;s fine for running a private server on your network, but you want to share one with your friends, and you know better than to put a server on the public internet with no security.</p><p>So you set a password on your account - the only account - which is also the admin account. You&#8217;ll disable automatic account creation. You&#8217;ll set the security level to 1, to enforce having passwords.</p><p>Then you&#8217;ll forget about your game for six months, not log in, and forget your password, and you&#8217;ll be screwed because all the Perforce documents assume that you have the ability to log in as SOME other user, which in a studio situation you would.</p><p>So here&#8217;s the ACTUAL recovery process, for Windows Helix Server (aka Perforce).</p><ol><li><p>Start Button &#8594; Services</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9MSN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9MSN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 424w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 848w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 1272w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9MSN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png" width="340" height="172" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:172,&quot;width&quot;:340,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42128,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9MSN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 424w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 848w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 1272w, https://substackcdn.com/image/fetch/$s_!9MSN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9f19dc4-e2eb-46a0-9cb1-ec11436441d1_340x172.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p></li><li><p>Stop the Perforce server<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8hK6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8hK6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 424w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 848w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 1272w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8hK6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png" width="1008" height="592" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:592,&quot;width&quot;:1008,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90176,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8hK6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 424w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 848w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 1272w, https://substackcdn.com/image/fetch/$s_!8hK6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ec840e2-0c3a-4a8e-8410-5856c8baf59c_1008x592.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p></li><li><p>Open a file browser to your Perforce Server folder. On Windows, that&#8217;s probably <strong>C:\Program Files\Perforce\Server</strong></p></li><li><p>Move the <strong>db.protect</strong> file out of the folder to somewhere else. Don&#8217;t delete it. This will be recreated when you start the server again, but if for some reason you need to roll back, delete the new file and put the old one back. This is just for backup purposes.</p></li><li><p>Open a command prompt as Administrator</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dpqx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dpqx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 424w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 848w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 1272w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dpqx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png" width="426" height="240" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:240,&quot;width&quot;:426,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60732,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dpqx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 424w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 848w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 1272w, https://substackcdn.com/image/fetch/$s_!Dpqx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee55cf8b-9139-4cc3-a8f5-59e0e0b9a4ad_426x240.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p></li><li><p>Usually when you use perforce CLI commands, you&#8217;re using the client (p4.exe) to send commands to the server remotely. However, you can&#8217;t log in with the client, because of all that security you put on it. So we&#8217;re going to use the server executable itself (p4d.exe) to rewrite its own configuration file. <br><br>We need to pass two arguments to p4d.exe:<br>-r &#8220;c:\Program Files\Perforce\Server&#8221; (or whatever your server folder is)<br>&#8220;-cshow&#8221; (which is short for &#8216;config show&#8217;)</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yx41!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yx41!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 424w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 848w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 1272w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yx41!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png" width="619" height="78" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:78,&quot;width&quot;:619,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31539,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yx41!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 424w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 848w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 1272w, https://substackcdn.com/image/fetch/$s_!Yx41!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4601e716-4bde-4da5-bfb2-5e698ded4173_619x78.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This prints out the configuration options currently set. These two are our problem.<br><br>dm.user.noautocreate = 2 (new users need to be created manually by admin)<br>security = 1 (passwords are required)<br><br><em>Sidenote: on Windows, you need double quotes around any of the config show, set or unset commands. (cshow, cset, cunset)<br></em></p><p>We&#8217;re going to set those to 0, so we can create a user and log in.<br><br><strong>p4d -r "c:\Program Files\Perforce\Server" "-cset dm.user.noautocreate=0&#8221;</strong><br><strong>p4d -r "c:\Program Files\Perforce\Server" "-cset security=0"</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nrir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nrir!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 424w, https://substackcdn.com/image/fetch/$s_!nrir!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 848w, https://substackcdn.com/image/fetch/$s_!nrir!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 1272w, https://substackcdn.com/image/fetch/$s_!nrir!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nrir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png" width="582" height="77" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92369799-2b26-49b7-b380-d323309f336a_582x77.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:77,&quot;width&quot;:582,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19306,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nrir!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 424w, https://substackcdn.com/image/fetch/$s_!nrir!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 848w, https://substackcdn.com/image/fetch/$s_!nrir!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 1272w, https://substackcdn.com/image/fetch/$s_!nrir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92369799-2b26-49b7-b380-d323309f336a_582x77.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Much better.<br></p></li><li><p>Now, you can restart the Perforce server. Mine is already running here:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RdgB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RdgB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 424w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 848w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 1272w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RdgB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png" width="359" height="104" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:104,&quot;width&quot;:359,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11157,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RdgB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 424w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 848w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 1272w, https://substackcdn.com/image/fetch/$s_!RdgB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe12bb1fc-4616-4af0-becb-fd25994da23c_359x104.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p></li><li><p>Any p4 action now will create a new user. The simplest action is a &#8220;ping&#8221;. Use this to create a user, set a password, then log in with it. We use the -u argument to specify a username to execute as, then the ping command:<br><br><strong>p4 -u christina ping</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nG_t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nG_t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 424w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 848w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nG_t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png" width="369" height="247" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/daa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:247,&quot;width&quot;:369,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89746,&quot;alt&quot;:&quot;C:\\windows\\system32>p4 -u christina passwd User christina doesn't exist.  C:\\windows\\system32>p4 -u christina ping .000s for 10  messages  C:\\windows\\system32>p4 -u christina passwd Enter new password: Re-enter new password: Password updated.  C:\\windows\\system32>p4 -u christina login Enter password: User christina logged in.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="C:\windows\system32>p4 -u christina passwd User christina doesn't exist.  C:\windows\system32>p4 -u christina ping .000s for 10  messages  C:\windows\system32>p4 -u christina passwd Enter new password: Re-enter new password: Password updated.  C:\windows\system32>p4 -u christina login Enter password: User christina logged in." title="C:\windows\system32>p4 -u christina passwd User christina doesn't exist.  C:\windows\system32>p4 -u christina ping .000s for 10  messages  C:\windows\system32>p4 -u christina passwd Enter new password: Re-enter new password: Password updated.  C:\windows\system32>p4 -u christina login Enter password: User christina logged in." srcset="https://substackcdn.com/image/fetch/$s_!nG_t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 424w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 848w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 1272w, https://substackcdn.com/image/fetch/$s_!nG_t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaa2f497-c753-4b53-86dd-22c7378c02cf_369x247.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can see there is no &#8216;christina&#8217; user, until I perform an action claiming to be user &#8216;christina&#8217;. As soon as I do, the user is created. After that, I&#8217;m able to set a password, and then log in.<br></p></li><li><p>You may now use the newly created account (in my case, &#8216;christina&#8217;) to edit the password of your old account:<br><br><strong>p4 -u christina passwd oldaccountnamegoeshere</strong><br><br>So now we&#8217;ve got a new account, we&#8217;ve reset our old account, all that&#8217;s left is to bring back the administrator privileges.<br></p></li><li><p>Run P4ADMIN to open the administration console, and connect to your server with your new user. It should tell you that if you proceed, you will be the only super user in the system. Say yes. You may need to disconnect and reconnect after this for the UI to update with full super-user access. Congratulations! You now have full control of the server, and are free to restore your old account to superuser, or whatever else you&#8217;d prefer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S524!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S524!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 424w, https://substackcdn.com/image/fetch/$s_!S524!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 848w, https://substackcdn.com/image/fetch/$s_!S524!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 1272w, https://substackcdn.com/image/fetch/$s_!S524!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S524!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png" width="889" height="587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:587,&quot;width&quot;:889,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44785,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S524!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 424w, https://substackcdn.com/image/fetch/$s_!S524!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 848w, https://substackcdn.com/image/fetch/$s_!S524!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 1272w, https://substackcdn.com/image/fetch/$s_!S524!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2567077c-ee10-4229-82e6-23aa1a54c996_889x587.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Woohoo! You&#8217;ve done it.</p></li><li><p>Don&#8217;t forget to reset your auth permissions. These were mine, yours might have been different. Back to your administrator command prompt:<br><br><strong>p4d -r "c:\Program Files\Perforce\Server" "-cset dm.user.noautocreate=2&#8221;</strong><br><strong>p4d -r "c:\Program Files\Perforce\Server" "-cset security=1"</strong></p></li></ol><p>WHEW. What a mission. Save your password somewhere next time, or keep a backup user with no real permissions except login, with a dumb password you can&#8217;t forget, and then you only have to do <a href="https://portal.perforce.com/s/article/2492">the db.protect step, as listed here</a>.</p><p>Until next time.</p><p><em>for those we have lost<br>for those we can yet save</em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA["AI Fans" Have No Imagination]]></title><description><![CDATA[They understand neither AI nor game development, yet lecture us on both.]]></description><link>https://loadbearingtomato.com/p/ai-fans-have-no-imagination</link><guid isPermaLink="false">https://loadbearingtomato.com/p/ai-fans-have-no-imagination</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Thu, 16 Feb 2023 19:39:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/hmV4v_EnB0E" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever since crypto fell face down and started twitching, crypto chuds have been itching for a new scam. We blinked, and Lensa appeared. But AI art generation isn&#8217;t new - DALL-E and Midjourney have been around for ages now, but most consumers weren&#8217;t paying for them, and they were little more than a toy. So why were Lensa and the other profile pic generators such a hit?</p><p>Anyone who&#8217;s worked in marketing knows that people&#8217;s favorite thing is themselves.</p><p>Don&#8217;t argue with me on this one, I can see your social media manager nodding along from here. Ask them about their favorite gaming memories, their favorite champion, their best whatever and your replies will be full for a week. So when you get a computer to draw beautiful pictures of people&#8217;s favorite thing - themselves - they&#8217;re more than a happy to fork over some cash. So now Lensa is sitting on a big pile of your photos and we probably won&#8217;t regret that in the future.</p><p>But now dipshits are claiming AI is the future of game development, and it&#8217;s going to make indie games all AAA-quality. So why are they saying so many dumb things this time?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>They want jobs prompting for concept art</h2><p>Unfortunately, they don&#8217;t know what they&#8217;re asking for, and if they did, they&#8217;d know that the AI generators they love are actually not a good tool for it. </p><p>To explain why, we have to ask: <strong>what is the purpose of concept art?</strong> </p><p>I&#8217;m not going to explain it, because Delaney King already has, and she did it better than I would have, <a href="https://twitter.com/delaneykingrox/status/1497393434734522368">in this thread</a>, which you should read.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/delaneykingrox/status/1497393434734522368&quot;,&quot;full_text&quot;:&quot;Today's <span class=\&quot;tweet-fake-link\&quot;>#gamedev</span> tips is about the subject of <span class=\&quot;tweet-fake-link\&quot;>#conceptArt</span>, what is (actually) is, how to use it and busting a few myths.\n\nThis is a wholistic multidisciplinary look- so all devs may find something here. &quot;,&quot;username&quot;:&quot;delaneykingrox&quot;,&quot;name&quot;:&quot;Delaney King&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Sat Feb 26 02:09:49 +0000 2022&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FMfPZGZaUAIZ-Wn.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/QODrvX1NnL&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:79,&quot;like_count&quot;:394,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Of particular interest is the bit where she talks about how concept art can be supposed to convey how something works - it informs the next steps of production. AI image generators don&#8217;t understand how things work. They don&#8217;t understand a person, or how the idea someone has in their head of a particular 3D object represented in 2D should move. They only know that certain things go together. They don&#8217;t know a person should have four fingers and a thumb, just that pictures of people have stuff like that at the end of it, which is why AI routinely <a href="https://medium.com/merzazine/drawing-hands-and-ai-78b501df0085">draws people with too many fingers</a>, or <a href="https://twitter.com/ZachWeiner/status/1625960779991195649">recommends books that don&#8217;t exist</a>.</p><p>The thread above demonstrates a concept art mistake - not thinking through how a character will behave in game. Driving, sitting, or shooting, for example.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/delaneykingrox/status/1497416258756964354&quot;,&quot;full_text&quot;:&quot;You can see the original proportions in the concept art.  Personally I feel the shipped model loses what made the concept cool... but it is my fault, because I didn't think through holding rifles and sitting in vehicles.  I should have sketched some in those positions. &quot;,&quot;username&quot;:&quot;delaneykingrox&quot;,&quot;name&quot;:&quot;Delaney King&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Sat Feb 26 03:40:31 +0000 2022&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FMfkJltakAAIPxF.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/9NiLIcXPAE&quot;,&quot;alt_text&quot;:null},{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/FMfkJuRaUAICXlH.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/9NiLIcXPAE&quot;,&quot;alt_text&quot;:null}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:1,&quot;like_count&quot;:23,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Concept art is about understanding, and AI fundamentally does not understand - it correlates. </p><p>So with their primary pitch off the table, they accuse developers of not liking AI, or not understanding it. But that&#8217;s not true at all, because&#8230;</p><h2>Developers are already using AI for things, just not that</h2><p>Animation, for example. Have you seen FIFA &#8216;22? Traditionally with fast-moving games, you need to have short animations so your characters can be responsive at any time. Blending can help but the transitions out of long detailed animations often look weird and forced when it&#8217;s purely programmatic. But <a href="https://www.polygon.com/22675796/fifa-22-hypermotion-motion-capture-new-realism">EA&#8217;s &#8220;HyperMotion&#8221; technology</a> is trained on massive datasets of pro soccer, and now the machine learning algorithm knows how people actually transition between those moves, and can dynamically adjust to create realistic motion, because it learned how humans move. If I wasn&#8217;t paying attention, much of this in-game footage would look real.</p><div id="youtube2-vLj-27T-SEQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vLj-27T-SEQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/vLj-27T-SEQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>A new technique called Adversarial Skill Embedding let AIs teach themselves how to do attacks, which then become dynamic animations. This shit is absolutely phenomenal. It empowers developers and animators to be able to key in precisely what they want but not have to be locked into just their premade animations or blends.</p><div id="youtube2-hmV4v_EnB0E" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hmV4v_EnB0E&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/hmV4v_EnB0E?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>This stuff promises to make games so much more immersive as NPCs, enemies, opponents move realistically. Goodbye capsule skaters, no more &#8216;feet sliding through the air&#8217;, we can have a future where <em>characters move in response to things because they know how to do that</em>.</p><p><strong>There&#8217;s so much cool stuff AI can do. We&#8217;ve barely scratched the surface. But we&#8217;re using it to solve our actual problems, and they don&#8217;t understand that because they don&#8217;t know what our actual problems are, because they are hypothesizing based on an imaginary version of game development they made up.</strong></p><p>Be wary of anyone who claims to have a solution to your problems when they don&#8217;t understand what your problems are.</p><p>Until next time.</p><p><em>for those we have lost<br>for those we can yet save</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Load-bearing Tomato is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Ergonomics Are Not Enough]]></title><description><![CDATA[Comfort, harm reduction, and change.]]></description><link>https://loadbearingtomato.com/p/ergonomics-are-not-enough</link><guid isPermaLink="false">https://loadbearingtomato.com/p/ergonomics-are-not-enough</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Mon, 05 Sep 2022 06:37:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DtNl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I think about office chairs a lot.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DtNl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DtNl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DtNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;An animation showing different configuations of the Aeron Chair.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An animation showing different configuations of the Aeron Chair." title="An animation showing different configuations of the Aeron Chair." srcset="https://substackcdn.com/image/fetch/$s_!DtNl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!DtNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F486216b0-afdc-4fa9-bd6b-6091ec7b8658_1600x1600.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Aeron deez nuts. Sorry, sorry I&#8217;m trying to delete it</figcaption></figure></div><p>The rise of &#8220;racing seat&#8221; gaming chairs washed a wave of flamboyance over our homes as desks became battle-stations. We measured, customised, and tailored them to our favourite colour combinations and to our bodies, just right for a gaming session or a stream. But as work from home became the norm, these neon bucketed thrones revealed their weakness - longevity. Our bodies ached in places they did not ache before, because we never sat in these chairs that long, or that frequently. They were simply not very good for extended continuous usage. And so, since the pandemic, we&#8217;ve seen a renewed interest in office chairs, because office chairs are designed with one very simple purpose in mind.</p><p>To keep you working for as long as possible.</p><p>They are not designed to look nice, or to feel nice. They are designed to keep you productive for extended periods of time by ensuring that sitting down for a long time harms your body as little as possible.</p><p>The thing is, there is a meaningful difference between not harming your body and having a healthy body. Setting yourself up for a healthy, happy life in which your body is not in pain requires a lot of work (and it may not even be possible if you have a disability). It requires routine, and exercise, and habit, and movement, and standing, and walking, and all sorts of things. Those things and how we engage in them largely dictate our starting state &#8212; how much health we have to burn sitting in a chair. How long we can <em>assume the position.</em> And so we must interrogate the difference between getting and keeping a healthy body, and merely lowering how much you&#8217;re harming your body.  One of them is about taking actions that make things better. The other seeks to not make things worse.</p><p>And yet, the majority of our discussion and discourse around bodily health as it relates to working is not about that health. We mostly just talk about the <strong>chair</strong>.</p><p>It is little wonder then that when we talk about burnout and crunch, we talk about about minimising damage. We talk about the reduction of pain and reduction of the impacts of pain. We don&#8217;t talk about people&#8217;s trajectory through the gaming industries and their career paths through game development, or esports. We, like with the chair, focus on the thing causing the most visible loss of health instead of focusing on the work required to create a good life and a good career for workers as they transit in, through, and out of our industries.</p><p>Look at esports. Young people burn themselves out training, over-practising, over-playing, their bodies and minds laid waste. And so we hire performance coaches and trainers and mental coaches to help them devote themselves to their singular cause of performing. They take <a href="https://twitter.com/MindBodyEsports/status/1566423171275825153">planned breaks with regimented recovery times</a> to manage the burnout and plan their downtime for optimized efficiency to maximize their effectiveness for their singular focus of the game. Of output. Of productivity.</p><p>Just like the office chair.</p><p>And yet, in three to five years, they will quit. This will occur with such regularity that 23 year olds are considered &#8220;<a href="https://medium.com/@harreh_leow/longevity-in-league-of-legends-98138440f0b5">veterans</a>&#8221;. Most will leave the gaming industry forever. Even if they don&#8217;t burn out, or become injured, they will leave. On the weight of averages, most will quit in, or before that time period. They are often damaged by their experiences here, set behind their peers, with an adjustment ahead of them to return to the regular world. They quit because the trajectory of their experience is not leading them anywhere good.</p><p>Just like game development, where most people leave in three to five years.</p><p>If you squint, it might look like your goals are aligned with executive management&#8217;s goals when they spend money on office chairs for our homes. They are looking after us, we tell ourselves. They are making sure we are healthy. But they are not. The company&#8217;s goal is to keep you as effective and productive as possible for the maximum amount of time, on a reasonable budget. The company&#8217;s responsibility under OSHA is to ensure you do not harm yourself by sitting whilst doing that.</p><p>It is on us then, to ensure that our workplace cultures are creating standards of normal that go further than simply ensuring we are not harmed by working. We &#8212; you and I &#8212; must both live by example and talk about how we live and talk about how we live by example, so that others can repeat it. So we can build places where people don&#8217;t just survive, but <strong>thrive</strong>. As game developers, our job is to create joy. If we wish to do that well, the experience of that work must also be one of joy.</p><p>We must take time off, and we must be <em>seen</em> to be taking time off. We must maintain healthy relationships with our workplace and our work and our productivity. We must identify first as a creator on our own terms, rather than an employee, a &#8220;rioter&#8221;, a &#8220;twitch staff&#8221;, or any of the failed spin-off monkers that imitators have attempted to have their workers identify as. We must be insistent on addressing the project management failures (and it is <strong>always</strong> failures) that cause crunch. We must be diligent in addressing the management failures that cause thrash, remove psychological safety, and fail to understand the needs and experiences of workers. We must stand up for people who feel they are &#8220;not established enough&#8221; to safely stand up for themselves. <strong>We must say the things that the juniors in our teams would not feel comfortable saying</strong>.</p><p>It will be unpleasant. It will be scary. You will be afraid. But in a few short years we have gone from a place where CEOs were praised for talking about how hard people crunched, to being <a href="https://twitter.com/jasonschreier/status/1566069446225133569">eviscerated by thousands of developers and the media</a> for insisting that people working 12 - 15 hour days, 6 - 7 days a week, &#8220;luv&#8221; it, and do it because they&#8217;re passionate. The world has changed. You and I can continue to change it.</p><p>If we do not, we are not looking after people. We are merely pumping farm animals full of antibiotics, instead of giving them an environment where they do not get infected.</p><p>Much of the advice we prescribe to others is an office chair. It helps them reduce the harm they experience. And that&#8217;s good, of course that&#8217;s good. But it&#8217;s not creating joy, it&#8217;s not creating spaces where we thrive. It&#8217;s not helping people grow through their careers. </p><p>Let us think further than harm reduction.</p><p>Let us imagine of a world where we are not within striking distance of being undone by furniture.</p><p>Let us create that world.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://loadbearingtomato.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p><em>for those we have lost<br>for those we can yet save</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[How The Games Industry Hurts People]]></title><description><![CDATA[The anatomy of a breakdown, and how to rebuild afterwards.]]></description><link>https://loadbearingtomato.com/p/how-the-games-industry-hurts-people</link><guid isPermaLink="false">https://loadbearingtomato.com/p/how-the-games-industry-hurts-people</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Tue, 29 Mar 2022 15:38:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-ru7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This post started as a draft that contained five lines.</p><blockquote><p><em>being locked in a bad work environment</em></p><p><em>is not like being chased by a tiger</em></p><p><em>that destroyed his cage</em></p><p><em>i have long forgotten the number of times ive been hurt or nearly killed at work</em></p><p><em>but i remember the ones that hurt my soul</em></p></blockquote><p>I know, I usually cover deep technical dives into how games operate, but in a world where every major studio gets <a href="https://kotaku.com/inside-the-culture-of-sexism-at-riot-games-1828165483">The Article</a>&#8217;d, it would be remiss of me to not talk about the fact that studios are run by people, and that how those <em>people</em> operate is every bit as important as how their software operates.</p><p>To do that, we have to talk about biology.</p><p>The human body is a marvelous, resilient thing, capable of both incredible feats, and the ability to change in order to <em>become capable</em> of incredible feats. But evolutionarily speaking, it was built for survival. And to survive, it relies on <strong>the sympathetic nervous system</strong>.</p><h2>Fight or Flight</h2><p>When activated, the sympathetic nervous system increases your blood pressure and heart rate, dilates the pupils, dumps adrenaline, and ups the oxygen supply to your vital organs, readying you to fight for your life or run screaming into the woods. <strong>Fight</strong> moves you <em>towards</em> a problem. <strong>Flight</strong> moves you <em>away</em> from it. At its core, the sympathetic nervous system says &#8220;I CAN&#8221;.</p><p>The human body evolved and built itself specifically to do this, because most of the threats that governed whether we would live to reproduce had to be either killed, or escaped from.</p><p><strong>But what if you can&#8217;t fight or flee?</strong></p><p>For better or worse, the human body also built itself another survival mechanism that&#8217;s <em>suspiciously</em> suited to sitting in a design meeting with someone who gaslights you and seeks to undermine you at every turn, or to quietly attend class with someone who beats you. It&#8217;s not what it evolved for, but our biology has a nervous system behavior that happens when you must politely repeatedly comply with the social rules of interaction with someone who is actively harming you. We&#8217;ve all heard of the fight or flight nervous system activation &#8212; it&#8217;s what tells you &#8220;SHIT IS GOING DOWN. DO SOMETHING&#8221;. Fight or flight is a call to action; a gas pedal.</p><p>But in a workplace, you can&#8217;t use that gas pedal the way nature intended. You can&#8217;t upend the chairs of a meeting and barricade yourself with furniture, safe from your attacker. You certainly can&#8217;t leap over the table and choke them until the threat subsides.</p><p>So you slam on the brakes, despite what your body is telling you. What happens after that, is one of the lesser-known &#8220;F&#8221;s.</p><h2>Freeze</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ru7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ru7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ru7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg" width="800" height="590" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/eafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123976,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-ru7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-ru7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feafcd23f-1589-4e5c-80fa-e0ab2e7d6688_800x590.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The polyvagal nervous system activation chart.</figcaption></figure></div><p>If you&#8217;ve ever held the gas and the brake down at the same time on a car, you know what happens: smoke, lots of it. Do it long enough, and you get fire. First the parts start failing, and the vehicle itself fails.</p><p><em>Note: Before we go into the chart, it&#8217;s important to note that polyvagal theory is a simplification of the numerous complex physiological processes; it&#8217;s less a strict analysis of the operation of the body, and more a lens through which we can generalize and talk about the things we experience.</em></p><p>When you&#8217;re in a safe and healthy state, the <strong>parasympathetic nervous system</strong> is in charge, maximizing all the things you need to be a healthy, effective, social creature. When you&#8217;re <em>not</em> safe, the <em>sympathetic</em> nervous system takes over, arming you to deal with the threat.</p><p>But when the sympathetic nervous system <em>fails to deal with that threat</em>, things start to go wrong. When in sympathetic activation, the adrenal glands produce cortisol, which is basically your body&#8217;s alarm system. It sets you up to react to threats by increasing blood pressure, heart rate, blood sugar, clotting ability, as well as a bunch of other things. That&#8217;s great for outrunning a predator, or hunting your prey, but what happens if you don&#8217;t do either of those things? And if you end up just staying in that state of activation for extended periods of time?</p><p>The effects of long-term elevated cortisol levels are well-documented and too complex to go into, but let me know if this sounds familiar:</p><p>You&#8217;re tired, no matter how much sleep you get. Your pain tolerance goes up. You put on weight more easily. Unnecessary movement, like exercise, feels bad. You become less social. Your memory suffers. You have trouble expressing emotion. Your libido tanks. You get sick more easily. Almost like your body is trying to give you the best chance to survive something you can&#8217;t escape from.</p><p>You are in <strong>freeze</strong>.</p><p>Anyone who has worked in game development knows this state, regardless of the name they use for it.</p><h2>This Is Not Burnout Discourse</h2><p>What I&#8217;m trying to get at here is that there are very specific things that happen to the body when you are trapped in a situation that&#8217;s hurting you. It is a <strong>physiological</strong> state, not just a mental one. Here&#8217;s a different interpretation of the same chart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8cKf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8cKf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8cKf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png" width="800" height="590" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/a070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:428273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8cKf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!8cKf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa070a4e9-7ec8-4a5d-b4f9-8439dfa52df6_800x590.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In a healthy, normal state, you&#8217;re frequently flitting in and out of mild levels of sympathetic nervous system activation. When it&#8217;s short periods of exercise, intense gaming, or things that challenge you, the pattern of entering and exiting fight-or-flight is completely sustainable.</p><p>But when you&#8217;re constantly in fight or flight, your system is flooded with cortisol, and that has flow-on effects. And if you stay there long enough, you freeze completely.</p><p>In order to enter the Freeze state, you need to:</p><ol><li><p>Encounter a threat your body tells you to kill or run from, and then;</p></li><li><p>Not kill it or run from it, and;</p></li><li><p>This state needs to either not be resolved, or continually re-entered.</p></li></ol><p>In other words &#8212; you must be trapped, and unable to do anything about it.</p><p>In previous, non-games-industry jobs, I was almost killed twice, and was nearly (or actually) seriously injured plenty more &#8212; yet I suffered zero psychological damage from those experiences. Why? Because the sympathetic nervous system did what it was supposed to do, and got me out.</p><p>My body prepared itself to take action, I took action, and the problem was solved. My sympathetic nervous system screamed &#8220;DO SOMETHING&#8221;, and I did something. Pain is most likely to become trauma when we do not <em>or cannot</em> heed that request. And the reason that we sometimes <em>don&#8217;t,</em> is that we&#8217;re trapped in social situations where <em>social order</em> tells us we cannot simply sprint into the woods with no intention of returning, or hit someone with a piece of furniture.</p><p>To be clear &#8212; I am not advocating for fleeing into the forest or hurling the nearest ergonomic chair at your crunch-loving boss. But with the concept of how we end up in freeze in mind, what else can you learn from the chart?</p><h2>Deactivation</h2><p>The body is constantly attempting to normalize itself, and return to a state of equilibrium. It continuously breaks down things it doesn&#8217;t need, which is why you don&#8217;t stay drunk forever after you drink alcohol. But when the effects of activation outpace the normalization process, things get bad.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!53rY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!53rY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!53rY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!53rY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!53rY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!53rY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png" width="800" height="590" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/bfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:443773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!53rY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!53rY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!53rY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!53rY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfcba9d3-802f-4cce-8761-000dcbaa4b01_800x590.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Anyone who&#8217;s designed a combat system can probably see where this is going. Your body primed itself for a hundred fights that never came, and loaded a magazine full of cortisol bullets. You&#8217;re continuously adding stacks of a <strong>berserker</strong> buff, then not consuming the flow-on status effects. And you&#8217;re adding stacks faster than they can time out. You&#8217;re being activated at a rate greater than your body can fix what being activated does to it.</p><p>When you entered <strong>freeze</strong> instead of fighting-or-flighting, the chemicals your brain dumped and the effects they had on your body didn&#8217;t just dissipate or disappear. And in order to return to normal, you&#8217;re going to have to stop adding stacks, and then expend, purge, or heal from the flow-on status effects &#8211; one way or another.</p><p>In short - the constant sympathetic activation is adding cortisol faster than your body can remove it, and so the effects accumulate, wreaking havoc.</p><p><em>To be totally transparent - even this is an oversimplification of a set of very complex processes. But using it as a lens through which to view and understand what happens to us without a degree in neuroscience, it can still help us wrap our heads around the problem.</em></p><p>There is no singular, universal, guaranteed way to return to normal after hitting that freeze point, but because this has physiological causes, there <strong>are</strong> things that are very likely to help in most cases, even if the <em>exact</em> path looks different for each of us. For some people, it might be trauma therapy. For others, it might be quitting a job, or moving, or both. For the rest, it might be breaking themselves open with a particularly emotional piece of music, then letting themselves feel and express all of the emotions and reactions they suppressed in the lead-up to the freeze state. You may need to punch, kick, and curse to the high heavens, screaming every turgid word of hate you held in when your needs, your hopes, and your safety were shattered. I recommend a punching bag, a pillow, or a bed, in that order. But be warned - it may not be enough to merely carry out these actions, especially if you&#8217;re still dissociated or disconnected - <a href="https://ct.counseling.org/2016/06/polyvagal-theory-practice/">you may need to re-enter the state where your body screams &#8220;fight</a>&#8221;, and burn the fuel it filled you with. This was my experience. It may not be yours. And exercise, however bad it feels to start, helps in almost all paths.</p><h2>When It All Goes Horribly Wrong</h2><p>Trauma complicates matters. It can leave you in a state of perpetual fight or flight, or keep you braced to enter it at the slightest trigger. For some, the exhaustion of the  continuous fight or flight response can also leave you in a perpetual freeze. It can even end in C-PTSD. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZMX3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZMX3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZMX3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png" width="800" height="590" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/cbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:416893,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZMX3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 424w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 848w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 1272w, https://substackcdn.com/image/fetch/$s_!ZMX3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbbc9c0-9a85-4c5d-adb0-c43963057555_800x590.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The real dark industry secret of this article is that many of us just end up <em>living</em> in these states, not knowing what they are, and not understanding why two weeks of vacation doesn&#8217;t help. Even when we quit our jobs and take extended breaks to decompress, we often don&#8217;t get better, because the underlying issue hasn&#8217;t been addressed. The pain is quite literally stored in our bodies chemically, stuck operating in a state where we&#8217;re one step from breakdown, and we live trapped in a cycle where we can never get back to that safe and healthy state.</p><p>My articles usually include very little advice, and instead seek primarily to educate, but after diving into our collective pain, I can&#8217;t <em>not</em> talk about recovery.</p><p>First off:<strong> It </strong><em><strong>is</strong></em><strong> possible to heal.</strong> It won&#8217;t just magically happen though &#8212; there is no set amount of PTO or recovery time between jobs that will guarantee healing. Rest alone is usually insufficient. But there&#8217;s almost certainly a minimum amount of rest time each person will require to heal. That timeframe will be different for everyone. But you <em>have</em> to do the work. Get help. Be active in your own recovery. Your friends are good support. A trauma therapist is better. One that knows the industry? Better again &#8212;  it&#8217;ll save you explaining things like &#8220;crunch&#8221; and &#8220;patch days&#8221;. If you can&#8217;t find one, <a href="https://twitter.com/chhopsky/status/1428475405766250497">this thread may help</a>.</p><p>You may need to redefine your relationship with work. You <strong>will</strong> need to learn that the people who hurt you are not the only kind of people out there, and that sometimes, mild annoyance from a boss or coworker is just that &#8212; and it&#8217;s not a sign that you&#8217;re about to be blamed for something that&#8217;s not your fault, or held accountable while the people who created the situation are not.</p><p>The goals of all these is to:</p><ol><li><p>Stop adding berserker stacks (stop creating unnecessary cortisol).</p></li><li><p>Remove the stacks you currently have (normalize excess cortisol).</p></li><li><p>Heal the damage caused by them (fix the flow-on effects of freeze).</p></li><li><p>Retrain yourself so that the pain you carry is not perpetually adding more stacks.</p></li></ol><h2>How To Prevent It</h2><p>If you&#8217;re an executive reading this, you need to understand that this is probably happening to someone who works for you right now. Your corporate values won&#8217;t protect them from it. &#8220;Empowering&#8221; language and concepts can easily be weaponized against vulnerable employees. Convincing yourself that your space is &#8220;safe&#8221; will prevent you from seeing when it&#8217;s not. Ideas don&#8217;t protect anyone &#8212; only action can do that.</p><p>For workers:</p><p>Industry-specialized therapists can help you learn better communication, better conflict resolution, and better ways to handle when things go wrong. There are actions you can take to give yourself the best possible shot at having a good work environment. But ultimately, you can only ever be responsible for your own behavior, and there&#8217;s a limit to how much an individual contributor can affect in a workplace.</p><p>For managers, executives, founders, and owners:</p><p>You have to mitigate toxicity with robust process, with anonymous reporting and feedback, with project management designed to combat crunch, and with product management designed to prevent thrash. You have to design your work methodology intentionally to protect the people who work for you. There is no way around this. And since I know that some people will be reading this saying &#8220;But surely not HERE? We&#8217;re a <em>family</em>!&#8221;, let me disburse you of the notion that work &#8220;as a family&#8221; is a necessarily good thing. Those implied social and emotional obligations can further freeze people who need to fight or flee.</p><p>So let me give you all some clear, direct questions you can ask yourself about the place you work:</p><ul><li><p>Is it possible for employees to raise issues they have, without any risk to themselves?</p></li><li><p>How does the company react when workers raise issues? What management practices do your managers adhere to that ensure staff are heard?</p></li><li><p>How do the company&#8217;s performance improvement or disciplinary processes ensure that managers are not targeting vulnerable staff or people who raise complaints?</p></li><li><p>What training is provided to managers? What expectations does the company have of its managers, and how do you measure their efficacy?</p></li><li><p>Do you give teams the agency they need <em>(agency is action, freeze occurs on inaction)</em> to self-determine the people, practices, and tools that best suit their work?</p></li><li><p>Is there any way that your corporate values could be misused? Could they be abused the way that Riot&#8217;s &#8220;default to trust&#8221; was used to hand-wave away sexual harassment? As in, &#8220;I&#8217;m sure he didn&#8217;t mean it <em>that</em> way&#8221;?</p></li><li><p>How often does unplanned work occur? How do your processes and prioritization handle that &#8220;found&#8221; work? Do you bake additional time into your project planning to allow for things not going to plan?</p></li><li><p>How often do employees work outside of standard business hours? How do you track it? How do your processes ensure that the majority of work does not escape standard business hours?</p></li><li><p>How clear are the objectives for each of your teams? Can people trust that the targets and goals that are set for them will still be true in two months? If not, what effect do you think this has on their morale and general trust in the company?</p></li><li><p>How do you instill a sense of psychological safety in your employees? <em>(If the answer to this question is not something organizational, you don&#8217;t.)</em></p></li><li><p>Do you use automation and workflow management in your task management software (e.g. JIRA)? How do these systems empower the teams that use them?</p></li><li><p>Are the communication paths between your various teams well-defined?</p></li><li><p>Does your accountability structure align with those communication paths?</p></li><li><p>How do you ensure that promotion opportunities are visible and available to anyone who might be interested in them? How do you ensure that they are given fair consideration, accounting for bias?</p></li><li><p>Is your organizational structure well-defined? For each of the areas of your product, who is responsible? Who is accountable? Who is consulted? Who is informed?</p></li><li><p>Are employees consulted about changes that affect them, or merely informed?</p></li><li><p>What structures and processes are in place to ensure that people are not misusing power in your organization?</p></li><li><p>How many people who leave your company leave the industry forever?</p></li><li><p>How many people who leave your company leave without a new job to go to?</p></li></ul><p>Be honest with yourself when you answer these questions. The answers may be unpleasant, but that can be good. You do not solve problems by looking away from them. And even if you don&#8217;t give a shit about the people who work for you, there is no greater hit to the bottom line and to your deliverables and schedule than burnt out, traumatized staff that don&#8217;t trust management and will eventually quit (or be fired for voicing their concerns).</p><p>Mental health stipends and work-subsidized therapy will not help. Looking after staff is a company-wide directed effort that <em>always</em> flows downhill from the top. Whatever behavior is displayed in the most influential positions will be mirrored down throughout your management structure. The behavior we accept is the behavior we condone. It is up to the managers and the executives to maintain a healthy environment.</p><p>And if you&#8217;re a worker reading this, you have a list of questions you can take to your management to ask. And if they don&#8217;t have good answers, every company I know has bone-dry hiring pipelines, and the best way to get a pay raise is to switch jobs! Get the fuck out! No game or job is worth your health, either mental or physical.</p><p>I leave you with two images.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q0Ng!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q0Ng!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q0Ng!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg" width="1052" height="1080" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/bb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1052,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!q0Ng!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!q0Ng!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb77d31b-6640-400f-83c5-31ef5e751267_1052x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FIHO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FIHO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 424w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 848w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 1272w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FIHO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png" width="1244" height="834" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:834,&quot;width&quot;:1244,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:624431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FIHO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 424w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 848w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 1272w, https://substackcdn.com/image/fetch/$s_!FIHO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1cfaa7-4c55-477e-8e2b-9cc89236cb60_1244x834.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Until next time.</p><p><em>for those we have lost<br>for those we can yet save<br></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://loadbearingtomato.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for more Load-bearing Tomatoes.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[NFT Fantasy 3: Why None Of The NFT Plans Even Make Logical Sense]]></title><description><![CDATA[Why none of the promises make logical sense.]]></description><link>https://loadbearingtomato.com/p/nft-fantasy-3-you-cant-fix-a-bad</link><guid isPermaLink="false">https://loadbearingtomato.com/p/nft-fantasy-3-you-cant-fix-a-bad</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Sun, 16 Jan 2022 23:28:51 GMT</pubDate><enclosure url="https://cdn.substack.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>You Can&#8217;t Fix A Bad Plan With More Code</h1><p>Welcome back to Load-bearing Tomato.</p><p>This final part addresses the logic that underpins inter-system communication.</p><p>Now that we&#8217;ve established that <a href="https://chhopsky.substack.com/p/nft-fantasy-why-items-as-nfts-does">NFTs cannot take items between games</a>, and that <a href="https://chhopsky.substack.com/p/nft-fantasy-2-how-games-communicate">NFTs don&#8217;t enable knowing what you own in other games</a>, it&#8217;s time to get down to the most important thing:</p><p><strong>The plans for NFTs in games do not make logical sense at a fundamental level.</strong></p><p>Blockchains, at their core, are vehicles for establishing trust in an untrusted system. They are an immutable record of transactions that can be mathematically proven to have happened.</p><p>And that&#8217;s great for things like cryptocurrencies, where everything the blockchain knows about exists entirely within that system. </p><p>Wallet A has 5 BTC, Wallet B has 5 BTC. <br>Wallet A transfers 1 BTC to Wallet B. <br>Wallet A now has 4 BTC, Wallet B has 6 BTC. </p><h2>The Trust Boundary</h2><p>The system is self-contained &#8212; it doesn&#8217;t care about anything but the state of the wallets and transactions it contains. For this, blockchains do a great job of establishing trust. In order to formally evaluate trust, we use what's called a <strong>Trust Boundary</strong>: a line you draw between a system you trust, and one that you don't.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ECzE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ECzE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 424w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 848w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 1272w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ECzE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png" width="990" height="361" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/fe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:990,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23299,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ECzE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 424w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 848w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 1272w, https://substackcdn.com/image/fetch/$s_!ECzE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe5679f0-9b7e-403d-b48b-047f56907a28_990x361.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The BTC blockchain contains everything it describes.</figcaption></figure></div><p>This is where systems like NFTs based on cryptocurrencies fall over dramatically. A cryptocurrency describes only itself. <strong>The second that the thing you are describing is off the blockchain (off-chain),</strong> <strong>you are no longer trusting what happened, you are trusting what someone said happened. </strong>Anything that occurs off-chain crosses the trust boundary, and thus, can't be trusted.</p><p>The lie of &#8216;items/skins as NFTs&#8217; relies on a server that reports that a user gained an item. In this world of non-self-containment, we can&#8217;t think of a blockchain as something someone can trust, because anyone can write to it.</p><p>Instead, we need to think of it more like <em>shared storage</em>, like the hard drive of a shared computer. Remember all those warnings of the websites you log into that warn you &#8216;if this is a shared computer, don&#8217;t save your password&#8217;? There&#8217;s a reason for that. Now imagine your computer is in a public library, and anyone can save files on it, but like a blockchain, no-one can edit them after they&#8217;ve been saved. How do you know which files are safe to open? How do you know which files contain information you need? How can you trust any file that you didn&#8217;t create?</p><p>So, if you think about the &#8216;items and skins as NFTs&#8217; idea, where do you draw the trust boundary?</p><p>Let&#8217;s think it through.</p><h2>Who Do You Trust?</h2><p>Anyone can mint an NFT of a Bored Ape JPG, but it&#8217;s not a <em>real</em> Bored Ape NFT unless it was minted by the BoredApeYachtClub, from contract address 0xaba7161a7fb69c88e16ed9f455ce62b791ee4d03. The Bored Ape site won&#8217;t list it, and OpenSea won&#8217;t show it under the Bored Ape contract.</p><p>Let&#8217;s put this back in the context of some games: Game A and Game B. You have the following system &#8212; two games, both storing items as NFTs on a blockchain. We&#8217;ve already established that <a href="https://chhopsky.substack.com/p/nft-fantasy-why-items-as-nfts-does">these NFTs can only be item codes</a>, and will not contain assets.</p><p>Game A has the items SWORD and BIG_HAT. Game B has the items SHIELD and BIGGER_HAT. They both agree to implement each other&#8217;s items.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-EKu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-EKu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 424w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 848w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 1272w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-EKu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png" width="838" height="376" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/df374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:838,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16504,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-EKu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 424w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 848w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 1272w, https://substackcdn.com/image/fetch/$s_!-EKu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf374531-bfa2-4b8e-bdc5-a1171fe18c80_838x376.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Where do you draw the trust boundary?</p><p>Game A supports SWORD, SHIELD, BIG_HAT, and BIGGER_HAT.<br>Game B supports SWORD, SHIELD, BIG_HAT, and BIGGER_HAT.</p><p>But clearly this is insufficient. What&#8217;s important is not just the item, but the contract/game that minted it. If Game B plans to use an item from Game A, they can only trust that item if it was <em>minted</em> by Game A.</p><p>There&#8217;s an obvious reason why.</p><h3>Fake Mints</h3><p>If Game A decides that all items are equally trustworthy &#8212; regardless of which contract minted it &#8212; anyone can add anything to their inventory. They have opened the doors to fake items or worse. Let&#8217;s see that vulnerability in action.</p><p>Player X mints an NFT with an item BIG_HAT and adds it to their wallet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A5kW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A5kW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 424w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 848w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 1272w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A5kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png" width="842" height="374" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/fa890c50-2733-4ee0-b180-98c523cf2578_842x374.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:842,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22551,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A5kW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 424w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 848w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 1272w, https://substackcdn.com/image/fetch/$s_!A5kW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa890c50-2733-4ee0-b180-98c523cf2578_842x374.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Game A obviously should not trust this item, even though it supports BIG_HAT. That&#8217;s because it&#8217;s not BIG_HAT that is trustworthy, it&#8217;s <strong>BIG_HAT </strong><em><strong>by 0xA</strong></em>.</p><h3>The Actual Vulnerability Is Name Collision</h3><p>That&#8217;s a malicious example, but the same thing can occur completely naturally.</p><p>What happens when Game B &#8212; a trusted contract &#8212; adds an item that <em>also</em> uses the code BIG_HAT?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l-UE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l-UE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 424w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 848w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 1272w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l-UE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png" width="846" height="377" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:377,&quot;width&quot;:846,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20214,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l-UE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 424w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 848w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 1272w, https://substackcdn.com/image/fetch/$s_!l-UE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F287d1096-0a94-4b16-a7a7-f4f05b271032_846x377.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Game A supports SWORD, SHIELD, BIG_HAT, and BIGGER_HAT.<br>Game B supports SWORD, SHIELD, BIG_HAT, and BIGGER_HAT.</p><p>Player X has BIG_HAT. But which BIG_HAT is it? In order to avoid confusion, each game needs to maintain a list that includes information about both the items it trusts <em>and</em> the game/contract that minted them.</p><p>Game A and Game B now have a list that looks like this:<br>0xA SWORD <br>0xA BIG_HAT<br>0xB BIG_HAT<br>0xB SHIELD<br>0xB BIGGER_HAT</p><p>&#8220;But Christina&#8221;, you ask, &#8220;you talked about using <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier#Format">UUIDs</a> to generate unique ids. Couldn&#8217;t you just use those, and then each game could store a mapping of UUIDs to in-game items?&#8221; </p><p>Good question! But even if you avoid an accidental collision this way, it doesn&#8217;t protect you from someone maliciously and intentionally minting an item with a &#8220;unique&#8221; string. And because NFT contents are public, anyone can inspect or clone them.</p><p>This isn&#8217;t a technological problem &#8212; <strong>it&#8217;s a logical problem that arises from using shared storage</strong>. You can&#8217;t trust everything on the blockchain, you can only trust things on the blockchain that come from <em>trusted sources</em>.</p><p>This logic error underpins every failure of blockchain to deliver the promised metaverse of interoperable items. There is no way around it, because <strong>untrusted shared storage is a bad plan</strong>. The &#8220;trust&#8221; that blockchain delivers does not ensure that the <em>data</em> is trustworthy<strong>.</strong> It only ensures that we have a record of what was posted, and by who. Whether or not we trust that data is entirely up to us. </p><p>That is the <strong>Trust Mesh Problem</strong>. And it cannot be solved. It can only be <em>managed</em> through choices that we, as game operators, make about who we trust.</p><h2>So Who Do We Trust?</h2><p>We already discussed that Game A&#8217;s developers need to do a lot of work to <a href="https://chhopsky.substack.com/p/nft-fantasy-why-items-as-nfts-does">implement Game B&#8217;s items by hand</a>, and that they'd need to do this all over again for every game they use items from.</p><p>So naturally, we trust those items from those sources. </p><p>Earlier, I asked you where you thought the trust boundary was. What was your answer?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mp4W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mp4W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 424w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 848w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 1272w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mp4W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png" width="883" height="408" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/dbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:408,&quot;width&quot;:883,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32929,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mp4W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 424w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 848w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 1272w, https://substackcdn.com/image/fetch/$s_!mp4W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb95938-490a-43de-9f7b-4ddbdbeb3c4b_883x408.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s what it actually is. As Game A, we don&#8217;t trust the blockchain. We don&#8217;t even trust the contents of our players&#8217; wallets. We trust our servers, we trust items that we minted ourselves, and we trust items that were minted by specific contracts that we choose.</p><p>This reveals the real truth: Since what we actually trust is Game B&#8217;s <em>contract</em>, by extension, we also trust Game B. We trust the contract code, the server code that executes contracts, and we trust anything that they create or execute.</p><p>A game&#8217;s <strong>Trust Mesh</strong> is the network of external systems that it decides are a source of truth. Here&#8217;s our trust mesh in the Game A/Game B scenario.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IwIL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IwIL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 424w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 848w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 1272w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IwIL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png" width="572" height="152" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:152,&quot;width&quot;:572,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5496,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IwIL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 424w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 848w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 1272w, https://substackcdn.com/image/fetch/$s_!IwIL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e164a50-c2e6-463f-af49-72813efdcf41_572x152.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>The Trust Mesh</h2><p>So we (Game A) trust Game B. But by trusting their inventory, we are also trusting their drop rates, their economy, their methodologies &#8212; everything that goes into the game that we choose to support.</p><p>This means that Game B can fuck us in many different ways. Not only can they fuck our game balance &#8212; by flooding our game with super-powerful items, for instance &#8212; but they can fuck us economically. If Game A chooses to support Game B's skins, and those skins are cheaper than Game A&#8217;s skins, that could decimate Game A's skin revenue. And Game A can't even sell Game B's skins to make up for it, because they can&#8217;t mint them. Like we already established, Game A and any other game can only trust Game B items that came from Game B's contract.</p><p>And there&#8217;s nothing you can do about it, because it&#8217;s a logic problem. If you allow Game A to mint and sell Game B&#8217;s items, any game participating in this item-sharing system now has to maintain a list of all valid sources for Game B items, or else Game A&#8217;s Game B items will be incorrectly be identified as fakes. This also means that any time a new game joins the sharing system, every participant in the system has to update that list in their game. An incremental change would then require exponential work to implement, which destroys the idea of this system scaling, and Game B just gave Game A another way to fuck them. Before, Game B could just make skins that might be more popular than Game A. Now, Game A would be able to literally sell Game B&#8217;s content, but cheaper.</p><p>This scenario also reintroduces name collisions, because now the combination of contract ID and item code are not enough to uniquely identify the correct item type. We&#8217;re back to requiring globally-unique item codes.</p><p>These issues decimate the metaverse promise, because every time you add a new game to the trust mesh, it gets exponentially more complex. In computer science, we refer to this as <strong>O(N^2)</strong>, in what&#8217;s called &#8220;Big-O&#8221; notation. What does this actually look like if we try to do it for seven games instead of two?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1DoU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1DoU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 424w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 848w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 1272w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1DoU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png" width="932" height="826" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:826,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83944,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1DoU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 424w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 848w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 1272w, https://substackcdn.com/image/fetch/$s_!1DoU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F393a0cda-952c-4079-bdf9-a600ff8ca2df_932x826.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">If this doesn&#8217;t terrify you, I don&#8217;t know what will.</figcaption></figure></div><p>The size of a full trust mesh is the number of participants (n) minus 1 (you trust yourself) squared, or (n-1)^2. With 10 games involved, that&#8217;s 81 trust relationships. With 100, it&#8217;s 9801, all of which must be maintained and kept in sync. And if any participant in that system retains the freedom to choose who it trusts, the number of hypothetical different trust states becomes (2^n), rising from 9801 to 1,267,650,600,228,229,401,496,703,205,376.</p><p>Good luck programming for those.</p><h2>What About User Generated Content?</h2><p><a href="https://chhopsky.substack.com/p/nft-fantasy-why-items-as-nfts-does">We&#8217;ve talked about the difficulties of assets before</a>. For low-fidelity, objectiveless games like VRChat and Second Life however, there <em>are</em> standards you can use to make and import assets &#8212; at the trade-off of performance, fidelity, and freedom. These standards are unsuitable for modern AAA games, but let&#8217;s assume that we don&#8217;t care how badly our game looks or runs.</p><p><a href="https://www.khronos.org/gltf/">GLTF</a> and other similar standards allow importing and using assets, but in order to allow UGC, we need to choose to trust anyone on the blockchain that claims to have an asset for our game. We&#8217;ve already discussed why that&#8217;s terrible; the problems start all over again, but this time, it&#8217;s the content that&#8217;s the issue.</p><p>Aside from the usual &#8220;Time-To-Penis&#8221; concerns (<a href="https://www.youtube.com/watch?v=3_xqyIMwbew">the amount of time between enabling UGC and someone using it to draw a dick</a>), and people making things that are just bad (e.g. obscuring hitboxes, breaking silhouetting rules) we have a much larger problem: <strong>Shaders</strong>. </p><p>You might think that a surface in a game is just a texture, but it can actually be much more than that. Shaders are programs that generate the look of a surface. Textures are little more than simple images, but with a shader, you can do things like control how it refracts light, make something glow, or even <a href="https://www.youtube.com/watch?v=8kQW2jFPYZo">simulate the liquid contents of bottles in Half-Life: Alyx</a>. And now we&#8217;re saying that we&#8217;ll let people import shaders and execute them.</p><p>If you&#8217;re a programmer, you may commence panicking now.</p><p>Shaders are basically arbitrary code. In security terms, they are an <a href="https://blog.barracuda.com/2021/10/13/threat-spotlight-remote-code-execution-vulnerabilities/#:~:text=Remote%20code%20execution%20(RCE)%20vulnerabilities,take%20full%20control%20of%20it.">RCE vulnerability</a> &#8212; one of, if not <em>the</em> worst kind of vulnerability you can possibly have. You&#8217;re letting someone else run programs inside your game, on your players&#8217; PCs. If your game loads a shader that you didn&#8217;t write, it could easily contain code to download child porn, or join a botnet and turn every player&#8217;s PC into a DDOS participant, or run an aimbot (it would be so profitable to make skins that contain aimbots in their shaders, I shudder even thinking about it). One guy even wrote <a href="https://blog.pimaker.at/texts/rvc1/">a shader that runs an entire Linux instance</a>.</p><p>You can never, ever let a client run a shader you don&#8217;t trust.</p><p>Here&#8217;s what our trust mesh looks like with UGC:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G66L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G66L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 424w, https://substackcdn.com/image/fetch/$s_!G66L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 848w, https://substackcdn.com/image/fetch/$s_!G66L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 1272w, https://substackcdn.com/image/fetch/$s_!G66L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G66L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png" width="1157" height="512" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/bc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1157,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46015,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G66L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 424w, https://substackcdn.com/image/fetch/$s_!G66L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 848w, https://substackcdn.com/image/fetch/$s_!G66L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 1272w, https://substackcdn.com/image/fetch/$s_!G66L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9880e6-8726-434f-9f05-ee6e1b75e6f2_1157x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If we let users load anything at run time, we are choosing to implicitly trust them. And since we have decided that we are trusting things we don&#8217;t control, created by anyone, we arrive back at the core problem:</p><p><strong>Trusting shared storage allows anyone to hack your game.</strong></p><p>Quality control is gone. Anti-cheat is gone. Game balance is destroyed. The game economy is destroyed. It is all the hell of trying to buy an authentic item on Amazon, times a million.</p><h2>The Cursed Design Problem</h2><p>This is what we call a <a href="https://www.youtube.com/watch?v=8uE6-vIi1rQ">Cursed Design Problem</a>: when you have two goals that are in conflict with each other, and you can&#8217;t have both.</p><p><em>Example:<br>You want to buy a two-seater sports car.<br>You also want to be able to transport four people.<br>You can&#8217;t have a two-seater car and transport four people. One goal must lose.</em></p><p>The logic error inherent to NFTs in games is a cursed design problem. </p><p>If you have user-generated, NFT-loaded skins, you can&#8217;t have security, stability, or performance.<br>If you have items coming in from other games, you can&#8217;t have economic integrity.<br>If you have immutability, you can&#8217;t have customer support fix things when you get hacked.</p><p>These are not technical problems &#8212; they&#8217;re logical problems. The design goals are in conflict with each other. They cannot be resolved without sacrificing one of them.</p><p>You cannot fix it with more code. A new <a href="https://eips.ethereum.org/erc">ERC</a> can&#8217;t fix it. <a href="https://eips.ethereum.org/EIPS/eip-20">A new token</a> can&#8217;t fix it. The plan is at odds with itself, because it was never designed for this. It is <a href="https://medium.com/age-of-awareness/the-wrong-tool-problem-fb53f2899c7f">the wrong tool for the wrong job</a>.</p><p>&#8212;</p><p>This is the end. Hopefully you&#8217;ve come to understand why we don&#8217;t do this; it doesn&#8217;t do what you think it does, we can already achieve the same things using stuff that actually works, the outcome is worse, and the plan does not make sense.</p><p>I hope that by writing this, I will never have to explain this to anyone again. That won&#8217;t happen, but a girl can hope &#129310;</p><p><em>for those we have lost; for those we can yet save</em></p>]]></content:encoded></item><item><title><![CDATA[NFT Fantasy 2: Why NFTs Don't Enable Knowing What You Own In Other Games]]></title><description><![CDATA[We do that already. Inter-game communication is far less complicated than you might think.]]></description><link>https://loadbearingtomato.com/p/nft-fantasy-2-how-games-communicate</link><guid isPermaLink="false">https://loadbearingtomato.com/p/nft-fantasy-2-how-games-communicate</guid><dc:creator><![CDATA[Christina Pollock 死神]]></dc:creator><pubDate>Tue, 04 Jan 2022 04:33:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5R39!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome back, friends.</p><p>Today, we&#8217;re talking about communication.</p><p>People have become quite fond of saying that NFTs will enable games to understand what <em>stuff</em> you own, and let you load your gear from other games. As we discussed in part one, <a href="https://chhopsky.substack.com/p/nft-fantasy-why-items-as-nfts-does">the idea of just plucking those assets off the internet is a fantasy</a>. So, we accept that in order to use NFTs for items in modern games, a studio would need to pre-implement any actual assets and use the NFT to refer to them. </p><p>In the kind of modern, online games we&#8217;re talking about, each item is probably identified by the combination of two things:</p><ol><li><p> A string that indicates what type of item it is (e.g. WEAP_ENERGY_SWORD_ULTRA)</p></li><li><p>An item ID that refers to a specific instance of that item (e.g. <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier#Format">a UUID</a> like f561e9cc-06b3-4399-a274-d1e431a84cac)</p></li></ol><p>If you wanted to load an item from an NFT, the contents would most likely be, at a minimum, those two things.</p><p>Since we established that you can&#8217;t store the item&#8217;s actual game assets in the NFT, the pitch we&#8217;re left with is that the NFT will tell games what you own using these identifiers, and that will prevent games from messing with your inventory, give power to players, etc. etc.</p><p>But if you&#8217;re going to suggest that a new technology can enable something, you should first understand how the current technology works. In order to demonstrate this, I&#8217;m going to make up a new platform, like Xbox Live or PlayStation Network, called <strong>Games Network Live</strong>, for the <strong>HomeXperience</strong> platform. <strong>GNL</strong> and <strong>HX,</strong> if you will.</p><p>So you boot up your <strong>HX </strong>console, and tell it to log into <strong>GNL.</strong> What happens next?</p><p><strong>Now, I have to warn you: this part is boring to most people.</strong> Which is weird, because this is the actual technical layer at which blockchains and NFTs operate, and it&#8217;s the one people are also &#8220;excited about&#8221;. It&#8217;s going to be long, involved, and complicated, but if you&#8217;re here, you care about that sort of thing, so let&#8217;s dig in.</p><h2>Everything Is Just Websites, Kinda</h2><p>Pretty much all modern online games are powered by something called <a href="https://en.wikipedia.org/wiki/Web_service">Web Services, which are also referred to as APIs</a>. They&#8217;re functionally identical to how your web browser loads a web page with a URL. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w28F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w28F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 424w, https://substackcdn.com/image/fetch/$s_!w28F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 848w, https://substackcdn.com/image/fetch/$s_!w28F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 1272w, https://substackcdn.com/image/fetch/$s_!w28F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w28F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png" width="535" height="163" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:163,&quot;width&quot;:535,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13340,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w28F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 424w, https://substackcdn.com/image/fetch/$s_!w28F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 848w, https://substackcdn.com/image/fetch/$s_!w28F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 1272w, https://substackcdn.com/image/fetch/$s_!w28F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4a357dbf-a28c-4643-b441-383d4a3bb3e3_535x163.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Your console can also make HTTP requests, exactly like the ones your web browser makes, to services that receive them. This time, it sends some data along with it &#8212; some <a href="https://www.w3schools.com/whatis/whatis_json.asp">JSON</a>. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TXi6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TXi6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 424w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 848w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 1272w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TXi6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png" width="536" height="211" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:211,&quot;width&quot;:536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18417,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TXi6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 424w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 848w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 1272w, https://substackcdn.com/image/fetch/$s_!TXi6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7cda8ac7-46ed-48a9-9150-474f9216cea1_536x211.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If the JSON looks familiar, it&#8217;s because it&#8217;s exactly like what NFTs use. Your login request JSON might contain your username and password, and maybe some other metadata about your login attempt. It might look something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AlVJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AlVJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 424w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 848w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 1272w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AlVJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png" width="396" height="168" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/b0b47479-dd23-4216-b744-7dffa817c35d_396x168.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:168,&quot;width&quot;:396,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AlVJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 424w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 848w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 1272w, https://substackcdn.com/image/fetch/$s_!AlVJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b47479-dd23-4216-b744-7dffa817c35d_396x168.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">My real password is hunter2.</figcaption></figure></div><p>Then, exactly like your web browser, it receives a response. For your web browser, the response is a HTML web page and maybe some JavaScript, but for a web service, the response is usually just JSON.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7IQ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7IQ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 424w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 848w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 1272w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7IQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png" width="553" height="150" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:150,&quot;width&quot;:553,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:14626,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7IQ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 424w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 848w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 1272w, https://substackcdn.com/image/fetch/$s_!7IQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7ce04bc7-f07e-4abf-8d0d-eba369ab2ffa_553x150.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Truncated for readability.</figcaption></figure></div><p>Most importantly, the response contains an <strong>authentication token</strong> (or &#8220;auth token&#8221; for short), which is a specially encoded piece of text that the platform will use to identify you from here on in, so you&#8217;re not repeatedly re-transmitting your password. It&#8217;s cryptographically signed so you know it hasn&#8217;t been altered.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5R39!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5R39!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 424w, https://substackcdn.com/image/fetch/$s_!5R39!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 848w, https://substackcdn.com/image/fetch/$s_!5R39!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 1272w, https://substackcdn.com/image/fetch/$s_!5R39!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5R39!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png" width="1203" height="726" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1203,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76697,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5R39!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 424w, https://substackcdn.com/image/fetch/$s_!5R39!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 848w, https://substackcdn.com/image/fetch/$s_!5R39!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 1272w, https://substackcdn.com/image/fetch/$s_!5R39!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F21af0126-5ca7-4e97-bb21-f1aaf543f589_1203x726.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Left: the token contents on the wire. Right: what that encoding actually contains.</figcaption></figure></div><p>If you hit F12, or look at your cookies after logging into a game&#8217;s web site, you might find something that looks like the Encoded section above, and if you paste it into a decoder (like <a href="http://jwt.io">jwt.io</a>), you can see what your actual token looks like. &#10024;<em>HACKING</em>!&#10024;</p><p>So, why do you care about any of this? Well, because it&#8217;s the basis for most communication between systems on the internet, and we&#8217;re here to learn about how shit works. What NFTs do, from a game client&#8217;s perspective, is identical to any other web service.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3fyZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3fyZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 424w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 848w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 1272w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3fyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png" width="902" height="164" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:164,&quot;width&quot;:902,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16648,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3fyZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 424w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 848w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 1272w, https://substackcdn.com/image/fetch/$s_!3fyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2b420076-d4aa-47af-8703-77ee008ceefe_902x164.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So you have your <strong>GNL Auth Token</strong> - now it&#8217;s time to do something with it.</p><h2>&#8220;The Login&#8221;, by J.R.R. Token</h2><p>Thanks, I workshopped that.</p><p>So you boot up the newest, hottest game you&#8217;ve been playing the last few months, <strong>Call of BattleHalo</strong>, and you&#8217;ve just bought the latest DLC, <strong>Fate&#8217;s Cry</strong>.</p><p>Your console boots up Call of BattleHalo (hereafter COBH), and it logs into the COBH servers by sending it your <strong>GNL Auth Token</strong>. With this, it knows what your GNL account is, can validate that you are in fact logged into GNL, and is able to look up which COBH account is associated with it by checking its database. Most games use <a href="https://www.mysql.com/">MySQL</a>, <a href="https://www.postgresql.org/">Postgres</a>, or some cloud-hosted version of same, but COBH uses Postgres.</p><p>So COBH accepts your GNL token and issues you its own authentication token, that it will use to identify you for the rest of your session.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yr6B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yr6B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 424w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 848w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 1272w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yr6B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png" width="917" height="391" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:391,&quot;width&quot;:917,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35497,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yr6B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 424w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 848w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 1272w, https://substackcdn.com/image/fetch/$s_!Yr6B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F40d3163c-abe9-4735-bfcd-1be3fa68fcd8_917x391.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So, now you have a <strong>COBH Auth Token</strong>, and you can start making the requests you need to play the game.</p><h2>How Does It Know I Bought The Fate&#8217;s Cry DLC?</h2><p>I&#8217;m sure you&#8217;ve guessed - it&#8217;s more HTTP requests.</p><p>When you sent your auth token to the COBH servers, it knows that you&#8217;ve logged in from GNL, so it sends a request to GNL&#8217;s purchase servers to ask it whether you&#8217;ve bought anything. There are a few methods of doing this, but we&#8217;ll stick with a simple one.</p><p>COBH maintains a list of your purchases, requests a fresh list from GNL, and then goes through and delivers anything that hasn&#8217;t already been delivered. This could be COBH virtual currency that goes in an inventory, or an entitlement record that says you own the expansion and can access it.</p><p>It might go something like this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lMtn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lMtn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 424w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 848w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 1272w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lMtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png" width="1171" height="695" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:1171,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60774,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lMtn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 424w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 848w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 1272w, https://substackcdn.com/image/fetch/$s_!lMtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2822e4f1-86a6-4cd1-9a37-7c28a95e539f_1171x695.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To recap:</p><ul><li><p>Your game knows it needs to check the GNL store for purchases</p></li><li><p>It makes a request to GNL to ask what you bought</p></li><li><p>It compares that to a list of what it&#8217;s given you already</p></li><li><p>It grants you anything you&#8217;ve bought but not received</p></li></ul><p>Using a remote source to understand what someone owns in a game isn&#8217;t new - it&#8217;s how all console platforms work.</p><h2>More Data Required</h2><p>When your game starts to load in, it makes some requests to various COBH services to get the data it needs, including:</p><ul><li><p>Social (e.g. friends list, guild information)</p></li><li><p>Progression state (e.g. achievements, quests, level, data)</p></li><li><p>Inventory (e.g. items, cosmetics, consumables)</p></li></ul><p><strong>This is the part you&#8217;re interested in.</strong></p><p>The game client makes a request with its auth token to a game server API. The game server has its own secret token that it uses to make a request to an inventory server on behalf of the player. When the inventory server gets that request, it looks up the player&#8217;s items in a database, and the data weaves its way back up the chain.</p><p>Note that the inventory server does not need to send everything it receives from the database back to the game server. In fact, it&#8217;s normal not to. Items and currencies get deprecated all the time, and although games might perform migrations on the database to get rid of such things, there&#8217;s no reason they can&#8217;t instead filter them out in the inventory server.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mm4Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 424w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 848w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 1272w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png" width="785" height="401" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:401,&quot;width&quot;:785,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45979,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 424w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 848w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 1272w, https://substackcdn.com/image/fetch/$s_!Mm4Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51eebb23-82a8-418b-9d75-3ff832288e46_785x401.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>How might that be different with NFTs?</h2><p>It wouldn&#8217;t. Here&#8217;s how the same flow would go.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W33J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W33J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 424w, https://substackcdn.com/image/fetch/$s_!W33J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 848w, https://substackcdn.com/image/fetch/$s_!W33J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 1272w, https://substackcdn.com/image/fetch/$s_!W33J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W33J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png" width="1073" height="420" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e4464531-a173-49e8-bf14-a32f3f877156_1073x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:1073,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60938,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W33J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 424w, https://substackcdn.com/image/fetch/$s_!W33J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 848w, https://substackcdn.com/image/fetch/$s_!W33J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 1272w, https://substackcdn.com/image/fetch/$s_!W33J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4464531-a173-49e8-bf14-a32f3f877156_1073x420.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The same inventory server is the arbiter of what you get to have in-game. While it can&#8217;t remove things from your wallet, it <em>can</em> make them useless or worthless. A game company can immediately nullify anything you own. If they remove or block the item your NFT represents, then all you have left in your wallet is a JSON string that refers to nothing.</p><p><em>&#8220;But if the client makes that request and then sends it to the game server, a game company can&#8217;t interfere with it, right?&#8221;</em></p><p>No. This is incorrect for two reasons:</p><ol><li><p>Never, ever, <em>ever</em>, <strong>ever</strong>, <em><strong>ever</strong></em> trust that what a player&#8217;s computer tells you is real. Anyone can do anything to it. You could make your client say you have every item in the game. Inventory cannot be client-authoritative if you want your game to be secure.</p></li><li><p>The inventory still requires interpretation by the game server. The game server can similarly just ignore or change anything you send it. You probably have dead, invisible items in the inventory of every online game you play.</p></li></ol><h2>What about items from other games or services?</h2><p>It&#8217;s not meaningfully different than getting your purchases from GNL. When you earn an item by watching a Twitch stream, Twitch sends a request to that game's inventory server and tells it to grant you that item in-game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RnIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RnIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 424w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 848w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 1272w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RnIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png" width="1022" height="362" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:362,&quot;width&quot;:1022,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30745,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RnIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 424w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 848w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 1272w, https://substackcdn.com/image/fetch/$s_!RnIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F51a7bee6-1a48-46bb-9d05-443a3fe0cbb3_1022x362.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve simplified this a fair bit, but at a high level, this is how it works. It&#8217;s all just a bunch of requests flying around between services you&#8217;ve chosen to trust.</p><p>And <strong>trust</strong> is the important part here, because there&#8217;s functionally no difference between choosing to trust a particular service and choosing to trust NFTs minted by a particular contract address.</p><p>I&#8217;ve alluded to the <strong>Trust Mesh Problem</strong> before, but the core of it is simple:</p><h2><strong>Item Origin Matters</strong></h2><p>If, as the operator of COBH, I choose to honor items from another game, like the fictional <strong>Hail Of Storms (HOS)</strong>, I should only trust those items if they were <em>created</em> by Hail Of Storms. </p><p>Which makes sense right? If I&#8217;m telling my game that the item WEAP_ENERGY_SWORD is a HOS weapon, then I should only trust NFTs minted by HOS. If some other game started minting NFT items containing WEAP_ENERGY_SWORD, I know they didn&#8217;t originate in HOS. Like right-clicking and saving a popular NFT, then minting your own with it, the <em>contents</em> might be the same but it is the <em>source</em> that gives it its validity.</p><p>If I trust HOS items from any other source, anyone could create fake HOS items, and I&#8217;ve just allowed anyone to add anything to my inventory that COBH supports.</p><p>So given that you&#8217;re loading HOS items, and they can only ever come from HOS, all you&#8217;ve done is added more steps, when you could just <strong>ask HOS directly</strong>. If you ever recognize HOS items from a source other than HOS, you&#8217;ve allowed anyone who can mint an NFT to hack their own inventory, so the blockchain serves no purpose.</p><p>I&#8217;ve added a second game in here, <strong>Per Requiem Inventorius</strong> (PRI) for illustration purposes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S5WS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S5WS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 424w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 848w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 1272w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S5WS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png" width="1243" height="539" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/da3edd98-eb5c-463a-b6b2-339503992330_1243x539.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:539,&quot;width&quot;:1243,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84871,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S5WS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 424w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 848w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 1272w, https://substackcdn.com/image/fetch/$s_!S5WS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fda3edd98-eb5c-463a-b6b2-339503992330_1243x539.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Loading inventory from NFTs on a blockchain.</figcaption></figure></div><p>For all that talk of decentralization, <strong>that sure looks a lot like centralization</strong>, doesn&#8217;t it? The fact that the <em>storage</em> is decentralized doesn&#8217;t actually change anything in a centralized architecture.</p><p>Here&#8217;s how it currently works today:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vjY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vjY4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 424w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 848w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 1272w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vjY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png" width="1173" height="450" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:1173,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73688,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vjY4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 424w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 848w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 1272w, https://substackcdn.com/image/fetch/$s_!vjY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe03d31e3-c900-45bd-b18f-e7c18104ad6b_1173x450.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Looks pretty similar, huh? </p><p>COBH, HOS, and PRI are all free to dictate how their item exchange works, and design solutions that work for them. They can build exactly what all parties agree upon, without being kneecapped by an unnecessary choke point rife with counterproductive limitations.</p><p>In a future article, we&#8217;ll talk about what those limitations are, and why every possible version of a system like this is worse for them.</p><p>We&#8217;ll also talk about <strong>marketplaces</strong>, <strong>game design</strong>, and <strong>game economy health</strong>. Each of those topics raise their own issues, and any one of them is serious enough to kill any assertion that NFTs enable anything in games. But the future articles must wait for future days, and my hope is that if people can understand the inner workings of how they&#8217;re talking about, that they might focus on possibilities for the future that aren&#8217;t self-defeating.</p><h2>Thank You For Your Service</h2><p>So.</p><p>This was a fairly long and in-depth look into game services, and if you made it this far, I&#8217;m impressed - you care more about infrastructure than the average game-enjoyer.</p><p>But at its core, when people talk about NFTs and gaming, they&#8217;re talking about infrastructure, so that&#8217;s what I&#8217;ve attempted to get people thinking about here.</p><p>Next up, we&#8217;re going to be talking about the <strong>Trust Mesh Problem</strong> in detail, so stick around for the next article &#8220;<a href="https://chhopsky.substack.com/p/nft-fantasy-3-you-cant-fix-a-bad">You Can&#8217;t Fix A Bad Plan With More Code</a>&#8221;.</p><p><em>for those we have lost; for those we can yet save</em></p>]]></content:encoded></item></channel></rss>