Epic Games announced the Epic Mega Jam as a celebration of their 1 year anniversary of hosting game jam events.
It was a great opportunity to take a holiday from my studio work, refresh my mind with some features which have changed since UE3 and UDK, and to have some fun with Unreal Engine!
The theme: Standing on the shoulders of Giants led me to an idea where players use twin grapple hooks to traverse between “the scavengers” and defend them from the relentless hordes of AI drones by… you guessed it… standing on their shoulders in a “king of the hill” style game mode!
My narrative reads something like this:
You are the only defense for the “scavengers”, giant robotic beings who must travel out into a hostile world in search of Energy and mineral resources to power their super-city and its defensive energy shield.
Whilst out in the world, the scavengers face an organic race who are smaller and nimbler than themselves, leading the scavengers to develop you, the guardians.
Although I never completed the art for the swarm who were supposed to deliver a visual opposition to the scavengers; I did manage to complete the rest of the narrative through the game-play. Defending the scavengers against oncoming hordes of enemies as they run (very slowly) through the mist – and ended up creating a really cool final visual identity for the game!
I took the opportunity to go crazy with Weapons, Character locomotion and AI scripting using blueprints. My first port of call was the character grapple hooks (above) where I referenced and tweaked a great tutorial from Peter L Newton on youtube:
I continued from here by iterating on my character design and “flow”, by which I mean I made it feel better to grapple and land, switching intuitively between 1st and 3rd person to give a better view of the game world and greater visual narrative for the actions you were performing – I also wanted it to look badass!
After completing character motion, I started to create Enemy “AI” or more simply, finite state pawns which either move to the player, or orbit the player and attack with their weapon of choice. I started with behaviour trees but went ahead and started my own system which was hard coded through blueprints. I’ll be re-visiting that soon. Here is the list of enemy types included in the jam:
AI_MainPawn > Extends to:
The parent AI_MainPawn handles the base movement mechanics and targeting, as well as firing its own weapon, allowing me to customise the basic variables of each child class, like health, speed, damage, fire rate and score.
I then produced the different weapons using a similar Base_Weapon parent and extension system, and set those up on each drone, the original plan was to give them unique art to distinguish between enemies – but I met a few brick walls on the way through the Jam.
I finished with an array of different behaviours and some interesting “damage zone” design for each weapon – splash damage AOE, kamikazee enemies, timed death rays and flyby minigunning – really giving the player something to worry about and memorise for each enemy.
In my work environment I focus on UI production using UMG, however, I haven’t been making anything based on traditional games, so spent one of my afternoons finessing this damage indicator and directional radar!
One of the most important things in my game was challenging the player against waves of enemies, I needed something robust to handle this challenge and developed a customisable enemy spawner:
The original iteration on this spawner allowed me to setup the waves for “the mission”, with delays in between waves, the spawn number for that wave, and the types of enemies which should spawn.
It worked great until I neared the end of the Jam and decided – “you know what, this would be better as an infinite runner for now” and quickly made a version which set random settings between my upper and lower limits (random number of enemies per wave, random delay between waves, random type) but ensured they were reasonable for performance and fair game play.
My original goals for this game changed a lot but I stuck to these 4 core components:
- Character (Grapple Character)
- Enemies (Damage Zone design and Wave Spawner)
- Weapons (Rocket Barrages and many explosions)
- Objectives (Defending Giants)
With these in mind as I worked day and night, I managed to actually complete a majority of it! Including some things i’d wanted to do for a long time, like on screen indicators for objectives, and this sonar-like shader:
That was a happy moment! I used these for the “control zones” (if you hadn’t noticed, my game is heavily based on my current favourite game – think shanks, think control and look at my UI!).
Players inside this zone increase its “completion” and eventually heals the giant you are standing on.
The final game (and post jam iterations) can be downloaded from my google drive here:
The game jam submission featured the following elements:
- Dynamic grapple hooks for locomotion (can attach environment and to moving enemies)
- Dual RPG launchers
- UI Targetting system and homing missile array (max 20 shots)
- Dynamic objective system (pick an existing scavenger, spawn a hold zone and enemy mothership)
- Directional indicators for damage and objectives (enemy destroy / scavenger defend and health bars)
- Random enemy wave spawner from mothership
- Enemy redirection towards player once their target scavenger is defeated
- Infinte runner style gameplay (with score displayed at the top of the screen)
- End game feature based on all scavengers dying
- Various enemy types (gunners, snipers, missile launchers and exploders)
- Camera shake and blood splatter screen effects when taking damage
- GPU rocket trails, explosions and world mist/cloud layer
Overall I’m really happy with the progress, please let me know what you think in the comments below or on my twitter!!
Don’t hesitate to send me a message if you want to write anything about my game jam, i’d be really excited to talk more about the idea and will be working on it more in the future thanks to its positive reception from Allar during his gaming sessions on twitch!