I'm Kaspian,
A Gameplay &
Tools Developer
I'm a game developer and student at The Game Assembly who has been programming for the better part of a decade and who specializes in developing gameplay and tools.
More about me
My name is Kaspian Ringqvist and I live in southern Sweden. I have been programming for almost half my life and what started with making cool things in Unity just for the fun of it quickly turned into much more and now - a couple of years later - it is what I'm hoping to do for a career. I'm comfortable with at least half a dozen programming languages and spend my days either playing games or creating them as well as working on everything from websites to Discord bots in my free time. Why don't you continue scrolling and have a look at what I've done during my time at TGA?
Tools
I enjoy tools development a lot and at TGA I've been involved with a number of tools ranging from level exporters for Unity to visual scripting solutions. My specialization even revolves around tools development.
Gameplay
Gameplay is what I've worked with the most during my time at TGA and is also something I enjoy. During our game projects I've worked on everything from AI and interactables for mobile games to audio and collision systems.
My programming journey in 4 parts
2016 - 2017
Technically one might say that my programming journey started 8 years ago when I won a competition with a game I made but that was done using visual scripting with blocks you dragged into place so I would say that it started properly a little later when I got into Unity. I made a lot of things using Unity but, except for one very small and rushed game jam game, never anything I released. I was much more interested in learning as much as possible and experimenting so mostly just played around with all of what the engine had to offer and by doing so also got very comfortable with C#.
2018 - 2019
After Unity I branched out and started learning other programming languages. I taught myself JavaScript and some simple web development which I used to create really simple browser games for me and my friends to play during our breaks at school and I also briefly got into game modification and taught myself some Java to mod Minecraft. It was still quite simple and never released outside my friend group but it was a lot of fun and was the first time other people got to try my things.
2019 - 2022
In high school I didn't really have a reason to keep making games but took on some projects for an online group and made quite a few things for them which was an amazing learning opportunity. I got a chance to work on things collaboratively even if the groups were small, learned new programming languages, and most importantly got to build things that would actually be used by quite a few people and did so completely from scratch. This taught me a lot about structuring medium to large software projects that would require continuous updates and I've made everything from user-facing tools and websites to backend servers and libraries.
2022 - 2024
And last but not least we get to my time at The Game Assembly. I'll cover this in way more detail further down on this page when I talk about the projects I've worked on and my specialization but to briefly summarize I've had a hand in almost everything across both the projects and my individual courses. I had not worked in C++ at all before TGA so that was new to me but now I feel very comfortable with it. I'm sure there are more things for me to learn but I know it well enough to be on par with the rest of the class and think it helped me a lot to already be familiar with writing and structuring code.
Core competencies
C++
As it was the language primarily used at The Game Assembly I am very comfortable with C++ and know it well.
C#
C# was the first language I learnt and I became really good at it during the years I used it. I might be a little rusty now but I think I'd quickly get back into it if I started using it more.
Unity
Unity was my go to engine for very long and was even briefly used at TGA. I am very comfortable with it and even made my specialization in it.
Other
Coding
I know multiple other programming languages. JavaScript/TypeScript is what I've been using the most but I have experience in Java and even briefly touched Python and Lua.
Source
Control
I have worked with both Git (using GitHub and GitLab) and Perforce Helix as source control softwares.
English
While not exactly a rare thing to know I speak English almost as much as I speak Swedish nowadays and have exclusively spoken English on the projects I've done outside school so know it very very well.
Projects at TGA
Mothia #7
Description: This game project was a lot freer with 3 very different reference games to choose from but we went with Jak & Daxter and made a 3D platformer with a heavy focus on exploration and light combat elements. This was the first game project I transitioned to tools development for.
My contributions:
- Alongside one other programmer I implemeted our visual scripting solution
- Worked on our level editor and did a number of things there
15 weeks
18 people
Custom engine, C++
PC
The Firefly Café has been raided by the Mothia! As a mercenary frog; jump, roll, and spin through the seedy underbelly of the lighthouse island to retrieve the fireflies.
Reference game: Jak & Daxter
GOSpiTe #6
Description: This was a third-person combat game with a fixed camera and we had to use Diablo 3 as our reference game. I almost exclusively worked on gameplay as I was solely responsible for the enemies and everything that came with that.
My contributions:
- Was responsible for implementing all 5 types of enemies and their underlying structures
- Built a custom state machine and handled everything from animations to physics based projectiles
10 weeks
18 people
Custom engine, C++
PC
Leap into battle and use your rage to battle your way through Helheim to save your brother from Hel and her undying legion.
Reference game: Diablo 3
G.O.S.T. #5
Description: This was made for a very short game project designed to get us familiar with working in our own engine. It was a puzzle game where you moved on a grid and had to collect items and interact with objects to progress through a small lab.
My contributions:
- Was responsible for implementing all interactables
- Implemeted some audio
4 weeks
18 people
Custom engine, C++
PC
Assist the overworked scientist as he is haunted by his own experiments, is it real or all in his head? Call for help!
Reference game: The Legend of Grimrock
Watch trailerTårta och Demoner #4
Description: This game was created in TGA's in-house engine and was a top-down adventure game with a heavy focus on combat. This was the first project I did some tools development for but I also helped out here and there with audio and other gameplay things.
My contributions:
- Created an editor extension that lets you start the game from Unity and handled exporting levels from Unity and importing them into the game
- Did some gameplay things such as destructible objects and audio implementation
8 weeks
13 people
TGA's engine, C++
PC
You're a demon slayin' kid and it's your little sister's birthday! Fight your way to the store through a Swedish town, return home and bake that cake!
Reference game: Moonlighter
Watch trailerPitFoil #3
Description: This was the first game we made using TGA's own engine and was a 2D platformer with a heavy focus on aesthetics and feel. I was more or less solely responsible for implementing audio using FMOD but also worked on some other gameplay aspects and collisions.
My contributions:
- Some interactables and other gameplay objects
- Audio implementation
12 weeks
13 people
TGA's engine, C++
PC
Reawaken a once Desolate Steel Mill and manipulate its Forgotten Technology to overcome its Automated Defense System
Reference game: Limbo
Watch trailerLibrary of Illusions #2
Description: For this project, which was done in Unity, we took inspiration from the puzzle game Monument Valley to create a game that was all about optical illusions and perspective. This time I almost exclusively worked on interactables and other moving parts in the game world.
My contributions:
- All interactable things in the world and their foundation
- A number of other moving parts triggered by buttons and similar
6 weeks
12 people
Unity, C#
Phone
As an owl, climb your way up the library while solving puzzles based on optical illusions to aid the Grand Owl
Reference game: Monument Valley
Watch trailerScatter #1
Description: This was our first project and was supposed to be an endless runner-type game although in our case split up into levels instead of infinitely generating. It was created in Unity, featured 2 levels, and, as we didn't have much time and were just getting started, I had no dedicated role in this project.
My contributions:
- Handled collision detection
- Implemented playing of certain animations in code
6 weeks
13 people
Unity, C#
PC
Play as a muscular Cockroach running your way through stages and avoiding obstacles!
Reference game: Temple run
Watch trailerSpecialization
Background
For my specialization, I decided to delve deeper into tools
creation by expanding on an idea I had during game project 4. This idea was a level exporter for
Unity that wouldn't just export your level with a button but notice the user pressing play and
doing so automatically in addition to generating and/or copying many other necessary
files.
I knew I wanted to do something to do with tools as I hadn't gotten to do that
very much before this point but this idea also felt both fun and challenging as it would expose
me to several things I hadn't done before and left a lot of room for trying to improve
convenience and ease of use which I enjoy trying to maximize.
The concrete idea
I wanted to create a level exporter for Unity that focused heavily on convenience and ease of use and even simplified parts of our pipeline. I wanted to design it in such a way that it could work for nearly any project but decided to export the files in a way that would work for our custom engine as I was familiar with it and figured it would make it easy to test and structure the tool.
A step-by-step guide covering what my exporter does
Export level
- I created my own way to save data to JSON. There are a whole number of
prebuilt ways to do this (including one that comes with Unity) but none really
worked for my purposes and I also wanted more of a say in how objects are
stored.
- This makes it trivial to edit the format of basic objects. Want vectors or colors as arrays instead of objects with properties? That's a 30-second change. Want it to also include a property for its type so that we know that it's a 3D vector? No problem.
- My system also handles lists very well. It works recursively so can serialize nested lists or objects.
- I used reflection to get all fields and properties of any class and save it, no matter if it comes built-in as part of Unity or is custom-made. Our engine is built on a component system so I wanted the exporter to easily support creating components in Unity that just store data and export that data to be used in the game.
- Say you want to create an enemy spawner for example. Make a component in Unity that stores all the necessary data (what enemy to spawn, how often to spawn them, where to spawn them, etc.), and then all of that will be exported automatically without needing to touch the exporter. Level designers can then easily edit all that in the level editor and everything will work in game.
- I hard-coded some commonly used components. This allowed me to add more advanced functionality for those or display them in a custom way for convenience.
Example of a component exported using reflection - only the name and whether or not it was enabled was hard coded
Prepare files
-
I copy the needed files from the asset folder in Unity to the game's asset
folder. This was used for meshes and textures since those are used in both
places and the graphic artists appreciated only having to place their files in one
folder as opposed to two.
- I also use a command line utility to convert the PNGs to DDS files.
Our engine uses
.dds
but our artists create their textures in.png
which is what Unity uses so not having to convert it every time saved them time. For bonus points, the command line utility used will be downloaded to the user's computer if they don't have it installed instead of having to do so manually or keeping it in the files you'd push to Perforce.
- I also use a command line utility to convert the PNGs to DDS files.
Our engine uses
- I create JSON files for all materials. Our engine uses JSON files for each material to keep track of all its textures, how metallic it is, etc., and creating that manually was a pain and caused a lot of problems. We did create a tool for it in our editor that we used for the game projects but I figured I'd add it to my tool as well.
- I keep track of the exported files in a JSON file. I didn't have time to work on this quite as much as I would have liked to because I was planning to store all the exported files along with a hash to keep track of changes (alternatively I could use the timestamp of the last edit in Windows but hashing would most likely be better) and that way I wouldn't have to export the same file more than once. I still do keep track of everything I've exported in a file to more easily remove files that were used at one point but have been deleted since though however if I would have had another week or two this is the part I would have kept working on.
Start game
- I start the game automatically. I start the game correctly right from the editor and even pass along what level we were just in so that that level can be started without having to go through the level selection.
- Optionally, the things logged to the game console can be sent to the Unity console. In case of crashes and similar this is sometimes useful.
How did it go?
Creating the tool went very well and didn't cause me any major issues. I initially tried
to use Unity's built-in JSON utilities which didn't really work for what I wanted to do
and my attempt to use a different one also didn't work because Unity blocks it (probably
to encourage the usage of their one) so there I lost some time but that was probably the
biggest issue I encountered and didn't bother me as it gave me a chance to build my own
which was a good learning opportunity.
The only other thing I can really think of
that became a problem is that the tool can be a bit slow sometimes, especially when
converting a large number of textures to DDS, so if I was to continue working on it I
would definitely try to improve that by either looking at more efficient ways to use the
converter or only exporting and converting the PNGs when something has changed (by using
hashes as explained above).
Showcase
Contact me
Kaspian Ringqvist
Phone: +46 73-532 86 54
Email: kaspianringqvist@gmail.com
Internship Disclaimer
I am part of The Game Assembly's internship
program. As per the agreement between the Games Industry and The Game Assembly, neither student
nor company may be in contact with one another regarding internships before April
23rd.
Any internship offers can be made on May 6th, at the earliest.
The form has been disabled to prevent spam. Please use one of the other means of contact instead.