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?
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
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: