✦   ✦   ✦

Year IV Final Project — Computer Games Development

Veilfall

A wave-based character action game built in C++ and Ogre3D

Hack & Slash 3D Real-Time State Machines N64-Style Visuals AI Pooling Purple Fog
Scroll
Player character
3D Full 3D Rendering
9 Player moves
2 Enemy Types
Wave Mode
20fps Anim Frame Limit
C++ Core Language
Gameplay — Veilfall

About the Game

Veilfall is a 3rd-person character action game built using C++, Ogre3D, and Blender. Ogre3D is a 3D rendering library with little to none in the way of built-in physics or object management, so systems like collision, scene management, and UI were all implemented from scratch. The gameplay is inspired by character action games like Devil May Cry, God of War, and Bayonetta, combined with wave-based gameplay similar to Call of Duty Zombies or DMC's Bloody Palace mode.

The game has a purple fog visual style with a 5th-generation console aesthetic. 3D characters and environment are rendered in 3D space, while UI elements like the main menu and health bar are in 2D. A 20fps animation frame-limiter replicates the look of N64-era games while the game itself runs at 60fps.

The final build includes a playable character, one grounded melee enemy, one flying ranged enemy, a battle arena, wave-based difficulty scaling, health, UI, and a main menu.

C++ Ogre3D Blender Mixamo SDL2 imGui

How it Works

Four main systems underpin the gameplay, each implemented without engine scaffolding.

I

State Machine

Player and enemy both own a State enum. Depending on the current state, they have different available transitions, update loops, animations, and variables toggled on entry. Player input, input buffering, and cooldowns control the player's state transitions.

II

AI Behaviour & Pooling

Rather than all enemies attacking at once, the pool nominates one aggressor at a time while the rest hold a formation around the player. If the aggressor is being attacked or dies, another takes over. This keeps pressure on the player without everything ganging up simultaneously.

III

Hitboxes & Hurtboxes

The design is intentionally more generous to the player: slightly smaller player hurtbox, slightly larger player hitboxes. The opposite applies to enemies. Accuracy and realism matter less here than game feel — what reads as fair in a multiplayer game can feel frustrating in a singleplayer one.

IV

Animation Blending

The 20fps frame-limiter replicates a stylistic N64 look while the game runs at 60fps. Animations still blend between states so transitions look natural rather than snapping abruptly, which helps the combat feel responsive despite the retro aesthetic.

V

Input Buffering

Attack inputs are buffered to allow early queuing during active states. Combined with attack cancelling and jump cancelling, the player can exit states earlier than the animation would normally allow, which is important for the genre feeling responsive.

VI

Custom Fog & Materials

Ogre's fog either doesn't render on the skybox or fully occludes it. To get the grounded purple fog look, the skybox uses a two-pass material where the second pass copies the world fog colour, creating a vertical gradient that blends into the scene fog.


In-Game

Click any screenshot to enlarge.

Skulls and Redeads surrounding the player in the arena
Player character standing in the arena with the purple fog skybox
Wave 1 start, health bar visible, enemy shadows in background
Player attacking a Redead with sword, afterimage visible

Enemies

Two enemy types, each designed to be countered through different mechanics so the player has to use the full moveset rather than one approach.

Redead

Redead

A grounded enemy that approaches and attacks in melee range. Can be launched into the air with an uppercut move, putting it out of range of other grounded enemies. While it's airborne, other enemies in the pool will take over as aggressor.

Skull

Skull

A flying enemy that attacks from range. Added specifically so the air isn't a safe zone when the player launches grounded enemies. The player has a downslam move to exit the airborne state quickly rather than waiting to land.

Waves increase in size as the player progresses. Difficulty scales linearly rather than exponentially, so the challenge increases at a consistent rate rather than hitting a sudden spike.


Project Timeline

September 2025

Project Start

Initial concept inspired by Devil May Cry, Zelda, Drakengard, and No More Heroes. Planned as a hack-and-slash with puzzle elements. Ogre3D selected as the rendering library. First milestone: player movement and animations by end of October.

November 2025

Player Movement & Animations

First milestone completed, running about a month behind the original target. Basic movement and animation playback working. Full combat implementation was originally planned for November but got pushed back.

February 2026

State Machine & Combat

Player states and attacking implemented early February. Full state machine including transitions, cancelling, and input buffering completed later that month. Combat started feeling like the genre at this point.

March 2026

Visual Update & Mid-Project Presentation

New player model and animations added. The game's visual style came together this month. The mid-project presentation had a basic enemy AI and the completed arena, mostly as a test target for the combat systems.

April 2026

Final Build

Full AI pooling, player and enemy HP, collision, aerial enemy, wave system, UI, and main menu added. The game has a complete playable loop with a wave high-score goal.


Download

The final build is hosted on Google Drive. The archive contains the compiled executable and all required assets — extract and run Veilfall.exe. A Windows machine is required; no additional install is needed.

Download Build
Google Drive — Windows

What I Learned

The main thing I took from this project is a better understanding of why character action games play the way they do. Working through the first iteration of combat without input buffering or attack cancelling made it obvious why those systems exist. The same was true for enemy groups — before the AI pooling was in, enemies would just rush and stunlock the player, which made it clear why coordination systems are necessary.

Ogre3D was a good choice for learning how a 3D engine works under the hood, even if the documentation is lacking and some things like UI and controller support were harder to implement than expected. The visual side of the project — particularly the materials system and getting the fog to look right — ended up being more of a learning process than anticipated, but the end result is close to what I had in mind.

  • DeveloperDylan Crimmings
  • Student IDC00273675
  • SupervisorBen O'Shaughnessy
  • ProgrammeComputer Games Dev, Year 4
  • RendererOgre3D
  • 3D ToolingBlender + blender2ogre
  • AnimationsMixamo (adjusted)
  • Submitted13 April 2026
  • CVView CV ↗