Space Nomads

Space Nomads was a Group project that had me and 7 other students collaborate with Spilt Milk Studio’s to design and create a prototype game. The original project brief involved a medieval setting where the player could visit towns and upgrade or buy various items. Traveling between these towns would be Idle, where the player could decide equipment and also where to travel to but the combat itself would playout by itself. However with discussion with the team and the client, we decided to change to a space theme, alleviating the workload for the Artists. My role as Gameplay/Engine programmer was to design and implement the core navigation system as well as the combat systems. Below I will cover the main technical features that I worked on:

Procedural Routes

The Procedural Routes were a major foundation of the game, so I began by researching many popular methods of creating procedural cities and worlds in order to create an in-depth but functional system that could be used by the whole team. In the end I settled on a technique that was inspired by Slay The Spire’s navigation systems. This system 3 major techniques which were Poisson Disc Sampling, Delaunay Triangulation and A-Star Pathfinding.

Poisson Disc Sampling is used to create random but evenly spaced points, which for the game is used to spawn events within the map. This is preferable to using completely random points as we do not want events spawning very close or on top of each other. Below is an example of random points (LEFT) and Poisson Disc Sampling (RIGHT)

Delaunay Triangulation is used to create a mesh of triangles, given a list of points. This mesh is created so that the triangles are as small as possible(i.e. not spanning the entire map) and that each point has at least one or two connections. While this technique is generally used for creating convex meshes, It was repurposed to create the pathways between events. This is more effective than creating all possible connections, as we do not want an event to have too many possibilities in order to not confuse the player and we generally want to player to take more divergent routes. Below are examples of all points connected (LEFT) and points connected using Delaunay Triangulation (RIGHT)

Finally, we can use A-Star to pathfind a possible route through the map. Doing this once will find the shortest path, however by locking events and then running A-Star again we can get a new route that diverges from the original. We can repeat this to get as many unique paths as we want. Below is an example of 5 routes (LEFT) and 20 routes (RIGHT)

Combining it all together with Planet Meshes and Shaders provided by the Artists, we get a Dynamic Procedural route generator.

Combat

For combat, my goal was to add more depth to the already present scene, by adding abilities and stat effected attributes to the fights. This meant that the enemies and player could greatly vary for each playthrough, For example an enemy with high fire rate but low accuracy or a slow firing enemy with powerful homing bullets.

Firstly, I added the ability for bullets to home in on the target, which really improved the feel of combat and was generally satisfying to look at. The homing strength could be altered by the items and equipment from the shops.

Then I added an accuracy systems using some vector math, where the bullet would fire with a a slight offset from the intended target, based of the player’s accuracy. This made combat feel much more dynamic and when combined with the homing, made the fights feel much more interesting

Finally, I began working on the abilities, where the player could chose to activate at anytime during a battle but had limited uses per trip. I chose to add a reflective shield as a defence ability and a fire rate increase as a offensive ability.

Minigame

As a way no make the main navigation more interesting, a Minigame was added to the main navigation, where the player could chose to time an input, to increase the ships speed. The Minigame was implemented as a UI elements using Unreal’s shader graphs which was a good learning experience for me. The first implementation was focused on the timing, where after each successful attempt the game would become harder (LEFT). However this felt a bit finicky and after feedback from the clients and team, the design was improved so that the speed remained the same but the target location would move randomly (RIGHT).