Seeds of Sol

A twin-stick shooter action roguelike featuring a multi-personality AI companion.


>

Description

Seeds of Sol was the biggest, project I worked on at Rarebyte. We started development in late 2016 and the project was put on indefinite hold after about 2 years of development in 2018 because of focus and scope issues. The game was developed in Unity, and we coded most of it in C# but used various assets for AI behavior trees and visual scripting to allow our designers to quickly prototype gameplay themselves.

The game was originally envisioned to be a difficult top-down twin-stick shooter with rogue-like elements but that niche was kinda overflowing at the time, and we didn’t necessarily want to compete with the other, sometimes very highly polished games in it. Because of that, we fell into a long period of prototyping to find other distinguishing mechanics to set Seeds of Sol apart. Among the things we experimented with were mechanics like a dual-wield system, an energy system and a companion with multi-personality disorder but, even though some of them had potential, we either failed to meaningfully incorporate them into the games core loop or didn’t commit to them fully enough. This, combined with issues related to too early demoing, reliance on the wrong tools and scope growth led to a kind of identity crisis of the project which in turn led to the decision to put it on hold and put our focus towards other matters.

Even though the development was very bumpy at times and I cursed the project on more than one occasion, it will always be the first, really big project I worked on and I treasure the memory of it and the team deeply. I acquired an incredible amount of technical knowledge and learned important lessons about project management, communication, community-building and loads more. This project and my growing negative mindset towards the state of the games industry made me realize that I wasn’t particularly keen on relying on game development as my sole source of income which led to my decision to quit my job at Rarebyte and switch to a more stable career in other fields of software engineering and get back to making games as a hobby.

Contributions

I was on the project from the start and, as the main programmer, I was heavily involved in the design and implementation of nearly all parts of the game. I already stopped working on this project a couple of years ago so the details below will only provide a rough overview over some of the things I did and can still remember.

Dual-Wield Character Controller

I implemented a character controller including a special animator, inventory and weapon system that supported separate equipment slots for both hands. The player could either equip one or two single-handed weapons or one two-handed weapon at a time. When two weapons were equipped they could be fired separately which created interesting synergies and therefore allowed for the creation of compelling builds.

AI Behaviors

I was heavily involved in most enemy behaviors in this game. We used behavior trees to implement the behaviors of all of our enemies and it was my first experience working with this technology. It took some time to get used to the new programming paradigms but after a few days I got the hang of it and it was fairly easy to develop new behaviors from that point on. Initially, we used Behavior Designer but we switched to Node Canvas later on because it was very well integrated with another asset we were using.

Spitters
Spitters
Guardian
Guardian

Steering System

The steering system was completely designed and developed by me and it is based on the math found here. The whole system consisted of a singular steering agent component that could be added to characters and that was used to control their movements.

The implemented steering behaviors included:

  • Seek: Walk to a certain position
  • Flee: Flee from a certain position
  • Pursue: Pursue a moving target and try to intercept it
  • Evade: Evade a moving target

All of the steering behaviors had integrated path following to keep agents on traversable terrain. I also implemented a very elaborate collision avoidance and agent separation system to prevent agents from running into dynamic obstacles or into each other.

Positioning System

This system was used to find and evaluate viable positions for enemies around the player character. It consisted of a positioning system and multiple positioning agents. The positioning system kept track of all positions and whether they were valid or occupied. The agents consisted of various modules which were used to describe the desired positioning for specific agents. There were modules that weighed positions based on distance to the target, distance from the agent, distance from other agents and so on. These modules could for example be used to make enemies feel clever by surrounding the player while keeping their desired distances to them and it was very powerful in it’s configuration capabilities.

Enemies surrounding the player
Enemies surrounding the player
Stress testing the positioning system
Stress testing the positioning system