Also feel free to check out my
Itch.io2023
stealth
shape-shifting
enemy AI
I made use of a finite state machine - naively implemented with an enum and the switch-method.
There is a method changeState(Behaviour nextBehaviour):
Here variables for the next state get set. (Things like navmesh agent destination etc.)
Periodically the exit conditions for each state are getting checked. Some examples include timeSinceStartOfBehaviour and LineOfSightToPlayer. Afterwards the state is changed accordingly.
In Update, depending on the currentState, a different method is called, which controls the actual behaviour of the enemy. For example in case of the patrol state, the distance to the next waypoint is checked and the navmesh destination is updated, if applicable.
The AI makes uses of an event based sensing system. These events are invoked, when the player/exits enters the vision cone or makes a sound withing audible range. Depending on the current state, the next one is selected and transitioned to - usually investigate or combat.
The sensing works by checking range, angle, raycasts and layers. Additionally, with every state change, an event is invoked, which then informs any other components. This is used for mostly visual side effects, including emotes and audio barks.
2022
bullethell
top-down
shooter
BOIDs
HeartAttack is a bullet-hell twin-stick-shooter with wave mechanics.
The concept was much simpler than that of many other contestants and no single aspect of our game blew the others out of the water. We won first place anyway. This taught me valuing a cohesive overall experience.
My main contributions were:
A large part of my contributions consisited of work on the games enemy AI.
Though most of its features remain unused in-game, a slightly improved version can be found on Github.
I made use of steering behaviours - specifically an improvement on BOIDs. BOIDs are a great way to create swarming / flocking masses of enemies.
Each Update (notably, not necessarily in every frame), for every agent, every feature calculates a new desired direction based on all nearby agents. These directions are then avereraged according to user-set weights, defining their behaviour.
To speed up performance, for the necessary distance checks, a spatial hashmap is used.
Agents are sorted according to their position into grid-cells, with a side-length of the vision distance of the agents.
This makes filtering out obviously out-of range agents trivial for distance-checks, as only adjacent cells need to be sampled, greatly improving performance compared to a brute-force approach.
In the future, I might look into compute shaders and the jobs-system to improve performance even further.
2022
interactive fiction
satire
narrative engine
Headline is a satire game about manipulative reporting. It puts the player in the role of a malicious newspaper editor.
While the gameplay seems fairly simple, under the hood there are some fairly complex systems controlling the narrative. Combined with difficulty in play testing, this lead to a game unable to live up to its potential. The final product is polished in some aspects, but falls short at its central premise of procedual story telling. After a chaotic start to development I reluctantly became team lead mid way through development. The game would likely have been better, had I done so sooner. I learned the value of an organized development team environment this way.
My main contributions were:
A large part of my contributions consisited of work on the dynamic narrative systems, which controlled what direction the story takes, by selecting the next available news articles.
Due to organizational difficulties, this system had to be partially cut to fit a smaller scope than intended. Under the hood my original implementation works similarly to the dialog system of Firewatch and valve's AI-driven dynamic dialog system, outlined in these great GDC talks: 1 2
A global DataManager stores information about the player's preovious involvment with specific topics and factions in a form of blackboard. These values can later be queried as preconditions for story threads or modified as direct effects of player actions.
Each news article stores mainly four things.
With all this information the StoryManager decides which articles to show next. It is based on a priority cue, containing all relevant articles.
This cue is first filtered for only articles, whose preconditions are met and then sorted based on remaining lifetime. This way currently relevant articles are shown while letting older story-threads resurface as narrative callbacks.
Incase no articles qualify as relevant to the current world state, filler articles are chosen at random from a set of throwaway articles without any preconditions.
After every round the articles effects are applied to the current world state, simulating the news agency's influence on the political climate.
This then affects the available news articles in the next turn, possibly unlocking follow-up stories.
2021
social
mobile
game
quiz
UI/UX
Campus Wars is a mobile social game with the purpose of encouraging class attendance.
The app uses data from the official TUM website to divide students into teams
and then lets them "conquer" territory around the campus by taking part in class relevant quizzes.
There were fairly tight restrictions on what the game could and could not include.
Overall I believe we did a splendid job of bringing theoretical knowledge into a practical setting.
I particularly liked dabbling with mobile development, which I had rarely done before.
My main contributions were:
2021
arch viz
time travel
shaders
tool dev
Tempora Facta Casa is an exploration with puzzle elements and the goal of intuitively visualizing the effects of wood aging on architecture.
Through the use of time travel and carefully placed hints, the player is led through a forest village and its architecture. The game fulfills its premise fairly well and playing is overall quite fun and relaxing. The graphics are not as polished as I would have liked, both in terms of performance and visual fidelity.
My main contributions were:
Keeping track of objects in multiple time eras within the same level quickly became confusing and tedious for our level designers. To make their job easier, I created an editor window, which could selectively hide specific time lines, as well as move objects between them. This removed visual clutter of WIP levels and sped up the workflow.
A major goal of this game was to demonstrate the decay of architecture through time. The main way to archieve this was through textures. The ageing process of wood is however, specific to the surroundings of the houses. So there needed to be a way to paint on objects within the context of the scene and therefore the engine. For that purpose, I created a simple vertex painting tool with features similar to old school paint. The resulting vertex colors could then be fed into custom shaders.
In multiple places, it was necessary to smoothly blend between materials within a single mesh.
Unity has some support for this, but only for terrains and only utilising alpha blending and only blending simple textures, not PBR materials. This was not sufficent for our needs.
My improved approach relied on three steps:
At the time of the games development, Unity did not ship with any premade water assets. Also the look we were going for was specific to a swampy biome and could not be achieved with free solutions of the time. So I created my own, with the following features:
2021
sailing
pirates
cozy
shaders
physics
Sail Away is a casual game about relaxation and exploration.
The main purpose of this game was to experiment with reactive programming and Unity's new input system. The speed of the ship is dependent on a combination of the ship's sail's and wind direction through a rough approximation of the physics at work, allowing for a smooth sailing experience.
My main contributions were: