Project Eventide


Development Team Artake Games
Programming Language(s) C++, Blueprint
Software Unreal Engine 4, Visual Studio, Perforce
Role Gameplay Programmer

Background

Project Eventide is a fan-made sequel to The Legend of Zelda: Twilight Princess.

It is built using Unreal Engine 4.

I was responsible for coding most of the gameplay related systems. A majority of the codebase is in C++, with Blueprint being used for scripting simpler level setpieces.


All weapons, both offensive and defensive, exist as entities independent of the characters that wield them. They can "activate" and inflict damage even when lacking a user.

For a weapon to be lethal, it must be moving at a certain velocity. This is either done by a character swinging the weapon in an animation, or by the weapon being thrown/dropped. If the weapon is not moving fast enough, its damage hitbox will be disabled.

When a character is hit by a weapon, they become invincibile for a limited amount of time. This is to prevent a weapon from inflicting damage every frame while inside a target. In order to allow for comboing, an additional "combo number" variable is used. Weapons have an assigned integer combo number, and entities which can be hurt have an integer value keeping track of the combo number of the last thing that hit them. If a weapon has a higher combo number than it's target, it will circumvent that target's invincibility time.

The main functionality of the player entity is powered by two state machines - one which manages movement and other core actions, and the other which manages combat actions. These can also be thought of as a "lower" and "upper" state machine.

By having two state machines, the player can perform certain actions at the same time. For example, while the player runs around, they can independently pull out their sword and use it. This greatly simplifies programming compound actions since one does not need to create a new state for every possible combination of actions.

Like similar third person action games, the player can jump and climb onto ledges.

This is done through a cylinder cast which first determines if there is a wall in front of the player, and then performs a downward cast from above the player to determine the exact height of the ledge.

Once the height of the ledge is determined, the player's own height is compared to determine if they are within reach to grab the ledge.