Spite: Beyond Salvation
Spite: Beyond Salvation is our second project in the second year which is an ARPG Diablo like game where you battle through plagued enemies to defeat the plague god.
For Spite my goals and contributions were to improve the pipelines and adding a node editor to allow our designers to script events and content.
For the node editor and adding script support I used a base which we got from our scripting course, it took a while to adjust it to work in the engine and the base from the scripting course made it almost impossible for multiple persons to work on it simultaneously so I made most scripts and nodes due to this. Me and Emil Löfling worked on the scripting course together and we decided to implement std::any as a base type as the base node editor we got required us to hardcode in all possible combinations in each node and when we did the assignments; our vision for the node tree were for our designers to be able to construct new entities within the node tree and use components which would be easier if we were allowed to connect any type of node into any node. This turned out to be harder to implement than first anticipated when I worked on it and was later put on hold indefinitely due to time restraints. With more time on our hands I'd love to have implemented that as it would have given our designers a huge freedom of design.
An example of how much easier it was to read the nodes after we changed the original nodes to std::any can be seen below.
There is more variables needed and there is more things that could go wrong if the user does something incorrectly. Below is the same node with our implementation.
To make this work as smoothly as possible I had to design nodes to be as easily understood as possible, even if the programmers could do math to determine if the player was behind an enemy or not it would be stretching it to assume that everyone could do the math hence I asked around to make it more intuitive for others to use it, a good example is a for loop node, should it start from 0 or 1, would it be inclusive or exclusive on the limit parameter etc.
After asking with an example and getting multiple answers on how the for node would loop then I decided to go with an approach which would be harder to use incorrectly as "Iterations" is harder to interpret incorrectly.
The boss was mostly done in script, the exception was phase 1 which was basically already done in code so I just made a node which ran said code. The other phases were based on positions around the boss and it summoned enemies and threw attacks towards the player depending on it's health status. To minimize the nodes needed I made nodes such as Throw Potion which took a range and a Spawn Enemy node which took an offset which helped making the nodetree smaller.
I made some Version handling projects which I connected through hooks with SVN which prevented us from committing without compiling first, it also helped our designers to reexport our levels whenever the importer/exporter were updated which could have broken the old levels.
Alpha enemies and alpha collisions for attacks, this was an enemy which ran towards the player, then attacked when getting close, this was later taken over by Mattias Davis.
For Spite we also needed to move away from a menu which used the arrowkeys to navigate the menu so I rehauled it to work with mouse, sadly too late which meant it wasn't pretty but it did the job.