All work
Night Light poster. A glowing crystal on a stone tower at the centre of a night map, guarded by robot, UFO, and toy-train defenders, while pumpkin-headed creatures and ghosts close in from a dark rift.

Game 02 · Unreal Engine

Night Light

A game byJoshua Moonsamy and Xander Jacobs

Synopsis

At night, a sleeper’s dreams are protected by the Dream Core. Rifts open in the dreamscape, and creatures of darkness pour out to reach the Core and destroy it. Using the energy of dreams, you summon defenders to hold the light and keep the nightmares away until morning.

Night Light is a 3D tower defence game on a procedurally generated map. Enemies walk carved routes towards the crystal at the centre. You spend Dream Tokens to place defenders on platforms along those routes, and the game ends if the Core’s health reaches zero.

The waves adapt to you. They get harder when you are doing well, easier when you are struggling, and they send enemies down whichever routes you have defended least. The goal is to survive as many waves as you can.

Defenders can be upgraded twice, and they grow stronger and change their look each time. Enemies killed before they reach the Core can leave behind remnants, random patches of dream energy that help or hurt the defenders nearby.

Project brief

Night Light is our portfolio of evidence project, a tower defence game built across three parts, each marked out of 100.

Part 1, procedural terrain. Generate a 3D terrain mesh at runtime that changes every new game, with at least three paths leading to a central tower. The tower has health, attacks enemies on its own, and the game ends when it falls. Players place defenders on set spots that keep the paths clear, and one enemy type spawns from points based on the terrain. The game also needed a complete loop, clear UI that shows health, costs, and damage, and a pause and restart.

Part 2, procedural enemy waves. Add two more enemy types and two more defender types, each with distinct behaviour and a distinct look. Each of us wrote our own plan for a wave system that scales difficulty and adapts to the player’s skill and play style, and the team then built it.

Part 3, upgrades, shaders, and effects. Add at least two upgrades for every defender and for the tower, two custom shaders, a custom particle effect, a screen post-processing effect, and a procedurally generated feature of our own design.

Each part ends with an individual presentation video of about five minutes.

My role

I built the player’s side of the game and our procedural feature:

  • The player controls and the game mode they run through
  • The three defenders: the Patroller that circles its platform and strikes the nearest enemy, the Shooter that fires at one enemy from long range, and the Pulse that damages every enemy around it
  • Defender platforms, swapping between defender types, and freeing a platform when its defender is destroyed
  • The Dream Token currency used to buy defenders
  • The pause menu, the game-over screen, the controls screen, and the wave display
  • Setting up the defender and enemy models in the game, including the Brute and the Shade, and balancing the game
  • Defender upgrades: a shared upgrade interface, two upgrade levels for each of the three defenders, upgrading with the U key, and a new look at each level
  • Remnants, our procedurally generated feature. When an enemy dies before reaching the Core, a manager may drop one of six remnant types, picked by weighted chance from a data table, with some enemies more likely to drop certain types. Each remnant rolls its own size, duration, and strength. Three are hazards: the Weakening Puddle, the Damage Zone, and the Blackout Cloud. Three help: the Healing Glow, the Light Burst, and the Dream Shard.

Xander Jacobs built the procedural map and routes, the enemies including the mutating elites, the adaptive wave director, the tower upgrades, the crayon-style HUD, and the shaders, particle effect, and post-processing.

Tools

  • Unreal Engine 5.8
  • C++
  • Blueprints
  • Visual Studio
  • Fab
  • Git and GitHub

Process