https://arborinteractive.com/Arbor Interactive - Your modern media team2022-10-12T00:17:53-04:00Hire out your next video game, website, or interactive digital experience. We deliver on fast schedules and efficient budgets.Austin YargerJekyllhttps://arborinteractive.com/2022/10/11/affordances-in-greek-tragedy/index.htmlAffordance Interactions in Greek Tragedy (Survival Horror)2022-10-11T00:00:00-04:00Austin Yargerhttps://ayarger.com<p>TLDR : Interactions may be represented simply and elegantly by generic, re-usable components on gameobjects. This may sound simple, but if you ever find yourself writing components like “Door” for a door gameobject, or “Banana” for a banana gameobject, this may be worth reading.</p>
<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#affordance-examples" id="markdown-toc-affordance-examples">Affordance Examples</a></li>
<li><a href="#the-larger-picture" id="markdown-toc-the-larger-picture">The Larger Picture</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<p>Greek Tragedy is a survival horror game, which means players will want to investigate, study the environment, collect things, push things, etc– we need a way for designers to quickly add expressive interactions to gameobjects without needing to write any custom code.</p>
<p>Enter “Affordances”. Gameobjects “afford” some interaction.</p>
<h2 id="affordance-examples">Affordance Examples</h2>
<p>Want the player to pick up this healthy apple gameobject?</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/05/02/596/f710e056-326c-4e20-965f-6a2af2ccde79/firefox_lTTXO7sEwN.png" alt="An apple" /></p>
<p>Slap the “AffCollect” component on there–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/04/47/211/b3d9bec4-25cc-4ac5-95f6-ee1d12c4c470/firefox_bnqzGXkOZH.png" alt="The AffCollect affordance component" />
<em>Any gameobject with an AffCollect component may be stored in the inventory for later usage.</em></p>
<p>Want the player to be able to read this note (literally a yellow quad)?
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/05/10/322/b50f8178-a873-43b7-a98e-d3387be0b387/firefox_ZwLA8wak0u.png" alt="A note" /></p>
<p>Give the note gameobject the AffDocument component–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/04/32/082/bbb4b112-1abd-4699-8d38-56d709903ecd/firefox_C7Gy8K7EeR.png" alt="The AffDocument affordance component" />
<em>AffDocument triggers a document view (ex, showing a note) when the player interacts. The document may get be stored for later review.</em></p>
<p>Want to let the player to move to a new location after interacting with this door?
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/06/22/026/aaab424a-854d-43ab-80e8-2830d40ac91d/firefox_GwXpd0GBUC.png" alt="A door" /></p>
<p>Use the AffTravel component–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/04/09/588/889c282f-5ee3-4aa9-8d46-2f6f9ef26257/firefox_59iylnBfGc.png" alt="The AffTravel affordance component" />
<em>The AffTravel component handles allows us to warp the player gameobject, fade to black, reset enemies, etc</em></p>
<h2 id="the-larger-picture">The Larger Picture</h2>
<p>Affordance (“Aff”) components derive from a base “Affordance” class, and are usually fairly simple, overriding an “execute” function to perform its work. Any gameobject with an affordance on it may quickly be found by our interaction / selection system (the system that figures out what the player wants to interact with based on the player avatar’s looking direction, what the player can see, etc).</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/29/11/344/8e5c7d06-8e31-4e1b-880a-74aec09d0bec/devenv_3OLR794xg5.png" alt="Affordance component code" />
<em>The AffSetActive affordance is one of our simplest– it sets a gameobject to active or inactive when the player interacts with it. Good for opening things, turning off / on lights, etc</em></p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2022/October/11/23/13/19/907/dbab4a9a-ad9c-471e-9dea-480ceacd528b/Greek_Tragedy_-_demo_-_win_3SGO5sbYQp.gif" alt="The selection system" />
<em>When the game figures out what the player probably wants to interact with, it will spawn an icon (in this case, a mouse click)</em></p>
<p>Around 20 different affordances exist in Greek Tragedy, and many are flexible / expressive (from allowing the player to push / move gameobject, to traveling, to setting checkpoints, refilling ammo, launching minigames, etc). Once programmed, this toolbox of components allows designers to easily add functionality to various gameobjects without writing any code– creating puzzles, lore, and interesting interactions quickly (if each gameobject needed its own custom script, this would be a very painful genre to work in o_O).</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2022-10-11T00:00:00-04:00https://arborinteractive.com/2021/05/17/automatic-script-execution-order/index.htmlAutomated Script Execution Order in Unity (solve build issues)2021-05-17T00:00:00-04:00Austin Yargerhttps://ayarger.com<p>TLDR : If you’ve ever had a unity project that works in-editor, but not in-build (because scripts run in a different order), and lost hours to a script-execution-order bug, this package will prevent this from happening again by automatically locking down the execution order of all scripts across editor and build.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2021/May/17/15/41/56/305/bbb8011d-5245-4846-afa4-9925654f5f35/2021-05-17_15-41-43.webp" alt="Having an explicit Script Execution Order for every script helps the editor and build versions of your game run the same." /></p>
<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#the-problem" id="markdown-toc-the-problem">The Problem</a></li>
<li><a href="#the-solution" id="markdown-toc-the-solution">The Solution</a></li>
<li><a href="#the-solution-1" id="markdown-toc-the-solution-1">The Solution</a></li>
<li><a href="#goodbye-groundhog-progress" id="markdown-toc-goodbye-groundhog-progress">Goodbye Groundhog Progress</a></li>
<li><a href="#museum-tower-defense--lifes-a-beach-progress" id="markdown-toc-museum-tower-defense--lifes-a-beach-progress">Museum Tower Defense / Life’s a Beach Progress</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="the-problem">The Problem</h2>
<p>From the Unity docs, by default, the order in which scripts execute their functions (Start(), Awake(), Update(), etc) is arbitrary, and almost guaranteed to change when going from editor to build.</p>
<p>This is a big deal for most developers. Imagine you have two systems in your game…</p>
<p>If system A initializes first, all is good (system B can properly use it). If the reverse order were to happen, initialization of system B will fail, as system A (one of its dependencies) is not yet ready to provide service.</p>
<p>While certain patterns can get us past this, most developers do not use them (students definitely don’t), and thus the prospect of creating a build can be a terrifying one.</p>
<h2 id="the-solution">The Solution</h2>
<p>The idea is very simple– if a script exists within your Unity project, automatically guarantee it has an explicit, unique position in the script execution order.</p>
<p>After this script runs, your project’s script execution editor view should look like this–</p>
<ul>
<li>The package notices and respects DefaultExecutionOrder attributes, such that if you have already configured a script to have an execution order, this ordering will not be clobbered.</li>
<li>The package notices and respects any non-0 execution orders you may have already configured, so it will not clobber those values (though with most other scripts receiving a new default order, the relative position may still change.</li>
</ul>
<h2 id="the-solution-1">The Solution</h2>
<p>Thanks to Azure Ravens Entertainment for help with testing / verifying the package.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2021/January/11/20/48/21/469/d0a2aaf9-8385-4dd3-b65a-367c03a54de1/2021-01-11_20-45-56.webp" alt="Greek Tragedy horror game opening" />
<em>Arbor Interactive is becoming the leading producer of redhead-starring games. Perhaps we should change our name.</em></p>
<p>Not very scary yet, huh? Give it time– we’ve only put a week or two into it, and many successful itch.io horror games aren’t particularly scary either. We’re seeking inspiration from fantastic slow-burn games like Dead County, Blake McKinon’s fantastic, brief RE-inspired, fixed-camera game.</p>
<p><img src="https://img.itch.zone/aW1hZ2UvNTE4MDM0LzI2OTI4MTgucG5n/original/HM9hDP.png" alt="Dead County by Blake McKinnon" />
<em>Blake McKinnon has <a href="https://www.youtube.com/watch?v=OMTbpFgEIlU">an ongoing video devblog</a> which is informative, fascinating, and inspiring.</em></p>
<p>The coolest part of this production is the existence of a partner– PrairieVille games is, at this moment, ~58% owner of the project (with equity fluctuating based on weekly investment of time and money), and is responsible for animation, environmental art, and level design. You have no idea the weight lifted off my shoulders– if I never need to place another bush or log, it will be too soon. On this project, I can reserve all of my discipline and mental energy for programming and systems design, which is where my strengths and interests lie.</p>
<h2 id="goodbye-groundhog-progress">Goodbye Groundhog Progress</h2>
<p>Locally Sourced is a popular and impactful organizer of the Michigan gamedev community, and as part of his (Michael Klamerus’) efforts, a quarterly <a href="https://itch.io/b/700/locally-sourced-autumn-bundle">bundle of Michigan-made games and demos</a> gets released on itch.io for the purposes of showcasing the community (and scounging up some minor revenue for all involved).</p>
<video width="600" controls="">
<source src="https://f002.backblazeb2.com/file/sharex-hN8T5vpN8wZGmmwU/2020/December/25/02/56/22/605/9c8f363f-80ab-4b0d-bd15-320ba39c0dc1/2020-12-25_02-56-05.mp4" type="video/mp4" />
</video>
<p>The upcoming February bundle (set to release on the 2nd) will include a game from Arbor Interactive powered by our Tower Defense Engine. Set on a lonely, frigid mountainside, <em>Goodbye Groundhog</em> tasks players with escaping a ravenous mob of formerly fuzzy friends– enraged by a seemingly never-ending winter they believe you caused (by looking at your shadow). As times get tough, even the most absurd of rumors can take on a life of their own. Will the groundhog and his family survive the night? Decide for yourself in early February.</p>
<p>This project has value for Arbor Interactive outside of the small number of sales it will generate– this project, being more cinematic and story-dependent than our other ones– has forced us to create new technology, including…</p>
<ul>
<li>Deformable snow maps (easy to re-use for other materials, such as sand)</li>
<li>Connected-Area Exploration (walk from area to area, rather than be plopped down into one each round).</li>
<li>Anytime-Launchable Wavesets (invisible triggers in a room cause certain wavesets to activate and play out).</li>
<li>Customizable, animating gameplay backgrounds (starry-night sky).</li>
<li>Improved dialog technology.</li>
</ul>
<p>Regardless of the game’s final quality (it isn’t exactly receiving our full attention), this production and the new techniques / technology that comes with it, should improve the quality and expressiveness of all our future tower-defense-style games.</p>
<h2 id="museum-tower-defense--lifes-a-beach-progress">Museum Tower Defense / Life’s a Beach Progress</h2>
<p>Life’s a Beach and Museum Tower Defense are still progressing, albeit slowly. If you’ve forgotten, we’re talking about this game–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/03/00/27/56/821/08fa113a-327a-4412-b95e-f42611d0acc0/2020-11-03_00-26-46.webp" alt="Life's a beach game" /></p>
<p>And this one–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/18/04/34/205/61eb60bd-be07-491c-ad26-f48d42a8d9ec/2020-11-21_18-03-14.webp" alt="Museum Tower Defense game" /></p>
<p>The business model these games had been planned for–</p>
<ul>
<li>Create a game</li>
<li>Put it on the web</li>
<li>???</li>
<li>Profit</li>
</ul>
<p>hasn’t proven itself out in the case of <em>Life’s a Beach</em>, and this is causing a delay of Museum Tower Defense (why throw a second game to the wolves?). Should Life’s a Beach reach a truly finished point, it would make sense to release it on itch.io and steam at a low cost, but a new business model and plan has come into focus for these two games– one inspired by profitable artists at expo artist alleys. Here’s the basic outline–</p>
<ul>
<li>Create a game with cute characters.</li>
<li>Create stickers, decals, misc artist-alley swag from the game assets, like this.</li>
<li>Associate each piece of swag with a code that “unlocks” that character in the game.</li>
<li>Make the game itself free to download and accessible (desktop and mobile platforms).</li>
<li>???</li>
<li>Profit (cash + people joining the arbor interactive community)</li>
</ul>
<p>When purchasing a piece of art at an expo, the purchaser has no context for the original-IP character in that artwork. If they can see that this is a video game character, and can see that they are actually purchasing an experience (the ability to learn about that character), then this entire purchase begins to resemble that of a comic book for a new, original character (something that I have seen sell reasonably well at comic conventions, such as <a href="https://www.motorcitycomiccon.com/">Motor City comic con</a>).</p>
<p>I feel this business model is unique, doable, and has at-worst a small chance of mild success. It does, unfortunately, require the pandemic to end, so these projects are in a bit of limbo until then.</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2021-05-17T00:00:00-04:00https://arborinteractive.com/2021/01/11/personal-update/index.htmlArbor Interactivities 01/11/20212021-01-11T00:00:00-04:00Austin Yargerhttps://ayarger.com<p>Whew! It has been awhile, hasn’t it? Am I even allowed to refer to this as a <em>weekly</em> blog after more than a month of absence?
One of the ironies of being busy– one has so much to talk about and discuss, but no time to actually do so (perhaps this is why postmortems are so popular)! In order to get this post out quickly, before my brain melts, let’s make this entry more of a disorganized news-blast, rather than a well-architected discussion of a singular topic. Search engines won’t like it, but maybe you will!</p>
<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#horror-project-progress" id="markdown-toc-horror-project-progress">Horror Project Progress</a></li>
<li><a href="#goodbye-groundhog-progress" id="markdown-toc-goodbye-groundhog-progress">Goodbye Groundhog Progress</a></li>
<li><a href="#museum-tower-defense--lifes-a-beach-progress" id="markdown-toc-museum-tower-defense--lifes-a-beach-progress">Museum Tower Defense / Life’s a Beach Progress</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="horror-project-progress">Horror Project Progress</h2>
<p>PrairieVille Games and Arbor Interactive have teamed up to produce a retro horror title in the vein of the early Resident Evil / Silent Hill games. Set on a college campus, <em>Greek Tragedy</em> follows the player as they attempt to rescue their boyfriend from a fraternity-turned evil-cult.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2021/January/11/20/48/21/469/d0a2aaf9-8385-4dd3-b65a-367c03a54de1/2021-01-11_20-45-56.webp" alt="Greek Tragedy horror game opening" /></p>
<p>Not very scary yet, huh? Give it time– we’ve only put a week or two into it, and many successful itch.io horror games aren’t particularly scary either. We’re seeking inspiration from fantastic slow-burn games like Dead County, Blake McKinon’s fantastic, brief RE-inspired, fixed-camera game.</p>
<p><img src="https://img.itch.zone/aW1hZ2UvNTE4MDM0LzI2OTI4MTgucG5n/original/HM9hDP.png" alt="Dead County by Blake McKinnon" />
<em>Blake McKinnon has <a href="https://www.youtube.com/watch?v=OMTbpFgEIlU">an ongoing video devblog</a> which is informative, fascinating, and inspiring.</em></p>
<p>The coolest part of this production is the existence of a partner– PrairieVille games is, at this moment, ~58% owner of the project (with equity fluctuating based on weekly investment of time and money), and is responsible for animation, environmental art, and level design. You have no idea the weight lifted off my shoulders– if I never need to place another bush or log, it will be too soon. On this project, I can reserve all of my discipline and mental energy for programming and systems design, which is where my strengths and interests lie.</p>
<h2 id="goodbye-groundhog-progress">Goodbye Groundhog Progress</h2>
<p>Locally Sourced is a popular and impactful organizer of the Michigan gamedev community, and as part of his (Michael Klamerus’) efforts, a quarterly <a href="https://itch.io/b/700/locally-sourced-autumn-bundle">bundle of Michigan-made games and demos</a> gets released on itch.io for the purposes of showcasing the community (and scounging up some minor revenue for all involved).</p>
<video width="600" controls="">
<source src="https://f002.backblazeb2.com/file/sharex-hN8T5vpN8wZGmmwU/2020/December/25/02/56/22/605/9c8f363f-80ab-4b0d-bd15-320ba39c0dc1/2020-12-25_02-56-05.mp4" type="video/mp4" />
</video>
<p>The upcoming February bundle (set to release on the 2nd) will include a game from Arbor Interactive powered by our Tower Defense Engine. Set on a lonely, frigid mountainside, <em>Goodbye Groundhog</em> tasks players with escaping a ravenous mob of formerly fuzzy friends– enraged by a seemingly never-ending winter they believe you caused (by looking at your shadow). As times get tough, even the most absurd of rumors can take on a life of their own. Will the groundhog and his family survive the night? Decide for yourself in early February.</p>
<p>This project has value for Arbor Interactive outside of the small number of sales it will generate– this project, being more cinematic and story-dependent than our other ones– has forced us to create new technology, including…</p>
<ul>
<li>Deformable snow maps (easy to re-use for other materials, such as sand)</li>
<li>Connected-Area Exploration (walk from area to area, rather than be plopped down into one each round).</li>
<li>Anytime-Launchable Wavesets (invisible triggers in a room cause certain wavesets to activate and play out).</li>
<li>Customizable, animating gameplay backgrounds (starry-night sky).</li>
<li>Improved dialog technology.</li>
</ul>
<p>Regardless of the game’s final quality (it isn’t exactly receiving our full attention), this production and the new techniques / technology that comes with it, should improve the quality and expressiveness of all our future tower-defense-style games.</p>
<h2 id="museum-tower-defense--lifes-a-beach-progress">Museum Tower Defense / Life’s a Beach Progress</h2>
<p>Life’s a Beach and Museum Tower Defense are still progressing, albeit slowly. If you’ve forgotten, we’re talking about this game–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/03/00/27/56/821/08fa113a-327a-4412-b95e-f42611d0acc0/2020-11-03_00-26-46.webp" alt="Life's a beach game" /></p>
<p>And this one–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/18/04/34/205/61eb60bd-be07-491c-ad26-f48d42a8d9ec/2020-11-21_18-03-14.webp" alt="Museum Tower Defense game" /></p>
<p>The business model these games had been planned for–</p>
<ul>
<li>Create a game</li>
<li>Put it on the web</li>
<li>???</li>
<li>Profit</li>
</ul>
<p>hasn’t proven itself out in the case of <em>Life’s a Beach</em>, and this is causing a delay of Museum Tower Defense (why throw a second game to the wolves?). Should Life’s a Beach reach a truly finished point, it would make sense to release it on itch.io and steam at a low cost, but a new business model and plan has come into focus for these two games– one inspired by profitable artists at expo artist alleys. Here’s the basic outline–</p>
<ul>
<li>Create a game with cute characters.</li>
<li>Create stickers, decals, misc artist-alley swag from the game assets, like this.</li>
<li>Associate each piece of swag with a code that “unlocks” that character in the game.</li>
<li>Make the game itself free to download and accessible (desktop and mobile platforms).</li>
<li>???</li>
<li>Profit (cash + people joining the arbor interactive community)</li>
</ul>
<p>When purchasing a piece of art at an expo, the purchaser has no context for the original-IP character in that artwork. If they can see that this is a video game character, and can see that they are actually purchasing an experience (the ability to learn about that character), then this entire purchase begins to resemble that of a comic book for a new, original character (something that I have seen sell reasonably well at comic conventions, such as <a href="https://www.motorcitycomiccon.com/">Motor City comic con</a>).</p>
<p>I feel this business model is unique, doable, and has at-worst a small chance of mild success. It does, unfortunately, require the pandemic to end, so these projects are in a bit of limbo until then.</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2021-01-11T00:00:00-04:00https://arborinteractive.com/2020/12/26/moonsharp_usage/index.htmlUsing Moonsharp in Unity Projects : Application for Customization2020-12-26T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#system-re-use-versus-customization" id="markdown-toc-system-re-use-versus-customization">System Re-Use versus Customization</a></li>
<li><a href="#moonsharp-as-a-means-of-easy-customization" id="markdown-toc-moonsharp-as-a-means-of-easy-customization">MoonSharp as a means of easy Customization</a></li>
<li><a href="#establishing-an-interrupt" id="markdown-toc-establishing-an-interrupt">Establishing an Interrupt</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="system-re-use-versus-customization">System Re-Use versus Customization</h2>
<p>The New Super Mario Bros series was already being seen as a bit “safe” and “predictable” upon its second entry, <em>New Super Mario Bros Wii</em>. The series, a spiritual and design continuation of original Super Mario Bros formula from the 80s didn’t exactly flip the table with each new entry.</p>
<ul>
<li>Plot : Rescue Princess Peach from Bowser</li>
<li>Gameplay : Mario-Style momentum-based platforming.</li>
<li>???</li>
<li>Multiplayer : Mario x 4</li>
</ul>
<p>That last one was the big new innovation for this second entry, which doesn’t mean much for single players. You’ve got a friendly grass world to begin, a fiery castle world to end, and desert, snow, etc worlds in between. The game’s intentions were clear– use a safe and popular format to fill a release schedule and make some consistent cash– not a bad plan, but not one that is going to stick in players minds or (re)establish a brand or some characters.</p>
<p>And yet I do have one distinct memory from this game.</p>
<p>only the second in the series, was already being seen as bit “predictable” upon launch.</p>
<p>The finale of UnderTale includes a sizeable exposition dump– line after line of various monsters revealing a critical piece of the game’s backstory. With monster-squad after monster-squad saying line after line in sync, it’s a moment that’s likely to make some players daydream.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/21/46/974/49b626b9-fb0a-42de-a66b-23d47a416f84/firefox_2020-12-26_19-21-46.webp" alt="" />
<em>Watch <a href="https://youtu.be/Gz-iRDoAj9c?t=75">the sequence here</a>.</em></p>
<p>But this isn’t what happens. At the most important and emotional moment of this otherwise samey sequence, one of the monster squads chokes up and breaks syncronization with its partners, in a way that catches the player’s attention again.</p>
<p>![An NPC breaks tendency to get the player’s attention back before announcing the death of an important character.](https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/20/29/007/5d490952-fa29-448b-b28c-642434797fb4/2020-12-26_19-20-04.webp</p>
<p>This timing isn’t a coincidence. Breaking tendency– establishing a standard and then deviating from it– is a way to generate surprise and acquire the player’s attention.</p>
<p>At the heart of many excellent games is the struggle between quantity (standardization) and quality (expressiveness). <em>New Super Mario bros</em> was a cheap game to make– a safe bet– and its most memorable moments are when it decides to go off-script.</p>
<p>Standardization cuts costs massively, which is why a game with several systems will re-use them for hundreds of battles, why mini games are often rare,</p>
<h2 id="moonsharp-as-a-means-of-easy-customization">MoonSharp as a means of easy Customization</h2>
<p>When a system is established, such as an environmental system.</p>
<p>Unfortunately, in its current state the Moonsharp open source project has nasty garbage-generation problems by default, with every execution of a script generating quite a bit of garbage and slowdown if too many executions occur. This fact makes MoonSharp useful for periodic, occasional calls rather than every-frame logic.</p>
<p>Moonsharp finds its use via configuration interrupts (maybe not surprising, as the language was initially designed for lightweight config usage).</p>
<h2 id="establishing-an-interrupt">Establishing an Interrupt</h2>
<p>Below is part of our “Gameplay Initialization” sequence. When a map is loaded, this portion of logic is responsible for establishing what the environmental affects of this stage will be.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/37/26/647/f4f8f3a0-7864-4523-8597-1dd7279f1bb9/devenv_2020-12-26_19-37-26.webp" alt="" /></p>
<p>The DetermineNextStage function is responsible for figuring out what the next stage is. It’s written in C#, and provides a default random-selection approach that should work well enough for most games.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/39/27/198/b4ac0b83-c6f5-4ba7-a056-c41c8f2cacc2/devenv_2020-12-26_19-39-26.webp" alt="C# random stage selection code" /></p>
<p>What if a game wants to do something specific and customized, though? For example, a game might decide that “round 1” should always take place in a certain location, with a certain cinematic camera position, etc. How can we make this possible?</p>
<p>Let’s add a Lua Interrupt–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/42/17/681/3316f3f7-3283-4e56-90b3-83be27bfc500/devenv_2020-12-26_19-42-16.webp" alt="Adding a Moonsharp Lua Interrupt" /></p>
<p>This new function locates the relevant LUA code for this interrupt, and provides the LoadGameplayConfig data structure to this LUA code for customization purposes.
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/45/40/669/4f63eeb8-f5ef-422f-a8f1-4a2617d0852c/devenv_2020-12-26_19-45-39.webp" alt="" /></p>
<p>The LUA code has a function “GetRoundConfig” that takes two parameters– a round number and the gameplay config data structure mentioned above. Based on the round, it will alter this config data structure to turn certain features on and off–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/26/19/48/13/007/677642a8-3764-4584-b725-043b198fddee/firefox_2020-12-26_19-48-12.webp" alt="" /></p>
<p>For instance, in the logic above you can see that this particular game (represented by a spreadsheet) wants the first round to always occur in stage “s1” (note that “Play Now” is our version of survival / ladder / arcade mode), with no posse (allied units) spawned in, no UI, no intro camera animation, a particular camera zoom level and position, etc. If you look at the “round 2” block of logic, the situation is similar, <em>however</em>, the abilities UI is no longer disabled.</p>
<p>These things are done for guidance purposes– as a game begins, it can be helpful for a game design to gradually introduce new mechanics, new UI, etc. However, another game may not care about this, or desire a different intro pipeline. These games (represented by a different spreadsheet fed into the engine) may choose to supply a different LUA interrupt or even none at all (to roll with the purely-random stage selection approach).</p>
<p>As new needs for expressiveness arrive in our games–</p>
<ul>
<li>May we begin a <a href="https://yarnspinner.dev/">YarnSpinner</a> dialogue sequence at the beginning of the stage?</li>
<li>May we interrupt enemy-spawning in a particular stage to give all enemies hats in accordance with the plot?</li>
<li>May we block the player from using any abilities in this stage?</li>
</ul>
<p>New interrupts begin to appear throughout the codebase, allowing configuration data structures to be customized before use as a function of more and more variables (round number, player dialogue decisions, etc).</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-12-26T00:00:00-04:00https://arborinteractive.com/2020/11/28/mtd_parallax/index.htmlMulti-Layer Cutscenes and Mouse-Parallax2020-11-28T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#multi-layer-cutscenes-and-mouse-parallax" id="markdown-toc-multi-layer-cutscenes-and-mouse-parallax">Multi-Layer Cutscenes and Mouse-Parallax</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="multi-layer-cutscenes-and-mouse-parallax">Multi-Layer Cutscenes and Mouse-Parallax</h2>
<p>(gif of MTD intro cutscene)</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/02/48/24/367/0fc537f7-1913-4db7-930d-3586a0e74eed/2020-11-21_02-47-56.webp" alt="Villianne flies into Detroit while planning her next mission" /></p>
<p>(image of how each layer is organized in the spreadsheet).</p>
<p>(discussion of mouse-parallax)</p>
<p>Mouse-Camera-Parallax is an increasingly common UI effect in which the movement of the player’s cursor causes a camera to move slightly, producing a somewhat engaging effect, as seen below.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/02/50/42/262/d52cd8d9-a401-4227-b05a-9df6401cba75/2020-11-21_02-50-05.webp" alt="" />
<em>Please forgive the turbulence.</em></p>
<p>In our case, the movement of the camera reveals the depth of the scene and its layers (it also reveals a graphical artifact– can you spot some missing image data just above Villy’s laptop?).</p>
<p><em>No Man’s Sky</em> uses this technique in its UI, as do other games.</p>
<p><img src="https://www.nomanssky.com/wp-content/uploads/2018/08/1-58-transfer.gif" alt="" />
<em>Note the movement of the grid cells when the cursor moves. It’s a subtle effect.</em></p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-28T00:00:00-04:00https://arborinteractive.com/2020/11/28/budget_scalable_architecture/index.htmlGame Architecture for Diverse Clients and Budgets2020-11-28T00:00:00-04:00Austin Yargerhttps://ayarger.com<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/12/58/07/995/374e7e36-f9ae-4096-b43e-a3f56433dec6/mtd_budget.webp" alt="" />
<em>No matter the client’s budget, we want to work with them– auto-scaling, efficient, and re-usable tech makes this possible.</em></p>
<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#arbor-interactive-funding--business-model" id="markdown-toc-arbor-interactive-funding--business-model">Arbor Interactive Funding / Business Model</a> <ul>
<li><a href="#step-1-keep-access-to-your-technology" id="markdown-toc-step-1-keep-access-to-your-technology">Step 1: Keep Access To Your Technology</a></li>
<li><a href="#step-2-make-that-technology-reusable" id="markdown-toc-step-2-make-that-technology-reusable">Step 2: Make that technology Reusable.</a></li>
<li><a href="#step-3-make-your-technology-auto-scaling" id="markdown-toc-step-3-make-your-technology-auto-scaling">Step 3: Make Your Technology “Auto-Scaling”</a></li>
</ul>
</li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="arbor-interactive-funding--business-model">Arbor Interactive Funding / Business Model</h2>
<p>Like many small / medium-size studios, Arbor Interactive funds itself partially through contract work with diverse external clients. Are you <a href="https://www.youtube.com/channel/UCLAVg6ayEe4Abkz0QH-ZoZA">a youtube brand</a> celebrating childrens meal prep? <a href="https://play.google.com/store/apps/details?id=com.arborinteractive.bunchesoflunches&hl=en_US&gl=US">Here you go</a>–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/19/53/24/201/29b3ec3c-82a0-481b-ba22-22da5bea872b/firefox_2020-12-05_19-53-22.webp" alt="" />
<em>For the super-small budget, I’m fairly proud of this one. It has a unique timing and combo mechanic that makes it somewhat unique among match-3’s.</em></p>
<p>Are you <a href="https://www.fws.gov/">a federal agency</a> looking for a way to advertise a dangerous new disease to the public? <a href="https://www.whitenosesyndrome.org/mmedia-education/game-on-the-white-nose-syndrome-video-game">No problem</a>–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/19/56/07/249/50418de3-27ae-4f6b-ad3c-b72908b5d736/firefox_2020-12-05_19-56-05.webp" alt="" />
<em>This one became a unique little mix of Plague Inc and Civ. The original version had you piloting robot drones into caves, before we realized it would send an eco-unfriendly message.</em></p>
<p>Are you a research group seeking to shock conference goers by showcasing your discoveries via a video game? Are you a health insurance company looking to provide a digital take-home game? Regardless of who you are, or how large you are, Arbor Interactive wants to make your game, but having diverse clientele with diverse budgets isn’t easy. You can win more contracts too if you pursue the following objectives–</p>
<h3 id="step-1-keep-access-to-your-technology">Step 1: Keep Access To Your Technology</h3>
<p>…so you may maintain, expand, and re-use it! While not all of the above projects allowed us the right to re-use and expand the tech we created for non-related projects, most did. These technologies would be reworked to make them as flexible and re-usable as possible, allowing development on fancier games to continue despite a staff roster of precisely 0.5 people (I’m our only part-time engineer) and some freelance musicians and artists.</p>
<h3 id="step-2-make-that-technology-reusable">Step 2: Make that technology Reusable.</h3>
<p>Here’s a fancier, more-traditional, original-IP game–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/18/04/34/205/61eb60bd-be07-491c-ad26-f48d42a8d9ec/2020-11-21_18-03-14.webp" alt="" />
<em>It’s an RPG / RTS / Tower Defense game with high player-character mobility (kinda like a Moba, maybe?). Wait, where are the towers in this gif??</em></p>
<p>Hey! It’s a new RPG / RTS / Tower Defense engine. I say “Engine” and not game, because it is almost trivial to create a new title with different levels, enemies, story, etc.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/October/26/01/52/06/509/a5ab2cfe-9a1c-4fc7-b860-1f1b4898b553/2020-10-26_01-50-05.webp" alt="" />
<em>This one has a beach theme, and all-new characters, towers, and narrative elements.</em></p>
<p>If Arbor Interacive’s accessibility goal is to be met– if we are able to keep costs low and accomodate clients and projects of diverse scopes and budgets, we must make heavy use of the re-usability of our tech. The spreadsheet system discussed above gives us the power to quickly create games that feel unique, even if their underlying mechanics are similar.</p>
<h3 id="step-3-make-your-technology-auto-scaling">Step 3: Make Your Technology “Auto-Scaling”</h3>
<p>Let’s say we’re working on a low-budget game, and we can only afford to represent our game characters with a single sprite–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/35/53/176/3c7dbead-65d3-4f88-9c91-4e39a7a77421/2020-12-04_17-35-47.webp" alt="sin wave movement animation" /></p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/44/11/971/457a834e-725c-4b2f-be09-bfecfaa98ae4/2020-12-04_17-44-06.webp" alt="" /></p>
<p>That’s ok! We can still give that single sprite a satisfying, charming, and juicy walking animation through a bit of rotation and vertical displacement (use the absolute value of the sin wave!). This method of movement will work acceptably for movement rightward, leftware (just mirror the sprite), towards the camera, and away from camera. It evokes a paper-mario approach which some players may find nostalgic or charmingly minimalist.</p>
<p>In the spreadsheet database that powers our engine, we see this–
<img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/20/23/22/032/65070097-622a-4531-932d-4182736e1e95/firefox_2020-12-05_20-23-21.webp" alt="" /></p>
<p>Let’s say the budget is a little bit higher though, and we can now afford one idle sprite, and one idle-back-to-camera sprite, like so–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/38/35/744/5183a856-a240-4ce1-8da0-cc17c32d7767/2020-12-04_17-38-32.webp" alt="" /></p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/44/48/534/fcfefaf0-be85-463a-817b-849ad0e86184/2020-12-04_17-44-40.webp" alt="" /></p>
<p>The character is just that much more lively! This is how it looks to configure an “away” sprite for a given unit in the spreadsheet database–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/20/21/46/565/e0f9c2e5-5757-43bf-ba90-d7e02a5e8c50/firefox_2020-12-05_20-21-46.webp" alt="" />)</p>
<p>Something important to note, is that <em>this just works</em>™️. The single component that handles the rendering of every unit in the game (“HasUnitVisualization”) knows to check for existing and non-existing sprites when the unit spawns, and will use the appropriate rendering and animation techniques to “make it work” with whatever assets that unit has.</p>
<p>Let’s say we have time and money enough to support 5+ sprites per character–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/13/12/54/546/34e61b33-798f-43a0-a7b9-d68f65184577/2020-12-04_13-12-48.webp" alt="" /></p>
<p>Currently, this extra time and funding would go into attack, damage, pre-ko, ko, blinking, victory, and jogging poses. With each new pose, some “moment” in this unit’s gameplay becomes juicier and more satisfying.</p>
<p>For instance, if a particular unit’s row in the spreadsheet database has been given jogging sprites, we see this…</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/20/31/42/374/15f55a82-bac6-4cfb-aae0-52eeeeb8c9a1/2020-12-05_20-31-19.webp" alt="" />
<em>Pretty effective for just 2 frames– the rotation, displacement, and cartoony art style is a big part of why.</em></p>
<p>Instead of just this…</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/44/11/971/457a834e-725c-4b2f-be09-bfecfaa98ae4/2020-12-04_17-44-06.webp" alt="" />
<em>Still effective, if a bit cheap-looking.</em></p>
<p>The change between these two walk “styles” is handled automatically by the game engine– artists simply upload their new sprites to the spreadsheet database, and that unit gets the more luxurious version.</p>
<p>Another example– If a unit gets KO’d and it has a Pre-KO and KO image supplied, here’s what happens in-game–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/04/17/45/32/984/b127b010-9d4f-426a-ab32-e923e83f4cbf/2020-12-04_17-45-14.webp" alt="" />
<em>Mario and Sonic always had the cutest, most dramatic ways to “die” non-violently, so here’s a mix of the two.</em></p>
<p>If a unit is missing these poses, then here’s what happens instead–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/December/05/20/46/13/030/a8fc71e2-d15a-4192-a663-577ebc430974/2020-12-05_20-45-21.webp" alt="" />
<em>Here, Villy has a damage-sprite, but no pre-ko or ko sprites, so rather than do the surprise-fall sequence above, she goes flying like a piece of cardboard to the wind.</em></p>
<p>And this scalability extends to many other elements of the game engine– from continue screens to intro cutscenes to audio to loading scenes to items– the game engine is designed to “deal with” a lack of assets, and make the best of the situation through clever placeholders, default animations, etc. The philosphy aims to make projects shine in the presence of reasonable budgets, but cope well in the event of strained resources. It’s more “Amazon” than “Apple”– more “accessible” than “amazing”. It’s easy to see some players and devs not being a fan (but gosh do I love it).</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-28T00:00:00-04:00https://arborinteractive.com/2020/11/24/howto_get_your_student_game_published/index.htmlHow to get your Student Game Published2020-11-24T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#list-of-student-game-publishers" id="markdown-toc-list-of-student-game-publishers">List of Student Game Publishers</a></li>
<li><a href="#metal-graphics-api-performance--poor" id="markdown-toc-metal-graphics-api-performance--poor">Metal Graphics API Performance : Poor</a></li>
<li><a href="#openglcore-graphics-api-performance--good" id="markdown-toc-openglcore-graphics-api-performance--good">OpenGLCore Graphics API Performance : Good</a></li>
<li><a href="#fix--force-openglcore-usage-on-mac-osx" id="markdown-toc-fix--force-openglcore-usage-on-mac-osx">Fix : Force OpenGLCore usage on Mac OSX</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="list-of-student-game-publishers">List of Student Game Publishers</h2>
<h2 id="metal-graphics-api-performance--poor">Metal Graphics API Performance : Poor</h2>
<p>Our non-graphically-intensive game is running slowly and choppily, at 20-30 fps.</p>
<h2 id="openglcore-graphics-api-performance--good">OpenGLCore Graphics API Performance : Good</h2>
<h2 id="fix--force-openglcore-usage-on-mac-osx">Fix : Force OpenGLCore usage on Mac OSX</h2>
<p>In player settings…</p>
<p>Alternatively, use the following code before triggering a build…</p>
<figure class="highlight">
<pre><code class="language-csharp" data-lang="csharp"><span class="n">PlayerSettings</span><span class="p">.</span><span class="nf">SetGraphicsAPIs</span><span class="p">(</span>
<span class="n">BuildTarget</span><span class="p">.</span><span class="n">StandaloneOSX</span><span class="p">,</span>
<span class="k">new</span> <span class="n">UnityEngine</span><span class="p">.</span><span class="n">Rendering</span><span class="p">.</span><span class="n">GraphicsDeviceType</span><span class="p">[]</span> <span class="p">{</span>
<span class="n">UnityEngine</span><span class="p">.</span><span class="n">Rendering</span><span class="p">.</span><span class="n">GraphicsDeviceType</span><span class="p">.</span><span class="n">OpenGLCore</span><span class="p">,</span> <span class="n">UnityEngine</span><span class="p">.</span><span class="n">Rendering</span><span class="p">.</span><span class="n">GraphicsDeviceType</span><span class="p">.</span><span class="n">Metal</span>
<span class="p">}</span>
<span class="p">);</span></code></pre>
</figure>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/24/22/02/41/014/3b76139a-c9c6-487d-969d-b72e23d037f8/devenv_2020-11-24_22-02-40.png" alt="" /></p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-24T00:00:00-04:00https://arborinteractive.com/2020/11/21/mtd_abilities/index.htmlGame Mechanic Implementation : Abilities2020-11-21T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#game-mechanic--abilities-prototype" id="markdown-toc-game-mechanic--abilities-prototype">Game Mechanic : Abilities (Prototype)</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="game-mechanic--abilities-prototype">Game Mechanic : Abilities (Prototype)</h2>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/18/04/34/205/61eb60bd-be07-491c-ad26-f48d42a8d9ec/2020-11-21_18-03-14.webp" alt="Abilities in a Unity Tower Defense Game" />
<em>TLDR ~ The Player character now has (prototype) recharging and re-usable abilities, including projectiles and buffs.</em></p>
<p>One of Tower Defense System’s most impactful and persistent weaknesses has been its downtime– once players have organized and purchased their towers, players who are seeking a more actiony, active experience (like me) find themselves with little to do besides watch their plan unfold. While entertaining to an extent, and common in the Tower Defense genre, the lack of player interaction during a battle leaves players like me out in the cold. Collectibles and a movable player avatar were introduced in order to remedy this and give players more to do as the battle rages on, but until this week there has not been a way for players to actively participate in the pain. This week, my inspiration came from Final Fantasy 7 Remake* and its multi-layered combat system.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/03/15/11/766/98f84223-fa7a-4367-80ec-9aaac69f6555/firefox_2020-11-21_03-15-08.webp" alt="" />
<em>The Final Fantasy 7 Remake provides many options for engaging micromanagement.</em></p>
<p>Take a few minutes and watch this FF7 combat overview / strategy video from <a href="https://ign.com">IGN</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/yhMpmF9csH4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>As shown in the video, <em>Final Fantasy 7 Remake</em> is uniquely great at making combat engaging over short, medium, and long term timeframes, with “many things to keep track of” at essentially all times (but not all of them <em>required</em>). Combat is fueled by several different “layers”, beginning with light and oft-recurring layers that may be spammed (simple attacks) that are less impactful but less time-expensive, and leading up to rarer, more impactful heavy-damage layers (Limit Break ultra-moves), some of which take an entire battle to become usable–</p>
<ul>
<li>Layer 1 : Simple Attack (Costs essentially no time. Mash the square button like in a beat em up.)</li>
<li>Layer 2 : Character Attack (Costs a second or two to charge and use. Typically a heavy attack that does more damage.)</li>
<li>Layer 3 : ATB Section Action (Costs a handful of melee hits to charge ~ 5-10 seconds. Can deal large damage via special attack, or alternatively be an item or spell usage).</li>
<li>Layer 4 : Summon (Takes half of a battle to charge. 5-10 minutes. Significant damage).</li>
<li>Layer 5 : Limit Break (Charges as player takes damage. Typically only one usage per boss battle. Outrageous damage).</li>
</ul>
<p>These 5 layers all charge (essentially) separately from each other, which means that various layers become usable at any given moment. Each layer cannot begin re-charging until used, so efficient players are incentivized to use each one ASAP as they become available (and at the proper moment, such as when an enemy is staggered or vulnerable).</p>
<p>Note that this is just for one character– the player usually controls 3 in any given fight, and each of these three playable characters has their own 5 layers all charging at once, creating a ceasless march of special-attack after ATB action after summon after limit break, etc. In the most heated battles, players will find themselves rapidly expending each layer, switching characters constantly to find and spend the most recently charged-up layer.</p>
<p>And while managing all of this activity, players need to spend some attention on dodging large attacks from bosses, consider their dwindling item counts, and play towards enemy elemental weaknesses and resistances.</p>
<p>While all of this may sound exhausting, much of it isn’t critical (victory may usually be achieved, albeit slower, when ignoring many of the gameplay mechanics above). Players who want a slower, less-stressful experience can stick closer to Layer 1– simple beat-em-up, button-mashing attacks, with the occasional Layer 2 and 3 usage to wittle down bosses and heal. It’s a win for accessibility, and for those who may be more used to slower-paced games, or those who are simply seeking a less-manic experience.</p>
<p>For players who gain satifaction from micromanagement– those who seek to optimize their damage per second– heavy use of Layer 3, Layer 4, and Layer 5 can provide a feeling of empowerment and anticipation as players swiftly switch between the layers, expending them ASAP for huge, fast, and visually-dazzling battles. How could we use this general approach in the Tower Defense genre?</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/13/15/27/44/999/7b6e3791-5ca2-47a0-b4be-f70c3e0ebd9d/2020-11-13_15-24-57.webp" alt="Abilities Prototype" />
<em>Hardcoded, ugly, and fast. This early prototype did its job by proving fun quickly.</em></p>
<p>Abilities are a new system that allow players to convert a capped amount of “time-spent-alive” into special actions such as high-damage projectile attacks…</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/17/32/40/502/7b6ef02e-f467-4f35-98bb-b788570ee532/2020-11-21_17-32-21.webp" alt="" />
<em>Projectiles currently fly from the feet of units, because that is where their origin and collision detection is. Looks odd, will fix.</em></p>
<p>Or useful buffs…</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/17/50/44/311/7687b278-93a9-45f5-be8c-97e35b73bc00/2020-11-21_17-50-15.webp" alt="Buffs in a Unity Tower Defense Game" />
<em>A Unit’s buffs are represented by faint icons that swirl around the unit. The Arbor Interactive logo you see above is the “default_missing_image” icon. Did we mention that this is a pre-alpha Ability system?</em></p>
<p>Each ability costs time to use, and the amount of time differs per ability. Each one is represented by an icon at the right side of the UI, and each icon has multiple states–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/17/52/32/419/a8c4917a-3b11-47c8-954e-8d28cdb8b47c/2020-11-21_17-52-30.webp" alt="Hooke's Law for Juicy Unity Game Ability Icons" />
<em>Sproing! Your abilit-y is read-y!</em></p>
<p>Shoutout to Hooke’s Law for making everything bouncy! We have created a new component (“HookesScale”) this week that makes it almost trivial to get this behavior, simply add the component, tell it what the “desired” scale is, and the component will adjust the gameobject’s localscale in a way that makes it bouncy and sproingy.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/17/56/22/301/8a2198ce-d45e-4d4d-b3cf-7b7511ef0ed3/Unity_2020-11-21_17-56-21.webp" alt="A Hooke's Law Scale-Oriented Unity Component" /></p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/17/58/12/625/b3a91bc7-2039-4ce3-8a6f-dcc52f746dd6/rufus-ultra-sf4-stance.webp" alt="Jiggle Physics via Hooke's Law" />
<em>Every usage of Hooke’s Law makes the world a better place. Gif by <a href="http://fightersgeneration.com/">FightersGeneration.com</a></em></p>
<p>Why is every ability icon an adorable winky-face of Spotlight? This is the nature of prototyping– don’t have an set of icons ready to represent various abilities? Don’t code written to scan your database for them? Use the cutest icon you’ve got instead. If the final system turns out to be a bust, and you end up scrapping it, less effort is wasted.</p>
<p>The end result is a a much more active player experience, for those who want it. The introduction of hotkeys makes for a convenient and satisfying system that makes the player feel more ownership of their situation.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/21/18/04/34/205/61eb60bd-be07-491c-ad26-f48d42a8d9ec/2020-11-21_18-03-14.webp" alt="Abilities in a Unity Tower Defense Game" /></p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-21T00:00:00-04:00https://arborinteractive.com/2020/11/16/btd_update/index.htmlResolving a Difficulty Progression Derp2020-11-16T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#parallax-and-multi-layer-cutscenes" id="markdown-toc-parallax-and-multi-layer-cutscenes">Parallax and Multi-Layer Cutscenes</a></li>
<li><a href="#abilities-prototype" id="markdown-toc-abilities-prototype">Abilities Prototype</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="parallax-and-multi-layer-cutscenes">Parallax and Multi-Layer Cutscenes</h2>
<p>(gif of MTD intro cutscene)</p>
<p>(image of how each layer is organized in the spreadsheet).</p>
<p>(discussion of mouse-parallax)</p>
<h2 id="abilities-prototype">Abilities Prototype</h2>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/13/15/27/44/999/7b6e3791-5ca2-47a0-b4be-f70c3e0ebd9d/2020-11-13_15-24-57.webp" alt="Abilities Prototype" /></p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-16T00:00:00-04:00https://arborinteractive.com/2020/11/09/btd_update/index.htmlResolving a Difficulty Progression Derp2020-11-09T00:00:00-04:00Austin Yargerhttps://ayarger.com<nav>
<h2>Contents</h2>
<ul id="markdown-toc">
<li><a href="#play-now-balancing-improvements" id="markdown-toc-play-now-balancing-improvements">“Play Now” Balancing Improvements</a></li>
<li><a href="#bonus--jsonnet-webgl-deserialization-issue" id="markdown-toc-bonus--jsonnet-webgl-deserialization-issue">BONUS : JSON.net WebGL Deserialization Issue</a></li>
<li><a href="#subscribe-to-future-devblogs" id="markdown-toc-subscribe-to-future-devblogs">Subscribe to Future Devblogs!</a></li>
</ul>
</nav>
<h2 id="play-now-balancing-improvements">“Play Now” Balancing Improvements</h2>
<p>The most prominent mode of <em>Life’s a Beach</em> is the “Play Now” mode–</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/11/15/43/33/103/440913f8-9c26-4d22-8670-3e3e6def5db6/chrome_2020-11-11_15-43-25.webp" alt="Life's a Beach Game Play Now Mode" />
<em>Forget the cutscenes and story! Let’s just go!</em></p>
<p>It is structured similarly to that of the “Arcade Modes” found in many fighting games, in that it features a set of randomly-chosen, narrative-less stages the player must clear in sequence.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/11/15/38/02/531/f4862a67-fe81-4a0b-b331-e02835b1ebc2/mk3_ladder.webp" alt="" />
<em>Mortal Kombat 3’s Arcade Mode “Ladder”. Image by 666gonzo666 on Mobygames.</em></p>
<p>Unique to this game’s “Arcade Mode” implementation…</p>
<ul>
<li>It never ends, progressing infinitely as the player clears stage after stage.</li>
<li>Collectibles obtained persist, allowing players to grind effectively.</li>
</ul>
<p>Sounds pretty good, right? Sure, we probably want to add in bosses and “climaxes” every handful of stages, but this design should be nearly as engaging as other ladder systems (that is to say, mildly).</p>
<p>earning upgrade items through gameplay like normal, ranking-up their units and towers between matches. This mode is designed to allow for quick bursts of progress-causing fun, perhaps to serve as enjoyable grinding between story campaigns.</p>
<p>Unfortunately, the mode currently serves as a prime example of how balancing can ruin an otherwise competentely designed (if not excitingly-designed) experience.</p>
<ul>
<li>Which Stage is Chosen? One of the first 30 stages from the story mode.</li>
<li>How is enemy unit / wave strength determined? From the stage chosen (the further along the stage, the higher the enemy level and corresponding stats).</li>
</ul>
<p>With these two points in mind, this problems with this disaster of a mode should be very clear. A new player entering “Play Now” has a ~25 / 30 = ~83% chance (enemy levels 5 above the player being largely intractable) that the player gets thrown into the lions pit with a peashooter– unlikely to provide a good first impression. If players are getting dunked on, there’s a good chance they aren’t learning and exprimenting. If players aren’t learning, they aren’t making decisions and performing experiments– the core of an engaging game loop. Successful progression designs typically seek to build up a player’s confidence and knowledge before testing them, but this ladder is almost certain to crush their spirit immediately, leaving them confused about their options, confused about their decisions, and flustered (but maybe they’ll think the continue / game over screens are neat?). We need a fix.</p>
<p><img src="https://d2vansag56dj8u.cloudfront.net/ShareX/2020/November/12/01/47/50/163/f27d66f9-aefc-4d6e-9899-956879530066/tenor.webp" alt="" />
<em>Not the noobs!</em></p>
<p>Fortunately, the solutions are as clear as the problems.</p>
<ul>
<li>Let’s keep stages random, but decouple enemy difficulty from them. Being spawned into stage 30 shouldn’t necessarily mean enemy strength levels of 30.</li>
<li>Enemy strength level begins at 1, increases with each victory, and…</li>
<li>Enemy strength level is persisted to the user’s save file.</li>
</ul>
<p>The result of these small changes is a difficulty level that starts off managable, and scales up as the player levels up, acquires more cards, grows stronger, and wins. Beyond additional tweaks, this success of this mode will depend on the progress players feel as they achieve victories and climb the ladder. Can we provide a continuous stream of rewards to keep players enticed? Introducing new enemies as rounds progress could help, as could providing a special currency reward for the shop.</p>
<h2 id="bonus--jsonnet-webgl-deserialization-issue">BONUS : JSON.net WebGL Deserialization Issue</h2>
<p>A few hours this week was lost to debugging an issue with JSON deserialization. <a href="https://www.newtonsoft.com/json">JSON.net</a>, the popular JSON C# library does not appear to correctly deserialize HashSet types in WebGL (at least, <a href="https://github.com/jilleJr/Newtonsoft.Json-for-Unity">the library’s Unity fork</a> doesn’t). Without diving into the root cause (at a likely loss of several additional hours), switching to a List resolved the issue (it’s unsurprising that this more-common datatype is less buggy).</p>
<h2 id="subscribe-to-future-devblogs">Subscribe to Future Devblogs!</h2>
<p><a href="https://mailchi.mp/60f68a29a9f2/arborinteractive_website_landingpage">Subscribe here</a> to be notified when we publish future devblogs, tutorials, etc.</p>
2020-11-09T00:00:00-04:00