<?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[AltDevArts]]></title><description><![CDATA[Sharing what we have learned over the years, in the art of development. ]]></description><link>https://www.altdevarts.com</link><image><url>https://substackcdn.com/image/fetch/$s_!5Off!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F469e720c-e14d-4efa-ae20-7d74bdaa966a_1280x1280.png</url><title>AltDevArts</title><link>https://www.altdevarts.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 07:42:39 GMT</lastBuildDate><atom:link href="https://www.altdevarts.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Matt Yaney]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[altdevarts@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[altdevarts@substack.com]]></itunes:email><itunes:name><![CDATA[Matt Yaney]]></itunes:name></itunes:owner><itunes:author><![CDATA[Matt Yaney]]></itunes:author><googleplay:owner><![CDATA[altdevarts@substack.com]]></googleplay:owner><googleplay:email><![CDATA[altdevarts@substack.com]]></googleplay:email><googleplay:author><![CDATA[Matt Yaney]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[End of Term]]></title><description><![CDATA[Craft Methodology]]></description><link>https://www.altdevarts.com/p/end-of-term</link><guid isPermaLink="false">https://www.altdevarts.com/p/end-of-term</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Mon, 01 Dec 2025 20:43:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/86040eb2-881b-4323-a8fe-9260cd5867c9_1544x1028.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Altdevarts we have been exploring AI and its uses in the game development space. In an attempt to be good stewards we have looked into numerous platforms out there that want to try to build some part of the game pipeline through AI. Some offer bits while others want to offer entire games at the speed of prompt.</p><p>When it comes to AI development for games, I see a tough impasse.</p><p>We need the AI to be expertly trained but if you use training data from all of the current games you&#8217;ll get the most average game possible. That sucks. To modify the game you now need to be a full developer as then using AI becomes a full skill set.</p><p>Instead of developing a game as intended we are developing prompts, or we need to have both skills, and the bar for entry is raised.</p><p>We need the AI to generate not the average of other games but the intent of the experience of what the creator actually wants. This is what we have looked at.</p><p>I wanted to see how the broader market handles it but that is immature.</p><h3><strong>Coming to terms</strong></h3><p>I&#8217;ve talked to companies with the primary goal to quickly earn money. No hate, just facts. They want to tie together as many publicly available pieces at once to get something of a good demo and then hopefully sell the company. I assume M&amp;A would do proper discovery and decide how exciting that is for their company.</p><p>Next, I see companies being so scrappy that they appear to be overusing AI themselves today. As an example one AI game generation company out there has this in their FAQ which appears to be probably inspired by a human:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h3Sx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h3Sx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h3Sx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg" width="1197" height="286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:286,&quot;width&quot;:1197,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29121,&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://www.altdevarts.com/i/178653157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.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_!h3Sx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h3Sx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ee01bb-487e-406a-a6d5-b0ceeec5af19_1197x286.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Sounds good right?</p><p>In their terms of service they say:</p><pre><code>&#8220;Services include access to an online database of games and corresponding code (&#8220;Materials&#8221;) for you to download and use to develop your own games.&#8221;</code></pre><p>Later it is stated that:</p><p> 3. License to Use the Services and Materials</p><pre><code>&#8230; You are further granted a nonexclusive worldwide license and right to use, modify, distribute and create derivative works of the Materials available through the Services for both personal and commercial purposes, provided that such use complies with all applicable laws and these Terms.</code></pre><p>The definition of materials is a bit vague though it does seem like the license is stating you don&#8217;t own the rights to anything you generate with the AI for your game.</p><p>None of that really matters though because of this:</p><pre><code>&#8220;You are responsible for regularly reviewing the Terms, as the Terms may be modified at any time. All such modifications will be effective immediately upon posting. If You are dissatisfied with any modification to the Terms, Your only remedy is to terminate Your use of the Sites and/or the Services, as described in Section 10 (Termination and Survivability) of these Terms. Your continued use of the Sites and/or the Services after a change or update has been made to the Terms constitutes Your acceptance of such change or update.&#8221;</code></pre><p>So what I see here is that they own the rights of everything and they can update the terms without you knowing at will. If you log into the service you just accepted the terms because you&#8217;re responsible to check if they changed anything before you log in every single time. It is a fever dream of a one-sided agreement and shows a lack of customer respect.</p><p>On their site it shows a bunch of big developers have used their site. I have trouble believing it was anyone with legal authority. The lawyers I know would start Thanos snapping people for someone signing that. I&#8217;d buy popcorn and watch.</p><p>Oh, and if that company ever reads this. Consider letting people own their generations outright, and all derivatives with a warning that the system might generate identical assets due to another prompt and those assets would be owned by others. Users would agree users cannot sue each other over those generated assets. No, it&#8217;s not perfect but it&#8217;s better. Once again,<strong> none of that matters</strong> if you stick with being able to update the terms at will.</p><p>There can be small companies with amazing products. Those products might revolutionize the world. At least we hope they change the world in a positive way. I would love to see what they are up to.</p><p>Sadly, the company that wrote those terms doesn&#8217;t seem to be trying to get customers. They appear to be setting up to get hostages while hoping to create Stockholm Syndrome. The only people who will accept those terms are people that don&#8217;t read or people that have nothing to lose. The terms we saw above are just a symptom of a larger problem.</p><h3><strong>A Craze</strong></h3><p>I distinctly remember how the Metaverse was going to revolutionize the world. I think the best metaverse we have right now is a cell phone. Single login to a portal of everything you might need to do with a consumer usable identity. So many Metaverse companies sprung up overnight. Next there was the NFT craze. People could get an insane amount of money thrown at them for starting a company to issue something like NFT Water Bottles. That image of a bottle will be great to stare at while you&#8217;re stranded in a hot desert.  That didn&#8217;t matter though. It&#8217;s an NFT idea, so let&#8217;s go! Here is the seed money! Then the AI wave started.</p><p>In the AI surge we see a bit more discernment but once again we have an unhealthy number of  money chasers and the seemingly endless supply of buzzword investors.</p><p>All of these waves tend to end in a similar way. A bunch of investors have lost money. A new shiny idea is out for people to chase. Previous idea wave experts are now just waiting for people to get excited about the Innerverse or Generative Relationships and start their new company there.</p><p>When hype has become a signal flare for a gold rush, those who survive to actually get to the gold are the ones who deliver on the product and build trust with their customers. Terms of use agreements, like the one above, torch trust faster than a jackrabbit on a hot griddle. You need trust. You need a working product.</p><p>Your customers are what make you succeed. If you treat them like a KPI proof point that carries risk, you should start working on your VC Innerverse deck today as you have already locked in your company&#8217;s demise. Trust isn&#8217;t a feature. It&#8217;s a foundation.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>]]></content:encoded></item><item><title><![CDATA[Stop improving]]></title><description><![CDATA[Craft Methodology]]></description><link>https://www.altdevarts.com/p/stop-improving</link><guid isPermaLink="false">https://www.altdevarts.com/p/stop-improving</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Mon, 17 Nov 2025 21:42:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/efb0ce34-5177-4a37-bf40-b16d166904dd_1680x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p>In the craft methodology discussion I&#8217;ve mentioned that I disagreed with one of the lean pillars. I was referring to continuous improvement.</p><p>On the surface, it seems to be a great thing. The idea being that we are always looking for a way to eliminate waste or ways to improve the efficiency of our corporation. We will then adjust the corporation to be more efficient and aligned in the end.</p><h3><strong>Let&#8217;s re-org!</strong></h3><p>A few companies I&#8217;ve been at had us reorganizing every 6 months to a year. Some of the reorgs were great and were done to make alignment with initiatives. This could be creating new initiatives, closing initiatives that were at end of life, or shifting some groups within leadership to reduce conflicting goals and reduce outside dependencies. However, most of the reorgs were chasing ways to improve ROI to no success. I&#8217;ve seen some companies reorg more often than they have shipped products. </p><p>I&#8217;ve witnessed companies and teams making changes to processes in hopes of correcting a reported issue. The problem is that those changes were done for all issues without really considering what is lost through change.</p><p>It is generally well understood that if you hire someone new it takes three to nine months for them to get to their full potential. Time is lost when a new employee is not working as they could when they are:</p><ul><li><p>Getting their computer</p></li><li><p>Gaining access to all of the systems</p></li><li><p>Learning company processes</p></li><li><p>Learning how to work with the team</p></li><li><p>Gaining insight on how to effectively communicate in your company</p></li><li><p>Learning how work gets approved and validated long term</p></li><li><p>And so much more</p></li></ul><p>I don&#8217;t know of anyone who thinks a new employee can start a new job and be as effective day one as they will be in a year.</p><p>If an employee changes what job they are doing they will also be less effective for some time. They can use knowledge from their old job to get up to speed quicker on their new job. They will still have a time where they are less efficient.</p><p>When we reorg, change processes, or change teams we disrupt at least the people affected and potentially the entire company.</p><h3><strong>Getting Experts</strong></h3><p>Getting all of this right has become such a priority, we will hire experts to explicitly tell us where and how to change our company. I&#8217;ve seen them create and grow entire departments in an organization around perceived inefficiencies in processes, communications, reporting or what have you.</p><p>This can extend even lower where entire methodologies are taught on how to conduct continuous improvement down to the individual.</p><p>So am I going to say improvement is bad? Not at all. Iteration is one of the most important things we do. If we don&#8217;t iterate our company we will die. The real question is:</p><p>What are you iterating for?</p><h3><strong>Good Reason</strong></h3><p>We have to make changes to our organizations with imperfect information even at high risk. Many times it could be compared to gambling. Leaders at the top are the best in the world at making those decisions. They know making a change is the right call with the information they have. Highly visible pain is shouting from the roof tops that something needs to shift.</p><p>Over in my post on Iteration, I talked about how long to wait before making a new change. I showed a game where making a small change to a rule set would create noise in a system for a long time before actually stabilizing into a new system. We had to wait long enough for the game&#8217;s entities from creating new patterns before then waiting to ensure what we see is the actual result from our changes.  It can be a deceptively long time. If you make a change too soon all you are doing is changing based on noise instead of signal.</p><p>We will always need to make some changes with imperfect information. However, noise isn&#8217;t imperfect information. It&#8217;s noise. Changing a company will produce that noise and the noise will be louder and arrive quicker than the actual results. Turbulence can make success look like failure. Excitement can be false proof. A short term gain can hide an oncoming turn over.  Even the best leaders with the best reasons for change can hear early results then move on before the noise has settled enough to truly tell.</p><p>Sometimes the solutions are the actual problems.</p><h3><strong>Why?</strong></h3><p>If your company has some sort of team with one of their primary pillars is efficiency, what are you evaluating their performance on? What if one of those team members said, &#8220;I don&#8217;t see any changes to make for this coming year.&#8221; or &#8220;I need to take a year to see how those changes work out.&#8221; Should they then be concerned about their job?</p><p>If they must show they made something in the company more efficient to be a performer, their KPI is now internal change rather than making your company do its purpose better. If you are paying people to make changes, everything will always be changing.</p><p>Once you make a change, you lose context, need to rebuild working relationships and wait for efficiency to hopefully grow higher than before. It can get crazy where we are changing every part of the org forever and simultaneously. At scale this is just an expensive waste engine.</p><p>I&#8217;ve seen this happen first hand. Program managers were hired to be a point of communication for the engineers. Now those managers needed to be explained everything, told everything, and would insist on being in most every meeting for visibility. Inadvertently they became just a giant drag to the system. Be careful not to get caught up in the excitement of the latest structure to try.</p><p>Keep in mind, if you keep repotting a tree, that tree will struggle and you will eventually kill the tree.</p><p>As I said, change is critical when needed. To know if you need change, look at what your product actually is. Internal procedures usually are not the point. Specific ways of working for employees are not the point.</p><p>We build products, ship them, and then when a new product makes sense to build, we do that. Our companies should be no different.</p><p>If our company is too inefficient to make the company&#8217;s actual products profitable we need to change.</p><p>If we need to make a different product we need to change.</p><p>If our company&#8217;s dependencies shift we need to change.</p><p>If we have a KPI that are burning out employees, we need to change.</p><p>I thought we were making changes so that our company would be great for our customers.</p><p>Changes are supposed to lead to a time of actual stability and performance.</p><p>The goal of changing is not to just find more changes.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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[When to ship]]></title><description><![CDATA[Craft Methodology]]></description><link>https://www.altdevarts.com/p/when-to-ship</link><guid isPermaLink="false">https://www.altdevarts.com/p/when-to-ship</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Sat, 06 Jul 2024 21:04:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ocXC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.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_!ocXC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ocXC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ocXC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9786930,&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_!ocXC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ocXC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe27f4e49-0297-4682-9c72-2dc8b4cd9b25_4651x3101.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><h3><strong>Who wants to be rich?</strong></h3><p>One of the richest people on earth has gone just a little crazy.&nbsp; They are working on a slot machine to give away 20 billion U.S. dollars. It is a guaranteed jackpot win within 50 pulls. Each pull is completely free. They haven&#8217;t worked out all of the bugs yet. For some reason there is a 1% chance that the machine will deliver an electrical shock strong enough to stun you and possibly cause a little burn. They ask if you&#8217;d like to play it right now. You can pull the slot machine hammer as many times as you&#8217;d like and you can keep the winnings.</p><p>What do you think most people would do? Would they pull that hammer till they hit the jackpot?</p><p>Alternatively, we could have a slot machine that is shockless, works perfectly, costs 40 dollars each pull, and rewards a maximum of 30 dollars in return. No sane person would use it.</p><p>We could say, &#8220;People will use your product once its value outweighs the product's shortcomings even if those shortcomings are severe.&#8221;</p><p>I&#8217;m not suggesting we ship frustrating or harmful products. I am saying that we should be aware of what value our customers are seeking to get from our products and to ship when those desires are met.</p><p>One game I was working on had a bug where if you played the first 30 hours without ever saving, stopped at a specific location, and then fired a weapon the game crashed. If you ever saved before that point the bug wouldn&#8217;t happen. I was surprised our testing team found that one. We ended up shipping with that bug still in the game. We never saw or heard a single comment or report of that bug post-ship. I really don&#8217;t like crash bugs. However, the opportunity cost of us delaying shipping to fix that bug versus the chance of any player being harmed by it was so low it just wasn&#8217;t worth fixing.</p><p></p><h3><strong>Customer value</strong></h3><p>We&#8217;ve been looking at value versus bugs which is only one part of the story. Over in <a href="https://www.altdevarts.com/p/prioritizing-work">prioritizing work</a> I&#8217;ve talked about how to figure out how valuable any given specific feature is to include in the product. We assign value for many thing including:</p><ul><li><p>If that feature is table stakes</p></li><li><p>If the feature was asked for by the customer</p></li><li><p>If the customer has shown interest in the feature</p></li><li><p>If the customer is willing to pay money for that feature</p></li><li><p>What impact the feature will have</p></li><li><p>Do our competitors already have this covered</p></li><li><p>What the current maintenance cost would look like</p></li><li><p>And many more items</p></li></ul><p>A version of the feature evaluation should be done for the entire product before production to see just how valuable the product could be. As we are building the product we can see how much of that potential value we are delivering.</p><p></p><h3><strong>Fit and Culture</strong></h3><p>An audio company became interested in diversifying and hired me to start to make video games for them. I put together a small team. Worked on shipping a couple of audio related specific products they wanted and then started building entertainment products. Right before I could ship a product that I had a great deal of faith in, the company got bought by another audio company.</p><p>The new company had no interest in entertainment products so the title was killed. Even though the title had a great deal of potential value, it didn&#8217;t serve the larger corporate goals and it made the most sense to&nbsp;abandon the project.</p><p>You need to be sure that releasing the product will fit with the company's view for market, value, quality, statement, and culture. If the product doesn&#8217;t fit the company&#8217;s requirements, adjust the product.</p><p>Alternatively, you can adjust the company. Look at how Nintendo made instant rice, Avon sold books, Wrigley sold soap and baking powder. Don&#8217;t be a slave to what your company is. You can easily destroy a company with corporate requirements that have no real impact or value. Sometimes it is ok to ship a product that will update your corporate goals.</p><p></p><h3><strong>Ok, but when?</strong></h3><p>Ship when the product is delivering the intended value, that value is not destroyed by drawbacks, and represents the company&#8217;s requirements for it.</p><p>Intended value can be tested against. If you are building a calculator you can test directly against it working or not. If you are creating an open world game you can use player statistics to infer the value. Intended value doesn&#8217;t mean when every feature has been completed. If your consumers want the value from the product right now, give it to them. The other features can come later as needed.</p><p>Value being destroyed by drawbacks can be determined with a few techniques. First, ask the consumer. No secrets here. Consumers will happily tell you what they want. The more frustrating the issue the louder the voices. If there are no voices, be concerned that the product lacks value.</p><p>Secondly, you can determine value being destroyed by drawbacks from long term use. As I&#8217;ve mentioned before, I used to go to the testing department right before their lunch time to see how QA would stop playing my game. If they threw the controller down and left I had much more work to do. If they played for a little more and then left for lunch, I was getting closer. If they played through their lunch I knew I had a good game. These days we can easily track play habits and see how they align with our intent. How many bugs are users experiencing? Do those bugs affect the experience?&nbsp; Do users take a break after hitting an issue or using a feature?&nbsp;</p><p>Corporate requirements should be an easy bar. You know your company. Look at the product the way it is today, not tomorrow, not some future version, today. Does that fit your company or not? If not, do you have unreasonable corporate requirements? Will you tank the company because of them?</p><p>If the product passes these tests then ship it right now. Don&#8217;t think. Don&#8217;t keep building, fixing or perfecting.</p><p>Just ship it.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>]]></content:encoded></item><item><title><![CDATA[Stop Documenting the Truth]]></title><description><![CDATA[Story Telling for Games]]></description><link>https://www.altdevarts.com/p/stop-documenting-the-truth</link><guid isPermaLink="false">https://www.altdevarts.com/p/stop-documenting-the-truth</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Thu, 22 Feb 2024 05:02:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VCM9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.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_!VCM9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VCM9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VCM9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg" width="1456" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23806930,&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_!VCM9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VCM9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7d94c7f-2b50-476f-ad4d-315068a6e5a1_6533x3875.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></p><pre><code>&#8220;The bloodiest war started in 2932. Both sides struggled through tough days. It wasn&#8217;t until Cerias Tucker betrayed President Holland by poisoning his porridge that peace could be established.&#8221;</code></pre><h4><strong>So Bad</strong></h4><p>I see narrative like the one above too much in games. There are several storytelling crimes in those two sentences.&nbsp; Beyond being overly short with pointless information it lacks engagement, relevance, or viewpoint.</p><p>Each time I&#8217;ve seen a writer create text like that, I assume they were attempting to set the scene for the player. To help the player understand a character, the world, or the history of the world. Unfortunately, it actually sucks.</p><p>One of the most famous narratives similar to this is the opening crawl for Star Wars. It is an iconic and memorable opening. It also does almost nothing for the story. If that screen crawl were to be removed, I believe nothing would be lost from the actual film. The film covers everything in the crawl at its own pace. The only real value of the crawl is text at an interesting angle before some great camera movement. That crawl has become about the excitement of starting a new Star Wars film and much less about actually adding to the story of the film.</p><p></p><h4><strong>It Matters More in Games</strong></h4><p>One of the big differentiators with videogames is the level of immersion and involvement a player can have with a story. The player can be a living witness to the story or can quite literally drive all the story choices.&nbsp; Direct reciting of events as narrative is not realistic to a world you want the player to feel they belong in.</p><p>The way we are told events in the world is always from someone&#8217;s perspective. We then get a feeling about the events from that perspective combined with what we think about them. If we tell events in games from the perspective of the in-game author we get many advantages from it:</p><ul><li><p>The game feels more real</p></li><li><p>The player gets to decide if they trust the story and the source</p></li><li><p>We can introduce alternate versions to add depth or confuse the issue</p></li></ul><p></p><h4><strong>A Shootout in Town</strong></h4><p>For instance, we could have the following:</p><pre><code>&#8220;I&#8217;ll do my best to tell you what I saw. Every time I try to say this I cry. Oh, God, please help me.

The first I saw was the Red Bandits emerging from the dust storm and trying to escape with their transport pullers crawling down the back path of town.

Deputy Thompson knew he couldn&#8217;t allow them to keep spreading their lies and their ways in a new town. He went out to stop them.

Bravely standing in the middle of the path a few strong supporters stood with him. I could only imagine the hate under their bandit masks as they opened fire. Old lady Candice stepped in front of Thompson hoping to stop the aggression. They, they, cut her down without hesitation. They, they, never even stopped firing. I never got to say goodbye. It took our doctors to confirm it was her. 

All of them were murdered by the time the Red Bandits got near them. It was a massacre. We can&#8217;t let this continue.&#8221;</code></pre><p>What if this was narrated by <em>Sam Gladly</em>, a poor local farmer? What would you think? </p><p>What if it was a report from the <em>Ministry of Truth</em>?</p><p></p><h4><strong>A Second Thought</strong></h4><p>Later, you could have the player get another account of the event told from the Red Bandit&#8217;s perspective:</p><pre><code>&#8220;We tried to reason with the Deputy. We wanted to live in peace on the outskirts of the desert. He insisted we erect their idols or go to the education camps.

Murray wanted to try one last time putting up the white flag to talk. The deputy&#8217;s goons shot him four times in the gut and sent him back. They saw him wrap the white flag around his waist. As the flag became soaked with his blood they said it gave him a great red color. They mockingly called him a "Red Bandit." Apparently the name stuck and they kept referring to us as that.

We knew we had to flee. We weren&#8217;t going to have our kids be programmed to hate us. The only path to peace would be to try to escape through the back of town. It wasn&#8217;t any good. Those goons found us and opened fire.

They lined up their women in-front of them as human shields. They were firing from behind their women with the barrels literally under their arms.

I tried not to use my weapon. I saw my youngest child go limp and fell off the transport. She had been shot. It was clear she was dead. My two other kids were in shock. I was a fool to hold fire. I started shooting back. Then I lost my other children.

Only a few of us escaped with our lives. I keep trying to find a way to live with the horror of that day. Why am I even trying to make the world better now that my kids have been killed? Who am I trying to make it better for?&#8221;</code></pre><p></p><p>If you set up your story events as unswerving truth you&#8217;re just documenting facts. If you want to document facts, make a quiz game. If you&#8217;re going to make a story, help the player live and breathe that world.</p><p></p><p>Feel free to write a hard truth of what happened to characters and your world. Just keep it to yourself and only tell it through the lenses of those that claim to have been there.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.com/subscribe?&amp;gift=true&quot;,&quot;text&quot;:&quot;Give a gift subscription&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.altdevarts.com/subscribe?&amp;gift=true"><span>Give a gift subscription</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Priority Basics]]></title><description><![CDATA[Craft Methodology]]></description><link>https://www.altdevarts.com/p/priority-basics</link><guid isPermaLink="false">https://www.altdevarts.com/p/priority-basics</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Fri, 26 Jan 2024 22:54:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/45bae876-722a-41f8-af7f-00f0f4efbfbe_7360x4912.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Link to file below for paid subscribers.</p><p></p><p>The post I did on <a href="https://www.altdevarts.com/p/prioritizing-work">prioritizing work</a> gives a way to prioritize tech based features. For prioritizing other items, some people have shown me the Eisenhower Matrix.</p><p>It seems fine on the surface though it has problems in use. For those not familiar with the Eisenhower Matrix, it is a way to organize work according to 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_!0NVz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0NVz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 424w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 848w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 1272w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0NVz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png" width="1456" height="1225" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1225,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64705,&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_!0NVz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 424w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 848w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.png 1272w, https://substackcdn.com/image/fetch/$s_!0NVz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6b4a7fe-7af1-410a-be87-664eb4c93c3f_1665x1401.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>The idea is that you should take everything that needs to be done and sort it by its importance and urgency.&nbsp;</p><p>If something is:</p><ul><li><p>Important and urgent - Do it now</p></li><li><p>Important and not urgent - Schedule when you should do it</p></li><li><p>Urgent but not important - Delegate it out to others</p></li><li><p>Not important and not urgent - Throw it in the trash and don&#8217;t do it</p><p></p></li></ul><p>The spiritual intent of the chart is the idea of focusing on important things that need to be completed soon. There&#8217;s nothing wrong with that high level concept. It&#8217;s not all that revolutionary or helpful on its own.</p><p>Looking at the Eisenhower Matrix, it is attempting to help answer both what to do and who should do it in one swoop. Let&#8217;s ignore who should do it and focus just on what to do.</p><p>The Eisenhower Matrix makes the assumption that we should have an important axis and an urgency axis. The urgency axis I think is deceptively dumb. If one task is critically important and another has no importance, urgency doesn&#8217;t matter. Urgency should be a factor when considering a task&#8217;s importance. It shouldn&#8217;t be its own axis. Instead of an urgency axis, let&#8217;s just make sure that there is still a possibility to complete any task you are looking at. That is all we need.</p><p>An axis for important makes sense. To help classify tasks we should find a way to actually sort the tasks.</p><h2><strong>What is Important?</strong></h2><p>So, what is important work? I see importance primarily as work that significantly contributes to at least one specific goal in a KPI, OKR, smart, or other form.&nbsp;</p><p>The desired outcome of the goal does not need to always be product related.&nbsp; It could be setting up a cadence of skip level meetings to improve communications. It&nbsp; could be shipping a product to completely eliminate the top 3 users' concerns in our company&#8217;s primary market by Q4 within the allocated budget. It could also be something to do with culture, morale, process, or an infinite number of other items.</p><p>A better way to look at the matrix would simply be to sort tasks by an importance value. We could do that by writing them down and assigning a value that seems appropriate. We&#8217;ll give a 1 - 10 value with 10 being the most important.</p><p>It doesn&#8217;t matter to get the numbers exactly right. What matters is the numbers make sense relative to each other. One way to do this is find a task you think you are confident on its number as a starting point. You&#8217;re best off finding a task that seems to be about a 5 in importance. Assign it a 5. Then start assigning numbers to the other tasks relative to that one. While 5 may work best, you can start with a 10 or any other task with an importance value you know.</p><p> Something along the lines of:</p><ul><li><p>Land Changes for Feature X - 10</p></li><li><p>Doc Check for Feature X - 7</p></li><li><p>Integrate Desired Growth Paths for staff - 5</p></li><li><p>Update Corporate Onboarding Procedures - 10</p></li><li><p>Revise Stakeholder Guidance - 7</p></li><li><p>Sign off staging version of Product K - 10</p></li><li><p>Product K Prep from Staging to Live - 5</p></li><li><p>Establish Monthly Weak Point Training for staff - 2</p></li></ul><p></p><h2>This Could Use Weight</h2><p>Sorting like that is fairly terrible as we are rating against goals of a potentially unknown worth. For example, &#8220;Land Changes for feature X&#8221; is really important to feature X. &#8220;Integrate Desired Growth Paths for Staff&#8221; could be important for both training staff and increasing morale. To get a better view we should weigh how important each of our goals are and modify each task's importance with the weighting.</p><p>As an example this chart shows 5 goals with their overall value from 1 - 10. 10 is the most important. Use the same method of assigning numbers as described for the tasks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xSfA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xSfA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 424w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 848w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 1272w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xSfA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png" width="555" height="424" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:424,&quot;width&quot;:555,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31568,&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_!xSfA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 424w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 848w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.png 1272w, https://substackcdn.com/image/fetch/$s_!xSfA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9446d940-dde3-46e6-b23f-ebb85bf991da_555x424.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>We can then have a chart automatically be set up so we can enter how much value each task would contribute to each goal from 1 - 10 with 10 still being the most. That looks 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_!el62!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!el62!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 424w, https://substackcdn.com/image/fetch/$s_!el62!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 848w, https://substackcdn.com/image/fetch/$s_!el62!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 1272w, https://substackcdn.com/image/fetch/$s_!el62!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!el62!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png" width="1383" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1383,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72458,&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_!el62!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 424w, https://substackcdn.com/image/fetch/$s_!el62!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 848w, https://substackcdn.com/image/fetch/$s_!el62!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.png 1272w, https://substackcdn.com/image/fetch/$s_!el62!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa13821d5-3394-42cc-a200-9cededd1ed0e_1383x475.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>From that the values can be added up with their relative weightings to give what is important to do. Those values can be shown in a simple bar 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_!p8Is!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p8Is!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 424w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 848w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 1272w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p8Is!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png" width="1456" height="907" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:907,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44792,&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_!p8Is!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 424w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 848w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.png 1272w, https://substackcdn.com/image/fetch/$s_!p8Is!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac1dc60-1f16-4af7-a3f2-97bae0bd11ce_1503x936.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><h2>Take an Extra Minute for Risk</h2><p>If we want to put just the slightest more effort into rating our tasks, we can integrate risk. If we add a risk value to our tasks we can represent that along with value for a better picture. Risk is the chance this task will fail for any reason. That could be from unknown solutions, external dependencies and similar. We will set risk from 1 - 5 with 5 being the most risk.</p><p>Adding a risk column to our table we get:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TMnN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TMnN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 424w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 848w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 1272w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TMnN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png" width="1456" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79485,&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_!TMnN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 424w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 848w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.png 1272w, https://substackcdn.com/image/fetch/$s_!TMnN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4569853-221c-4505-bc43-ea55731a2a2e_1774x465.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 data we can build a chart with:</p><ul><li><p>Move valuable tasks on the top</p></li><li><p>Less valuable tasks on the bottom</p></li><li><p>Riskier tasks on the right</p></li><li><p>Less risky tasks on the left</p></li></ul><p>This would mean that a safe important task would be in the upper left and a risky worthless task would be on the lower right. That chart looks 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_!iQFH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iQFH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 424w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 848w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 1272w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iQFH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png" width="1252" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51625,&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_!iQFH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 424w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 848w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.png 1272w, https://substackcdn.com/image/fetch/$s_!iQFH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88727fe9-7512-42bc-95e2-3a931ce3e560_1252x762.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>From the chart you can easily see which tasks are valuable and safe to complete. This little extra info helps really visualize the worth of each task.</p><p></p><h2>Sizing Tasks</h2><p>For just a minute more you can add a rough duration to each of the tasks to round out the chart. All of the tasks added to the list should all be task sized. You don&#8217;t want to be thinking about if you should do a three year project or that two day task. If you end up with mismatched tasks, breakdown the big task into smaller pieces you can work on right now that are around the same size as the other tasks. Once you have that you can choose an expected duration for each task. To make it easier I set up selections in the sheet of:</p><ul><li><p>Very Long</p></li><li><p>Long</p></li><li><p>Medium</p></li><li><p>Short</p></li></ul><p>This is a bit vague on purpose. We are trying to move quickly and get a good idea of what to do without spending more than 10 minutes on this entire exercise. We assign rough duration to the tasks here:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u6dY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u6dY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 424w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 848w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 1272w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u6dY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png" width="807" height="428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a063e18a-e28c-408f-9726-96903c365c5c_807x428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:428,&quot;width&quot;:807,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59918,&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_!u6dY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 424w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 848w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.png 1272w, https://substackcdn.com/image/fetch/$s_!u6dY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa063e18a-e28c-408f-9726-96903c365c5c_807x428.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>Taking those durations and using them as the size of the bubbles on the bubble chart gives us the view below. </p><ul><li><p>x axis is Risk</p></li><li><p>y axis is Importance</p></li><li><p>Size of bubble is Duration. The bigger the bubble the longer the task takes.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RPar!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RPar!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 424w, https://substackcdn.com/image/fetch/$s_!RPar!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 848w, https://substackcdn.com/image/fetch/$s_!RPar!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 1272w, https://substackcdn.com/image/fetch/$s_!RPar!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RPar!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png" width="1342" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1342,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71218,&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_!RPar!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 424w, https://substackcdn.com/image/fetch/$s_!RPar!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 848w, https://substackcdn.com/image/fetch/$s_!RPar!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.png 1272w, https://substackcdn.com/image/fetch/$s_!RPar!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a9a7e61-13ee-47be-b64f-f0cb82051cfa_1342x813.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>From this we can see the importance, risk, and potential time commitment of each task. It should give a much better idea of where to spend time then just relying on importance alone.</p><p>We should ignore the Eisenhower Matrix as we can get a better results with a simple bar chart. If we add in accounting for goals, risk, and duration it makes it even better with minimal effort. If we can&#8217;t answer those questions about our tasks then we need to get a better understanding of those tasks before we commit to doing them.</p><p></p>
      <p>
          <a href="https://www.altdevarts.com/p/priority-basics">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 21]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-c17</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-c17</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Mon, 08 Jan 2024 19:13:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6a7b4b32-6af6-4d5b-b044-2ab672bea08d_1547x974.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In Part 21 we&#8217;ll look at collision detection. In the Unity project, the physics system is used for collision detection, which is an expensive and complex option. We&#8217;ll reduce the problem to some simple checks and organize the data so that collision and damage systems can be handled independently from the enemy, hero, and bullet instances. (And so they can all share the same solution.)</p><h2>21.0 Visualize broad-phase collision grid</h2><p>Visualize a 16x16 grid to potentially use as a broad-phase collision. Think through possible some storage options of collision data:</p><ul><li><p>Option 1: Store 1 bit per grid section. If there is a hit, check against all possible inputs. Given the counts are low, it's not unreasonable.</p></li><li><p>Option 2: Store 1 byte per grid section. Store index of item at that grid section. If there is a hit, only compare against the indices that are indicated. If multiple items are on the same grid section, just overwrite. Given relative sizes, there's not likely to be any noticeable issues.</p></li><li><p>Option 3: Store 16 bytes per row. 1 byte for count. 15 bytes for elements. For each row, a list of items overlapping the row. If there is a hit, walk the list of items indicated. Overlapping items are non-issue. 15 elements per line is a reasonable constraint.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b9073998-22d0-4a3f-a07e-16a9dace8e04&quot;,&quot;duration&quot;:null}"></div><h2>21.1 Collision grid data and input maps</h2><p>I was thinking of a case I&#8217;d like to try that would make option 2 problematic: Intentionally fully overlapping objects. e.g. a shield around a ship. Which makes the case for option 3. So, we&#8217;ll start with that. (Although as I said earlier, revisions on various speeds, sizes, and spawn frequencies may change the situation enough to require a completely different solution.)</p><p>Start by creating collision_grid. We&#8217;ll hook this up to enemy_instances, hero_instances, enemy_bullets, and hero_bullets to get grid data for each of them respectively. To hook them up, we&#8217;ll map collsion_source_instances and collision_source_types. </p><p>I decided to simplify the mapping process a bit for when I don&#8217;t specify a source (i.e. when the offsets in the map are assigned at runtime.) But to do that, I need to fix up the builder scripts a bit.</p><p>TODO:</p><ul><li><p>Need to support importing schemas in schemas, to look up types. (Without source data, we can&#8217;t infer the type anymore.)</p></li><li><p>Bullet and hero/enemy type data store radius in different formats (radius_q8 and radius_q4, respectively.) </p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;9aca1907-b4f6-4640-8847-94310f2b07db&quot;,&quot;duration&quot;:null}"></div><h2>21.2 Support import types in schemas</h2><p>Update export_bin to use imported schemas to gather type information for maps.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5e71a11d-f1d3-4f68-a2f6-1f3d2efa6c5d&quot;,&quot;duration&quot;:null}"></div><h2>21.3 Support different radius ports</h2><p>Update collision_grid to have both radius_q4 and radius_q8 ports. The appropriate port is mapped, where the other remains NULL. Update export_c_header to return NULL when offset is zero.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;d2345a20-faac-4a52-bf09-f5b05189c1d4&quot;,&quot;duration&quot;:null}"></div><h2>21.4 collision_grid_update</h2><p>Updating collision_grid_update for the various input cases highlighted a few issues that we need to resolve. There&#8217;s no tracking of filtered out instances (e.g. the live_instances bit set for enemy instances.) Got the basic update working and visualized the data being stored to help sort out the issues.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;60895206-dda9-419c-892a-2dcb67a0defb&quot;,&quot;duration&quot;:null}"></div><p>On the left are the hero instances and hero bullets. On the right are the enemy instances and enemy bullets. The play area is divided into 16 slices vertically. The number of instances overlapping that a slice is stored, and the indices of the specific instances are stored per slice, for later more fine-grained collision testing. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NOCk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NOCk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 424w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 848w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 1272w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NOCk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png" width="1424" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1424,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68699,&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_!NOCk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 424w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 848w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.png 1272w, https://substackcdn.com/image/fetch/$s_!NOCk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F624c7d29-1c82-4b93-808d-337212035bc3_1424x777.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>21.5 collision_grid_update filter</h2><p>Add an enabled filter for collsion_grid_update. Enemy instances have a bit vector for each instance that is cleared when the path is complete. Nothing else has enabled bits at the moment, but it&#8217;s easy to anticipate them being needed once the rest of this system is in place and we need to start tracking destroyed things.</p><p>Also I don&#8217;t have dependencies in my makefile setup correctly. Schemas can be dependent on other schemas, so build order for those matters. Which bit me here again for a few minutes. That definitely needs to get fixed soon.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;781d7c48-9628-483a-80d5-932111c963f2&quot;,&quot;duration&quot;:null}"></div><h2>21.6 Fix makefile dependencies</h2><p>Add dependencies for schema files in makefile. Nothing automated for now.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;99940e27-0d85-4145-93d6-9b4fad393dbb&quot;,&quot;duration&quot;:null}"></div><h2>21.7 Gather damage and health data</h2><p>Open Unity project and find the health and damage data. Add to enemy_instances, hero_instances, enemy_bullets, and hero_bullets. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;0a547ca6-e43a-49c1-bb88-3aa9fabe6164&quot;,&quot;duration&quot;:null}"></div><h2>21.8 Create collsion_damage</h2><p>Create a type to gather damage ring buffer (position, time, amount) for a pair of grid types. Pairs to be tested:</p><ul><li><p>hero_bullets vs. enemy_instances</p></li><li><p>enemy_bullets vs. hero_instances</p></li><li><p>hero_instances vs. enemy_instances</p></li></ul><p>Also:</p><ul><li><p>Rename &#8220;ref&#8221; in schema to &#8220;context&#8221; (two names for the same concept.)</p></li><li><p>Rename &#8220;collision_source_types&#8221; to &#8220;collision_source_radius&#8221; for clarity.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5fa4d568-11d9-4c25-b5cf-c2bb3dca293a&quot;,&quot;duration&quot;:null}"></div><h2>21.9 Generate common code for cut and paste</h2><p>At some point I want to look at codegen for removing the boiler plate around getting the right variable addresses for data lookup in the context. Since there&#8217;s only one possible way to do it, I shouldn&#8217;t need to specify it every time. In the meantime though, I&#8217;m just going to add code I probably want to cut and paste as comments to the generated c header. </p><p>Also some other things to the TODO list I  want to get to:</p><ul><li><p>Time in uint64_t as nanoseonds</p></li><li><p>binary data column offset to be relative to the sheet instead of the file</p></li><li><p>schema yml&lt;-&gt;binary converter</p></li><li><p>tool to waypoint curve entry</p></li><li><p>data playground tool</p></li><li><p>s/TypeIndex/Index/g</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;4aca7b2c-7e9e-4cd9-8c8c-4eb9caee981e&quot;,&quot;duration&quot;:null}"></div><h2>21.10 Collect damage events</h2><p>Also output context struct for copy/paste.</p><p>Implement collision_damage_update to collect up damage events. Keep it pretty simple:</p><ul><li><p>Do A and B have anything on the same slice? </p></li><li><p>If so, for each of the instances on A and B on that slice,</p></li><li><p>Test if each radius overlaps.</p></li></ul><p>Oh, I missed this, so next I also need to add:</p><ul><li><p>Don&#8217;t re-add same collision multiple times if they happen on multiple slices.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;54842206-2d8b-48af-a0b9-9c46f9c30647&quot;,&quot;duration&quot;:null}"></div><h2>21.11 Don&#8217;t report same collision pair multiple times</h2><p>Observation: If the pair exists in the previous slice, we don&#8217;t need to add anything. Any collision would have been handled in the previous slice. If it doesn&#8217;t exist in the previous slice, the only other possible place is the next slice, which will be handled by this same rule. There are no non-contiguous same-pairs stored.</p><p>Create double buffered bit vector on the stack to track previous and next a and b instances processed. On both a and b bits set on previous, do not re-store event. </p><p>Cheap and easy.</p><p>Add an additional debug view of collision_damage.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;eceaef8e-99a5-4b46-b143-f88bb570b2de&quot;,&quot;duration&quot;:null}"></div><h2>21.12 Prepare to accumulate damage</h2><p>Re-arrange damage_events. Remove redundant time. Combine a and b data under the same sheet. </p><p>In order to accumulate anything, you need a reset flag. Add a reset flag to source_instances so that accumulated damage can be stored in collision_damage. Fix up enemy_instances and bullets to set the reset flag on spawn and clear on move. Also change behavior slightly so that instances don&#8217;t move on first frame spawned (they are at the spawn location.)</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;24984382-4d3b-42d4-a958-b257f14b0da0&quot;,&quot;duration&quot;:null}"></div><h2>21.13 Accumulate damage</h2><p>Clear accumulated damage based on reset flag. Add to accumulated damage at each event. Update the debug view to show the accumulated damage for each instance in each damage event.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;fe3db25d-ed51-4016-9b19-c4ab0955d50b&quot;,&quot;duration&quot;:null}"></div><h2>21.14 Destroy on damage</h2><p>Add an input line to bullets for damage values. Compare those to health values and destroy if exceeds. Something doesn&#8217;t look quite right though&#8230;</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;bc750276-6b4e-4102-b463-7d51a5c12472&quot;,&quot;duration&quot;:null}"></div><h2>21.15 Debug and discover the problem</h2><p>The problem is that I&#8217;ve been playing fast and loose with ring buffers and there isn&#8217;t really a rule around the data for them. So bullets, being first implemented, are a bit different from the others. The solution is to:</p><ul><li><p>All sheets should store capacity</p></li><li><p>Sheet counts can exceed capacity</p></li><li><p>Remove spawned_count from bullets.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;1c19a76a-0bee-4318-b191-6a74f0e0409c&quot;,&quot;duration&quot;:null}"></div><h2>21.16 Destroy hero bullets correctly</h2><p>Updated count and capacity rules to handle ringbuffers consistently and fixed everything up. Turns out though that wasn&#8217;t the actual problem. A small typo in the schema meant that the reset flags weren&#8217;t being received.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e174df72-ca46-4e0c-a225-e7249af4fff4&quot;,&quot;duration&quot;:null}"></div><h2>21.17 Destroy enemy instances</h2><p>Give accumulated damage to enemy_instances. Check damage versus health, and disable enemies. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;fdab59fe-9273-4ecf-9ae6-f4b87fe5f80d&quot;,&quot;duration&quot;:null}"></div><h2>21.18 hero instances vs enemy bullets</h2><p>Map the inverse case from above. Enemy bullets damage and destroy handled. Need to decide game loop when hero is destroyed before we hook that up though.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e6c2b4c5-e58a-46ca-9c81-ce0a0adc006e&quot;,&quot;duration&quot;:null}"></div><h2>21.19 You died</h2><p>Remove old level_index from game_state. Quick and dirty version of hero loop. Reset game on hero death.</p><p>Quick check on the state of memory and performance. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;eb43f305-dedd-4019-baf2-30afe5fb98e0&quot;,&quot;duration&quot;:null}"></div><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-c17">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 20]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-3e2</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-3e2</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Fri, 22 Dec 2023 01:38:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5Off!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F469e720c-e14d-4efa-ae20-7d74bdaa966a_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>20.0 Reformat with clang-format</h2><p>It&#8217;s time to automate formatting code. The only formatter I know of that will do the vertical alignment I prefer is clang-format, so I&#8217;m using that. </p><p>Start with an llvm format:</p><pre><code>clang-format -style=llvm -dump-config &gt; .clang-format</code></pre><p>Then modify .clang-format to more closely match the style I&#8217;m using. There&#8217;s a couple of features in newer versions of clang-format that would make the output a bit better, but this is close enough. </p><pre><code><code>&#9;ColumnLimit:     200
&#9;BreakBeforeBraces: Allman
&#9;AlignAfterOpenBracket: Align
&#9;AlignArrayOfStructures: Right
&#9;AlignConsecutiveMacros: AcrossEmptyLines
&#9;AlignConsecutiveAssignments: AcrossEmptyLines
&#9;AlignConsecutiveBitFields: AcrossEmptyLines
&#9;AlignConsecutiveDeclarations: AcrossEmptyLines
&#9;AlignEscapedNewlines: Right
&#9;AlignOperands:   Align
&#9;AlwaysBreakAfterReturnType: AllDefinitions
&#9;AllowShortFunctionsOnASingleLine: None
&#9;PointerAlignment: Left</code></code></pre><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;52f68a1c-0fa9-4c7d-90f5-b1245fa37db1&quot;,&quot;duration&quot;:null}"></div><h2>20.1 Split play area data</h2><p>I&#8217;ve been bundling play area data (like resolution) in just what happened to be the first schema I made. It doesn&#8217;t really make any sense to be there, nor is there any practical benefit. So I&#8217;m moving it to make it clearer.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;65b4459e-4bd9-4601-98d9-d31ade8416ee&quot;,&quot;duration&quot;:null}"></div><h2>20.2 System internal data remapping</h2><p>Let&#8217;s look at hooking up the hero. Start by creating the hero_instances sheet from a copy of enemy_instances. Delete what we don&#8217;t need for heroes. Which turns out to be just about everything. Hero instances are handled differently than enemy instances since they aren&#8217;t totally pre-determined at build time. But we do need to constrain the maximum number of hero instances (16). This gave a situation where the binary file is only partially sourced from the xlsx data. Some of the data (like hero positions) aren&#8217;t defined there and are just zero-initialized space. So quick fix-up of export_bin to support that. </p><p>Looking at the hero data, we have a level_wave remapping table which just points to exactly the same instances for every wave. While that would work, it&#8217;s clearly data that isn&#8217;t needed and is only there because the only example we had until now (enemy_instances) did that remapping. So instead of mapping to that format, let&#8217;s actually just do that remapping internally to enemy_instances and every other system can just get a table that&#8217;s already pointing to the correct instances wherever they might be. In the case of hero, it&#8217;s just always the same set; in the case of enemies the remapping needs to get fixed up whenever the wave changes. That gives a first use-case for using the remapping feature at runtime by fixing up the offsets. </p><p>Next up: Remove any of the previous code that did the level_wave to instance lookup and just point to the ready to go map instead.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ca40e5bb-e781-4eb3-82da-3e6dbb14034f&quot;,&quot;duration&quot;:null}"></div><h2>20.3 Finish re-mapping</h2><p>Complete the re-mapping and remove all the code that uses the level_wave to instance lookup.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e8fef453-de29-44d0-b680-f151d73a1d9c&quot;,&quot;duration&quot;:null}"></div><h2>20.4 Merge enemy_instances and enemy_instances_update</h2><p>Now that enemy_instances has a runtime mapping and is no longer read-only, there&#8217;s not much benefit from keeping enemy_instances and enemy_instances_update data separated. So merge those for simplicity.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;22a06769-f0e3-4db6-be79-c1f9cdc41f09&quot;,&quot;duration&quot;:null}"></div><h2>20.5 Add reset flags for stateful systems</h2><p>As a bit of cleanup, to resolve the issue of initializing any data on the first call, add a reset flag to the wave update system. In general, it&#8217;s useful for stateful systems to have reset flags (as well as enable flags, aka feature flags). Also add a reset to game_state, and allow that to cascade to the wave.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;23e04f48-8c86-4c17-b470-a19bcdb5bc40&quot;,&quot;duration&quot;:null}"></div><h2>20.6 Hero instances</h2><p>Hook up hero instances based on enemy instances. Create an update function which just initializes one hero. And a draw function. Bullets should be handled automatically if the source data is mapped correctly.</p><p>Fix an issue with the hero_instances schema. (Not actually assigning a capacity.)</p><p>Change a constraint. The hero bullet update rate is very high, which spawns a lot more than the expected constraint of 255 maximum per wave. Adjust the allowed count to 16 bits. But all the same, the rate is probably too high anyway, so reduce that to be balanced again later.</p><p>Use the mouse position to set the position of the first hero instance.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f0d9d0cd-055b-452d-806f-68e6eee1234a&quot;,&quot;duration&quot;:null}"></div><h2>20.7 Revisit bullet angle</h2><p>Up until now bullet angle was implicitly along the vector between the root of the source and the spawn position of the bullet. But in the case of the hero, we want bullets where the offset position and angle are distinct. So we&#8217;re going to adjust the bullet format to include a base position. Adjust hero bullet and enemy bullet xlsx files accordingly.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;0c14a0d4-29b0-426d-990a-2f581a4ae1be&quot;,&quot;duration&quot;:null}"></div><h2>20.8 Separate clocks</h2><p>Note that hero and enemy should be running on separate clocks. Enemy is on the wave clock and hero is on the level clock. Create the level clock and update bullets to use mapped play clock and not be tied to wave.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;90e8c479-c4bc-49f3-97b2-d4b0c721cad6&quot;,&quot;duration&quot;:null}"></div><h2>20.9 Default values in schema</h2><p>Previously added base_xy to enemy bullets, but I don&#8217;t need to make the input more complicated as they are all defined the same. In order to remove that, I need to be able to specify a default value in the schema. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ebaf43dc-6806-428d-9d2c-201f97a3b567&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-c17?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcome=true">Port a Unity Game to Your Own Engine: Part 21</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-3e2">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Tidbits part 1]]></title><description><![CDATA[Knowledge Shorts]]></description><link>https://www.altdevarts.com/p/tidbits-part-1</link><guid isPermaLink="false">https://www.altdevarts.com/p/tidbits-part-1</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Wed, 13 Dec 2023 01:03:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a98552b1-b5ea-48df-8341-53aa5dd9027c_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently I have been having some conversations where I&#8217;ve answered questions with quick advice. I thought they might work well as shorts. </p><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;764be4a4-f4fd-45d8-9d91-1fcdcd9065f4&quot;,&quot;duration&quot;:null}"></div><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;af3cac17-da76-429d-be22-d4034fac2f74&quot;,&quot;duration&quot;:null}"></div><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;c0495e4e-3819-4097-8acc-03df4d1b05f5&quot;,&quot;duration&quot;:null}"></div><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;241625a3-a01e-4001-b376-37547e880b46&quot;,&quot;duration&quot;:null}"></div><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;919f0d76-f0cb-462c-99f8-ce42033587f5&quot;,&quot;duration&quot;:null}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4&quot;,&quot;text&quot;:&quot;Get 10% off a group subscription&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4"><span>Get 10% off a group subscription</span></a></p>]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 19]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-481</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-481</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Tue, 12 Dec 2023 01:50:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa3530a6-1956-44ea-b1c3-7271be2f1446_1215x602.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Hero Bullets</h2><p>Extract hero bullet data from Unity project into xlsx. Hero bullet format matches enemy bullets, so rename the common format source_bullets. Patch up references to enemy_bullets.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;44f677fd-4fbf-4c1c-adc7-9262f6a9d6e2&quot;,&quot;duration&quot;:null}"></div><h2>010 Editor Template (bt)</h2><p>In addition to Kaitai (ksy) files, also generate templates for 010 Editor (bt). They&#8217;re basically equivalent here.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3d0aab57-4f1c-4977-9f10-3b804bc7a130&quot;,&quot;duration&quot;:null}"></div><h2>Prepare for schema map</h2><p>Quick rename of source_bullets to bullets. Change sheet counts to be offset into data segment instead of directly in header. Which will allow for a mapped schema type to point to specific columns and along with the counts.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7e9c51bd-931e-4599-a1f5-a875fa045e9d&quot;,&quot;duration&quot;:null}"></div><h2>Add map to bin and ksy</h2><p>Change export_bin to add any maps. Update ksy to inspect the data. Todo: update bt and c_header outputs.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;89a19ed6-5fe4-4e60-8bc0-6786fa6cf545&quot;,&quot;duration&quot;:null}"></div><h2>First test for maps</h2><p>Create the C header for maps and fix up issues with bin export. Maps are the first thing exported, so that all offsets are positive relative to a given map. First test case: Use bullet_source_instances instead of enemy_instances for bullets schema. This is the first step in removing  dependency on enemy data in bullets update, so hero and enemy will use the same bullet system. Todo: Update export_bt, remove enemy_instances_update dependency. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;adfd5a39-a7e4-426d-8b7c-114ae83803e3&quot;,&quot;duration&quot;:null}"></div><h2>Indirect values </h2><p>Make values in schema types indirect. Patch up existing code. Now maps can also remap values. Add bullet_source_instances_update map to enemy_instances_update. Bullets no longer have any direct references to enemies.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;216b0331-6d47-47c6-9bab-6221a82f9ecb&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-3e2?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcome=true">Port a Unity Game to Your Own Engine: Part 20</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-481">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 18.1]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-fb1</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-fb1</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Wed, 06 Dec 2023 07:05:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/12038bb8-40e1-416f-ad9e-5089a6837a33_1226x615.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Bug fix</h2><p>Quick patch to export_bin script so extra unnecessary data segments aren&#8217;t written to the file.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f37e44cd-4352-49dd-8040-4bd875a9d195&quot;,&quot;duration&quot;:null}"></div><h2>Build enemy_instances</h2><p>Create schema for enemy_instances so binary data, c header, etc. can be built from command line.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b1885613-c532-46fc-a1a6-b1b4ba0b5143&quot;,&quot;duration&quot;:null}"></div><h2>Build enemy_instances_update</h2><p>Create schema for enemy_instances_update and enemy_instances_draw. Fix up Makefile. Left at the end with a bug to fix in next part.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;2e5faa27-68ed-4586-a8bb-b8666f44cbc8&quot;,&quot;duration&quot;:null}"></div><h2>Byte pack structures</h2><p>Binary export doesn&#8217;t do standard C structure packing so for now, add an attribute to the C header output for byte packed structures. Todo: Sort out the packing question.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;da190252-3ee1-4684-aa2c-c43e99e8ae75&quot;,&quot;duration&quot;:null}"></div><h2>Add game_state</h2><p>Wrap up this clean up phase by bundling the common game variables into a game_state structure. Now everything that any system accesses needs to be fully declared in the schema file. Introduce a data rule here: A system can only write to its own data (Root, as defined in the context) - every other dependency must be read-only.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a1bd0d69-ad73-46c1-9bfb-bc29c41d1950&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-481?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web">Port a Unity Game to Your Own Engine: Part 19</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-fb1">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 18]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-d34</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-d34</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Sat, 02 Dec 2023 07:55:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d8244e37-5bef-4fa9-bed4-94c99e9ecc91_1220x696.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Unify data builders</h2><p>Finish up changes to enemy_bullets_update data access. Move spreadsheets from sheets to xlsx. Update scripts to build data with or without source data supplied by xlsx. Update enemy_bullets and diff binary results to verify exactly the same results.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;33acf64a-15ef-4a00-b9fc-f4e8328a0f64&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-fb1?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcome=true">Port a Unity Game to Your Own Engine: Part 18.1</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-d34">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 17]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a47</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a47</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Fri, 01 Dec 2023 02:49:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5436e435-8fe0-45b4-8939-5df565629fd9_1256x713.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Structured Runtime Data</h2><p>The data defined at compile time is very similar to the data defined at build time with the spreadsheet conversion scripts. It would be nice if the same tools to build and inspect the data could be used for both. So, let&#8217;s define the runtime data using a very similar description and mmap that in as well. Here we get through a first example with the backing data for enemy_bullets_update and enemy_bullets_draw.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;1f8e831e-1404-4e0f-894b-2a8110eef1fa&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-d34?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcome=true">Port a Unity Game to Your Own Engine: Part 18</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a47">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Actually Build a Game Economy Part 2]]></title><description><![CDATA[Game Design Methodology]]></description><link>https://www.altdevarts.com/p/actually-build-a-game-economy-2</link><guid isPermaLink="false">https://www.altdevarts.com/p/actually-build-a-game-economy-2</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Thu, 30 Nov 2023 22:35:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ao-D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you haven&#8217;t the preceding post yet, check it out first. <a href="https://www.altdevarts.com/p/actually-build-a-game-economy-1">Part 1</a></p><p></p><h3><strong>Show me the money</strong></h3><p>From where we left off the next thing we need to determine is how much gold to drop. We need to write down what we want our relationships to be for dropping gold. For this example our desired interactions are:</p><ul><li><p>A player needs cash to buy the remainder of the item sets at any given level from the money collected from fights as well the money created by the off-class items</p></li><li><p>Items should increase in value to keep a player needing to always earn more money and sell lots of gear to get higher level items</p></li><li><p>A merchant should sell items for more than they will purchase them</p></li><li><p>A player should feel like they are earning lots of money at high level</p></li></ul><p>We need wrap our head around the idea of the system. As we talked about before money is one of the transports to turn the remainder items into gold.</p><p>Let&#8217;s take a look at the high-level concept of this with our high-level economy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ao-D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ao-D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ao-D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg" width="1175" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1175,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131036,&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_!ao-D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ao-D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69bd162-32f5-4847-98aa-de13095cd2de_1175x787.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>Focusing on a sub-section of the economy we listed before you can see the loop from items through the shop. On that process the economic drain that exists is from the merchant multiplier. The merchant removes worth from items by paying less for them than they are worth. <strong>With these relationships in mind</strong> let&#8217;s start to attack the actual creation of the system by figuring out the total number of desired and non-desired item drops.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y5Rr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y5Rr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 424w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 848w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 1272w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y5Rr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png" width="657" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:657,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45149,&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_!y5Rr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 424w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 848w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.png 1272w, https://substackcdn.com/image/fetch/$s_!y5Rr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047dfd51-bf8e-425f-95b4-9ad7789e826a_657x794.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>We need to turn the non-desired items into gold and provide gold directly to the player by dropping it at the end of combat. To do this we need to now know the average value of a level 1 item. Once again this is a number we simply make up. We don&#8217;t want to make a value that is so low a merchant multiplier would fall apart. We&#8217;ll make it easy and be cheap to the player at the same time. We&#8217;ll pick 10 gold. Ok, great. We now have a cost of the average level 1 item.</p><p>I personally like to really rip off the player on resale. I&#8217;ve never seen or heard complaints from internal or external sources about being harsh on resale. The players somehow always blame the merchant, like he really exists, and then just accepts it almost immediately.</p><p>Let&#8217;s say that a merchant will pay 20% of the cost of an item to a player. With the stated data points we know a player will be able to buy an item for 10gp and then sell it back to the merchant for 2gp. <strong>This also means the player will be able to convert 5 items into 1 item.</strong> I am being harsh on resale but don&#8217;t miss the point I just said. Up above we see that 40 items plus extra gold needs to be converted into 10 items. This means a 25% merchant multiplier (10/40) would be a break even point without a gold drop. Anything higher or the existence of the gold drop would begin to give the player more dough than we want them to have. Our example game is rather simple. Most game economies have more exits for money out of the economy such as potions, bank deposit fees, item decay, heal costs, etc. Those extra money drains help allow the merchant multiplier to be higher.</p><p>Quickly hopping back to the cost of items in the game we stated a level 1 item should be worth 10gp but <strong>what do we want a level 2 item to be worth?</strong> Take a second and think about it. Keep reading after you&#8217;ve think you know.</p><p>The trick is to not actually pick a value. You need to determine the relationship between the two. How many level 1 items does it take to equal the value of a level 2 item? What about a level 3 item? This relationship determines how much a player can skip buying items for one level to apply it to the next.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SlRg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SlRg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SlRg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg" width="1175" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1175,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133265,&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_!SlRg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SlRg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62d03822-dedb-428b-ac08-ff5dbb0dec08_1175x787.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>In a sensible balanced economy, the cost of the item should be in-line with the effectiveness of the weapon and / or desirability of the weapon. However, they don&#8217;t need to be on the same curve but both curves need to mate well. <strong>The steepness of the lines or curves will determine how often players will want new items</strong> as well as how cost effective it is to trade up.</p><p>My gut feeling for this is something to the tune of items approximately doubling in value over a 2 level range. A sample data set for that would look 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_!Nvbv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nvbv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 424w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 848w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 1272w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nvbv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png" width="370" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18050,&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_!Nvbv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 424w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 848w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.png 1272w, https://substackcdn.com/image/fetch/$s_!Nvbv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd017cca-9851-4172-bbd5-75a955aa17c1_370x420.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 chart shows the cost of an item if it was 2x the previous level.</p><p>Looking over the data I&#8217;m not really excited about it. Level 19 items costing 5120 seems way to much over 20 levels with level 1 items only costing 10. Levels 1 through five look alright but I think we could scale back from doubling. As of right now, the first few levels will give the player an overt sense of being poor. I&#8217;ll reduce the strength overall and recalculate. Doing so gives us this curve which I&#8217;m fairly happy with:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x5Nv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x5Nv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 424w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 848w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 1272w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x5Nv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png" width="366" height="788" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33316,&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_!x5Nv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 424w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 848w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.png 1272w, https://substackcdn.com/image/fetch/$s_!x5Nv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64fbc966-bc48-4339-9406-fefb0aa019e6_366x788.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>Wondering how I got that curve?</p><p>A quick tangent is in order here. You may have noticed that the enemies to level and the number of sets to level as well as many other sets of data used are on curves. No surprise really. That said, all of the curves are clean and don&#8217;t have unwanted flat spots within their usable range. You&#8217;ll want to make several curves for your game. Before anyone starts trying to remember all of their math lessons you should know something. The trick is that anytime you need a line or a curve you don&#8217;t actually need to calculate it. Even if you are capable of calculating the curve doing so can be slower than cheating. How do you cheat? Simple, currently out on the internet are several curve fitting programs you can use for free. Write down the data you want and the program will return the curve for that data. You can select from many different kinds of curves to see what fits the data best. A site you can try for this purpose is:</p><p><a href="https://mycurvefit.com/">MyCurveFit.com</a></p><p>Once you have the curve equation, you can calculate out all of the fields.</p><p>Here&#8217;s how I used the trick for the chart you just saw.</p><p>First, I laid out the basic data I was looking for:</p><div class="preformatted-block" data-component-name="PreformattedTextBlockToDOM"><label class="hide-text" contenteditable="false">Text within this block will maintain its original spacing when published</label><pre class="text">Level 1, 10gp
Level 3, 15gp
Level 5, 30gp
Level 7, 80gp</pre></div><p>Next I ran that data through a least fitting squares program to get a quadratic curve. That program returned.</p><p>y = 3.4374999999998934 + 9.479166666666783x -3.4375000000000324x^2 + 0.5208333333333359x^3</p><p>Once I had the data I rounded it and got the chart you saw above. Most of the time the values you get will be slightly off from the values you asked for which happens because curve fitting is approximated not exact.</p><p>With that said, who cares if it is slightly off? We aren&#8217;t building a space shuttle we&#8217;re building a game. The fact is that if your intent was for an item to cost 60 at level 7 but instead it costs 61 is actually an improvement. You can chart out the entire economy past the number of levels you asked for and you can visually see any plateaus or anomalies you data might have.</p><p>One quick side note, when I&#8217;m building a game I usually build all of the equations to handle at least twice the number of levels, damage, experience, or whatever than I am initially planning to use. It doesn&#8217;t take anymore time and allows for extra content to be added at will.</p><h3><strong>Back to the regularly scheduled program</strong></h3><p>With all of the preceding data we can now make this next 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_!ozwm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ozwm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 424w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 848w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 1272w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ozwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png" width="837" height="799" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:837,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79616,&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_!ozwm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 424w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 848w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.png 1272w, https://substackcdn.com/image/fetch/$s_!ozwm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7408a5-1f0c-48e3-9c82-25327e1c9a56_837x799.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;ll explain. We just determined the average cost of an item at a given level. Earlier we specified how many items in a given level we felt a player will want to sell. Multiplying them against the merchant multiplier gives us how much cash a player will get from selling the items. Now we take the total amount of cash the player can get from selling items and divide it by the cost of an item for a given level. This gives us the number of items a player can purchase from selling at that level.</p><p>player cash = sell items * avg cost * merchant multiplier</p><p>buyable = player cash / avg cost</p><p>Earlier we specified how many items we wanted players to buy at a given level. With that information we can now make this 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_!BgnI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BgnI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 424w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 848w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 1272w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BgnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png" width="1174" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1174,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97350,&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_!BgnI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 424w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 848w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.png 1272w, https://substackcdn.com/image/fetch/$s_!BgnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20f77a0a-e6a2-43ad-ab5a-7dc0c89b117d_1174x790.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>We take the number of items we want the player to buy and subtract it from the number of items they can buy from the cash they have. The number we end up with is the total gold they will need to buy what they are supposed to at that level. We then divide the needed gold by the number of times a monster will drop gold in a level to get how much, on average, a monster should drop gold.</p><p>Buyable items = player cash / item cost</p><p>items to buy = number of items to be bought &#8211; buyable items</p><p>needed $= items to buy * avg item cost</p><p>$ per drop = needed gold / times gold drops on level</p><p>Great, armed with that information we can now build the item and gold economy systems.</p><p>In our game we will store a base economic table that is a level and the value for that level. With our game it would look 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_!5011!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5011!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 424w, https://substackcdn.com/image/fetch/$s_!5011!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 848w, https://substackcdn.com/image/fetch/$s_!5011!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 1272w, https://substackcdn.com/image/fetch/$s_!5011!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5011!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png" width="279" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:279,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33604,&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_!5011!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 424w, https://substackcdn.com/image/fetch/$s_!5011!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 848w, https://substackcdn.com/image/fetch/$s_!5011!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.png 1272w, https://substackcdn.com/image/fetch/$s_!5011!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd7f1c0-9370-4681-bfc2-5841d5b00c74_279x896.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 every item we need to store the level of the item and an avg value %. Depending on the complexity of the items you are creating you could have prefixes and suffixes on the items modify the base items %. What this gets you is the ability to state an item is worth 50%, 110%, 80%, etc. of the avg value for the level. This way you have a base frame of reference what the value means. In other words, instead of saying, &#8220;I have a level 14 item that is a bit overpowered, Should I make it worth 902?&#8221; you will say, &#8220;This overpowered item should cost 120% of what other items cost at this level.&#8221; You can then easily change the percent as much as you want but <strong>you have a reference. </strong>Even better than that, with this setup you can rewrite your entire economic curve and every item will simply update to the new values. No need to revisit old items. You have access to virtual big and small adjustment dials.</p><p>By creating the economy out of how we want everything to relate to each other. <strong>We can update any relationship and easily recalculate</strong> the entire economy. This allows for the economy to be rapidly tuned in any fashion. Once your playing maybe you&#8217;ll discover you want creatures to drop more items, you don&#8217;t like how the first few and last levels has similar gold drops, or you think the player&#8217;s bank account should show less money in it but still be able to buy the same number of items. All of these tweaks and any other tweaks are easy. Change the variables you want to and new balanced data falls out.</p><h3><strong>My Economy Isn&#8217;t Like That</strong></h3><p>Very few games have identical economies. This example illustrates <strong>how to articulate the relationships you need</strong> and turn them into game systems. The process for creating an economy big or small is the same. How would you use these processes to create an economy for a FPS, RTS, Platformer or other? Think about how elements I glossed over such as hording items affects the economy. Some people may ask you to add an auction house or have player traded items. Now you know the real question there is what are you trying to accomplish with those systems? How could you make them to cause the outputs you want from the system?</p><p>Think it through, <strong>create your relationships and everything else will just fall into place.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4&quot;,&quot;text&quot;:&quot;Get 10% off a group subscription&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4"><span>Get 10% off a group subscription</span></a></p>]]></content:encoded></item><item><title><![CDATA[Actually Build a Game Economy Part 1]]></title><description><![CDATA[Game Design Methodology]]></description><link>https://www.altdevarts.com/p/actually-build-a-game-economy-1</link><guid isPermaLink="false">https://www.altdevarts.com/p/actually-build-a-game-economy-1</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Thu, 30 Nov 2023 22:34:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WRNT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is part 5 of the Game Design Methodology series. You can find the series overview at <a href="https://www.altdevarts.com/p/game-design-methodology">Game Design Methodology</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_!WRNT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WRNT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WRNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg" width="1175" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1175,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140015,&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_!WRNT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WRNT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b6ad985-ef7e-4eb1-b0f1-a86cb5f442f2_1175x787.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></p><h3>Practical Design: Game Economics</h3><p>Let&#8217;s focus on the actual process of making a game economy without talking too much theory.&nbsp; This article assumes you&#8217;ve already made a balanced combat and exp system for the game.&nbsp;</p><p>We know we are building an economy but we don&#8217;t know the purpose or function of it.&nbsp; We need to know our desired inputs and results before we build it.&nbsp; To do this we start by stating objectives and declaring system assumptions where needed.</p><p>First we&#8217;ll state the kind of game we are making an economy for.&nbsp; Since RPGs have robust standard economies with money and bits you buy, want, need, and can&#8217;t live without, we will use that style game for our discussion.&nbsp; Our game has levels you gain, creatures you kill and loot, a merchant you can sell to / buy from, but no player trading.&nbsp; We want to keep this example cleaner.&nbsp; The unique aspects of large scale MMO style economies can&#8217;t really be discussed until we show how to build a functional smaller one first.</p><p>The first objective we need to figure out is a big one.&nbsp; What input does the player give that allows them to use the economy.&nbsp; It is critically important to know the relationship of the player to the system.&nbsp; The most commonly used inputs in various combination are:</p><ul><li><p>Winning fights / challenges &#8211; a player receives the ability to transact in the economy through winning fights.&nbsp; This is usually set up with a sub-system that awards more or less in a fight with the amount of risk the character was exposed to.</p></li><li><p>Time &#8211; Either in the game or not.&nbsp; The player earns the ability to interact in the economy the longer they are associated with or in the game.</p></li><li><p>Skills / Achievements &#8211; Impressive feats are rewarded with interaction with the economy.</p></li><li><p>Money &#8211; Cash in the real world is translated to buying potential in the virtual world.</p></li></ul><p>We will base our example economy off of winning fights.&nbsp; With the input determined we need to begin to determine the system&#8217;s interaction with the player and its output.&nbsp; We will start this process by stating our desires for the player interaction with the economy.&nbsp; For our example game we will base our example economy off of the following:</p><ul><li><p>We want players to get items fairly often</p></li><li><p>We want players to buy better items</p></li><li><p>We want higher level items to cost more</p></li><li><p>We want the player to be scrounging for items until the end of the game when we will let them have an easier time getting what they want</p></li><li><p>If we had health potions we could would state their desired supply rate here as well</p></li></ul><p>Armed with these desires we have reasonable idea of what kind of relationship we are creating between the player and the system.</p><h3><strong>The Trick</strong></h3><p>The trick to putting together a balanced economy is to realize this economy isn&#8217;t real.&nbsp; Fortunately games are VR and not R.&nbsp; The way an economy acts and reacts is the same in real life but you, the designer, allow every action the player can do.&nbsp; You allow every action the economy can have.&nbsp; You don&#8217;t have to worry about competitors unless you allow them.&nbsp; You don&#8217;t have to worry about supply and demand you control it.&nbsp; You have the ability to control all of the possible actions of the player.&nbsp; What you enable a player to be able to do is what they will do.&nbsp; As Maslow, Kaplan, or Twain said, &#8220;If all you have is a hammer, everything looks like a nail.&#8221;&nbsp; You&#8217;re making the game; you should know what a player is going to want from the economy.&nbsp; For instance, you know most players will gravitate towards the most rewarding items in a visual or battle effective way.</p><p>With the trick in mind we can ask, where did I get the desire we listed above? <strong>I got them out of thin air</strong>.&nbsp; It doesn&#8217;t matter what we state.&nbsp; There are no wrong desires.&nbsp; You can have the players get as much or as little from the economy as you&#8217;d like.&nbsp; As long as you state realistic desires you should be able to create a system that meets them.</p><p>You might have noticed we haven&#8217;t talked about in-game money yet.&nbsp; The reason for this is that in our example economy, in-game money isn&#8217;t an output.&nbsp; In-game money is one path for converting battles into things we want.&nbsp; It isn&#8217;t the thing we actually want.</p><h3><strong>Game Economies are not big scary black boxes</strong></h3><p>Creating an economy for a game can have many steps but is actually fairly straight forward and simple.&nbsp; Too many people have been talking about them as a mythical system you need to hire 80 year old economists to create to ensure a proper play experience.&nbsp; Like most things with games, there are tricks and realizations that allow you to create the relationships of a system if you <strong>frame the problem the right way</strong>.</p><p>What are the Game items?</p><p>We need to take a quick moment and define the possible item types we will have.&nbsp; We can&#8217;t really setup an economy unless we specifically know what things we are pushing through it.&nbsp; Let&#8217;s say the game will have:</p><ul><li><p>poor, average, great, and legendary quality items</p></li><li><p>Melee weapon, Ranged weapon, Torso, and Legs equipment slot.</p></li><li><p>4 character classes</p></li><li><p>Class specific and all class usable items</p></li></ul><p>This gives us a small pool of possible items but we now know 1 set of items is 2 weapons and 2 armor.</p><p>Let&#8217;s take a break real quick and make sure we understand the high-level concept of the process we are working through.</p><p>The economy we are piecing together will work 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_!opPW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!opPW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!opPW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!opPW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!opPW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!opPW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg" width="1175" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1175,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131539,&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_!opPW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!opPW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!opPW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!opPW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90751829-1be9-4249-8494-ecd67a8ebe48_1175x787.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>Our little example economy is all about items.&nbsp; The shop and battles creates items.&nbsp; Items can be sold to the shop, equipped or horded in basic inventory.</p><p>We will start by focusing on the section of the economy that dumps in items from battles.&nbsp; The easy start to this is a simple question, &#8220;How often do we want players to get items from battles?&#8221;&nbsp; This is a question of what kind of experience do we want a player to have.&nbsp; Should a dropped item be a rare coveted occurrence or should all creatures be perceived as overstuffed pi&#241;atas?&nbsp; This is a personal choice for the game.&nbsp; All types of drops can be made to work with almost any game.&nbsp; For our game we&#8217;ll say that when a battle is won there is a 25% chance of a gold drop or item drop. These percentages will give a great pick-up feel but because of the quantity of drops most individual drops will be less in value.&nbsp; There is a significant amount of game theory that can be applied to choosing drop rates but I&#8217;m going to stick to practical design for now and can talk theoretical design at some other point.</p><p>Now we need to switch to the other side of the economy.&nbsp; How often do we want player&#8217;s to get the best set of equipment? &nbsp; Keep in mind once a player has the best set they are much less likely to care about the other items available at that level.&nbsp; For our example game we&#8217;ll say the player should be able to get a decent set of new armor once per level. &nbsp; There is a catch though.&nbsp; If we look at a part of our exp curve (not discussed here) to see how many fights we go through to gain a level we can see that level 3 has 1/20<sup>th</sup> the creatures killed as level 20.&nbsp; Look at this sample &#8220;Number of Monsters to kill to Level&#8221; chart to see:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!beUT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!beUT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 424w, https://substackcdn.com/image/fetch/$s_!beUT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 848w, https://substackcdn.com/image/fetch/$s_!beUT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 1272w, https://substackcdn.com/image/fetch/$s_!beUT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!beUT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png" width="359" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:359,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27914,&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_!beUT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 424w, https://substackcdn.com/image/fetch/$s_!beUT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 848w, https://substackcdn.com/image/fetch/$s_!beUT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.png 1272w, https://substackcdn.com/image/fetch/$s_!beUT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67b61db2-fc3b-4111-a5a3-1dfd1c02a391_359x784.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>Handing out items in a static fashion is a bad idea.&nbsp; We will want to scale it to be taking more into consideration number of fights won instead of level.&nbsp; Massaging our data we get a chart that looks more 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_!66ST!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!66ST!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 424w, https://substackcdn.com/image/fetch/$s_!66ST!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 848w, https://substackcdn.com/image/fetch/$s_!66ST!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 1272w, https://substackcdn.com/image/fetch/$s_!66ST!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!66ST!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png" width="732" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:732,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60688,&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_!66ST!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 424w, https://substackcdn.com/image/fetch/$s_!66ST!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 848w, https://substackcdn.com/image/fetch/$s_!66ST!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.png 1272w, https://substackcdn.com/image/fetch/$s_!66ST!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F459b3812-fb62-48f1-b248-5ff184b314c1_732x790.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>As you can see starting at level 5 we&#8217;ll take the entire level to pass out 1 set of armor where as at level 20 we&#8217;ll pass out a good set of armor only after 21% of the level.&nbsp; I constructed this chart by <strong>thinking about what type of balanced relationship I wanted</strong> between the number of fights a player needs to win versus the frequency they can get new gear to equip.</p><p>One more data point we need to determine is the ratio of dropped vs. bought items.&nbsp; For ease we&#8217;ll say 50/50.</p><p>As you may have noticed we haven&#8217;t used any hard values yet.&nbsp; What we&#8217;ve done is defined our initial thoughts for the relationships between items, battles, the shop, etc.&nbsp; It is critically important to know how everything interrelates before we attempt to apply hard values.</p><p>From the numbers we&#8217;ve stated above we can make this chart to start to get closer to hard numbers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bh8m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bh8m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 424w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 848w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 1272w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bh8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png" width="677" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:677,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50144,&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_!bh8m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 424w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 848w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.png 1272w, https://substackcdn.com/image/fetch/$s_!bh8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5986002-593e-486b-b1f2-6e11b8d6b24d_677x782.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 chart was made by taking the number of enemies you need to kill to level and multiplying it by our stated desired item and gold drop rates.</p><p>Now we have two charts.&nbsp; One is how many drops that are useful to the player are and the other is the number of drops of items and gold we get per level.&nbsp; Let&#8217;s convert them into one chart. &nbsp; To do that we need to convert item sets into just items.&nbsp; We have 4 items in each set but we stated that only half of the items the player will use come from drops, the rest is going to come from the shop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F_Lx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F_Lx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 424w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 848w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 1272w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F_Lx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png" width="925" height="791" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:791,&quot;width&quot;:925,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63647,&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_!F_Lx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 424w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 848w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.png 1272w, https://substackcdn.com/image/fetch/$s_!F_Lx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F996eb3ab-83e9-4bea-abeb-0b751c2de41d_925x791.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 number of item drops was taken from the chart above and the desired dropped items was created by the following process:</p><ul><li><p>1 item set is 4 items</p></li><li><p>Half of an item set, 2 items, needs to come from drops</p></li><li><p>We know the total number of drops in a level</p></li><li><p>We know how many sets of items we want to hand out in a level</p></li><li><p>For each level multiply the number of sets to hand out by the half set drop (aka 2) to get how many desired items should be dropped</p></li><li><p>Divide the desired number of dropped items by the total number of items dropped to get the % to use to determine if a killed enemy drops a useful item for any stated level.</p></li></ul><p>Another way to explain how we have gotten to where we are so far is like this:</p><ul><li><p>enemies per item set = enemies per level / number of item sets for level</p></li><li><p>items dropped per level = enemies per level * item drop percent</p></li><li><p>desired item drops for level = desired number of item sets for level * size of item set / % of set from drops</p></li><li><p>% applicable drops = desired item drops for level / items dropped per level</p></li><li><p>We now have the percent that will be used to roll against when an item is dropped.</p></li></ul><p>Here&#8217;s one of the most important bits to understand about the process.&nbsp; If you don&#8217;t like how only 19% of items a player gets at level 20 is usable you can increase or decrease it.&nbsp; Once again, it doesn&#8217;t matter you can change the percentage.&nbsp; By upping it you&#8217;ll see the exact number of usable items a player will receive while they are in the level. <strong>There is no confusion, it isn&#8217;t guess work, you&#8217;ll see the full cause and effect</strong>.&nbsp; If you are playing the game and feel the number is off, you know exactly what to change where to get the exact result you want.&nbsp; No guess work.</p><h3><strong>Quick Item Drop Design Example</strong></h3><p>A quick scratch pad design doc system write up for the item system could look like this:</p><p>When the character kills a generic monster the game will roll a 25% chance of dropping an item.</p><p>If the game decided to drop an item it will then roll a % chance of dropping an item of the player&#8217;s class depending on the level.&nbsp; For each creature killed roll against the following to determine if there is a drop:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QjCK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QjCK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 424w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 848w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 1272w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QjCK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png" width="362" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:362,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40188,&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_!QjCK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 424w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 848w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.png 1272w, https://substackcdn.com/image/fetch/$s_!QjCK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665eea28-ba24-40bb-9a34-30b6861e7940_362x790.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 the roll failed to drop on the player&#8217;s class randomly roll to choose one of the three other classes all with equal chance.</p><p>Next determine which slot the item dropped will be from the table to determine slot drop is as follows:</p><div class="preformatted-block" data-component-name="PreformattedTextBlockToDOM"><label class="hide-text" contenteditable="false">Text within this block will maintain its original spacing when published</label><pre class="text">MELEE WEAPON               25 %
RANGED WEAPON            25 %
TORSO                                   25 %
LEGS                                       25 %</pre></div><p>The game will then search the item table for an item that is for the chosen class and slot at the level of the killed monster.&nbsp; If an item is found, the game will drop the item at the location of the enemy&#8217;s corpse.&nbsp; If no item is found the game will re-roll the class and slot selections to try again.&nbsp; If no item is found after 5 attempts the game will switch to a gold drop instead.</p><p>-End simple sample design-</p><p></p><p>Obviously this system is fairly straight forward and dry but you can clearly see how <strong>this system creates outputs that match the relationships</strong> we wanted.</p><p>Continued in <a href="https://www.altdevarts.com/p/actually-build-a-game-economy-2">part 2</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4&quot;,&quot;text&quot;:&quot;Get 10% off a group subscription&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4"><span>Get 10% off a group subscription</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Prioritizing Work]]></title><description><![CDATA[Craft Methodology]]></description><link>https://www.altdevarts.com/p/prioritizing-work</link><guid isPermaLink="false">https://www.altdevarts.com/p/prioritizing-work</guid><dc:creator><![CDATA[Matt Yaney]]></dc:creator><pubDate>Sat, 18 Nov 2023 20:28:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/af70ea18-4177-4116-9cee-c396d0249ce4_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;875ef6f9-30bf-4abd-819a-a621b5f88e6d&quot;,&quot;duration&quot;:null}"></div><p>Link to file below for paid subscribers.</p><p></p><p>For quick navigation in the video, here are some times:</p><pre><code><code>0:00  Intro

3:11  The Questions

18:26 Team Questions 

19:05 Settings

22:14 Results

25:41 Results Expanded 

36:27 Outro
</code></code></pre><h3>Are you building the right thing?</h3><p>I&#8217;ve seen many times where teams are spending time on good features when they could have been working on great features. A few select reasons from many reasons you may see this are:</p><ul><li><p>The developer has limited exposure to customer benefits</p></li><li><p>Team could use greater understanding of the target experience</p></li><li><p>Poor communication between or from stakeholders</p></li><li><p>Less focus on building for customers</p></li><li><p>It is a passion project for the team</p></li></ul><p>To be used as a meeting exercise, I created a calculator to show how valuable a feature, maintenance, infrastructure or pipeline work is for a project. The calculator does a good job showing if the work:</p><ul><li><p>Is required</p></li><li><p>Is risky</p></li><li><p>Is too large</p></li><li><p>Is better to buy or license instead of building ourselves</p></li><li><p>Is potentially a distinctive competency</p></li><li><p>Has good ROI</p></li><li><p>Has a workaround that is better than the feature</p></li><li><p>Is something we are confident is</p></li><li><p>What priority number it should be</p></li></ul><p>The intent is not to have this calculator actually pick what we should do. The intent is to ensure we have thought through what we intend to do, have the ability to answer all of the questions about it, and have had a chance to talk about it.</p><p>In the next video of this series I&#8217;ll start stepping through exactly how the calculator determines everything.</p><p>Lastly, A note for the eagle eyed of the bunch, I&#8217;ve squished the small bug that you might see.</p><p>Thanks</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4&quot;,&quot;text&quot;:&quot;Get 10% off a group subscription&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.altdevarts.com/subscribe?group=true&amp;coupon=c2e316c4"><span>Get 10% off a group subscription</span></a></p><p></p>
      <p>
          <a href="https://www.altdevarts.com/p/prioritizing-work">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 16]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-243</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-243</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Sat, 18 Nov 2023 05:28:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d4bd1f07-0a03-4298-8cac-8394978d980d_2270x1220.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Bullet Runtime</h2><p>Bullets need non-zero local positions to determine shot direction. Create a ringbuffer for live bullet instances.  Implement enemy bullet move and spawn update functions. Like the enemy instance update, given a well-defined data layout and constraints, the update code is a straightforward process. There&#8217;s not a lot of variation in what it could be doing. Add time out to enemy update.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a9bda706-12d7-45bb-a9e0-9435dfde95d1&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-a47?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcome=true">Port a Unity Game to Your Own Engine: Part 17</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-243">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 15]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-850</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-850</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Thu, 16 Nov 2023 21:18:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/359af578-298a-45b3-87d1-232488eec415_1242x688.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Export Bullet Binary</h2><p>Add export description for the bullet spreadsheet. Use the identical export code from the enemy instances spreadsheet. Minor patches in the runtime code to correspond to changes in the enemy instance data. Add script to export KSY file (along with the C header and runtime binary files) from spreadsheet. Memory map in bullet data.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3486acac-b330-43ee-b318-0d8ea0485ba1&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-243?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web">Port a Unity Game to Your Own Engine: Part 16</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-850">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 14]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-643</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-643</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Wed, 15 Nov 2023 05:54:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b70cdb39-545c-4b87-98b0-a35c21ca46cd_1222x713.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Reverse the lookup</h2><p>Changing the approach. Simpler to lookup bullet type from enemy instance. Revert the enemy used per wave bitset we added last time. Prepare the bullet spreadsheet for export. Change from using delta start time in the enemy instances data to absolute start time, to make it easier to get time since spawned, since bullets are spawned relative to that clock.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;be38cde9-eb41-4a06-857e-9c36c6265ac4&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-850?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web">Port a Unity Game to Your Own Engine: Part 15</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-643">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 13]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a4d</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a4d</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Tue, 14 Nov 2023 05:34:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c369125f-490a-483b-88d2-18b7c160f79d_1275x724.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Preparing Bullet Data</h2><p>Spawn position can be pre-transformed as relative position to enemy.</p><p>In order to use the bullet data, we will need to find the enemy instances that match the enemy type in order to spawn at correct relative location.</p><ul><li><p>Take the opportunity to remove enemy type vs enemy variation type distinction. That extra bit of abstraction doesn&#8217;t buy us anything. Limit total enemy types to 64. It was bugging me anyway and I shouldn&#8217;t have added it in the first place.</p></li><li><p>Create a bit vector per wave which tells us if an enemy type is used in that wave or not. To use as broadphase check. Update exporter to save 64 bit value.</p></li><li><p>Next we&#8217;ll need to be able to lookup instance index by enemy type per wave.</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;1dffb596-ae0e-456f-935d-160302cc4026&quot;,&quot;duration&quot;:null}"></div><h2>Quick fix</h2><p>I fixed the indexing for string input in the hex to 64bit output.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ac17dd49-e507-4d8e-835f-3b2e54653a5a&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-643?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web">Port a Unity Game to Your Own Engine: Part 14</a></p><p>Links to files below for paid subscribers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-a4d">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Port a Unity Game to Your Own Engine: Part 12]]></title><description><![CDATA[A concrete look into a data-oriented approach to engine development.]]></description><link>https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-926</link><guid isPermaLink="false">https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-926</guid><dc:creator><![CDATA[Mike Acton]]></dc:creator><pubDate>Sat, 11 Nov 2023 05:14:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6b0b0468-6497-423b-8066-d0b09e308c2a_1253x678.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Bullet Data</h2><p>Sometimes it&#8217;s not worth it to write up a script to export data when it&#8217;s spread throughout a bunch of different systems and files and there&#8217;s not much of it anyway. So here I&#8217;m just manually extracting bullet data, which gives me a chance to look at each case one-by-one and make sure I have a pretty good understanding of what we want to be able to accomplish. </p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;77effd35-dea6-40c1-90fb-d1ca5e4f7c43&quot;,&quot;duration&quot;:null}"></div><p>Next: <a href="https://open.substack.com/pub/altdevarts/p/port-a-unity-game-to-your-own-engine-a4d?r=yknp0&amp;utm_campaign=post&amp;utm_medium=web">Port a Unity Game to Your Own Engine: Part 13</a>                                      </p><p>Links to download files for paid subscribers below.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.altdevarts.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">AltDevArts 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>
          <a href="https://www.altdevarts.com/p/port-a-unity-game-to-your-own-engine-926">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>