GaMES

Space Chef is the game I worked on during my internship at Blue Goo Games.

I mostly worked on fixing various bugs in the game, but I was not limited to a single area of expertise, so I learned a lot about all aspects of the game, such as the inventory and vendor systems, creatures, player, menus, and UI.

During my time at Blue Goo Games I created a couple of new UI elements, such as the controller layouts for every supported controller on the settings page, and reworked existing ones to add new functionality, such as making the quest tracker minimizable in order to free up some space on the screen.

I also got the chance to refactor some large functions and systems in the codebase that had been worked on by different people over a long time. Some had either gotten too large to be readable, or the people who had created them had left, and no one knew how they were actually supposed to function anymore.
This was more fun than I had anticipated, but it required a lot of time spent simply reading and following the code flow in order to figure out which parts were vital and what could be removed or altered.

Something I spent a lot of time on was to, mostly by myself, implement localization in the game. This was a very fun challenge that involved creating new systems for importing and exporting various assets and ensuring they could translate their text at runtime. I had to create new tools and work with existing ones from different packages, as well as write the documentation for others that might work with the systems in the future.
The first thing I did was integrate the dialogue system with the localization system since it had support for the localization system we had chosen and simply needed to be configured correctly. This didn't take that long, and most of the time during this step was spent reading up on how the localization and dialogue systems worked. I also spent some time setting up the database and external spreadsheets that would be used for all the text to be translated.

I also created a small manager that handled parameters inside strings of text so that we could have text that included unknown variables such as the player name and different items.

Then I searched the entire codebase for all hard-coded strings that were exposed to the player in some way and replaced them with localization keys, moving the strings into text tables. This was incredibly tedious and took a huge amount of time since the strings were spread among a large number of files, with few ways to help locate them apart from manually searching the files for orange text (the color of strings in my editor/IDE).
I then had to create a tool that could import all the keys and texts into the database from the text tables. I also made it possible to export to the text tables as well since the goal was to have the main source of text be the external spreadsheets.

The next step was to connect some partly created systems that were supposed to handle localization for some of the NPC’s reactions and shouts that had never been completely finished.
This included creating a tool that searched through all scenes and prefabs, updated localization keys in various components, and collected the texts that had been set as defaults. The tool was created together with my supervisor.

Lastly, I had to manually search through scenes and prefabs for some UI elements that were not handled in any way that was already being covered by the previous tools and systems and replace them with localization keys. This was not that hard because it was only a couple of objects that we had found while trying out the other systems.

While creating and testing, we used three languages: English, which was the default; Swedish, which we used when testing proper translations; and a test language where all the text was converted to "XXX" in order for us to more easily locate parts of the game that had not yet been localized.

All this work took just slightly more than a month to complete. I manually replaced more than 900 strings, and automated the localization of about 5500 strings.

SPECIALIZATION

I decided to create an Animation Controller as my specialization. The reason behind this was simply that it seemed to be the best choice at the time since it was easy to display visually and there was a need for it in my project group.

Some other considerations were doing something with threading or networking, but I could not think of anything small enough and visual enough to easily show on a web page.

Doing the Animation Controller also meant mixing a lot of the things I find fun to work with: tools and engine programming, system building, and scripting.

I also considered what engine I wanted to use for my specialization. I would have liked to gain some experience in Unreal, since we have not had the chance to work with Unreal Engine during any of the other courses. But since I chose to do an Animation Controller, I felt that it would be better to implement it in my own engine instead. Otherwise, it might not have been much of a learning experience since I could rely on Unreal for many of the functions.

The final thing that tipped the scales for the Controller was that my group needed to improve their animations in-engine in order to blend animations. So I could help both myself and the group by doing something that was in everyone's interest, and since I had created the component systems in both my own and the group's engines, it would be easy to transfer any changes from one to the other.

Originally, I had planned to create an Animation Controller with a built-in state machine, but due to my kids and me taking turns being sick, I realized about halfway through that I would not have enough time to implement a decent enough editor for it to be a viable option.
Instead, I opted to implement some of the other features that had been requested by the animators, such as root motion and additive animations.

Overall, I am happy with the result, even though there are some things I would have liked to turn out better.
I would have liked to add more features to my project, but I was unlucky with sickness in my family and had to spend a lot of the project either sick myself or caring for my children.

The animations, rig, and model used in my specialization were made by Hedvig Kronnäs.

Feature showcase

Editor

  • Render Skeleton, with customizable colours
  • Highlight hovered and selected bone
  • Render Mesh, with option to apply texture and colour
  • Asset browser that only shows Meshes with Skeletons and Animation files
  • Transform to move and rotate Mesh

Animation

  • Slider to select animation frame
  • Controls for playing animation
  • Variable playback speed and animation frame rate
  • Information about data in animation and skeleton (Ex. Bone count, Original FPS, Animation length)
  • Support for root motion

Animation Layer

  • Option to set bone either using bone hierarchy or slider with index
  • Possibility to change selected bone while animation is playing




Blend Space

  • Create new or edit existing Blend Spaces
  • Automatically sorts animations by their Blend values
  • Can handle animations with differing length and fps
  • Support for infinite animations (Or at least until the program runs out of memory)
  • Slider to test how it would look at different values

Additive Animations

  • No limit on amount of animations that can be added
  • Supports all animation types (Animation, Animation Layer, Blend Space)
  • Separate controls for each animation

Currently Additive animations does not work properly, but they will be fixed soon. 

The reason is a math problem that I have the solution for but have not had time to correct.

Below you can find a documentation of my progress during the 8 weeks we had available for this course.

Week 1

Since I was uncertain about what I wanted to do as my specialization I spent the first part of this week to gather information on my options and then deciding which one to choose.

Once I had decided on making the Animation Controller I went to the Animators and sat down with them for a day to see how they worked, what features they wanted, and how they used them. 

Week 2

Was sick the entire week. But still got a little work done on the project while I had enough energy.


Managed to create the base that I would use for showing Animations and Skeletons, and to edit blend spaces.


Was also able to try out a way to make Animation Layers, but did not have time to actually implement it.

Week 3

Was still sick during the first half of this week.


During this week I realized that the current way my AnimatedMeshComponent handled its Animation would make it impossible to implement Animation Layers and Blend Spaces. Thus I decided to move the responsibility of swapping frames and updating the bone cache from AnimatedMesh to the Animation.


I also started looking into how to interpolate between Animation frames, and came to the conclusion that it would be easier to handle it with Quaternions. 

Spent a bit more than a day to learn how Quaternions work and to implement a Quaternion class in my engine.


Once the Quaternion class was done it was a breeze to get interpolation working for both Animations and Animation-Layer.


Then I had just enough time to gather some information from the Animators and Educators about what is to be expected from a Blend Space, such as supporting animations of different length and fps.

Warped model

Messed up the order of some matrix multiplication

The first problem with the old implementation was that Animation was a base class, and even though I could have Animation Layer inherit from Animation, it would not be logical to have BlendSpace inherit from it, and might have caused issues further down the line. 

To solve it I simply created a new base class, AnimationBase, and made Animation and BlendSpace inherit from it. Then I had AnimationLayer inherit from Animation, since the only difference in data between the two is that AnimationLayer keeps an index to the bone it plays from. This also made it easier later when creating the logic for BlendSpace since I wanted to only accept Animations and AnimationLayers in BlendSpaces.


The second issue I had with it was that Animation was only a data container and AnimatedMeshComponent handled all the logic. This made it very hard to create a simple way to play most of the Animation classes, especially if I wanted it to support all of them. 

So I moved all of that logic into AnimationBase and the Animation classes. AnimationBase would hold most of the variables needed, such as timers and flags for different settings. It would also take care of logic that worked the same for all the classes. The other classes simply had to override the functions that needed unique logic. 

Since it was easier to let the Animations themself update the bone cache I made them hold a pointer to the cache they are responsible for. But I still wanted to be able to handle an Animation manually, so I created an interface that allowed for the option of stepping through an Animation and using an external bone cache as well. This was used in the editor later.

Week 4

Started out this week by implementing an external library, created by the school, that acts as a node editor with a completed base for a script graph. I also created a base for the State Machine and State classes i was planning to use.

This was the last thing I did that still followed the original time plan I had created at the start of the project.


Spent the rest of the week creating the BlendSpace class and creating a way to save and load them. 


Also refactored AnimatedMeshComponent since I had updated the interface of the Animation classes again.

Week 5

Since my engine and my groups engine both used my component system, but my groups engine had a more recent version of it with a lot of stability and performance improvements, I choose to update the component system in my engine. 

This sadly broke my project settings in my new engine and forced me to spend a couple of hours on fixing the errors, but I learned a lot about vxproj files in the process.


After that I created the editor for Blend Spaces and fixed the last bits that was needed to make them work properly.


Then I had to stay home for 2 days caring for sick children.

The end of the week was spent merging all the work I had done so far into my groups engine so that the Animators could start using it.

Week 6

First half of the week was spent creating a new resume and cover letter.


The rest of the week was mostly spent caring for my sick children.

Only managed to fix some of the bugs that had been discovered while the group tested out the new system, and also implemented a way to handle if the animation used namespaces or not.


It was during this week that I took a final decision that I would cut the State machine from the project and focus entirely on additive animations and root motion instead. I had considered it in the previous week but never decided anything then.

Week 7

This entire week was spent on creating this website, and all assets shown here.


The logo was created by Malvina Petersson.

Week 8

I spent some time during Easter to create the structure needed for additive animations.


Then once the school week began I rushed to complete the logic. This led to a row of different issues that forced me to wait while a third party had time to help me. 


While waiting I managed to implement root motion. Though I could not properly verify that it worked as intended, just that it moved the object in the desired direction.


Once I received the material needed to continue work on additive animations I was able to create a flawed implementation that only partially worked.

I did manage to figure out how I could solve the problem, but ran out of time before I could apply it to my code.

Elongated legs and arms on model

Found an issue that caused Blend Spaces to warp the model if the animations did not have matching fps

During Easter I began working on creating the interface and structure needed for Additive Animations and the Animation Controller that would handle them. This did not take too long and I still had a lot of time to spend with my family.


Once school started again I began working on the logic to run the Additive Animations. Though once it was done it looked weird and I spent a couple of hours testing out different ways to calculate the bone cache (I sadly can not show the troubleshooting process here on the website since I do not have the rights to the model or animations used during testing, but the weirdness was most notably that the fingers and hands curled backwards in a highly unnatural way).


After consulting my teacher about what it could be, I was told to use animations designed to be additive. Luckily enough I did have some that I had gotten from Hedvig Kronnäs the week before, but had not yet tested. 

Sadly due to some issues with the fbx-importer used in my engine I could not load the model and animations she had supplied, and I had to ask her to reexport them with some other settings. 


While I was waiting to get the new files I decided to start experimenting with root motion. 

Writing the logic for it went a lot faster than I had expected, but I now faced another issue. I had no animations with root motion, and none of the Animators I knew had any available. 


So I headed to Epic and found some free animations that had root motion and exported them using Unreal.
When I tried them it at least proved to me that I had done something right, because the animation moved the object it was attached to. Though it seemed to move it way faster than expected. But since I was unsure exactly how it was supposed to look, and if I had exported it using the correct settings in Unreal, I decided to count it as a success until I had an animation where I could confirm the export settings and verify that the movement speed was correct.


By this point I had gotten hold of the newly exported animations from Hedvig and they worked perfectly. I was finally able to properly test additive animations and managed to work out a way to make them look a lot better than before. But there was still some problems. The arms of the animation was raised slightly and the steps of the walk got shorter. 

Thankfully I managed to finally find a better keyword for the search engine I used and managed to find some resources that actually described the logic behind additive animations and not just how you use them in Unreal. 


Unfortunately I did not have enough time left to apply my new knowledge to the project before the course ended, but I plan on finishing it in order to use it in our groups engine for the eight and last game project.

School projects

This was the first game I ever made.


I worked on power-ups, pick-ups and sound in this project. 


Since it was my first time working with game development a lot of time went into learning how Unity works and how to structure the files and code.


Spent most of the remaining time with finding and editing sound effects and music for use in the game. I was responsible for implementing everything related to sound and music in-game.

This game was made using Unity and was mainly built for Android, but we did produce some versions for PC as well.


In this project i worked mainly with UI, but was also responsible for handling level loading and some minor parts of game play.


The UI was created with Unity's UI Toolkit, so a lot of time went into learning how it works and how I could make the menus responsive, so that they would look good both in mobile and PC versions.

Programmers

Elias Böök
Olaus Klaveness
Johan Fryklander
Ivar Sidorsson
Screenshot of Your Rabbit Died

Level Designers

Anton Johansson
Jeff Persson
Gustaf Löfkvist Andersson
Screenshot of Your Rabbit Died

The first game project we made in the schools own engine TGE. 


During this project i was mainly working with developing systems for the engine, but also created the pipes that drop scrap on the player and the upgrade the player unlocks later in the game. 


Some of the systems i created for this game includes: 

  • Double buffer rendering
  • Input handler with support for Xbox-controller
  • Post master for dispatching messages
  • Splitting the world into chunks to improve performance
  • Threaded level loading

The second and last game project produced using the schools game engine TGE.


Since i had not tried it yet I went for tools programming during this project.

For this project that mostly meant creating tools in Unity, since the level designers and graphical artists were building the levels there and then exporting them to our engine. 


Some of the tools i created was:

  • Prefab creator: Made prefabs out of all models that did not already have a matching prefab.
  • Prefab replacer: Replaced the selected objects with a selected prefab, or a random one from a list of prefabs.
  • Level exporter: Created a json-file with all data needed to transform components in Unity to components in the engine.
  • Set up the Play-button in Unity to launch the level in our engine instead of Unity's built in play-mode.
  • Customizable path-finding grid for AI and Player navigation.


Towards the end of the project I also helped with optimizing the game since we were suffering from low frame rates.

Some of the optimizations i did was:

  • Implementing a quad-tree to reduce the number of objects that was rendered at once
  • Implement double buffer rendering
  • Threading the level loading and caching the models to improve loading times
  • Create factory for objects in the game.

Programmers

Alexander Frost
Dino Zvonar
Johan Rubertsson
Olaus Klaveness
Screenshot of Little Sinner

Level Designers

Frans Alexandersson
Jeff Persson
Måns Mattisson
Screenshot of Little Sinner
Screenshot of Little Sinner

Graphical Artists

Daniel Nilsson
Linda S. Khamphoukeo
Philip Wolff
Sofie Axelsson
Screenshot of Little Sinner

This was the first game we created by using an engine made by us students. 

It is a very short game mostly meant as a way for us to get the basics of the engine ready for later projects.


I was meant to create a Component-system for the engine during this game, but due to sickness I was absent for a large part of the first half of the project. 

So since the game was small with few types of objects the group designed a simple system with actors instead, and I went on to create some of the game play elements during the second half of the production.

The first large project in our own engine. 


This project I was mostly working on developing the engine further. 

The first thing I did was to restructure our engine from the previous project in order to make it more modular, since it had been very rushed and pretty much everything was handled by a single class, and we wanted a Component-system instead of using Actors.


Once that had been accomplished I began working on creating a Collision-system with callbacks to the objects that collided.

I also created a large part of the Components that were used, such as Camera, Mesh, AnimatedMesh, etc. 


Towards the end I also made it possible to serialize our animations and models to binary format in order to be able to load them easier with a threaded loader.

During this project I mostly worked on integrating PhysX in the game engine. 

This included: 

  • Creating a thread-safe wrapper that handled all calls to the PhysX API, creating an easier interface for the other programmers to work against. 
  • Updating the collision system to use PhysX instead of our old collision system, and ensure that transforms was synced correctly between the PhysX simulation and our own internal systems.
  • Add support for Mesh colliders.
  • Create a Quaternion class with all math needed for use with PhysX, as well as slerp and matrix conversion for Animations.


I also reworked the base of our component system in order to solve issues we had when copying and moving GameObjects. 

Created a couple of macros that was used to declare new component types. These ensured correct inheritance and created some basic functions and friend declarations that needed to be implemented for every component.


It was also during this project that I copied over my work on Animations from my specialization, so spent some time adapting it for use with the groups graphics engine.

This was our final project that we worked on full time for 9 weeks.


I started out creating the base for the system that was used for all items that could be picked up in the game. This was in order to have a single interface that was used for all interactions. It was created using inheritance and function-overloading.


Then I went on to create all stations that spawned items as well as the thrash can, and was also responsible for some of the tools used to create stations and items in the editor.


Spent a lot of time reworking and adding more functionality to our Component-system and in adding support for multiple controllers.


Towards the end I implemented sockets in Animations. These were used for the player characters and some of the workstations.

About

My name is Olaus, and I have wanted to work in Game Development since I was a kid. My plan had been to study Game Development directly after my Upper Secondary Education, but I was so tired of school that I decided to take a one year sabbatical from school in order to get some work experience. Almost 15 years later I finally decided that it was time to get back to school again, and it was probably the best choice I have made. 


I find programming to be extremely fun and I really like building systems and tools that can help others with their work. 
Working closely with other disciplines is also something i truly enjoy. It also an important part of developing systems that others find easy to interact with and that fulfils their needs.

So far I have mostly been working as a Tools and Engine programmer, but I also have some experience with gameplay, I do not really have a preference between the 3 so long as I enjoy my work environment and colleagues.


During my "short study break" I worked in a wide variety of jobs in different sectors. Thus I learned a little about a lot of things, and have experienced how daily life is for people in various parts of society.


If you want more information feel free to reach out to me via any of the social media platforms below.


Olaus Klaveness