Becoming a competent Unreal developer is my current objective, and I like to take a project-driven approach to teaching myself. Having gone through a number of 2d game projects from Udemy, I felt confident scoping and planning this one-off boss fight to discover the complexities and limitations in implementing a slice of gameplay. As always, any art taken from the free Infinity Blade project is drawn by my hand.
The goal for the fight is to take down the boss before he can reduce the entire party's HP to zero. If the NPC Leslie's HP is reduced to zero, the fight automatically ends.
The fight has four party members, each with a mix of generic abilities like healing and attacking that work the same way, as well as abilities unique to them that you might imagine were unlocked via RPG leveling mechanics. Each ability can be modified by spending a point of willpower, and even the common abilities may be modified in ways that are unique to each party member. This built questions of inheritance and action abstraction to bear when settling on architectural design.
To challenge myself, I though hard about what might be appropriate boss mechanics to introduce into the fight. The AI is extremely rudimentary; although it's still a long-term goal to learn Unreal's AI systems, it wasn't appropriate for the style of gameplay. His attacks are pseudo-random, although he will make more of them each turn as the fight progresses. His targets are purely random, but he will prioritize physical attacks against his target, Leslie, if she is undefended.
Specific body part targeting was an early consideration, late addition once I felt I was within project deadline and confident in the risk/reward.
Overall, this project is throwaway code. It was a phenomenal learning experience to better grasp the Unreal way to structure your architecture, but I do want to learn to better rely on C++ except where I would imagine a designer fine-tuning.
The boss mechanics are far too hard-coded; while his abilities integrated seamlessly into their own action queue, oddball rules like dropping / using the hammer were not implemented generically. Similarly, I had a very naive grasp of data systems when detailing player stats, abilities, etc.. While I did use Data Assets and Data Tables, I feel I could have better integrated them into the loading sequence. And, in general, a serialization system would need to be implemented before making this into a complete game.
It will be my priority to find concrete architectural answers to these questions as I move the game to C++ and expand it from a single fight into a full game loop.