Progress Report - December 17th, 2023
Hi, it's been a while hasn't it? It's been a whole month in fact. Some of that time is due to me getting a better computer. It took me around a day to transfer all my data and adjust to it. I also spent a couple days working on the video that's basically an overview of everything I added.
The process was alright though. It gave me a much needed break after the work I put in. I've been that that grind over the course of the month. I guess that break I took really does wonders. So let's get into it.
Video Overview
If you're not interested in reading. I took the time to prepare a video detailing everything that I've implemented. The video is fully voiced, and scripted which is something I haven't done before. For most of you, this may be the first time you heard my voice.
My voice can be incomprehensible at times. Which is why I took the time to add closed captions to the video as well. The process of adding captions is actually super easy as I pretty already had the script. Makes me wonder why other youtubers add captions to their scripted videos as well.
So all you really have to do to catch up is to watch this video. Although, this post may contain some after thoughts about the changes I made. If you want to know, you can continue reading.
AI Nodes and Pathfinding
You remember in the previous progress report where I said I do this one thing? I did the thing! I implemented actual pathfinding using AI nodes. Probably the most complicated thing I've every written in programming, but most likely not.
The best explanation I could give on how it works is that it uses the A* Pathfinding Algorithm, but with designated preset points on the map instead of tiles. These designation points can be referred as AI Nodes. Every AI Node is link together to form a node graph. Which will be used by enemies and familiars for pathfinding.
If you don't know already, this system is taken from how games made in the Source Engine used to handle pathfinding for their NPCs. Even though how they've done it is probably more complicated than how I done it, I'm still proud of the fact that I could understand how it would generally work just by looking at it. Just goes to show how my programming and problem solving skills have improved. On top of that, the pathfinding system is very efficient as there were no freezes whenever it's used. Even on my old computer.
The Wraith Enemy
This enemy is created to test the pathfinding system. Literally took me only around 2 hours to implement this enemy's full functionality which is crazy. This enemy shoots projectiles at the player. When the player gets out of their field of vision, using pathfinding, it will go to the last place it saw the player to try to find them again. Pretty much works exactly as I wanted it to. I have nothing else to say for now.
Familiars
The main focus of the update, and one of the core features of the game that I've been waiting to add for a long time. Familiars are supernatural beings you can contract. Think of them as party members that follow you around and try to assist you in any way they can.
Familiars typically have magically/supernatural capabilities while the player themselves and their sub-weapons are more grounded. Each one of them will be designed with different purposes like: Offensive, Defensive, Supportive, and Utility. As such, I would want familiars to be a necessity to survive in the final area in the game.
Sigils
By default, the player starts with no familiars assigned to them. However, they can contract one by interacting with these objects called Sigils. Every time you start a new game, there is a chance that a Sigil can spawn in a set location around the map. The chances on them spawning depends on the area and what familiar you'll be contracted with upon interacting with them also depends on that factor as well.
Healing
Like the player, familiars also have a life bar that depletes when they take damage. A familiar's vitality derives from your willpower. This means that you can heal your familiar at the cost of your Morale. A cost that varies depending on how much health the familiar is missing. If your familiar dies, they will be rendered completely unusable. You can revive them if you have enough Morale to heal the familiar back to full health.
Originally the player would have to use their own health to heal their familiar, but I decided against it for reasons that will be explained later. I think I made the right call by having the player's Morale as the cost. Before, MP is only used as ammo for Sub-Weapons. It's fine on it's own, but considering that the chances getting sub-weapons are completely random. It's possible for players to go through the majority of the game without even obtaining a sub-weapon. Making Morale Points useless most of the time.
Not only will this give another use for Morale for the time being. I feel this will create a layer of depth on how players should use their Morale.
Enemy Targeting
The enemies now factor in the player's familiar if they have one. How enemies decided who to target is based on a single integer that will be incremented or decremented depending on the player's or familiar's actions. I refer to this integer as aggro. When I was implemented the aggro system, I didn't have to change the current enemies that much in order to adapt to the changes. I'm proud that my code is that flexible I guess.
Abilities and their cost.
The player can order their familiar to activate a special ability. This special ability is different for every familiar and it costs some of the player's health to use it. While the ability is activating, the player and familiar will be locked into a special state. that when interrupted, the ability activation will be canceled entirely.
Deciding what the cost would be for activating a familiar's ability took me a while. Originally, familiars would have a special resource known as Mana used for activating abilities. (This was way back when the resource used for sub-weapons are referred as "Spades) I have thought of making it so abilities costs the familiar's own health, but that is a problem for multiple reasons. One of which being that enemies will be able to target the familiar as well, and the fact that familiar's are AI controlled instead of being fully controlled by the player.
Since offensive familiars will regularly be attracting the attention of enemies, they will constantly take unavoidable damage as they can't dodge. This also acts as a reason I decided to rethink how familiars are healed as the player would have to constantly use their health just to revive their dead familiar.
I eventually settled on having the familiar use the player's health as the cost to their ability instead of their own. This would be an reliable option as the player will be able to dodge enemy attacks and not be damaged as easily. (Well as long as that player doesn't have a skill issue)
My decision to have familiar abilities use the player's health does have an effect on the game. For one, armor is now more important to have as they basically act a second source of health that won't be affected when using familiar abilities. So I may consider increasing the odds of gaining armor from a crate.
What's Next?
I'm gonna continue work on the game on Monday. When the day comes, I will fix some that bugs that were discovered after I finished the update. I will make some changes to balance the game, like changing the maximum amount of armor the player can have. Then, I'll perform some experiments in an attempt to optimize the game further.
I'll be doing all of this to warm myself up to implementing the last core mechanic to the game: Objectives. Yeah, remember when I said this is supposed to be a game where you complete objectives to win? Can't believe I spent so much time without adding what's pretty much the win condition to this game.
Links
I'm am still looking for play testers. If you're interested, you can add me on discord. My discord username is "proarch." (With the period)
Well, I'll see you guys next month, hopefully.