SPITE – OATHBOUND
As a shieldmaiden, slash and strike your way through your draugr-infested hometown, taking on the role of a valkyrie to save the World Tree.
- Team Size: 21
- Duration: 12 weeks (20h / week)
- Engine: Frostheim (our custom engine)
Introduction

SPITE – OATHBOUND is a Diablo 3-inspired action game made developed by a team of students from The Game Assembly Malmö and Östra Grevies Folkhögskola.
We developed a custom engine centered around the graphics engine from our individual courses and an Unreal plugin that exports levels into json format.
Contributions
Level Import
The level import was mostly consisting of parsing a json given by a plugin we used to serialize a level from Unreal. This meant translating the data to be aligned with our engine design. We used a component system with actors with no hierarchy that could only have one of each component type. This difference meant things like components could not be made to always read all the data that was exposed via the json giving Unreal as our exporter several limitations.
When parsing the exported level it was in Unreal’s coordinate space. That meant the transforms needed to be rearranged to fit our coordinate space. This was not as simple as first assumed, however. I discovered after a lengthy debugging prosses Unreal imports models with a different coordinate space than the editor uses.


Unreal versus custom engine
At first, I attempted to fix this by mimicking unreal and rotating models when importing. This meant however that we inherited Unreal’s issues with double standards. Anything models related became way more headache inducing. Instead I made the compromise of adding on the rotation into the model component with the consequence of having differing transforms than Unreal.
Material Import
In the beginning of the project, we were using json files to describe each material. It described the PSO setting, shaders and variables. Setting up each file whenever someone wanted a new material became tedious. As part of the level json we also got the data from material instances parameters. Things like textures and variables were all exported. The only issue we had was not being able to set up our PSO.
After a couple of weeks of working like this we got an update to our Unreal plugin which exposed the parent of the material instance. This meant we could finally make use of that data. Using the parent, I connected it with a json I copied and then filled it with the texture and variables from that specific instance. This significantly sped up the texturing of models and made our jsons act more like material types. That intern made it more workable for our technical artists to create new materials since it only involved creating a json and a base material in Unreal for our artists to instance from.

UI Editor
Together with Melvin Turesson Nilsson we created an in-engine UI editing tool using ImGui. The tool was tailored towards our artists to create functional UI canvases. It can handle sprites, buttons, sliders and checkboxes.

Reflection
With this being one of the longest project which would also influence the next, there was a lot of work put into making things proper. There was a lot of checking up between members to both keep each other informed and get nuanced opinions. A lot of my specific work, both with engine and our pipelines was to make it more sustainable and workable.
