Spite Beyond Salvation
Spite: Beyond Salvation is an ARPG made in 10 weeks halftime at The Game Assembly in our engine Memory Leek. In Spite: Beyond Salvation you play as plague doctor that has been ordered to purge the plague of Hillford by burning it to the ground.
In Spite me and Oscar Åkesson implemented a node editor for scripting. We used a base editor we got from our scripting course but we expanded upon it by implementing std::any. Our plan was that this would allow our designers to create entities and component from the node system. We however did not have time
build all the required nodes for this and our designers didn’t have time to iterate on the scripts. It did however help us programmers by making it easier to add new pin types and made the nodes faster to implement. This how the nodes looked in the original system:
And this how it looks after implementing std::any:
The old system required the user to add new enum entries and going into the node editor to define how this new type should be handled. Getting data out from the pins is also easier has fewer steps.
I also implemented script hot reloading. All the user must do is to save and all script-components with that script will automatically update. This significantly helped speed up the iteration on the scripts. This was made by in checking in the Script system if its factory copy has been updated.
Since script hot reloading was not required in the final game both this check and the pointer to the factory version is compiled unless ALLOW_HOT_RELOADING_SCRIPTS is defined.
Spite was the first game that required animations and I got to implement them. We built upon a library that required each instance to have an animation controller that needed to load in the full bone structure for each animation. This made the constructions of the animation components very heavy. I refactored it so that instead the controller is loaded only once. Now instead our components only contain the animations state and timings. When the instances are to be rendered it sends the state and timings to the model and it in turn returns the bone matrices.
I also implemented animation events. The events for each animation are written into a json file that is load when the game starts. I integrated the animations event with our node editor. This made it possible for our designers to use those events in their scripts. It was also used in the scripts for our footstep sounds.
To help our group early on development I created an ImGui editor that allowed models to be spawned, set the player animation and a particle editor. Before we had the particle editor our Technical Artist had to edit the values of the emitters in a json file.
Some other things I made for this project were a cut out shader, expanded upon our collision system to handle OBB-Sphere and gave our enemies a separation controller to stop them from walking into eachother.