The Hall of Change
Visual Scripted Boss Battle
You know you want to chase that door
The Hall of Change is a piece that has been immensely fun and rewarding to work on.
Wanting to focus on visual scripting and systems, and not so much on game design and AI scripting, I chose to use a simplistic boss fight from Dark Souls as a reference piece. This allowed me to push my scripting and systems creation more, and as a result I feel that I have managed to give the piece quite a high level of polish and fidelity.
I am very happy and proud of my accomplishment and experiences, although I am aware of certain areas of improvement, as well as certain potential complications that could arise in its current state of implementation.
Working on this boss fight, I have learned a lot about using visual scripting, creating tweakable systems, and working with game engines in general.
Goals & Specification
Replicating a reference piece using visual scripting
Adding to the reference piece with my own design
Creating an actually infinite corridor
Creating functional and tweakable systems that others could work with
Six weeks development time, half-time
Using Unreal Engine 4
Paragon characters by Epic
Medieval Dungeon assets by Infuse Studio
Music by Taylor Brook Music
Sound FX, Creative Commons 0, from https://freesound.org
Planar Dissolve Shader from tutorial by UnrealCG
I chose to use the boss Dark Sun Gwyndolin, from Dark Souls, as a reference for this piece. It is a very simple boss, from an AI standpoint, and I reasoned that this coupled with me not having to design the actual boss would allow me to delve quite deep into scripting and systems design instead.
I started pre-production on this piece by researching the reference, watching videos and reading about the encounter to get some idea as to how it actually was created. I proceeded to draw up pseudo code "schematics" of how I envisioned the system should work to get a clearer image before moving on to prototyping its implementation.
During my research I realized that the corridor in the reference piece actually was not infinite. Instead it is just a very long corridor, that takes about six or seven minutes to run through. This felt a bit boring to me and I wanted to challenge myself, so I pursued the path of an infinite corridor instead of strictly adhering to the reference.
Iterating on my pre-production work I soon managed to create an actually infinite corridor, by having the mesh segments passed by the player get moved to the end of the corridor.
The system I hade created immediately presented me with a new problem: as I was moving the mesh segments instead of creating brand new ones, the player would actually see the corridor being removed from behind them. This is obviously immersion breaking as well as just plain bad. I chose to combat this problem in a way that would also add to the experience: I created an additional system that has the corridor's entrance move with the player, but only when the player is not looking at it. This solved my problem and also enhanced the illusion and magical feeling of the corridor.
Adding Upon the Reference
Having achieved my main goal of creating the infinite corridor, I soon started feeling like I wanted to add something more to the boss encounter. In the reference the corridor is empty, except for pillars that litter the sides. These pillars are used as covers as you move up toward the boss.
After implementing pillars in my version as well, I still wanted to mix things up a bit more, to create a more immersive and magical experience. I therefore decide to add a bit of randomization. I designed several object segments, and different wall segments that I randomize throughout the corridor as it is stretched out. This added a whole new dimension to the fight as I was able to have the player move vertically, as well as determining specific teleportation points for the boss to move to. It also makes every playthough a bit different than the last, adding a bit of replayability.
In theory, any designer could create and add a basically infinite number of different obstacle segments to the encounter, which would make for a truly unique experience with every playthrough.
A Potential Issue
The fact that a prolonged fight through an infinite corridor would bring the player further and further away from the world origin is a potential issue I have been considering during the creation of this piece. Fortunately Unreal Engine 4 gives you the ability to relocate the world origin, so I would basically be able to have it follow the player through the corridor, or perhaps better: update it every time the player triggers a segment to move. Currently, that functionality is not implemented though.
Behind the scenes action of the corridor system
The door follows the player, to enhance the illusion,
and also to cover the previous segments that are moved forward
Randomization of obstacle segments
After the boss is defeated, I create the illusion of the corridor shrinking back againg
Boss Design and Systems
A Boss With Minimal AI
As mentioned in the beginning I chose to work with a simple reference boss for this project, as I wanted to focus more on developing my scripting and systems design. The AI in particular was something that I wanted to keep on the down low, as I know developing a good AI takes a lot of time. Thus my choice of reference boss was perfect, as it basically does three things: cast randomized spells at the player, check for the players proximity, and teleport down the corridor if the player actually gets too close.
As I added on my randomized obstacle segments it actually got a bit more complex, as the boss also hade to take them into consideration and search for the correct teleport location. Overall, however, it was pretty straight forward to implement the boss' basic functionality and I think I did a pretty good job of replicating the reference: simple but functional, and somewhat challenging.
Attacks and Telegraphing
When it comes to combat, readability is extremely important and I therefore wanted to focus quite a bit on telegraphing the boss' attacks. Using the animations that followed with the Paragon character I used for the boss, I created animation montages that I use for the boss' different spellcasting abilities and teleportation. On top of this I wanted all the spells to have a brief period of hovering above the boss before they were launched. This gives the player a brief moment of identifying the next incoming spell and preparing for it. To differentiate the spells I used the same, easily tweakable shader, but with different colours. This way I was able to quickly add in a few different spells without having to waste a lot of time trying to differentiate them with unique meshes and effects.
As the reference boss is quite monotonous I felt I wanted to spice my version up a bit by adding a phase change. In the spirit of not wanting to go overboard with the game design however, I decided to keep the phase change pretty simple. As I had set up my boss' spellcasting to be easily tweaked, I decided to just increase the amount of projectiles every spell produced.
To telegraph the phase change, I used the teleportation shader effect to make the boss constantly swirl with magic and shift in colour, and I also added a new particle effect to try to enhance the fact that the boss was powered up.
In retrospect I think I could have done a better job with visualizing the phase change, such as more prominent effect when the change occured, and more angry and intense colours for the boss when it is powered up, to better signify the increased danger.
The boss' behaviour tree. Simple, but functional. Click to enlarge.
Player and boss abilities interacting
The boss entering phase 2
Player Design and Systems
As with the boss I did not want to delve too deep into game design, and seeing as I was already creating a Dark Souls boss, it only felt logical to mimic a simple version of the Dark Souls player character.
Handily enough Epic has been kind enough to present me with a lot of useful assets in the form of their Paragon content. I chose a fitting melee character: Terra, and started tweaking it a bit to my needs. Using the Paragon animations I could quite easily add in animation states that enables and disables the collision on Terra's axe, for the melee attacks.
Animations and Readability
Readability and visual representations of hits is absolutely necessary when it comes to melee combat. Like mentioned above, I thankfully got a lot of this from the get go with the Paragon character. This enabled me to quite quickly create animation montages that I could use in different situations, to create a better readability of the gameplay.
On top of the free systems I got with the Paragon character, I wanted to create a few more systems of my own, to better represent the Dark Souls feeling. Obviously I needed to create a health system, but I also decided to add a few more systems that they have in Dark Souls: stamina, stamina regeneration, blocking, sprinting and healing.
Seeing as stamina influenced a lot of different player mechanics, it had to be interconnected with almost all other systems I created. I therefore created easy to use functions that check the amount stamina before attacking, blocking and sprinting, as well as reduce stamina if any of those mechanics are activated.
The player's melee combo
The player's block mechanic
The player's healing mechanic
Corridor System Blueprints