Corrupted Blood

For the final capstone project at Full Sail University, I worked in a team for 4 months to create this game from scratch. Based on Dishonored, Corrupted Blood is a stealth game set in a corrupt theocracy where the player must aid the poor and eliminate the powerful nobility. I worked on multiple level prototypes for this project, one of which became the final level of the game. I also worked on a number of mechanics and systems.

 

Game Trailer

 Post Mortem Video

 

Levels

 

Estate

The Estate is the last level of the final version of our game. In this level the player must identify and kill a character known as The Charitable Lady. Players will be able to find disguises throughout the level that allow them to blend in at a party in order to speak to NPCs and explore the level without alerting the guards.

 

 

Moodboards

For this level I drew a lot of inspiration from Victorian mansions for both the layout of the estate and the interior decor. The gardens in the exterior changed quite a bit from the original design to the final blockout, however many of the sources of inspiration remained the same.

 
 

Level Map

Creating the map for this level was a new challenge for me and required more research than I originally anticipated. In order to create a layout of an estate that was believable and fun to explore I was constantly looking at different mansion blueprints from both Victorian and modern style houses.

 
 

Blockmesh

During the first pass of level blockout my main focus was on the estate itself and making sure all the rooms were scaled properly. So that I could focus on the estate, I made the original gardens relatively simple, and it was clear pretty quickly that the design didn’t fit well with the stealth aspects of our game. During the next pass I focused solely on the exterior to make it a more enjoyable experience.

 

Original Garden Design

Updated Garden Design

 

Finishing Touches

The last month of our project was dedicated to finishing touches on our levels and adding any last systems. My time was mostly split between adding final assets to the Estate and creating the Achievement system. Since I wasn’t spending all the time on my level I wasn’t able to replace all the assets, but I know that I’ll also have future opportunities to go back and add more details.

 

 

Upper Rich Area

The original idea for this level was that it would be combined with another team member’s level to create a larger city. However, even with two of us working in one map we quickly realized that our idea was far out of scope for this project, which ultimately led to both levels being cut. Even though it wasn’t used in our final game, this level was still a great learning opportunity for me, and if we had more time to expand on it I think it would’ve made a great addition to the game.

 

 

Moodboards

This level was meant to provide a stark contrast between the run down city where the player starts the game, showing the vast difference in living situations for the people of this empire. I took a lot of inspiration from European cities and building styles, both victorian and modern. I also worked closely with the team member making the poor area so our buildings had similar architecture.

 
 

Level Map

The original level map I had created had a lot more details, as well as plenty of room for expansion if I had the time. However, I found that a lot of this had to be scaled down in order to finish on time. For example, I originally planned to make a larger variety of buildings with more interior spaces for the player to explore. I hadn’t realized how much time this would take, and ended up having to cut a lot of it to meet the deadline.

 
 

Blockmesh

While creating the blockout for our levels, me and the other team member working on the rich area came to the same realization that this environment didn’t work very well with our mechanics. One of the main aspects of our game was the ability for the player to navigate levels vertically via the Blink ability. However, we found it difficult to add elements of verticality that didn’t feel out of place in a pristine city. We had brainstormed a few solutions, but ultimately decided that our time would be better spent on other aspects of the game.

 
 

Mechanics

 

 Blink

 

The first mechanic I got to work on for this game was a duplication of the Blink ability from Dishonored. While at first glance this ability is a simple teleportation of the player, I quickly came across many edge cases that made it’s implementation more difficult. The main portion of the code is set up on a timer that starts as soon as the player activates the ability with the Left Mouse Button. That timer contains the main CapsuleTrace as well as code that adjusts the end location based on the surrounding meshes so the end location can never be through a solid object. The timer loops every frame until the player releases the Left Mouse Button and they are teleported to the last end location that the timer returned. The player also has the ability to cancel the ability before they release it, which is set up via a branch at the start of the timer checking if the player has pressed ‘F’.

 

Just like the Blink in Dishonored, our Blink also gave the player the ability to climb objects from a distance. For this portion of the code I worked closely with the team member who was working on the mantle mechanic. While both of these features required slightly different takes on the climbing ability, they both used the same system of three Capsule Traces to determine if the player can climb an object, and where they will end up if they can.

The biggest issues with this mechanic came when the team started to create level blockouts with more complicated geometry than the basic cubes in our metrics level. Having complex collision on objects meant the blink would often return locations that the player couldn’t teleport too due to lack of space. The best fix we determined for this was to manually go through our levels and add simplified collision to areas where the blink is prone to fail, however we didn’t have enough time to complete this before our last deadline.

 

Systems

 

 Achievements

 

The achievement system was an addition made during the last month of our project. As a team we created a list of 15 achievements that would be simple enough to implement that they wouldn’t cause any major issues with our game. The implementation of the system was relatively simple, with the biggest issue being the time it took to implement each achievement in different areas of code, and then playtest each one to make sure it worked.

Each the the achievements had their own variables in our game instance so that it could easily be saved between levels. During different actions in the game the variables would be adjusted and checked to see if the achievement requirements were met. For example, one achievement we had was called “‘Tis But a Scratch” which requried the player to die 10 times. This achievement had a bool to say if it was completed, as well as an int to track how many times the player died. In the player’s death code, the death number would increment and if that number was greater than or equal to 10, the achievement was completed.

 

The achievement menu was a simple scrollbox containing 15 images for each achievement. Each of the images had two versions and switched based off the bool mentioned previously. If false, the image showed the locked version. If true, it switched to the unlocked version.

One last detail in this system was the pop-up that appears on screen when the player unlocks an achievement. This wasn’t originally a required task, but I knew it would be a nice addition of player communication. The pop-up is an widget animation that is played when an achievement is unlocked. The biggest issue I encountered with this was cases when the player unlocks multiple achievement at once. Whenever this was possible, I had to add delays before the animation was played, however the length of the delay had to change based on how many achievements were actually unlocked.

 Level Stats

 

Level Stats were added alongside achievements since a couple of the achievements relied on the results from the levels. This goal of this system was to create a more polished ending screen for our levels as well as adding replayability so the player can try to complete levels with different goals. Most of the stats relied on using a switch that would store values based on which level the player was in. These values were stored in variables in the game instance, similar to the achievements, and then called once the ending screen was displayed. The enemies killed stat was a bit simpler since I was able to directly get all the enemies of the level and check if they were alive or dead.

The check mark images were set up in the same way as the achievement menu images, switching between two images based on a bool value. The also had a widget animation like the achievement pop-up in order to give the stamping effect. The three bools for Ghost, Immortal, and Pacifist are what were required for three of our achievements. Ghost, for example, related to the achievement “Ghost of the Empire” which unlocked if the player achieved Ghost in all 4 levels. In order to accomplish this, the variable that stored the Ghost level stat was a map that had the bool and level name for all levels. When the player completed a level it would add a true or false value for that level, and the achievement status would only be checked if there was a value for each level.

Previous
Previous

Anarchy Park

Next
Next

Velocity Rush