Stuffed – Waving Bear Studio

PlatformPC, Xbox One, Xbox Series X|S
EngineUnity
Team Size6
Duration3 years

Stuffed is a procedurally generated first-person shooter that takes place in the dreams of a little girl. You play as a teddy bear that fights waves of enemies while defending your owner’s door. Stuffed can be played solo or with 4 others in online co-op.

I worked on Stuffed for 3 years, from before release to early access. Waving Bear Studio consisted of 6 people while I was there, with 2 of them being other programmers.

I mostly worked on gameplay systems like the player perks and powerups but I also worked on extending the enemy AI, general optimization and porting the game to Xbox One and Series X|S.

The early access release of Stuffed is available on Steam and there’s a  free demo available for Xbox One.

Extending Enemy AI

I spent a lot of time working on the enemies in Stuffed. When I joined the game had four enemy types, I worked on those and then implemented an additional four. I also added a hit reaction to the enemies, got them to use object pooling and implemented behaviours related to the player powerups like the Freeze and Befriend powerups.

 All the enemies in Stuffed use a state machine with their main states being “move to target” and “attack target”.

The Shadow Minion and Sock Monster enemies needed the additional behaviour of targeting the door the player’s protecting instead of the player. I didn’t change any states for this, instead I changed how enemies select a target. The door has a health component the same as the player so logic in the state machine still worked with the different target.

A group of sock monster enemies flopping to the ground when the player looks at them
Sock Monster enemies

The Sock Monsters were one of my favourite parts of the game to work on. They have an additional state where they stop and ragdoll whenever a player is looking at them.  I tried a few different methods for this trying to find a solution that wasn’t too expensive but also wasn’t too accurate so that the monsters could move in the player’s peripheral.

There were some performance issues with multiple Sock Monsters entering the ragdoll state at the same time. To optimise this I reduced the number of joints in the ragdoll and added the option to have set percent of the monsters play a flop animation instead.

A gnome enemy whose head shatters when the player gets a headshot

Enemy Hit Reaction System

We wanted to make enemies taking damage more dynamic so I worked with artists and an animator to implement a hit reaction system that allowed enemies to have different VFX and animations per collider if needed. 

The first enemy we completed was the gnome, they have separate shatter VFX for each limb, their body and head. They also have a shader that makes them appear to crack the more damage they take and then multiple damage and death animations for the different ways they can take damage. 

Progression and Perks

The player gets XP for most actions in the game like killing enemies or opening doors. I worked on the system that allowed players to earn XP and then I helped design and implement a number of perks that the player can spend that XP on such as increased health, weapon upgrades or a door repair kit.

The player accessing the level up menu and choosing some perks
The player using the Real Bear ultimate

Powerups and Ultimates

Stuffed already had a powerup system when I started working on it, powerups have a random chance to spawn every time an enemy died and they are used and activated once the player collided with them.

I extended that system to also have ultimates which the player had to interact with to use and then instead of activating instantly they are stored until the player chooses to use them. The three ultimates I added are the Chest Burst, which sends out a shockwave around the player killing any nearby enemies, the Befriend ultimate which would make some enemies start targeting each other and finally the Real Bear powerup. The Real Bear took the most work as it counted as a new melee weapon, a new player state and it required the first and third-person bear models to be switched and all of this had to work online.

Wardrobe and Player Customisation

Another system I worked on was the player customisation and wardrobe system.  This involved refactoring the player prefab to be able to change the first and third-person meshes and then sync that with other players in coop.

It also involved adding the wardrobe UI to the main menu. From the menu, players could buy different furs, outfits and weapon skins and equip them. For saving this data I initially implemented a save system that converted the player data to JSON and saved it as a binary file. 

After doing more research into save systems in Unity and having a bug caused by a specific skin I remade the save system using a PlayFab Inventory. The major benefit of this was that most of the skin data could be edited in the PlayFab dashboard. This allowed me to add a kill switch tag in case we had another skin-specific bug. It also made it easier for non-programmers to edit skin values such as prices or UI names as they could use the web dashboard instead of in-engine. Another benefit was that it acts as an anti-cheat as players can no longer edit their local save data.

After I added this PlayFab integration it was relatively quick to also add PlayFab stats and currency integration.