It all begins with prototyping.

Let me start by giving context about this project. This is the project that got me seriously invested in game development. It was called something different before, Brim: Memories of the Ancients, but that’s really besides the point. I used this game to get into VFS for game design, it’s been with me for that long.

I restarted it.

Evidently something that has been with you for so long is hard to press the delete key on, but that’s what GIT is for! I really didn’t know what I was doing when I started this project, but I have learned so much through and for this game, that it felt like I could only do it justice by challenging the design from the ground up. That meant looking at what I had made, identifying what decisions were design decisions and which were my own previous technical limitations. By the end, I had re-discovered that the combat was not extensible at all, and the level management system was simply due to my not knowing how to program a proper world loader. Everything else simply wasn’t of a good enough quality.

So, what do I start with now?

I started with a concept document. This document has only one purpose: to become the GDD. Basically, it’s just scaffolding and a narrative overview, establishing context and space for every mechanic, enemy, level, etc. I wish I could show it here, but it contains ALL the little secrets I have planned… so you’ll have to wait until the game is out ;)

Okay. Now it’s prototyping time!

I decided to start with an Art Prototype for this project. Because this project is more of a side-project in my free time, it felt fitting to let the creative juices flow!

Needless to say, this involved lots of pixel art, animation, and shader work in order to get it to feel how I wanted. The part I am most proud of here is definitely my pixel art uber-shader, which adds custom filtering to the pixel art for much less noticeable pixel jitter at all resolutions, configurable outlines, drop shadows, colour overrides, and finally palette swapping! Second to that is definitely the water shader shown in the video above.

What next?

World Loading. It was what I was most scared of going into this, as I knew I wanted the world to be seamless. Previously, I was just using basic transitions— classic fade to black. This worked well enough, but there is just something about seamless exploration that is so enticing to me. Luckily enough, through some asynchronous resource loading, a world manager, a scene adjacency manager, and some bits for aligning different levels properly, we have a world loader!

The nice thing about this world loader is that it doesn’t matter how small or large your scenes are, nor how many scenes you want to connect to a single scene! No fixed grid like chunk loading, and fully seamless! I am so excited to see this with more levels set-dressed!! It’s going to be killer.

The final piece.

The player! The fine chap you have seen running through these videos is a person by the name of Idris. Now, everything is not prototyped for the character, as I am still designing the combat thoroughly before I pull that in-engine; nevertheless, I still needed to get the MVC set up, along with State Machines (SMs).

If I didn’t mention it already (EDIT: I read back through, I have not), I am using the Godot game engine for this project. Although most of my work is done in Unity (for Haste), I do love the Godot engine as it forces me to work differently than in Unity, which is a lot of fun! Shaders are done in GLSL, prefabs are scenes, and components are game objects— what a wonderful world!

This does mean that I have to implement something like a State Machine differently, though. Rather than just using classes or structs to define states, we have to use Nodes, which are essentially game-objects (but also components, just in one big ol’ scene tree). Luckily, this lets us follow a composition-based approach for our game, and we don’t have to cache our states for optimization as they are already serialized in the player scene.

With the composition-based architecture, it means we can create things like Hierarchical State Machines by just adding an SM as a child to another SM’s states, which is pretty cool.

Conclusion.

Overall, I am super happy with the progress I have been making on Kairos! The prototyping phase is a lot of fun, and now that I am moving out of the Art Prototype phase, I am super excited to dig my teeth into some AI and Combat design (and implementation of course… the best part!!!), which is exactly what I am going to write about next!!