<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="http://electricnoirgame.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://electricnoirgame.com/" rel="alternate" type="text/html" /><updated>2020-12-29T20:53:46+00:00</updated><id>http://electricnoirgame.com/feed.xml</id><title type="html">Electric Noir</title><subtitle>Electric Noir is a post-apocalyptic role-playing exploration of transhumanism set in a cyberpunk dystopian Neo-America (NeoAm).</subtitle><entry><title type="html">December Sprint Review and 2020 year in review</title><link href="http://electricnoirgame.com/2020/12/27/december-sprint-review.html" rel="alternate" type="text/html" title="December Sprint Review and 2020 year in review" /><published>2020-12-27T13:02:00+00:00</published><updated>2020-12-27T13:02:00+00:00</updated><id>http://electricnoirgame.com/2020/12/27/december-sprint-review</id><content type="html" xml:base="http://electricnoirgame.com/2020/12/27/december-sprint-review.html">&lt;p&gt;&lt;img src=&quot;/assets/images/dec-2020-sprint/OdeNearCrashedTaxi.gif&quot; alt=&quot;Ode stands near a crash auto taxi&quot; /&gt;&lt;/p&gt;

&lt;p&gt;December comes to a close and finally this year is over. December saw the completion of the work started in &lt;a href=&quot;http://electricnoirgame.com/2020/12/04/2020-12-04-November-Sprint-Update.html&quot;&gt;Novembers sprint&lt;/a&gt;. Ivy Automata has been included into the game as the first boss fight, but not without some sacrifices.&lt;/p&gt;

&lt;p&gt;Before I get to those though, let’s do sprint recap and cover the good things that are coming in the final build of the game for 2020.&lt;/p&gt;

&lt;p&gt;So this sprint I closed out 15 issues, 7 Bugs 🐛 , and 8 Enhancements 💡. A pretty nice split actually.&lt;/p&gt;

&lt;h2 id=&quot;ivy-boss-fight-and-narrative-tweaks&quot;&gt;Ivy Boss Fight and narrative tweaks.&lt;/h2&gt;

&lt;p&gt;The demo scene is more linked to the storyline of Electric Noir. It’s no longer a one-off encounter, instead it exists within the main storyline of Electric Noir and shows off some of the larger plot of the game.&lt;/p&gt;

&lt;h2 id=&quot;new-lighting-effects&quot;&gt;New lighting effects&lt;/h2&gt;

&lt;p&gt;I’ve updated my art pipeline so that I can more easily add visual effects to the game. This includes being able to author and include Normal Maps, Rim light masks and Emission Maps within my Aseprite files. These layers get imported via the Unity Asset Import Pipeline and included in the game automatically, so the 2D lights I’ve setup now add a lot of depth to the character sprites.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/dec-2020-sprint/NormalMapPortraitTest.gif&quot; alt=&quot;image showing lighting effects on Ivy's portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/dec-2020-sprint/IvyNormalMap.png&quot; alt=&quot;image showing Ivy's portrait normal map&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/dec-2020-sprint/OdeNormalsOnOff.gif&quot; alt=&quot;image showing the various image effect layers in aseprite&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;new-physics-improvements&quot;&gt;New physics improvements&lt;/h2&gt;

&lt;p&gt;In previous releases, when an enemy was knocked into the air their trajectory was pre-determined. The system used pre-computed bezier curves to control an enemies movement through the air. This worked well, however it ran into issues as the curves weren’t very high resolution, they consisted of about 10-15 points, which caused some of the larger movements to appear jerky and hard to follow.&lt;/p&gt;

&lt;p&gt;This movement system also made effects like the bullet casings from Ode’s gun hard to code, since the only way to move would be to use these pre-computed curves. Instead, I switched over to using a true physics system, with gravity, acceleration and friction (really really easy to setup) to govern how objects move through the air.&lt;/p&gt;

&lt;p&gt;This has improved a lot of the movement and feel of the game and allows for more dynamic combat and effects.&lt;/p&gt;

&lt;h2 id=&quot;2020-in-review&quot;&gt;2020 In Review&lt;/h2&gt;

&lt;p&gt;It doesn’t really need to be said that 2020 was the worst. However, 2020 was a pretty good year for Electric Noir. I doubled down on my narrative beat-em-up idea, tweaking, updating an re-writing the storyline until I had something I was proud of.&lt;/p&gt;

&lt;p&gt;I started crafting characters that I wanted to see, taking inspirtation from a lot of my favorite stories, both sci-fi and fantasy, fiction and non-fiction to get a world that I think feels real and has a unique perspective to offer players.&lt;/p&gt;

&lt;p&gt;I revamped this very website with a new design that highlights the visual style of the game and makes a unique space online.&lt;/p&gt;

&lt;p&gt;I started monthly development sprints and in September, I released the first of 3 builds this year.&lt;/p&gt;

&lt;p&gt;On top of all of these things I learned a ton about making a game in Unity. There are a lot of challenges, and I’m proud of the fact that I’ve stuck with this project and kept pushing forward, rather than making a step forward and two steps back.&lt;/p&gt;

&lt;p&gt;With that review complete, let’s talk about some things that aren’t so great.&lt;/p&gt;

&lt;h2 id=&quot;state-machine-bugs&quot;&gt;State machine bugs&lt;/h2&gt;

&lt;p&gt;This month revealed a lot of bugs with my state machine code. The bugs were really hard to debug and fix, so I’m currently trying to figure out a way forward, as such there are no enemies other than Ivy in the December release. It pained me to disable them but they weren’t working and I’d rather have a portion of the game that is playable, than a whole game that isn’t.&lt;/p&gt;

&lt;p&gt;I’m actually thinking of replacing the enemy statemachines with something like &lt;a href=&quot;https://flowcanvas.paradoxnotion.com/&quot;&gt;FlowCanvas&lt;/a&gt; with &lt;a href=&quot;https://nodecanvas.paradoxnotion.com/&quot;&gt;NodeCanvas&lt;/a&gt; rather than building something on my own.&lt;/p&gt;

&lt;h2 id=&quot;update-on-future-releases&quot;&gt;Update on future releases&lt;/h2&gt;

&lt;p&gt;My wife and I are in the middle of packing up our house in Texas, preparing to sell it so we can move back to our families in Massachusetts. The move is scheduled to happen mid February so the next two months are going to be incredibly hectic and chaotic which means there will likely be very little time for me to invest heavily in Electric Noir in the next few months.&lt;/p&gt;

&lt;p&gt;Looking forward through the move and back through the past few months, I’ve enjoyed the cadence of the monthly sprints, so I will definitely be keeping those up, but the monthly releases haven’t had the impact that I’ve expected/wanted so I’m going to be switching to releasing builds of the game when it’s gotten enough updates and polish to warrant them.&lt;/p&gt;

&lt;p&gt;This means fewer releases of the game, but it also means better quality of those releases. It also means I won’t be stressing out mid-month about testing all the work I’ve been doing, instead I can test as I go along and polish releases just before they are shipped.&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="release-notes" /><summary type="html"></summary></entry><entry><title type="html">November Sprint Update</title><link href="http://electricnoirgame.com/2020/12/04/2020-12-04-November-Sprint-Update.html" rel="alternate" type="text/html" title="November Sprint Update" /><published>2020-12-04T07:24:00+00:00</published><updated>2020-12-04T07:24:00+00:00</updated><id>http://electricnoirgame.com/2020/12/04/2020-12-04-November-Sprint-Update</id><content type="html" xml:base="http://electricnoirgame.com/2020/12/04/2020-12-04-November-Sprint-Update.html">&lt;p&gt;If you follow me on twitter then you already know that this month is the first month where there won’t be a major update to electric noir.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;this&amp;#39;ll be the first month since I started doing monthly releases of &lt;a href=&quot;https://twitter.com/electricnoir?ref_src=twsrc%5Etfw&quot;&gt;@electricnoir&lt;/a&gt; that I&amp;#39;ll miss my intended goals 😢. They were really ambitious but it still feels kinda bad. Anyway, December should have some cool new stuff. I&amp;#39;ll post an update to the EN blog in a few days.&lt;/p&gt;&amp;mdash; Jared Barboza (@codeimpossible) &lt;a href=&quot;https://twitter.com/codeimpossible/status/1331646479887437828?ref_src=twsrc%5Etfw&quot;&gt;November 25, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;This is tough for me to write because I really wanted to get this release out, not only because i had a lot of exciting additions planned but also because I committed to having a new update to electric noir each month.&lt;/p&gt;

&lt;p&gt;The changes I’ve worked on so far will get rolled into December’s release, so there should be an extra special update to the game by the end of the year.&lt;/p&gt;

&lt;p&gt;So what have I been working on this November?&lt;/p&gt;

&lt;h2 id=&quot;first-boss-fight&quot;&gt;First Boss Fight&lt;/h2&gt;
&lt;p&gt;Ivy Automata will be the games first implemented boss fight. She has two really devastating attacks that the player will have to avoid while dealing damage to her.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/nov-2020-sprint/IvyPortrait.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ivy stares you down. She is a ruthless assassin, one who takes jobs for the challenge, no the credits. Exclusively going after augmented targets to prove her un-augmented superiority by defeating them in hand-to-hand combat, completely naked. She gained a lot of fame fighting in the NonAug circuit, but when that no longer gave her the rush she wanted she started taking assassination contracts. Her tattoos are her badge of pride, she gets a new one with each target she eliminates.&lt;/p&gt;

&lt;h3 id=&quot;dash-punch&quot;&gt;Dash Punch&lt;/h3&gt;
&lt;p&gt;Ivy dashes towards the player and unleashes a devastating heavy punch that can send the player flying back.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/nov-2020-sprint/IvyDashPunch.gif&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;slam-attack&quot;&gt;Slam Attack&lt;/h3&gt;
&lt;p&gt;Ivy jumps high into the air and slams down onto a random spot with incredible force which will knock the player back and deal a ton of damage.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/nov-2020-sprint/IvySlamAttack.gif&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;player-ai&quot;&gt;Player AI&lt;/h2&gt;
&lt;p&gt;I’ve been worried a lot about not being able to catch bugs in the combat loop of the game. There are so many possible combinations of actions that the Enemies and the Player can perform that I really can’t hope to reproduce them all with just manual testing. So I spent a lot of time during November building out a script that can drive the player character with the hope that it would tighten up the testing loop for combat.&lt;/p&gt;

&lt;p&gt;I was really pleased with the results. The player AI isn’t incredibly advanced, it’s just a script that scans the enemies and reacts to what they are doing, with some randomization thrown in, but it’s already made testing so much easier. I was able to find and fix a ton of bugs in a short period of time, something that would have taken me ages before. I’ve also started using this AI to test out the Ivy boss fight and it’s helped me find and fix bugs there as well.&lt;/p&gt;

&lt;p&gt;I’ll write a more in-depth post on how I set up the player AI because it’s something that took very little time but added a ton of value, in the meantime, enjoy a gif of the AI in action!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/nov-2020-sprint/PlayerAI2.gif&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;on-to-december&quot;&gt;On to December&lt;/h2&gt;
&lt;p&gt;I’ve got a lot of stuff planned for December, but the main goal will be to finish up the Ivy boss fight and release that along with the combat bug fixes. It’s been a rough month but I feel really really good about the state of things right now, which is better than releasing something half done.&lt;/p&gt;

&lt;p&gt;Until next month!&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="release-notes" /><summary type="html">If you follow me on twitter then you already know that this month is the first month where there won’t be a major update to electric noir.</summary></entry><entry><title type="html">October Sprint Review</title><link href="http://electricnoirgame.com/2020/10/27/2020-10-31-October-Release-Notes.html" rel="alternate" type="text/html" title="October Sprint Review" /><published>2020-10-27T08:12:00+00:00</published><updated>2020-10-27T08:12:00+00:00</updated><id>http://electricnoirgame.com/2020/10/27/2020-10-31-October-Release-Notes</id><content type="html" xml:base="http://electricnoirgame.com/2020/10/27/2020-10-31-October-Release-Notes.html">&lt;p&gt;My second month-long development sprint wraps up today, and I am incredibly happy with the results! I’ll recap some highlights from the release notes but before I do that I’ll do a quick review on the sprint itself.&lt;/p&gt;

&lt;p&gt;If you don’t want to read all the things I wrote, you can download the &lt;a href=&quot;https://developer.cloud.unity3d.com/share/share.html?shareId=ZkyeAAeiI8&quot;&gt;v2020.10 release of Electric Noir here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-did-the-sprint-go&quot;&gt;How did the sprint go?&lt;/h2&gt;

&lt;p&gt;Octobers sprint was focused on itteration. Since &lt;a href=&quot;/2020/09/30/September-Release-Notes.html&quot;&gt;the last sprint was the first playable demo release&lt;/a&gt;, I was able to get a lot of feedback from playtesters and friends. This gave me a lot of great bug fixes and improvements to target for this sprint.&lt;/p&gt;

&lt;p&gt;So this sprint I closed out 18 issues this sprint, 11 Bugs 🐛 , 4 Enhancements 💡, 1 Cleanup task 🗑, and 2 Art tasks 🎨. Definitely not as many issues as the previous sprint, but fairly close. I’ve been expecting my velocity to go down a bit as we enter into the holidays here in America and this sprint had a lot of defects in it, which are hard to estimate sometimes.&lt;/p&gt;

&lt;p&gt;One thing that I didn’t expect was that by widway through the month I had completed most of the tasks! This left me a lot of room to experiment with some ideas and test out changes and features I’ve been thinking about but not had the time to dive into. Unfortunately this meant that that I finished a bit less work than I would have liked, but I am still incredibly proud of where Electric Noir is at the end of this sprint.&lt;/p&gt;

&lt;h3 id=&quot;workflow-changes&quot;&gt;Workflow changes&lt;/h3&gt;

&lt;p&gt;I changed up how I worked a bit this sprint as well. Normally I would commit changes to my main branch directly as I worked. This was beneficial because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; then always had the “latest and greatest” code. However, this was a pain in the ass also because a lot of times the “latest and greatest” code wasn’t you know, playable.&lt;/p&gt;

&lt;p&gt;This can be a big problem if you’re like me and you move between a few differnet issues during your work day. Also, since the move to monthly demo releases I’ve been treating breaking main as a more serious offense in my day-to-day workflow. Basically, I wanted to treat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; as an “always shippable” version of the game, something I can take and test myself or hand off to a playtester for feedback any time.&lt;/p&gt;

&lt;p&gt;So this basically pushed me to using branches and pull requests more frequently, which I use literally every day in my day job life as a programmer, I just hadn’t been as…strict? Disciplined? Whatever, with myself on Electric Noir. I decided to use branches and PRs for any normal or larger task but would still commit to main if a change was minor enough: tweaking AI configs, text/spelling changes, that sort of stuff.&lt;/p&gt;

&lt;p&gt;Using branches and PRs had a few nice side-benefits though:&lt;/p&gt;

&lt;p&gt;Since I use GitHub issues and milestones for all my task tracking, I could auto-close a bunch of issues with a single PR. And all my PRs show in my milestones, right next to the issues they closed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/oct-2020-sprint/milestone-issue-list.PNG&quot; alt=&quot;image showing issues and pull-requests within a milestone&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Squashing and merging is amazing, having a commit history that just shows features and fixes being merged in is great&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/oct-2020-sprint/commit-history.PNG&quot; alt=&quot;image showing commit history with squashed pull-request merges&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;v202010-release-notes&quot;&gt;v2020.10 Release notes&lt;/h2&gt;

&lt;h3 id=&quot;combat-changes&quot;&gt;Combat Changes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Hit screenshake amounts and pause-on-hit frames have been tweaked to make hits have more impact&lt;/li&gt;
  &lt;li&gt;Player can only dodge on the X axis now&lt;/li&gt;
  &lt;li&gt;Player can no longer dodge outside the level collision (Whoops!)&lt;/li&gt;
  &lt;li&gt;Enemies react to hits more consistently&lt;/li&gt;
  &lt;li&gt;Enemies spawn more blood when hit&lt;/li&gt;
  &lt;li&gt;Player has a new attack: their gun! Press Left-Trigger to draw your gun and then use Right-Trigger to fire! Be careful, there’s limited ammo but you can recharge your gun by attacking enemies.&lt;/li&gt;
  &lt;li&gt;Player can now heal 💕🩺! Pressing the left-button will inject you with a massive dose of healing nanites and a wonderful cocktail of euphoria inducing drugs. Isn’t the future grand!?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dialogue-system-changes&quot;&gt;Dialogue System Changes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Player can now “hurry up” dialogues without skipping to the next spoken line&lt;/li&gt;
  &lt;li&gt;Demo dialogue has been updated with some fresh text animations, thanks to &lt;a href=&quot;https://febucci.itch.io/unity-textanimator&quot;&gt;Text Animator by Febucci&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Choosing the “we’re just passing through” dialogue option no longer crashes the game (Whoops!)&lt;/li&gt;
  &lt;li&gt;Portraits fade in and out when talking/idle, making it more apparent who is speaking&lt;/li&gt;
  &lt;li&gt;There is more visual separation between the character portraits and the game world&lt;/li&gt;
  &lt;li&gt;Speaker names are now separate from the spoken text, spoken text is now wrapped in quotes making descriptive text more obvious.&lt;/li&gt;
  &lt;li&gt;I’ve added a custom pre-processor for Yarn files to make it easier to re-use nodes, which will help me write dialogues faster&lt;/li&gt;
  &lt;li&gt;I’ve added a custom version of &lt;a href=&quot;https://github.com/radiatoryang/ropework&quot;&gt;Ropework&lt;/a&gt; to handle most of the character portrait interaction code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;other-changes&quot;&gt;Other Changes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;I’ve switch to using the Pixel Perfect Camera from Unity&lt;/li&gt;
  &lt;li&gt;Sprite sorting has been overhauled and streamlined to support other objects as well&lt;/li&gt;
  &lt;li&gt;Particle Effects can be sorted using the same system as Sprites, which means I can use Unitys built-in particle systems to handle a lot of visual effects&lt;/li&gt;
  &lt;li&gt;I’ve added a developer console so that I can more easily debug demo versions of the game&lt;/li&gt;
  &lt;li&gt;I did a lot of cleanup on the repository, reference images and game screenshots have been moved to my notion.so project, automation projects have been moved to their own repositories in GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;latest-release-download-links&quot;&gt;Latest release download links&lt;/h2&gt;

&lt;p&gt;You can download the &lt;a href=&quot;https://developer.cloud.unity3d.com/share/share.html?shareId=ZkyeAAeiI8&quot;&gt;v2020.10 release of Electric Noir here&lt;/a&gt;.&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="release-notes" /><summary type="html">My second month-long development sprint wraps up today, and I am incredibly happy with the results! I’ll recap some highlights from the release notes but before I do that I’ll do a quick review on the sprint itself.</summary></entry><entry><title type="html">September Sprint Review</title><link href="http://electricnoirgame.com/2020/09/30/September-Release-Notes.html" rel="alternate" type="text/html" title="September Sprint Review" /><published>2020-09-30T08:00:00+00:00</published><updated>2020-09-30T08:00:00+00:00</updated><id>http://electricnoirgame.com/2020/09/30/September-Release-Notes</id><content type="html" xml:base="http://electricnoirgame.com/2020/09/30/September-Release-Notes.html">&lt;p&gt;In an effort to make more progress - and relieve a lot of pressure on myself during the pandemic - I’ve switched to doing month-long sprints. September is the second monthly sprint I’ve completed and it’s been a really great sprint for a few reasons.&lt;/p&gt;

&lt;h2 id=&quot;review-how-did-it-go&quot;&gt;Review, How did it go?&lt;/h2&gt;

&lt;p&gt;But before I get into those reasons I wanted to do a quick recap of the sprint.&lt;/p&gt;

&lt;p&gt;The sprint isn’t 100% over yet but I’m close enough to feel confident in posting the results. I closed out 22 issues this sprint, 6 Bugs 🐛 , 12 Enhancements 💡, 2 Core Refactors 🏠  1 Documentation ticket 📄 and 1 Art task 🎨.&lt;/p&gt;

&lt;p&gt;Overall the September sprint went really, really well. I was able to focus really well on the sprint goal of testing, fixing and tweaking combat which had been a big problem in the weekly sprints.&lt;/p&gt;

&lt;p&gt;Also, it allowed me to think more clearly about goals for the sprint. This helped me pivot midway through and get some minor changes done to product the first monthly demo of Electric Noir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s right this sprint will be the start of Monthly Releases of Electric Noir!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yep, I’m going to try to push out a new “demo” each month with changes and tweaks. This will give folks (hopefully a few of you fine people) the ability to play small sections of the game and give feedback to help shape the game and help me refine the systems and gameplay up till I get to “beta”.&lt;/p&gt;

&lt;h3 id=&quot;whats-the-difference-between-these-releases-and-a-beta&quot;&gt;What’s the difference between these releases and a “Beta”?&lt;/h3&gt;

&lt;p&gt;A beta is much closer to a release. My first beta will contain a larger vertical slice of the game featuring 90% of the games systems in a playable, and more importantly shipable state.&lt;/p&gt;

&lt;p&gt;These monthly releases are more like an early early access. Small segments of the game with a lot of things left unpolished, unfinished, untested to express an idea or feature with hopes of getting feedback before a ton of time is invested in it.&lt;/p&gt;

&lt;p&gt;That all being said I really want to avoid regressions during these releases so I expect my testing process to get some love and attention at some point in the future.&lt;/p&gt;

&lt;h2 id=&quot;full-v202009-release-notes&quot;&gt;Full v2020.09 Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;combat-changes&quot;&gt;Combat Changes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Screenshake values have been increased for every player attack.&lt;/li&gt;
  &lt;li&gt;Player dashing has been re-enabled&lt;/li&gt;
  &lt;li&gt;Enemies now wander while they wait for an opening to attack&lt;/li&gt;
  &lt;li&gt;Enemies attack and block more frequently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bugs&quot;&gt;Bugs&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Enemies no longer get “stuck” and play their walking animation while stationary&lt;/li&gt;
  &lt;li&gt;The published game will now start correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;foundational-changes&quot;&gt;Foundational Changes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Moved from a custom build of SInput to the newer Unity Input System. This was a big deal actually, it increased the performance of the game significantly and allowed me to start building out more complex attacks and combos.&lt;/li&gt;
  &lt;li&gt;Effects are now powered by the Reanimator animation system, instead of our custom animators.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;other&quot;&gt;Other&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;The release contains a playable demo level showcasing the dialogue and combat systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;where-can-i-get-the-demo&quot;&gt;Where can I get the demo?&lt;/h2&gt;

&lt;p&gt;Ok, here it is, the &lt;a href=&quot;https://developer.cloud.unity3d.com/share/share.html?shareId=W1deKQqbr8&quot;&gt;v2020.09 of Electric Noir&lt;/a&gt;. This is a very simple demo to get feedback on the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Art&lt;/li&gt;
  &lt;li&gt;Writing&lt;/li&gt;
  &lt;li&gt;Combat/Gameplay&lt;/li&gt;
  &lt;li&gt;Bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I encourage you to play this months demo and send me your feedback, either on Twitter - &lt;a href=&quot;http://twitter.com/electricnoir&quot;&gt;@electricnoir&lt;/a&gt; or you can email me &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;about at electricnoirgame.com&lt;/code&gt;.&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="release-notes" /><summary type="html">In an effort to make more progress - and relieve a lot of pressure on myself during the pandemic - I’ve switched to doing month-long sprints. September is the second monthly sprint I’ve completed and it’s been a really great sprint for a few reasons.</summary></entry><entry><title type="html">Unity Upgrades and Effects</title><link href="http://electricnoirgame.com/2020/08/04/upgrades-and-effects.html" rel="alternate" type="text/html" title="Unity Upgrades and Effects" /><published>2020-08-04T08:51:00+00:00</published><updated>2020-08-04T08:51:00+00:00</updated><id>http://electricnoirgame.com/2020/08/04/upgrades-and-effects</id><content type="html" xml:base="http://electricnoirgame.com/2020/08/04/upgrades-and-effects.html">&lt;h2 id=&quot;unity-upgrade&quot;&gt;Unity Upgrade!&lt;/h2&gt;

&lt;p&gt;I’ve been hesitant to upgrade Unity from my trusty 2018.3.x version, mostly because in the past it meant fixing a ton of bugs and possibly even ditching plugins until there was a release for the new version. But Unity kept adding newer and more compelling features with every release.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2D Lights and LWRP&lt;/li&gt;
  &lt;li&gt;Shader Graph&lt;/li&gt;
  &lt;li&gt;New Editor UI and UI Elements&lt;/li&gt;
  &lt;li&gt;TypeCache would help speed up a few internal tools I’ve built&lt;/li&gt;
  &lt;li&gt;Focused Inspector&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No, I really shouldn’t upgrade. I mean, everything is working right now. What if everything breaks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uhm, isn’t that why we have source control? If everything breaks you fix it if its small or throw your branch away and forget about it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeah, but when we tried this a few months ago with 2019 it blew up.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So we’ll try it again with 2020. Again, if it looks like it’s a ton of work then we’ll throw it away.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hmmm. It would be really nice to get onto a newer version of Unity and be able to use some of those newer features in the game, if possible. Yeah alright, fine. Fine!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And so, I did an upgrade of the project in another branch that weekend. Amazingly the project converted without too many issues. I had to upgrade some packages - which wasn’t surprising - and fixup some editor code in one of my own plugins. I think it may have taken me all of 15 minutes to do. I’m pretty happy with the changes in 2020, especially being able to use the new editor UI and eventually play around with shader graph and the LWRP.&lt;/p&gt;

&lt;h2 id=&quot;building-pixel-effects-using-unitys-built-in-particle-emitters&quot;&gt;Building Pixel Effects using Unitys built-in particle emitters&lt;/h2&gt;

&lt;p&gt;I’ve been meaning to augment how effects are done in Electric Noir for a while, so this weekend while I was upgrading the project, I spent some time in a new project playing with particle emitters. I haven’t really worked with them before, other than following a few tutorials online. The goal this time was to really build something on my own and figure out the ins and outs of what my workflow might be to create some interesting effects.&lt;/p&gt;

&lt;p&gt;My first test was making fire. Something that is pretty easy to do, even in sprite based art, but the good thing about using a particle emitter is that the fire will always be unique, so not every fire looks the same in your game. I also figured I could probably tweak whatever I ended up with into some kind of explosion effect later on, so much like the rest of humanity, fire is where I started my tech journey.&lt;/p&gt;

&lt;p&gt;I played around with using a single particle emitter but I wasn’t getting the results I wanted. So I eventually switched to using three of them, stacked on top of each other, each one rendering on different sorting level. I used one for the darker orange of the fire, one for the lighter yellow of the fire, and the last one would handle the bright white to yellow center. Each emitter used the same material and texture, a 4x4px sprite with the four corners removed so it looks somewhat rounded.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/dev-log-2020-08-04/pixel-texture.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I adjusted the size, color over time, noise and velocity over time until I was happy with how the particles were moving and then I worked on getting the effect to look more like pixel art. To do this I created a new layer in the game “Effects (No Display)” and moved my particle effects onto that layer. Next I created a camera that would only be able to see this new layer and set it to render to a Render Texture which I made incredibly low res (64x64). Once I had the effect rendering to this texture there wasn’t much work left, just add the texture to a quad in the scene and I had the following effect in my project:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/dev-log-2020-08-04/ExamplePixelFireEffect.gif&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;img-caption&quot;&gt;
    the final effect, shown in the scene and game views.
&lt;/div&gt;

&lt;p&gt;I’m switching between the scene view and the game view in the gif to show how the particle effect actually looks vs the final in-game composite in the render texture.&lt;/p&gt;

&lt;p&gt;Im pretty happy with this, especially since it is 100% modifiable in unity without needing any art asset changes. One thing I’m not sure about is how multiple effects would look on the screen, since I think that would require juggling multiple render textures… and AFAIK the only way to isolate RTs is by render layer… which are limited in Unity (I think there are 32…).&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="art" /><summary type="html">Unity Upgrade!</summary></entry><entry><title type="html">Dev Log 1.5</title><link href="http://electricnoirgame.com/2020/02/22/dev-log-1-5.html" rel="alternate" type="text/html" title="Dev Log 1.5" /><published>2020-02-22T06:00:00+00:00</published><updated>2020-02-22T06:00:00+00:00</updated><id>http://electricnoirgame.com/2020/02/22/dev-log-1-5</id><content type="html" xml:base="http://electricnoirgame.com/2020/02/22/dev-log-1-5.html">&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ekKo5J4J4wY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;height: 315px; width: 560px;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;In case you haven’t seen it already, &lt;a href=&quot;https://www.youtube.com/watch?v=ekKo5J4J4wY&amp;amp;list=PLf4AETuDnuX6JUV24-yNQYX3mJYeWu6zL&amp;amp;index=2&quot;&gt;the first video dev log for Electric Noir is up on my YouTube channel&lt;/a&gt;. It covers how Electric Noir got started, all the prototypes I worked through and the currents state of the game. Give it a watch and let me know what you think in the comments.&lt;/p&gt;

&lt;p&gt;I plan on creating video dev logs regularly, though I haven’t decided on how often that will be. Written blog posts like this one will be used to show off more achievements that are more code oriented, or more deeply cover game mechanics.&lt;/p&gt;

&lt;h2 id=&quot;grappling-and-throwing&quot;&gt;Grappling and Throwing&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/ThrowingEnemy.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Since the dev log video I’ve added grappling and throws to Electric Noir. The player can grab an enemy by pressing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RB&lt;/code&gt; and once they are grapppled, the player can press &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt; to throw them.&lt;/p&gt;

&lt;p&gt;The throws follow a set of bezier curves that are stored at edit time and evaluated during play time. The throws can be configured, including changing the throw distance, the duration, and the number of bounces right in the unity editor.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/ThrowCurveInspector.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;combo-chaining&quot;&gt;Combo Chaining&lt;/h2&gt;

&lt;p&gt;The next big addition to the game is combo chaining. The player and enemies can now execute attack combos - like a three punch combo or a heavy attack followed by a ground smash. Combos are basically a very simple sort of tree that gets evaluated at play-time.&lt;/p&gt;

&lt;p&gt;The next move the player or AI executes depends on what their current attack is and which various &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ComboCondition&lt;/code&gt; objects are met. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ComboCondition&lt;/code&gt; is a ScriptableObject that is created within unity and can be a check for almost anything - have you unlocked a specific move, what input are you pressing, what level are you, are you near a dead enemy, etc.&lt;/p&gt;

&lt;p&gt;I’m happy with this sytem and I think it will allow me to create a lot of different combos with the minimum of effort.&lt;/p&gt;

&lt;h2 id=&quot;deferred-logging&quot;&gt;Deferred Logging&lt;/h2&gt;

&lt;p&gt;One bug that I had to overcome was in the initialization part of the game - the stuff that spins up so that the rest of the game can work: Config, Logging etc. This is all in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GameContext&lt;/code&gt; object and the problem was that I made some changes along the way that made most objects throw an exception when retrieving a configuration setting or creating a logging instance. This basically meant that nothing worked when the game loaded :(&lt;/p&gt;

&lt;p&gt;This forced me to rethink how logging objects are initialized within the game objects themselves. Before there was a tight coupling between the gameobjects and the GameContext, which is why the exceptions were happening if the GameContext couldn’t load (or wasn’t ready in time).&lt;/p&gt;

&lt;p&gt;So I crafted a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DeferredNoirLogger&lt;/code&gt; class that acts as a pass-through for logging calls. Each game object now instantiates this deferred logger and makes logging calls as before. Under the hood, the deferred logger launches a coroutine if it detects that the GameContext is not ready. While it is waiting for a valid context it captures all the logging calls made to it and stores them in a queue. Once the GameContext is loaded and ready, a internal logger instance is created and the queue is flushed to it. From that point on logging calls flow through to the internal logger instance.&lt;/p&gt;

&lt;p&gt;I’ve included an example of the code below.&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DeferredNoirLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;INoirLogger&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NoirBehaviour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;INoirLogger&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_internalLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;INoirLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_internalLogCallQueue&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;INoirLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&amp;gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DeferredNoirLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NoirBehaviour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_context&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Enabled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LogLevel&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Level&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IEnumerator&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;CoWaitForGameInitialization&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GameObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FindObjectOfType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NoirGameContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;WaitForSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.1f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GameObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FindObjectOfType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NoirGameContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_internalLogger&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;call&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_internalLogCallQueue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_internalLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_internalLogCallQueue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LoggingEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LoggingLevel&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LogLevel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_internalLogger&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_internalLogCallQueue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_internalLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ... more calls like Debug() for all interface methods&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This immediately fixed my issues with exceptions on game startup. Getting game configuration within gameobject &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Awake()&lt;/code&gt; methods is still an issue however. As a workaround I’ve moved all the code that depends on configuration into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Start()&lt;/code&gt; for the gameobjects that need it. This should be good enough for a while and I really hope I won’t have to craft some kind of deferred configuration system.&lt;/p&gt;

&lt;p&gt;So that’s a quick-ish update on all the things that I’ve been working on. I’m working on another dev log video, which will cover the first alpha that I created, including the feedback recieved and changes I made coming out of it. If you haven’t already follow the &lt;a href=&quot;https://twitter.com/electricnoir&quot;&gt;game twitter account&lt;/a&gt;, subscribe to the youtube channel and check back here for more updates on Electric Noir!&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="game-internals" /><summary type="html"></summary></entry><entry><title type="html">Enemy States &amp;amp; Logging</title><link href="http://electricnoirgame.com/2019/09/29/enemy-states-logging.html" rel="alternate" type="text/html" title="Enemy States &amp;amp; Logging" /><published>2019-09-29T06:00:00+00:00</published><updated>2019-09-29T06:00:00+00:00</updated><id>http://electricnoirgame.com/2019/09/29/enemy-states-logging</id><content type="html" xml:base="http://electricnoirgame.com/2019/09/29/enemy-states-logging.html">&lt;p&gt;&lt;img src=&quot;/assets/images/code-hero.png&quot; width=&quot;624&quot; height=&quot;430&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve been spending my time the past few weeks cleaning up various parts of the enemy code in Electric Noir. The feedback from the alpha made it clear that the enemies – though basically functional – needed a lot of improvement.&lt;/p&gt;

&lt;p&gt;One of the biggest inconveniences of the codebase was the lack of a standardized way to handle enemy state. Enemies were just a collection of methods that would get called depending on which one the enemy code set into a pointer.&lt;/p&gt;

&lt;p&gt;This worked, and probably would have worked well in a game that didn’t need a ton of shared enemy logic, but with so many enemies sharing similar logic it was obvious afterwards that this approach was going to cause me a lot of pain later on.&lt;/p&gt;

&lt;p&gt;So I put together a pretty basic state machine where states are classes that can be created or inherited – to help share state code between enemies. It’s nothing spectacular, just enough to do what I need at the moment.&lt;/p&gt;

&lt;p&gt;Each state implements the following interface.&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IState&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;   
    &lt;span class=&quot;n&quot;&gt;INoirLogger&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Log&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;BeginEnter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MonoBehaviour&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;EndEnter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;IEnumerator&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StateBeginExitEventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OnBeginExit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;EndExit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnDrawGizmos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Each state has &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeginEnter&lt;/code&gt; called when the state is being transitioned to, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EndEnter&lt;/code&gt; being called once the state is fully in control. After that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Execute&lt;/code&gt; is called in a loop until it no longer yields or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeginExit&lt;/code&gt; is called with a new state. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EndExit&lt;/code&gt; is called once the state is transitioned away from.&lt;/p&gt;

&lt;p&gt;Having this simple standardized process around states lets me share more code across enemies – and other objects that can use the same states, like bosses, or companions. This will make creating new and interesting enemy archetypes much easier than before.&lt;/p&gt;

&lt;p&gt;I’ll cover the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OnDrawGizmos&lt;/code&gt; method in another post, but yep, each state can draw their own gizmos. The INoirLogger, as you’ve probably guessed is my custom logger, which I’ll talk about next.&lt;/p&gt;

&lt;p&gt;I needed to start collecting logs so I could request them from folks that encountered issues. A lot of players reported issues where the dialogue system was broken for them, or a cutscene didn’t play right (I’ll cover more on those in another post).&lt;/p&gt;

&lt;p&gt;Having some logs to look at would help a lot in tracking down those issues. Right now all I have to go on is whatever the player typed up in their feedback, which isn’t a lot.&lt;/p&gt;

&lt;p&gt;Logging was a bit harder to get into the game, mostly because I wanted logging to be able to be added easily to any object that wanted it, and to have it be performant enough that it could handle being called in an update loop during development without crushing the game performance.&lt;/p&gt;

&lt;p&gt;After a while I ended up with a logging system I’m pretty happy with, it supports logging levels, which can be overridden by component, and it’s initialized automatically at the start of the game and added to my base MonoBehaviour, so it can be used anywhere I need it.&lt;/p&gt;

&lt;p&gt;I’ve included a small sample below showing the debug logs for an enemy switching from their EnemyIdle state to EnemyAttack. Another bonus of the logger is that it automatically includes the frame number in debug mode.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2019-09-29 00:14:55 DEBUG [EnemyIdle] frame=1868 ChangeStateImmediate newState=EN.Enemies.States.EnemyAttack transition=NoopTransition
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1868 HandleStateBeginExit nextState=EnemyAttack transition=NoopTransition
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1869 Execute done. Waiting for transition state=EnemyIdle
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1869 Execute running transition Exit() state=EnemyIdle
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1870 Execute switching to new state state=EnemyAttack prevState=EnemyIdle
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1870 choosing next attack
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1870 attackType=Quick
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1870 move=Quick Jab hDmg=120 wDmg=80
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1870 Execute running transition Enter() state=EnemyAttack
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1871 SetupAnimation creating AnimatorOverrideController
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1871 SetupAnimation overrides=3
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1871 SetupAnimation Attack=TestEnemyQuickJab
2019-09-29 00:14:55 DEBUG [StateMachine] frame=1871 Execute running state state=EnemyAttack
2019-09-29 00:14:55 DEBUG [EnemyAttack] frame=1871 Execute playing animationState=Attack
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The format of the log is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{timestamp} {loglevel} [{component}] {debuginfo} {logmessage}&lt;/code&gt;. One of the more important parts of logging is that you want to keep like information lined up as much as possible. It makes scanning the log file a lot easier.&lt;/p&gt;

&lt;p&gt;I’m definitely happy with these two new improvements to the game, I’m going to be sharing a few more code and internal system updates in the coming weeks as I work through the feedback from the alpha.&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="game-internals" /><summary type="html"></summary></entry><entry><title type="html">Art Log: The Main Menu</title><link href="http://electricnoirgame.com/2019/09/06/art-log-main-menu.html" rel="alternate" type="text/html" title="Art Log: The Main Menu" /><published>2019-09-06T06:00:00+00:00</published><updated>2019-09-06T06:00:00+00:00</updated><id>http://electricnoirgame.com/2019/09/06/art-log-main-menu</id><content type="html" xml:base="http://electricnoirgame.com/2019/09/06/art-log-main-menu.html">&lt;p&gt;&lt;img src=&quot;/assets/images/mainmenu-hero.gif&quot; width=&quot;624&quot; height=&quot;430&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The first look at the new main menu for Electric Noir! It shows off the city, some of the weather as well as the “Rise” (slang for high rise) that the player lives in – and where the game gets its name from :).&lt;/p&gt;

&lt;p&gt;It’s laid out in Unity using a timeline + cinemachine for the camera movement and custom scripts for the menu and parallax effect.&lt;/p&gt;</content><author><name></name></author><category term="development" /><category term="art" /><category term="design" /><summary type="html"></summary></entry><entry><title type="html">Alpha Playtest Results &amp;amp; Alpha 2 Plans</title><link href="http://electricnoirgame.com/2019/08/29/alpha-update.html" rel="alternate" type="text/html" title="Alpha Playtest Results &amp;amp; Alpha 2 Plans" /><published>2019-08-29T06:00:00+00:00</published><updated>2019-08-29T06:00:00+00:00</updated><id>http://electricnoirgame.com/2019/08/29/alpha-update</id><content type="html" xml:base="http://electricnoirgame.com/2019/08/29/alpha-update.html">&lt;p&gt;Hey everyone, It’s been a few weeks since the first alpha release and I’ve been wanting to post an update on how the release went, the feedback I’ve gotten so far as well as plans for Alpha 2.&lt;/p&gt;

&lt;p&gt;Before any of that I want to give a shout to everyone who played the alpha. Thank you so much for playing and giving your input on how to improve the game. It’s amazing to see how many of you love the game so far and care about making it the best game possible!&lt;/p&gt;

&lt;h2 id=&quot;the-results&quot;&gt;The Results&lt;/h2&gt;

&lt;p&gt;So far the feedback has been really really good. I’ll post some screenshots of comments I’ve received and the rest I’ll break down by topic/issue ’cause a lot of folks noticed the same few issues (as you’d expect).&lt;/p&gt;

&lt;h2 id=&quot;the-goals&quot;&gt;The Goals&lt;/h2&gt;

&lt;p&gt;The goals of the alpha were two fold:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Build/Test the combat and player movement mechanics, basically all of the combat game loop&lt;/li&gt;
  &lt;li&gt;Get feedback on the narrative game loop design – this was still in early development, but the narrative is going to be a big part of EN so I wanted to get it out there ASAP.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;the-good&quot;&gt;The Good&lt;/h2&gt;

&lt;p&gt;Everyone liked the look of the characters, and the environment. I didn’t get any negative feedback on the art style, which is a big relief because other than the actual mechanics, it’s the part of the game I stress over the most.&lt;/p&gt;

&lt;p&gt;Also, folks called out the dialogue/lore as something they enjoyed and wanted to know more about. This was unexpected, the section of the game that I released is extremely far into the narrative, but it checked the two goals for the alpha best so I ran with it. Glad it paid off here.&lt;/p&gt;

&lt;h2 id=&quot;the-not-so-good&quot;&gt;The Not So Good&lt;/h2&gt;

&lt;p&gt;Ok, time to talk about the things that need to be worked on:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cutscenes&lt;/em&gt; – Pretty much everyone ran into bugs with the cutscenes. Characters didn’t play the right animations, or you could even trigger animations during them, music did or didn’t play, the wrong music played, wouldn’t stop playing, kept playing on the menu, dear god make the music stop playing…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stamina, Cool-downs, Health, “Mechanic Feedback”&lt;/em&gt; – There is a stamina system in EN, there is also a internal cool-down setting for each attack – to prevent spamming. Seems I left this value set too high for pretty much every attack as almost everyone ran into issues where they couldn’t attack even though they had stamina.&lt;/p&gt;

&lt;p&gt;Also the UI feedback for healing – when you can heal, how much has healed, when you take damage, isn’t very helpful to the player.&lt;/p&gt;

&lt;p&gt;And the gun. Yeah, the gun has problems too. Namely it’s not clear how the ammunition works with the gun. This is because honestly, I’m not even sure how the ammunition system should work with the gun. I should have pulled the gun from the alpha since it wasn’t 100% but I yolo’d it and am now sorry I did.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Actual mechanical issues&lt;/em&gt; – Thankfully there aren’t a ton of these. Players mentioned that Ode feels too fast when moving, but their attacks freeze them in place when they feel like they should move them forward.&lt;/p&gt;

&lt;p&gt;Also none of they players said they enjoyed having to stop while firing the gun. Having the player stop to aim was a conscious design choice on my part, I wanted shooting to be a risk during combat, something the player would have to use tactically, rather than as a crutch during fights.&lt;/p&gt;

&lt;p&gt;I already plan to spend more time on the guns ammo, so revisiting the rooted while shooting mechanic is also on the list of stuff for Alpha 2.&lt;/p&gt;

&lt;h2 id=&quot;alpha-2&quot;&gt;Alpha 2&lt;/h2&gt;

&lt;p&gt;This conveniently segues me into the next part which is all about whats on the agenda for Alpha 2.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I already mentioned the gun, but… yeah the gun. All the gun mechanics are on the exam table for the next update.&lt;/li&gt;
  &lt;li&gt;Fixing those cutscene bugs&lt;/li&gt;
  &lt;li&gt;Fixing stamina related combat issues. I want the player to be able to attack whenever they press the button (within reason). A dev friend of mine suggested always allowing the player to attack, but reducing damage when out of stamina. I think this is what I’ll try in the next update.&lt;/li&gt;
  &lt;li&gt;More narrative focus. Time to double down and really put some effort into the narrative aspects. This includes:&lt;/li&gt;
  &lt;li&gt;Fixing dialogue system bugs&lt;/li&gt;
  &lt;li&gt;Adding in quests and crime investigation mechanics&lt;/li&gt;
  &lt;li&gt;Expose a bit more of the lore and setting of Electric Noir&lt;/li&gt;
  &lt;li&gt;New enemy! I want to add a new enemy to the game to try and change up the combat a bit. The combat in the last alpha was more ranged than I think I want for the game. Yes, it’s the future and folks canonically will have guns, but I didn’t like the ranged combat in that level as much. Possibly because of all the gun issues I need to work through, but focusing the combat on melee should help find more of the fun in EN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As for a timeline on the next alpha, I don’t have a release date explicitly set yet, but it’ll drop sometime in September. I’ve already been working on a few of the issues and I’ll be sharing more progress on the Electric Noir twitter account, so if you liked the alpha or what you’ve read here, be sure to give it a follow for more updates!&lt;/p&gt;

&lt;p&gt;Also, as promised I’ve included some highlights from the feedback that I got from the last alpha below. I’ve got a lot of exciting work to show off in the next alpha, I can’t wait to release it!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/alpha1-feedback1.png&quot; /&gt;
&lt;img src=&quot;/assets/images/alpha1-feedback2.png&quot; /&gt;
&lt;img src=&quot;/assets/images/alpha1-feedback3.png&quot; /&gt;&lt;/p&gt;</content><author><name></name></author><category term="alphas" /><category term="playtesting" /><summary type="html">Hey everyone, It’s been a few weeks since the first alpha release and I’ve been wanting to post an update on how the release went, the feedback I’ve gotten so far as well as plans for Alpha 2.</summary></entry><entry><title type="html">Electric Noir Alpha is out!</title><link href="http://electricnoirgame.com/2019/08/09/alpha-announcement.html" rel="alternate" type="text/html" title="Electric Noir Alpha is out!" /><published>2019-08-09T06:00:00+00:00</published><updated>2019-08-09T06:00:00+00:00</updated><id>http://electricnoirgame.com/2019/08/09/alpha-announcement</id><content type="html" xml:base="http://electricnoirgame.com/2019/08/09/alpha-announcement.html">&lt;p&gt;&lt;img src=&quot;/assets/images/alphaannounce-hero.png&quot; width=&quot;624&quot; height=&quot;430&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Hey Everyone,&lt;/p&gt;

&lt;p&gt;I’ve been working on this game, Electric Noir, part-time for about 6 months now and it’s finally in a spot where I can get some constructive feedback on a few of the core systems. This version here contains a single area of the game built to show off some of the games narrative and combat systems.&lt;/p&gt;

&lt;p&gt;I’ve made a few small games before, but nothing quite like this before and would love some feedback or suggestions on how to improve on it.&lt;/p&gt;

&lt;p&gt;You can download the game over on itch.io: &lt;a href=&quot;https://literally-a-cat.itch.io/electric-noir&quot;&gt;https://literally-a-cat.itch.io/electric-noir&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you can submit feedback about the alpha here: &lt;a href=&quot;https://forms.gle/GgDTy2wvSqMPLqXTA&quot;&gt;https://forms.gle/GgDTy2wvSqMPLqXTA&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;can-i-stream-the-alpha&quot;&gt;Can I Stream the alpha?&lt;/h2&gt;

&lt;p&gt;Yes! I’d recommend starting up the alpha before you stream, just to be sure it launches ok and looks good. Also, if you know you’re going to stream it ahead of time hit me up on twitter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@codeimpossible&lt;/code&gt; , &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@electricnoir&lt;/code&gt; or on twitch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@literally_a_cat&lt;/code&gt; as I’d love to see you play and be there to answer any questions.&lt;/p&gt;

&lt;p&gt;Thank you so much for playing and I hope you enjoy this first alpha of Electric Noir.&lt;/p&gt;</content><author><name></name></author><category term="announcements" /><category term="alphas" /><summary type="html"></summary></entry></feed>