top of page

SoulCaster

School - Sep 2019 – Jun 2020

Escape an ancient temple by utilizing its arcane artifact!


Soulcaster is a 2D puzzle platformer in which you must use a soul projection artifact to escape a mysterious Meso-American temple.  In order to avoid being entombed within the temple forever, the player must utilize their abilities in new and unique ways to bypass the temple's evolving obstacles.

Soulcaster was developed by students at DigiPen Institute of Technology and utilizes a unique clone mechanic to solve a diverse set of intriguing puzzles.

Features:
-21 interactable puzzle levels.
-A unique cloning mechanic allowing the player to project an alt version of themselves.
-A diverse set of obstacles and challenges.
-An interesting set of achievements for complete mastery of the game.

Audio Engine

I implemented SoulCaster's audio engine using Fmod low-level API.

The audio engine has custom-built 2D audio panning for all selected sounds; using the player as the listener, and a source can be attached to any game object. Audio can also play without a source such as the level music.

Level music starts playing on the start of each level, loops, and keeps playing without restarting when switching levels. When a different level song was to play, the current and new level song would blend with the current level song fading out and the new one fading in.

Audio clips can be placed into groups. When a group plays, a random audio clip is selected from the group to play. This helps keep frequent sounds like walking from sounding too repetitive.

DSP effects can be applied to a group or individual audio clip. The DSP effects can also take random ranges for the parameters, and each time the Audio clip is played, the DSP parameters are randomized within the range.

Editor

I implemented SoulCaster's custom editor using ImGui.

The editor can adjust parameters of components on game objects and prefabs. It can also change global settings for the game, such as gravity and individual level settings, like ambient light and music.

The editor can also load in new textures, audio, and edit the metadata for use on game objects.

The editor also has some advanced features, such as: undo and redo, drag and drop, warnings when deleting unsaved work, and keyboard shortcuts.


 

Physics

I used axis-aligned bounding boxes(AABB) for colliders. When resolving collisions between the colliders, I find the smallest normal on the axis and use that to determine how to move the game objects.  If one of the colliding game objects is static, the dynamic game object will move the entire distance of the normal to no longer be colliding.  If both game objects are dynamic, the distance is split between the two objects based on the weight of the objects, giving off an effect of more massive objects being harder/slower to push than lighter ones. To find collisions, I used a broad phase AABB tree, which proved to be noticeably faster than a brute force check.  

For movement options, a game object can be affected by gravity and friction. Velocity and acceleration can also be applied to a game object that will then accurately update.

hitboxes.jpg
json.jpg

Data Management

I used RapidJSON for all of SoulCaster's data needs.

All of the data is split into multiple files to make sure each system only has one job. This creates synergies between the systems, like between the prefab and level loader system. The level loader has a list of all the names of game objects and where to place them. The level loader then asks the prefab system to build this game object for it, and the prefab system returns a reference that the level loader can use to place the game object were it need to be.

When the JSON is read, all possible data types that it could read in are known at compile time. While this results in JSON's reading and saving to be fast, a lot of time was spent making sure it could read all the data times. Something I would like to look into is replacing it with run-time type reflection.

The engine also can read in JSON Tiled maps and build a level from it.

 

bottom of page