GRAPPLEVANIA
Game Summary
Youkai have started running rampant through the nearby villages and it's up to you to rid your village of the source of evil originating from the temple. On your way, you'll be cutting down Onis and Tengus blocking your passage, traversing the environment with your grappling hook and blowing up walls using some highly explosive tools.
ROLE
Gameplay & Generalist programmer
Project Description
Grapplevania was the first group game-project I participated in at PlaygroundSquad. Over the duration of 5 weeks, we made this simple Hack & Slash game where you kill youkai while traversing the environment using a bomb and grapplehook. The engine used was PSQ's in-house Tengine and the team working on the game consisted of 3 programmers, 1 designer and 4 artists.
​
YEAR
2021
GENRE
2D Action, Hack & Slash
PLATFORM
PC
ENGINE & LANGUAGE
TenGine, C++
TECH TAGS
Combat, UI, animations, sound
GAMEPLAY
Combat
Making characters utilize hitboxes for their attacks is one of the first things I worked on. Since colliders don't exist as components in the TenGine framework, there weren't any signals or events to use for sending information about a target or attacker. Because of the time limit, I went for a simple approach of looping through all of the valid targets and did an intersection test with their hurtbox to see if it would connect. If it did, the attacker called TakeDamage() on the target.
Player vs Ogre
AABBs were used for both hitboxes and hurtboxes, and in order to check if the hitbox from an attack collied with the hurtbox of a character, the character's model's inverted world-matrix was used, along with some value flips in order to adjust for the rotation. This worked quite well, and to gain some performance because we were lacking some from other places, I gated the attacks from checking for targets every frame, instead making the check only run once the adjustable cooldown had expired.
Code used for attacking
Player blowing up a wall with the bomb
The Bomb
A bomb is at the player's disposal, and it's explosive power is enough to break walls that block the player's progress. The explosion also damages enemies and can be used to knock them away.
SYSTEMS & OTHER
Health UI
Updating the UI for the player's health was done as seen on the left. It accounts for the player being able to lose both full and half hearts. A simpler solution would have been to represent every hit as half a heart (2hp = a full heart), but people didn't agree with that, so I made this instead.
Since there is no physics engine associated with the Tengine framework and none of us on the team had used one before without the help of an engine wrapper, we decided to just apply our own simple physics like gravity and velocity. As the one with most experience with inheritance at the time, I was tasked with setting up the classes for that.
Gravity & velocity
(Shameless reuse of another gif) Note the player being knocked back, and the Ogre being knocked up and pulled down by gravity
Animations
In Grapplevania, characters all have three interpolators that make animation blending smooth: Current, Next and Blend. Current interpolates between keyframes in the currently playing animation, Next takes care of interpolation for any animation that the character wants to start playing and finally Blend is a mix between the two that is used while transitioning from Current to Next.
​
The player also has a separate interpolator that targets the upper body and sickle, which can overwrite the other interpolators. This allows the player to move and attack at the same time.
Animation blending
Sound
Implemented on the literal last day before the deadline, this wasn't originally my task. With everything else finished, we sat down and tried and figure out what was preventing FMOD from working correctly. After asking around the other groups and taking advice from the teachers, we found that the wrong files for FMOD had been installed, and that's why it wouldn't work. It felt super silly, but after finding that out, I just put in the code to play the sounds at the correct moments and went home.