top of page

 Team Projects 

Lost in the Dark

Lost in the Dark is a third-person exploration game with horror elements set during an epidemic in Victorian-era London.  Players play as a young orphan trapped in her own psyche who must find a way to escape from a nefarious entity seeking to drag her into the depths of the darkness.  Players are equipped with a lantern as their sole means of protection, and must stay in the light to avoid fading away.  

​

The core mechanics that a player can utilize are the ability to focus the lanterns light, to hide the lanterns light and become ghost-like, and to pick up objects that can solve puzzles.  

Features I contributed Toward

Investigation of Objects

If an object were picked up by a player, then the design decision was for the player to be entered into an investigation screen of the object.  Where they could move the object around and investigate it's details.  To do this, I had a post process darken the screen around the object and then allowed the player's mouse to rotate the object on all three axes (after some QA the decision was made to tilt the object and only rotate it left and right).  

Investigate
Investigate_player_call
Investigate_event
Investigate_Activate_Investigation_part_1
Investigate_Activate_Investigation_part_2
Investigate_Activate_Investigation_part_3
Investigate_Activate_Investigation_part_4
Investigate_Activate_Investigation_part_5
Investigate_Item_Location_Macro
Investigate_Item_Rotation_Macro
Investigate_revert_part_1
Investigate_revert_part_2
Investigate_Turn_Call
Investigate_Turn_Func_part_1
Investigate_Turn_Func_part_2
Investigate_Turn_Left
Investigate_Turn_Right
Pickup
Pickup_component_layout
Pickup_player_part_1
Pickup_player_part_2
Pickup_player_func
Pickup_pickup_event
Pickup_Attach_part_1
Pickup_Attach_part_2
Pickup_Attach_part_3
Pickup_Attach_part_4
Pickup_player_func_putdown
Pickup_putdown_event_part_1
Pickup_putdown_event_part_2
Pickup_Detach_part_1
Pickup_Detach_part_2
Pickup_Detach_Pos_part_1
Pickup_Detach_Pos_part_2
Pickup_Detach_Pos_part_3
Pickup_Detach_Pos_part_4
Pickup_Detach_Pos_part_5
Pickup_Detach_Pos_part_6

Picked up Objects

These were objects that were originally designed to be any object a designer chose, and when activated by a player, would be placed into the investigation mode and then either placed back or carried by the player character depending on the designers choice (picking up the object also includes the player having the ability to drop it as well).  Because of the need for designers to have freedom with this, I structured the system so that a base class would  perform all of the logic necessary; thus all a designer needed to do, was to inherit from the base class and supplement the data they needed.  

Shadow Locked Doors

Being able to lock doors and have an enemy that can influence a player's pathing abilities was requested.  So I created a door that can be locked by the and activates a designer created effect, then can be opened when the player focuses their light on it for a designer specified amount of time.  The opening would play a designer created effect then swing away from the player.  

Door_part_1
Door_part_2
Door_part_3
Door_components
Door_tick
Door_ui_part_1
Door_ui_part_2
Door_ui_part_3
Door_ui_part_4
Door_check_unlock_part_1
Door_check_unlock_part_2
Door_spotlight_part_1
Door_spotlight_part_2
Door_spotlight_part_3
Door_spotlight_check_part_1
Door_spotlight_check_part_2
Door_spotlight_check_part_3
Door_spotlight_check_part_4
Door_particle_part_1
Door_particle_part_2
Door_Activate_part_1
Door_Activate_part_2
Door_Activate_part_3
Door_rotation_part_1
Door_rotation_part_2
Door_rotation_part_3
Door_Deactivate_part_1
Door_Deactivate_part_2
Door_bagman_action
Painting_part_1
Painting_part_2
Painting_tick
Painting_Check_completion
Painting_change_mat
Painting_Activate_part_1
Painting_Activate_part_2
Painting_Activate_part_3

Painting Puzzles

The paintings work similarly to a doors, except they are always locked until the player can bring them the correct pieces to complete the portrait.  This was achieved by having a tag list the painting checks against, and if the object dropped into the alter has the corresponding tag from the key list then a bool list is marked true for that key.  When this list is completely true, then the painting can open up the path it is obscuring.  I also had a chance to do some technical art work, and create a material and material function that could allow designers to change the portrait and alpha maps for the key items.  This allowed us to achieve the glimmering effect for the missing items.

Ghost Mode

In order to give the player an option between walking in either the light or the dark and having consequences for either, the decision was made to add the ghost effect when the player hides their lantern.  This meant that the player could have optional paths if they hid the lantern; however if the player stayed hidden to long, then they would fade away and die.  This was achieved by utilizing UE4's collision channels and allowing certain object types to be passed through.  The visual effects were done by changing the characters material to one that had the "ghost-like" appearance.  This material would update its transparency based on the player's time hidden and used a depth-culling function I wrote to get rid of the artifacting that came up from the character being made of multiple meshes.

Ghost
Ghost_fading_bp
Ghost_material_func
Ghost_custom_code

Key Mapping

At first I had attempted to write some C++ code for this; however, because of a cut back in time the decision was made to make a quicker fix.  This led to the actual implementation, which was a save game object on the game instance that stored a bound key to action list.  This was loaded from at game start, and referenced to determine the appropriate action from a player's input.

Core Light System

This was a core system that was made back during the game's prototype period, and had most of its impact removed from the game.  Essentially it is a base class of light for designers to use that could do the following as either a spotlight or point light:

  • Detect if an actor was inside its light

  • Run down in size over time based on a fuel value given by designers

  • Be turned on and off by the player

Recharge_1
Recharge_bp
Reacharge_func

Lantern Draining Effect

Should a player focus their lantern light for too long, then it is designed to burn out for a short time.  My task was to help convey this to the player.  It was achieved by making a lighting function that would trigger on the lantern to start a soft flicker, a color mapping for the "glass" section material on the lantern to transition from a bright lit color to a black, and finally by playing a sparking particle effect when the lantern finally died.

Lost in the Dark

Auxilium

Auxilium is a multiplayer, class-based,  objective-based, first-person shooter set on a distant planet filled with magic and technology. Players split into two opposing sides and attempt to capture the other team's flag while defending their own in intense 4v4 capture-the-flag action.

The game combines a balanced variety of play styles to create a fun and satisfying experience that makes each player feel empowered while playing. The game also emphasizes strong environmental context, conveying the story of magical beings locked in the struggle of preservation vs. prosperity between the rebels fighting for survival and the corporate mercenaries fighting for society's continued prosperity through trade and magic exportation.

Features I contributed Toward

Assault Character

This class is meant to be the boiler-plate class for standard FPS players.  It has a medium move speed and medium maximum health, with a fully automatic assault rifle with medium range, and its class ability is to fire a rocket that causes enemies in its splash to immediately overheat their weapons and to be pushed away from the center of impact.  

Sniper Character

A player class that moves slightly faster than the assault class, has a lower maximum health, a higher damage per shot, and a single shot sniper rifle with a large range.  The rifle has the option of of zooming in, which places a Scope canvas on the screen and zooms the player camera in.  The class ability is to launch an energy orb, that when it lands will create a healing field for the player and any teammate.

Enemy Outline Silhouette

Through some QA, it was determined that player's benefited from the addition of enemy silhouettes.  To achieve this effect, I used the UE4 post processing volumes to create and outline of depth targets.  These depth targets are determined by a collection of players that are not on the client team.

Outline
Outline_bp_1
Outline_bp_2
Outline_bp_3
Outline_bp_4
Outline_mat

Worked to set up Networking

Because the game was a 4v4 multiplayer game, it was requested that we add a networking system to the game.  The system we decided to go with was to have a client host the game, and then have the other players join.  The host then decides to start the game if all of their friends are in.

Performance Optimizations

During our development process, we came across hard performance drops begin to take place. I was tasked with finding the bottlenecks and determining a solution for them.  The three major problems we came across was an abundance of CPU particles,  Usage of more memory on the GPU than what the engine would reserve, and an abuse of multicast and replicated events.  These were determined by using the UE4 debug console to monitor particle performance and GPU performance, and the network traffic was determined from walking through the code base.  The final fix for each was as follows:​

  • The CPU particles were used more sparingly in level or transformed into GPU particle systems

  • The default engine reserved memory on the GPU was increased to an amount that would be sufficient

  • Some of the code base was rewritten to reduce traffic, however most of it was too ingrained for the time we had left on the project

Wind Tunnel

One of the levels, the Atrium, has a tree that designers wanted to have a magical air lift.  Given the requested design, I made a blueprint that applies an upward impulse of force after a designer amount of time that a player overlaps with the capsule.  The magnitude of the force would decrease based on the overlapped players height in the capsule.

Healing Pickup

A pickup designed to heal an overlapped player by a designer specified percentage, then deactivate for a designer specified amount of time before reappearing.

Pickup
Pickup_overlap_1
Pickup_overlap_2
Pickup_overlap_3
Pickup_tick_1
Pickup_tick_2
Auxilium

Knightly Burden

Survive as long as you can in the plague ridden land.You can control the villagers and the Paladin and instruct them to do various tasks depending on whether it is day or night.

​

During the day, the villagers and the Paladin collect supplies from around the land. These supplies include grain, which keeps the villagers alive by replenishing their health, and wood, which you can use to upgrade the buildings in the village.

During the night, the villagers and the Paladin must defend the village from a Plague Knight army. Here the Paladin uses his Inspire ability to help empower the villagers as they protect the village buildings from destruction. This ability empowers all villagers around the Paladin making them stronger than normal. Protect your Paladin, your villagers, and you village against the armies of darkness.

Features I contributed Toward

Animation curves

Using Unity's Animation Curve Component, I was able to create a blinking outline around resources to allow player's to know what they can collect.  Another way that I used them was as a transition for the Houses.  As the House's health would deteriorate, the curve would fade a fully built house sprite to a destroyed one.

Day/Night cycle

Since the waves were based on a day/night cycle where the day time decreases and the night time increases each wave.  Because of this I set the clock up to have a maximum time for a full cycle that started with a state switch at 50%.  As the player progresses through the waves, a designer chosen value would decrease the amount of time the day would receive and the switching point would move closer to a clamping value near 0.

Animation Trees

Using Unity's Animation tree system, for the three character types (Paladin, Villager, and dark knights) I was tasked with taking the sprite frames and have them animate.  This was achieved by creating a state machine in the animation tree for what animation to play, then using Unity's Sprite Animator to animate each individual frame.

Knightly Burden
bottom of page