Hi, I am Stijn, a Belgian game developer.
I am currently working at Salty Lemon Entertainment where I am working on EXR.
I graduaded cum laude from Digital Arts and Entertainment University in 2020 as Game Developer.
I have always been passionate about games, and had personal projects going into details of mechanics and figuring out how they really work.
Apart from games, I am also interested in web development, (game) economy, Technology / IT, and cars.
09/2017 - 08/2018
While I have no intention of ever becoming an artist, I think it's important to understand the workflow. This not only gives me appreciation for artists who do it well, but also makes it a lot easier to communicate with, and understand the artists working on the project.
Useful skills / experiences:
EXR is an exercise game, a combination of a sports app and a game, that motivates people to work out by making indoor rowing fun and engaging by creating a 3D environment to row in.
I worked on EXR as a gameplay developer, but with a strong focus on UI development.
Some of the main features of the game I worked on are:
In the Training Editor users can create custom workouts by adding blocks to the editor, setting the length of the block and their power target or optionally also a strokes per minute target. Free blocks with no power target or a rest event on a timer can also be added for much-needed breaks during a workout. These trainings are then (cloud) saved so you can follow your or any premade training in-game
For the training system I made the:
The training editor was an interesting system to make. All of the visual elements in the editor were resizeable in both directions, which meant the entire viewport had to be able to scale in both directions as well. Many actions are done by drag and dropping elements around, and events can only be placed in between blocks. Users could also switch the units of both directions: switching their power between split and watt, or switching the training units between distance and time.
Taking a step back from the training editor, we start on the app's main menu. In the main menu people can connect their device, start their rowing session / minigame, or go into their profile for more details. In the profile we find the customization shop, saved past sessions, the leaderboard for timed sprints or minigame scores, and different kinds of objectives. Achievements are objectives people can always work towards for experience and coin rewards, challenges are objectives that are only available for a limited time and provide coins or badges, and goals are objectives a user can set for themselves.
For the main menu I made the:
With the coins you earn throughout your sessions you can unlock items to customize your avatar and boat.
For the customization shop I made the:
Moving on to the ingame UI this clip shows some of the notifications. There are various notifications during a session, such as when starting or finishing a sprint segment, when earning any achievement, challenge or goal, when leveling up, when completing a training schedule, or instructions on your new targets every time you complete a block during a training schedule. The video below shows an example when finishing a segment, and some level up and achievement notifications.
For the in-game notifications I made the:
All of these notifications are placed into a queue and will be shown based on their priority, depending on which area of the screen they cover. Multiple notifications can be shown at the same time if they do not overlap. The challenge, goal and achievement notifications also have a compact variant for while in the main menu.
At any time throughout your session, you can see a report of your workout. The graph will show information like your split time, stroke rate, and heart rate if a heart rate monitor is connected. The classic view shows your data split up into 500m blocks, just like it is shown on the physical concept2 monitor. In the general tab you can find an overview of any events, achievements, or otherwise notable moments that happened throughout the session.
For the report UI I made the:
Since we wanted to update the UI to a new design, we decided to switch to unity UI elements early. That way the designers have more control over the UI and they can make adjustments directly inside unity. Since UI elements uses strings to display text, updating values on screen would constantly generate new strings, creating garbage. Since creating garbage every frame is obviously not acceptable we created a string wrapper that would keep the same string in memory, but update the value inside the string using unsafe.
Apart from the system being performant, we also wanted to improve the development pipeline, and allow designers or anyone else with unity experience to be able to put text on screen, or iterate on it's formatting. So I created a text provider system, allowing anyone to set any kind of text through the inspector. Wether it's a fixed string, localized text, a dynamic value, a value formatted into time, etc. The system might look complex at first due to the amount of options, but it is very quick to use, and incredibly powerful.
Obelisk is a single player puzzle game that starts simple but quickly shows how complex a simple puzzle can get!
Obelisk was made with unity as an entry for the ludum dare 38 gamejam by a team of two programmers and an artist
You can play the webGL version or download the executable on itch.io!
Other team members:
Mari0 is a recreation of the original mario game, with the addition of the portal mechanic from the game p0rtal.
For this project I recreated the first level of the game, using a 2D engine based on box2D
This project was a lot of fun to make, as it not only has the fun vibes of mario, but also has a lot of mathematical complexity thanks to the portal mechanics and visuals.
You can see the complete codebase on Github, or look at a snippet below.
For the normalize I made use of SSE instructions, this would be an extremely efficient calculation, but in this project it's just a tech demo as the performance is lost by converting from a float and back.
This is function that checks who to teleport where when entering a portal:
This code faces the right version of the bitmap to face towards the cursor:
Small details make a big difference in the feeling of the game, like particles!
It's dead silent in an art gallery, but you have to sneeze... What happens if you just can't hold it anymore?
Hatchoo is a single player puzzle game where you spread a virus in an art gallery. The goal is to get the virus to everyone on the level in one sneeze. *note this was made in 2017, well before covid.
Hatchoo was made with unity as an entry for the Brains Eden gamejam by a team of five.
In this project I focused on the npc behaviour, player feedback, and character controls.
You can try the webGL version on itch.io!
Other team members:
Dodg'em is a fun two player party game based on the concept of dodgeball.
Dodg'em was made in unity 5 with a group of four students over the course of a semester.
In this project I focused on the ball mechanics, throwing controls, powerup mechanics, and tutorial.
If you have at least one controller and a friend handy, you can play the game here!
For this project, the main focus wasn't the Tower defense game, but rather the engine behind it.
We learned about, and implemented, the various stages of the rendering process. The engine was not limited to just the main directX rendering pipeline (Input assembler, Vertex shader, Geometry shader, Rasterizer, Pixel shader, output merger, Rendertarget view), but also implemented some other features Particle effects, Post processing effects, shadows, sprites, text, audio (fmod), physics (PhysX), keyboard input, materials and more.
Once the engine was ready, I created a simple tower defense game to show that the engine was functional.
Code snippets can be found below.
A turret's job of shooting is made simple and clear through separation of concerns. In this case moving the logic to separate npc and projectile managers.
For a small prototype like this, a modular system made it simple to generate levels in code.
Thanks to lambdas, projectile hit detection can be quite concise as well!
For this project I went through the process of making a high poly 3D object.
Apart from modelling, I also got into basic materials, lighting, and bump maps.
This model was made with 3ds max, with a few material textures made in photoshop like the carbon texture and bump maps.
Scroll down for wire, vintage, and AO renders.
A PBR model, dressing a bot in a nascar theme.
For this project, I started from the high poly model, and made a low poly version that I unwrapped, textured and enriched.
This model uses base color, Ambient Occlusion, Metalness, Normal, and roughness maps.
Note: when using chrome, hardware acceleration has to be enabled to view the model below with the sketchfab viewer.
Nascar Bot by stroeckx on Sketchfab
An exercise in Level design, using unreal engine.
I started with creating a fun level as a blockout, and then dressed it up using basic meshes.
To try the map in Unreal Tournament, you can download the pak file here
Useful skills / experiences:
The collective is an interdisciplinary project, where students from Digital Development and Design, Industrial Product Design and Digital Arts and Entertainment work together on a project for Volkswagen about autonomous driving.
The collective was a very interesting project that gave us an opportunity to act as a design startup during our school curriculum, acting as a subsidiary of Howest, with Volkswagen as our customer. This meant we went through every step of the process, form talking with the customer and understanding their need, to planning, scheduling, budgetting, etc. Learning to set up a company structure to make sure every we are on track, including scrum techniques, scrapping features, repivotting, etc.
One of the core issues we tried to solve is that if cars become fully autonomous, what does the driver do? And thinking a step further, if the car can drive by itself, drop you off at work, then go home again and bring your kids to school, etc. Is it still a car, or does it become part of the family? If it does become part of the family, adding AI to the car so that it can get to know you, your schedule, your prefered music, etc.
One of the features of our our car in the end was that it could project a different view of the outside world on the windows. So that when you drive by an ugly trash can, you can swap that trash can for a tree, or a beatiful bush with flowers. You could make that ugly cell tower smaller or make electrical wires look like a bridge. You could change the world around to you look like you want your world to look like.
Towards the end of the project, we decided to visualize a part of our story in an interactive video. In this video, we would show an example of the car bringing a kid to their grandparents. While driving through the forest, the car would analyse all the nature around you and sense how much you like it. Going into the city, everything feels dirty and ugly by comparison. So out comes the menu to change it, and as any kid would (over)do, put the green slider to MAX.
The video exist of two layers, one being just the regular video but the second layer is the mind of the car, the view of the AI. In our exhibition you were able to look into the mind of the car by point at the screen, and the second layer would be shown around where you point. Below is a version as regular video, where parts of the second layer are shown at all time and a pointer is pre-animated.
Most of the 3D environment was made in roughly two weeks, with unreal engine. The terrain was sculpted using the unreal terrain tools, for the forest area I used a variety of standard trees, which were improved using quixel's material library. Again the unreal terrain tools were used here to place the trees, and with the help of fog and a variety of lighting the forest came together. For the city I placed buildings together into groups of buildings, which i then scattered arround and combined them into blocks. These blocks could then again be combined to create a street. This meant that once the initial setup of my "building block" groups was finished I could very quickly create the entire "city" with them. Ofcourse the fact that the end result was focused on a video meant that things only had to look right where the camera was looking, which meant that possible tiling in the city wasn't too obvious, even before adding in unique decals and before bringing in any nature. Making the city look "overgrown" with plants seemed like a big task, too big to do in the timeframe, so I had to find a faster way to do so. I decided on using a spline generator, where every point on the spline would stick to the building. Which meant that once the proper configuration was done, I could generate variety of splines, some that would stick to the building almost exactly wrapping around corners if they had to, some that would go to a ledge and overhang from there, some that would find supports and keep trying to grow upwards, etc. Once the splines were in place, it was a matter of spawning meshes along these splines to make them look like plants, many varieties of leaves are spawned along the splines, in various different shapes, looks, clustered or spread etc to create a variety of plants, but various other meshes such as flowers were used to. In fact the bridges are also using this spline system, but instead of leaves, I spawned planks there, creating the drawbridge.
If you want to see more about the team, research, process or story of this project, you can download the pdf of the book here.
Note that a few pages will look weird, as they are transparant overlay pages in the physical book.
Useful skills / experiences:
When playing CSGO, I found out that there wasn't just a whole world of skins in the game, but there was also a whole world around the game in trading skins. And while there were various communities and platforms to find people willing to trade, all of them definitely had some shortcomings in some way. And as I got more experience in trading, I kept getting a better view of what my ideal platform would look like and the features it should have. So I took a javascript course, and started working on it.
While working on this site, the flair system of /r/GlobalOffensiveTrade broke, and since nobody had access to the source, the platform was essentially broken, as allowing users to trade on reddit without their accounts being linked to their steam account would give free reign to scammers. Since I already had experience with the steam API, I decided to step in and make a new system.
The new flair system didn't just put your steam id in your reddit flair though, it also ran some background checks before approval, and added the link to a database. This would provide more info to the moderators when scammers, or their alt accounts, were found and added a backup of which accounts were linked when in case users needed their connection changed later on.
within the first year, over 100.000 users registered through the system and linked their steam and reddit accounts, at which point the system was expanded to not just the csgo subreddit, but the trading sub for every game in the rugc trading group (/r/GlobalOffensiveTrade - /r/Tf2Trade - /r/Dota2Trade - /r/SteamTradingCards - /r/H1z1Market). At which point a portal was also added to both give all the moderators of these subs access, while also providing tools so that changing a users flair, or banning them, would trigger the bot to apply these changes on all rugc subreddits. After the merge with other subs, eventually another 200.000 users registered through the updated flairbot.
As for the trading website, I made a platform where people can log in using their steam account, once logged in with Oauth I can load the users inventory with the steam API. From there, they can mark which of their items are not for sale, hiding them for other people or when making a trade. That and any other information entered about an item will be saved in the database, saving details about your preference, or saving extra information about the item even after it is traded. On the page to make a trade, your inventory is loaded again, keeping in mind any marked items. From there, you can select which items you want to put up for trade on your side, and on the other side you can select items from a database which you are looking for in return. Once your trade is made, people can find it by searching for trades, when searching for a trade you get a similar interface, but ofcourse you find trades where people are offering the items you are looking for in return for the items you are offering.
Later on, as cash marketplaces became popular, I added a table view of the inventory, which is not focussed on seeing details of your items or marking them, but instead it offer various filters to specify which items you want to list. The list will then show a table of your items, the price of each item on a variety of websites, a number of conversions from your primary source such as X percent of that price or that price converted to keys (the currency used in the csgo economy). This way you can easily see which platform is the best place to list your item for sale right now. If you weren't looking to sell but were looking to trade instead, a simple button click would generate a markdown table from these items at the chosen price percentage. That way you could easily keep your reddit store up to date by generating a new table any time your inventory changed.
Finally, I also implemented the Bitskins API, this way the website could post any item on bitskins that would sell for more as my minimum price percentage after the bitskins fee. A cancel button was also available that would go over my active bitskins listings and cancel any items that were no longer within my price. This way by simply clicking two buttons I could automate the selling of a large chunk of my items, allowing me to spend my time focussing on trading special collector items instead of managing a flow of common items.
Useful skills / experiences:
LST is a World of Warcraft addon, that helps you keep an overview of your stock of legendary items, generates a restock list based on your profit settings, shows a list of materials you will need for this, and can craft the items for you with the click of a button. All of this can be synched across acounts. The addon ended up getting over 50.000 downloads, over 150 people joined the discord for it, and 6 people even pledged on the patreon!
In the Shadowlands expansion the most coveted items, legendaries, were crafted by players who heavily invested in their professions. Since I realised the potential of this system early on, I jumped right on that, covering every slot of every armour class. But I quickly ran into the issue that there were just too many items to track which ones I still had and which ones I sold, and NO addons supported the legendary items at all. So I looked at the documentation of how to write an addon, looked up the basic lua syntax, and quickly made an addon to filter out the items in my bags, bank, mailbox and auction house, and then export it to csv text which would give a clear overview in a spreadsheet.
Since I found this really helpful to me, I posted it on reddit in case it would help anyone else. People interested in goldmaking in WoW is already niche, those specifically making legendaries is a niche within a niche, and then people doing it at such a scale that they need warehousing tools, I didn't think many people would care. But clearly I wasn't the only one lacking this tool, as people started using it. And since other addons still didn't manage to support the system, I kept expanding on it's features. About a year and 54 updates later, LST got over 50k downloads and went from a csv export to a full on warehousing, restocking and inventory management tool.
The table view will show you an overview of each item at each rank. It will show you how many of each you have, and how much profit you can make on the item. If the profit is above your treshhold, and you have less as your restock amount, the stock count will be blue to highlight which ones could use a restock. In the settings there are various options to change this view, such as hiding ranks you are not interested in, siwtching between percentages and absolute values, or configuring your profit margins and restock amounts.
The restock window will show you a list of every item you need to craft, again based on your profit and restock settings. If you have the materials on you, pressing the craft button will craft the next item on the list with a single click, including applying the vestige. LST will do all possible profit optimizations, such as crafting vestiges from your other profession if they are cheaper, and even crafting lower ranks of legendaries using vestiges if the vestige cost less as the materials. LST can also craft legendaries you have technically not unlocked yet, by applying vestiges on lower ranks to create them. In the options you can again customize the display here, such as showing your alts' crafts in the list, wether you want to restock domination slots or not, or configuring your profit margins and restock amounts.
The materials list can show you an overview of which materials you need in order to craft all the items in your current restock list. This includes all the materials needed to make vestiges as well, and will keep in mind all the profit optimizations as described above. The list will update automatically when you craft or otherwise obtain a legendary by subtracting the materials for that item, or will update the counts any time you aquire materials. In the options you can again customize the display here, such as wether to only counts the items on you and your bank (the items you can craft with right now), or wether to include other sources such as your mailbox or alts (so you get a shopping list of which materials you need to buy).
Below is an example where with just a button click, LST can will look through my mailbox to find any of the materials I am missing, and move them to my bags so I can use them.
One of the common questions everyone is always wondering in Runescape, is "how much gold per hour is that boss", and so was I. On the pvme discord there was a spreadsheet for just that, except it was no longer maintained, and just about every boss' overview would read either error or n/a. So I made a copy, cleaned it up, fixed all the missing info, and fixed all the incorrect formulas and cells. Much better, we had numbers now. Unfortunately, the numbers were wildly outdated and therefore gave a very incorrect result.
So instead of updating the prices and kicking the can down the road, I looked for a way to make it update automatically. Thankfully, the Runescape wiki is amazing and has updating data of every item on the GE. So after making a wiki page with a table of all boss drops, I could have that table being imported into the spreadsheet as XML, and make it refresh the data in the spreadsheet automatically.
With everything working again, now with updating prices, the sheet became a great resource again, so I added all the missing bosses to the spreadsheet, and updated the sheet as new bosses were released (zamorak will be added as we get a better clue of drop rates). With the knowledge of how to update prices, I also updated the elite dungeons gp/hr with another price table for all the elite dungeon drops. That way, people can enter their kills per hour at any boss and compare the average rewards when deciding what to do.
With the release of archeology, every time I made an artefact I kept wondering what the best use was of that artefact. Do I disassemble it for components, or do I hand it in to a collector for chronotes? So I set out to make a calculator for just that. When asking how to go about this, most people said it just wasn't possible, but digging a bit further, there sure enough is a way to load other wiki pages inside a table to get the info I needed. The operations are a bit heavy to implement this in one of the archeology pages, hence why it might take a while for the page to load, but it has still been a great resource for me and any of my clan mates when digging up some artefacts!