Whenever we participate in a game jam, one of the core aspects people always compliment us on is on polish. With the release of Woofice Chair! those compliments came back around and we are very proud of receiving them again!
But what is this dark magical art that people call polish? And what about juice? While both are regarded as something to highlight in jam games, we believe polish is deeply connected with gameplay. Polish not only helps give a game a more complete-feel, but also helps making gameplay more satisfying to the player!
In our previous Ludum Dare entries, we always tried to force polish. This was done by adding in menus, pause screens and tweening as much as possible. While those helped the games feel more like a complete package, in hindsight, we feel the time spent on those could have applied more to the gameplay itself. With our latest entry, all of that focus with polish was put into the core game!
Through this development insight, I’d like to go over some tricks that we used in Woofice Chair! to make the gameplay feel extra good. While polish varies from game to game, there are common tricks that can be applied in all games! I hope some of these work as reference for what you can do with your own game’s polish!
Cameras! Screenshake! Freeze Frames! 🎥
In any article or video that you see about juice, camera smoothing and screenshaking are always mentioned! Being the window of the player into the game, it’s one of the easiest things to manipulate to help represent something is happening and add extra satisfaction to an action in it.
With Woofice Chair! we decided to experiment using the Cinemachine package from Unity to help facilitate camera actions. However, any of these ideas are applicable on their own using the default cameras in whatever game engine you’re using!
One of the first tricks we applied with Woofice Chair! was making the camera’s movement smoothed-out. Having the camera be constantly snapped to the player works, but doesn’t translate the concept of acceleration properly! And our game is all about that!
Using Cinemachine, we can add a bit of lookahead and smoothing when following the camera’s target. This makes it so the camera has some delay in its movement before catching-up with the player, improving the sense of acceleration. You can also achieve this same effect by code by using a Lerp.
Another major trick with cameras is screenshaking, used when there’s a ‘violent’ motion in-game. In Woofice Chair!, we use screenshaking whenever something causes the dog’s chair to suddenly lose speed. These include knocking into walls and obstacles or being hit by an enemy.
Implementing screenshake is not an arduous task either. You create a function that changes the camera’s X and Y position randomly relative to the player over some frames. Then you can just call that function whenever an action benefits from screenshaking! Cinemachine already comes with a set of Noise properties that achieve the same effect and can be controlled by code.
Something to note is that, with our non-game-jam releases, we make sure to make screenshake togglable in the settings. Even when balanced to not be too distracting, screenshake can cause nausea to some, and a toggle to turn it off is a nice accessibility inclusion.
Another method we employ with the camera are freeze-frames. Freeze-frames completely pause the game for a few frames to bring extra impact to an action. In Woofice Chair!, when you knock-out an enemy, the game will pause for a few frames, enhancing the satisfaction of doing a knock-out. It also gives you time to see the knocked-out sprite of an enemy before it’s flung off-stage.
You should use Freeze Frames sparingly! In our game, we added a short cooldown after each set of freeze-frames before they can happen again (less than half a second). This is to make sure if you defeat enemies in quick succession, it feels like a deliberate effect. Repeating the effect too often or making it too long can make it seem like the game has performance issues.
There are many more tricks when it comes to camera work, including screen flashing, zooming the camera in and out depending on the situation, and more!
Giving Players Feedback! ✨
While developing Woofice Chair!, we wanted to make sure all actions that the player takes felt tight and responsive. Controlling the chair should feel satisfying and hitting the enemies even more so! While the camera techniques go a long way, there are more ways to give the player feedback from their actions!
By using a combination of assorted effects, shaders and animations, you can make otherwise static instances and effects come to life!
One of the simplest ways we give feedback to the player is by displaying a sprite over the office chair whenever the player presses space to accelerate. This sprite shows some speed lines with animation that imply the player is rotating the chair. By giving a player a visual indication of their inputs, you gratify them with immediate confirmation!
Not only do you get the speed lines, but the rotation animation of the chair also loops faster with the acceleration. We also added Trail Renders to the wheels of the chair that increase their distance the faster the player is going. These, together with dust particles that appear whenever the player does a sharp-turns, give extra satisfaction to the player controlling it.
By mix-matching types of sprites, particles and other features that your game engine has, you can improve the satisfaction of the player doing their inputs! And that applies to the UI too, with buttons changing colours and sizes when hovered or clicked over! Make sure the player really likes pressing those keys and buttons!
We made it so certain objects would flash here and there to call quick attention to them! Sharp changes in sprite colours and tints are an easy way to give feedback to the player that an action has been performed.
These are done when there’s a successful hit against an enemy, or whenever the player gets hit! In Woofice Chair! we use sprite flashing when the player hits a buff-animal, causing them to flash white for a few frames, confirming a hit. If the player gets hit, its sprite flashes a bit between opaque and transparent indicating that they can’t speed-up.
It’s important to note though, If you’re going to flash the whole screen, consider that it can actually cause discomfort to players. If you must add them, use them sparingly or even consider adding accessibility options to disable said feature!
Depending on your engine, these flashing effects can be straightforward to setup! For example, in Unity, if you’re using a render pipeline, you can set up a shader graph shader for different types of tinting effects. In our case, we followed the tutorial by Code Monkeys to replicate the shader that we use! We also mix these effects up with some AnimationCurve and Gradient to setup the rest of the effect.
Outlines and Tweenings!
When an enemy is defeated in our game, they’ll drop a weapon or a score biscuit of various types and shapes. For these, we use a white outline to denote their status as a pick-up. With this outline, these pick-ups stick out from the background, and also from both player and enemy.
By pairing the outline with a bouncing, positive tweening animation, these pick-ups immediately attract the attention of the player. They’re always there for whenever the player feels like swapping weapons and to remind them to pick-up biscuits!
Animations, as mentioned previously, are one of the easiest ways to add juice to a game! Through the animation systems for each engine, or through a dedicated tweening library, it’s easy to go an extra mile and add a bit of tweening to some more static elements! Make sure those pick-ups really stand out!
Sound Design goes a long way! 📢
For this Ludum Dare, we chose to use FMod as an audio middleware! If you’re unaware of FMod, it is a special audio engine that uses an external studio editor to setup audio events, and plugs it on top of both Unity, Unreal or direct-code integrations.
The benefit of using a middleware, compared to the built-in audio engine, is that you have more control over several audio aspects of the game! With FMod, you can use parameters to dynamically tweak aspects of the game’s audio work in a more flexible way, allowing for more audio polish. If you’re going to use an audio middleware like this during a game jam, you’ll most definitely need a dedicated audio team member!
One thing to note though is, if you want to use FMod in your game jam games, you need to make them non-commercial (including donationware)! If you want to get revenue from your game, you’ll have to register your game on their portal, with max of one game a year for free.
If there’s one thing with audio that’s always been a hot-topic and an aspect players appreciate immensely, it’s dynamic audio! Dynamic audio works by either crossfading tracks, or adding in instrument layers depending on the actions that the player is doing in-game. It creates an engagement loop, where the player wants to keep a combo or an action going to get a more satisfying beat! 👏
For Woofice Chair! , we tied the rotation speed of the chair to assorted layers of instruments that make up our main music track. The faster the player is spinning, the more happy and instrumental the track gets. The moment you get into lower speeds, or crash the chair, the music lowers until silence. Also, there are ambient sounds to really sell-in on that park atmosphere.
Remember that dynamic audio needs to be thought ahead of time, and settled in with the audio team member as soon as possible! If a music composition is planned ahead of time to have layering instruments, its easier to break it into dynamic pieces!
Another audio aspect we are particularly proud of is the weapon hit sounds! In fact, we could argue some like the meat-bone sound very… juicy! Terrible puns aside, the weapons sounds have been one of the aspects people have praised the most regarding the sound design of the game!
We broke the repetitiveness of weapon hit sounds by having a different sound for each weapon. A newspaper doesn’t sound the same as a blunt bat! And to go one step further, each weapon also has three to five sound variations paired with small pitch variations! That way we assure they always sound new when you first hear them!
By using slight variations in sound, even if they’re just pitches, you can make them feel a lot less repetitive! While we used FMod to set this randomness up, you can use a script together with an Audio Source. From there, you randomly change the pitch and pick a sound to play whenever you want varied sounds!
Picking the correct sounds for the right project is a very important aspect of audio design! In a rush and without a dedicated audio person you can always settle for the first sounds you find. Although, if you do have the possibility to spend more time researching audio, then the more theme appropriate your sounds are to your game, the more impact the audio will have!
The most notable example is, when you pick up one of the aforementioned pick-ups in the game. When you equip any of the weapons, you’re rewarded with a very satisfying dog bark! Might seem like a minor detail, but since you’re a dog riding a chair, it feels appropriate! Samewise, when you are hit by an enemy, you hear dog whimpers. It’s saddening, so protect the dog at all costs!
Depending on the game that you’re working on, different sounds will be needed for different situations. If you’re doing a game involving puzzles, feedback whenever you interact with the game’s mechanics will feel like extra juice to the player. The same can be said regarding any genre’s game. And there are always multiple ways to go around getting sounds, such as using BFXR for a retro-themed game!
The Dog is in the Details! 🐶
One thing that we’ve realized as we’ve participated in game jams, is that a lot of the small details together make the most impact. While the polish techniques mentioned over the past techniques make an impact, these are the things that really give that warm feeling of “having paid attention to detail”!
One thing that is immediately noticeable before you even boot up the game is the executable icon. If you’re using a game engine like Unity, swapping the executable icon is a matter of assigning it an asset in the build settings.
While most leave it as the default during game jams, it’s pleasant to see changed up during a jam! If you build a set of folders for rating like our team does, it can be a very easy way for people to identify your game! Plus, it’s likely the first thing they’ll see of your game, so make that first impression count!
Pick on any asset you’ve done for the game, assign the sprite, and you’re already sticking out from the crowd!
Another small detail that hits home for players and is always a pleasant surprise is having a custom cursor! If your game uses the mouse for the menus as the main input then it’s nice to have something that turns that boring default cursor into something more thematic! In the case of Woofice Chair! It’s a clear as day dog paw, complete with a comfy pointing finger!
There are different ways to implement cursor images depending on the engine that you’re using and your preferred methodology. Engines like Unity also allow you to specify a hardware cursor, where a texture pretty much replaces the default OS cursor while still running at the screen refresh rate.
However, if you want more control, you can make a software cursor. That way, the cursor will be an image in-game and updates at the refresh rate of the game. The benefit of a software cursor is that you have more control over it. For example, you can make it any size you’d like, rather than be restricted to 64×64.
The Game Page!
And finally you can also polish your actual game page! Yes, the place that you upload your game to! While previous advice aims at in-game content, the game page also helps you make a very good first impression on the player! Since this article is meant for game jam games, we’re not talking about Steam pages or any commercial pages, but rather Itch.io’s!
If you’ve only uploaded a few jam games to Itch.io until this time, chances are that the default page editor will be enough! Change a few fonts, give it a nice background, and even spice the description with a few custom header images! Ta-da! You have a nice looking page!
If you want to go an extra mile, you can contact itch.io staff to have CSS customization enabled. This essentially unlocks any web customization rule that you’d like to use freely with Itch.io’s existing layout! You can change individual header fonts, add hovers, custom cursors, etc. and really strive to make an impact! We advise that you stick to the customization guide, to assure that you don’t break other features of the page while at it.
Finally, while Ludum Dare doesn’t allow much for customization within the site, you can still use some tricks you’ve used for the itch.io page here! For Woofice Chair!, we used paw-print separators to divide different sections about the game. We also used the same custom headers we made for the itch.io page, and put them to use there! You can also add some section-cap GIFs between sections to really attract people to your game too!
The game page can also be worked on past the submission hour of the jam! You always have the chance to come back and polish it up with new screenshots or touch-ups!
Wrapping it up with a shine! 🎉
And that’s a wrap up! Hopefully this development insight has given you ideas about how you can add some polish and juice to your game. All of these came from the way we did them in Woofice Chair! Their implementation always varies from the type of project, theme and controls!
One thing is clear though, is that there are a ton of different ways to go about doing it! While it might be hard to find the time to fit this sort of detail into a project during the time-frame of a game jam, they really go a long way striking an extra smile on players and jammers faces! If you ever find the time in-between tasks to add that lil’bit of extra polish and juice, I dare say go for it!
We hope that you had a fantastic time during this Ludum Dare! While we still don’t know if we will be around to participate next time, we certainly look forward to! See you next time and cheers! 🐳