Chalice Wizard takes place in Egypt, 1350 B.C. You are a priest, sent in the upside-down pyramid of KEK tasked to conquer the chalice of Ra in order to stop the resurrection of the dead Pharaoh Akhenaton and his obscure god.
In this quest, you will use a powerful relic given to you by the pharaoh known as the Horus staff. The staff has the power of manipulating sand around the user, creating powerful eruptions allowing for explosive movement.
Chalice Wizard was made using PlaygroundSquad's inhouse engine TenGine, and the team consisted of 4 artists, 2 designers, and 3 programmers.
I personally found TenGine cumbersome to work with, and felt like working in it often resulted in code duplication and dependencies. To solve this problem, I created an Entity Component System (ECS) framework with a bunch of independent components. We used this framework throughout the entire development process.
This system included components such as a mesh renderer, light renderer, animator, player controller, and other useful tools.
TenGine is a very bare-bones engine, and there is no built-in physics system to rely on like in other commercial engines. Due to this, we had to implement our own from scratch, and I was in charge of this.
I created a RigidBody component that was in charge of applying several forces to an object that you usually utilize in games, such as gravity, drag, and friction, but would also allow other scripts to add forces of different types to the object when needed.
In addition to the RigidBody component, I created a box collision system. This box collider would continously check against the player’s surroundings, and keep them from moving through surfaces.
I was in charge of the main mechanic; the arcane blast. This mechanic would allow the player to cause sand eruptions, launching themselves into the air when close enough to the ground. Holding down the button charges the blast, causing you to launch even higher.
Each successive blast adds an adaptive speed boost to the player, capped at a blast count of 3.
Out of the four traps we had in total, I was in charge of two; the fireball trap, and the gas trap. The fireball trap shoots fireballs at a fixed interval, while the gas trap causes an explosion when the player performs an arcane blast inside of the gas cloud. Both of these traps kill the player instantly on player overlap.
I created an Animator component that managed the animations of an object, and gave it common functionality you would expect from an animation system, such as the option to smoothly blend between animations, as well as an exit time for the current animation played.
I later used this system to implement all of the animations that our animator created for the project.
As Chalice Wizard was designed to be a speedrun type game, a scoreboard was essential. The scoreboard would show the player’s completion time on a specific level together with their initials, the top 5 scores being ordered from high to low.
This data would then be saved between game sessions locally through a text document and loaded on game start.