It was a highly productive week. 100% of my time went into features and fixes that are required for the initial release (not always the case).
Status effect icons. Enemy status effect icons now appear above the enemy. Player status effects are now represented as icons as well, located next to the health bar.
Loading screen. New levels now display a loading screen, complete with a progress bar and text describing what is currently happening. At first, the progress bar was based on AsyncOperation.progress, which tracks the progress of an asynchronous scene load in Unity. The bar quickly got to 90% and then hung for around ten seconds. This delay was, of course, the procedural generation. Luckily, when I made the map generation visualizer last year, I had to reduce map generation into hierarchical, independent units of work – maps are generated by a series of processors, processors are composed of stages, stages are composed of substages, and substages are composed of tasks. The tasks are pre-generated and placed in a queue. This enables the map generation visualizer to display the result of one task at a time and interactively fast forward through substages, stages, and processors. It also makes it easy to calculate the progress percentage. I only had to make a slight modification to make it work with the loading screen progress bar, which was to wrap it in a coroutine and have it yield after each substage so that the UI could update the status.
Cell selection improvements. The area of effect is now highlighted and the cell indicator (not just the mouse cursor) is now shown.
15 sound effectsadded.
Next week I’ll take a break from new features to shorten the bug list. Saving and loading is broken again.
Happy Holidays everyone! With a few days off from work this week, I got a lot done! Many of the changes were visual, which always feels more productive. I primarily worked on combat game juice.
Corpses. Slain enemies now leave corpses behind. This increases the player’s impact on the environment and will be used for a variety of mechanics including reanimating corpses, enemies reacting to corpses, and combat modifiers when fighting on a cell containing a corpse. I was pleasantly surprised to find that this feature didn’t require any code changes. It was implemented entirely in the Unity Editor using the custom trigger/effect framework developed earlier in this year.
Particle effect residue. Particle effects can now leave permanent residue, such as blood stains and bone fragments. Along with corpses, this is intended to increase the player’s feeling of leaving a mark on the environment. You can very clearly tell where battles took place and the size of those battles.
New walk and attack animations. After getting frustrated a couple of weeks ago by not being able to make a decent walk animation, I took some time to learn more about classic animation techniques. I applied the squash and stretch technique to walk and attack animations. I also added a slight pause to the beginning of attacks for anticipation. I got much better results this time around, due primarily to a more precise application of squash and stretch.
Replaced animation implementation. In researching Unity animation techniques I discovered Unity’s new 2D Animation package. This package provides a way to reuse animations with different sprites. Previously, I was using what I believe is the traditional methodology – for each animated game object prefab, create an animation override controller for the animation state machine, duplicate the animations referenced in the animation controller, and replace the sprites in the animations. This technique has major drawbacks: 1) it’s tedious 2) it generates a lot of redundancy. If I ever needed to change a common animation such as walking, I’d have to change every copy of the animation. The 2D Animation package provides a way to define an animation only once and swap out sprites based on the game object using the animation. This is done by adding a sprite library and sprite resolver component to each animated actor and configuring animations to reference the spriter renderer properties rather than the sprite directly.
Added a parent to all animated actor prefabs. This was suggested by /u/Notnasiul as a way to use relative positioning in animations and as a general good practice. It took around an hour to go through the existing actor prefabs, add a parent game object, and move the Sprite Renderer component to a child game object. And… it worked great!
Directional attack animations. With the capability to control relative game object position in the Unity animator, and trigger events in animations, I was able to remove the code that was previously responsible for this. This code was complicated. It updated the game object position on each Update() based on an easing function and managed time-based state changes for different points in the animation where events had to occur. I was glad to see it go.
Reconfigured my Unity Editor layout. Up until now I’ve been using the default Unity layout. This layout has been workable but not optimal. The project asset hierarchy panel isn’t large enough, the game object hierarchy panel is too large, and some tabs that need to be viewed concurrently (such as Animation and Scene) are by default in the same panel. I reorganized the panels to better suit the needs of this project. This is the end result.
Next week’s goal is to give level 1 the right amount of challenge. To do this, I’m going to tweak stats and drop frequencies for items and enemies. I want to finish the year with at least one good level. 🙂
Hotbar. The Hotbar is fully functional. Items and abilities can be dragged to and from the Hotbar. The default behavior for the item/ability can then be used by clicking the Hotbar slot containing the item/ability.
Inventory drag and drop. Inventory items can now be rearranged by dragging and dropping. Items are now equipped and unequipped by dragging in and out of equipment slots rather than having to inspect the item and press the Equip/Unequip button.
Tooltips. Hovering over an item or ability now displays a description.
Abilities Window. Players can now see their abilities and use them either from the Abilities window or by dragging onto the Hotbar.
Reformatted screens for 16:9 aspect ratio and made some additional layout improvements.
Refined UI elements. I added some more visual flair to panels and buttons.
Next Week’s Goals
Next week, to complete the August goals, I need to implement save/load for the Hotbar and finish up the Abilities Panel. Then it’s on to the September features: enemy alerts, abilities, sound effects (first iteration), and Character and Options windows.
Two Release 3 features completed this week: Class Selection Screen and Continue Game Screen.
Only three classes will be available when the game is installed. Additional classes can be unlocked for a total of 16. I haven’t determined how the additional classes will be unlocked yet.
An unlimited number of games can be saved and resumed at a later time. Games are saved automatically when a new game is started and on application exit. A saved game is deleted when it is loaded to prevent save scumming.
Aside from new features, I did some more cleanup from the big actor refactoring two weeks ago.
Next week, I’m starting on the hotbar and doing a lot of design work on spells and abilities.
Improved cell highlighting. When selecting a target cell to shoot at or throw an object at, highlighting now excludes cells that can’t be seen
Improved actor tracking. Enemy and NPC AI controllers were hardcoded to track the player. This caused a bug where other actors weren’t tracking the player because they were being instantiated during map generation, before the player was instantiated. But, the real problems were that a) the AI should determine what is being tracked instead of hardcoding it and b) the decision to track should be made when the other actor becomes visible, not when the tracking actor is created. I removed the hardcoding, extended the AI to determine what an actor tracks, and moved adding tracked actors to the point when the tracking actor sees the actor to be tracked.
Improved health bar visibility logic. Health bars used to appear over every damageable, dynamic actor. Now they only appear when an actor has been damaged, and appear for static actors like doors.
Miscellaneous refactoring and code improvement, which includes:
Changing variables from public to private
Removing unused classes and code
Consolidating redundant code
Many bug fixes. When things break, I’m spending more time on the fixes to lower the chance of the same things breaking in the future. I’m making progress but I have a lot of room for improvement.
Trimmed scope. I moved some planned enhancements from Release 2 to Release 3. I’ve been working on Release 2 for 15 months. That’s a lot longer than I want to spend on each release, so I pushed out the remaining planned enhancements to the next release.
Next week, play testing and bug fixing continues as I work toward wrapping up Release 2.