Survival Instinct

You play as a wanderer in the woods who had built a house to avoid growing civilization. Destroying an old totem to make way for your settling angered the spirits of the land and consequently, released its fury in the form of wolves to take you out. It’s up to you to see how long you can survive the night.

Can you survive all 100 waves?

2 months

Contributions

  • Implemented wave generator that handles variable enemy counts, types, occurrences, and distribution
  • Scripted lamp interaction that deals with burnouts and material emission
  • Scripted wolf states (idle, chase, attack, damaged, dead) in addition to creating wolf animations

White-box

In-engine Development

Production Review

This was my first time working on a game project with a team by means of professional workflow. As the programmer, I made sure to get all scripted interactions up and running as soon as possible so that the other members could import and integrate audio and art assets.

I have also helped with the creation of assets in cases where we couldn’t find kits online. I found that Blender was particularly useful in creating low poly models, and it was the first time I used Blender. I created the torch, terrain, shoe (power-up), waterfall mist, and hills in Blender.

The biggest challenge I faced during this project was getting the wolves’ AI to work properly. This included a lot of tweaking in the NavMesh properties (agent height & radius, voxel sizes, etc.) to make sure the wolves are able to traverse steep terrain and also maintain appropriate height level so that they keep a proper distance from the player when attacking (sometimes the wolves could get underneath the player, therefore lifting the player up).

Wave Generation

I reused and refactored an enemy wave generation script from a past project. Although its functionality is not yet complete, I was able to easily modify the code for generating wolves.

The following formula is used to determine the number of wolves to spawn each wave:

$$ N = \frac{ f - b} { (w_{max} - w_{start})^s } * (w_{count} - 1)^s + b $$

where:

$N$ = number of wolves in a wave

$f$ = final wolf count in the final wave

$b$ = starting wolf count in its first wave

$w_{max}$ = maximum wave

$w_{start}$ = wave of wolf’s first occurrence

$w_{count}$ = number of waves since wolf first appeared

$s$ = slope of generation

flowchart LR; A([Wolf 1
40%]) --> F B([Wolf 2
30%]) --> F C([Wolf 3
30%]) --> F D([Wolf 4
50%]) --> G E([Wolf 5
50%]) --> G subgraph Units A B C D E end F(Tier 1
60%) --> H[Generator] G(Tier 2
40%) --> H subgraph Tiers F G end H -- forecast spawn counts --> I[List of spawn counts per wave] I --> J[Spawner]

Spawning enemies at runtime:

flowchart LR; A([OnWaveEnd]) --> B[Enqueue units] C([OnWaveStart]) --> D[Dequeue random units]
Tony Nguyen
Tony Nguyen
Technical Game Designer

Tenacious game developer with an unwavering passion for overcoming game development challenges.