top of page

Building The Captains Curse: A Devlog

An over-the-shoulder pirate game of hide and seek, built in Godot with Synty's POLYGON Pirates pack for Synty's 12th Birthday Jam. https://jconncreative.itch.io/captains-curse


Synty gave a theme for their recent Birthday Game Jam. That theme - Hide and Seek. So for me the pitch was simple enough to say in a sentence: you're a pirate captain, and something cursed is hiding on your ship. Getting from that sentence to a shipped build was a longer voyage. Here's roughly how it went.


Setting sail: the skeleton of a game

The first real work wasn't gameplay at all — it was getting a character to move correctly. The POLYGON Pirates pack gives you gorgeous low-poly models but no animation, so the early days were spent retargeting the Universal Animation Library onto the Synty humanoid rig via bone maps, so Blackbeard's skeleton would actually take a walk cycle.

Once he could stand, we built the core: a CharacterBody3D captain with an over-the-shoulder camera, deck-hugging movement that walks the curved hull instead of clipping through it, and a flintlock pistol with six shots and aim-down-sights. Then we scattered a crew of idle NPCs around the warship so the deck felt lived-in.


The core loop clicks

The heart of the game is a day/night rhythm. By day you roam the deck freely while props are scattered around. Then the captain calls for the Night Watch — a curse card fades up over black ("What A Horrible Night / To Have A Curse.") — and night falls. Under the moon, six of those objects have changed: some swapped for a different item in the same spot, some brand new. You get six shots and a ticking clock to find them.

An early design rule that mattered more than expected: nothing ever just vanishes between day and night. If an object changes, it's replaced in place by something else of the same size, never removed. That one constraint is what makes it a fair game of observation instead of a memory trick.


A hundred small refinements

The middle stretch was where the game got its feel, and it was almost entirely little things:

  • Legs that keep walking during reloads. The reload is a full-body animation, so the captain used to float while striding and reloading at once. We wrote a SkeletonModifier that keeps the legs driving the walk cycle underneath the reload — no more moonwalking.

  • Instant feedback. The ammo HUD used to lag the shot by a beat. We tore that out so the miss-ring or hit-skull registers the instant you fire.

  • Shots that only hit what matters. The gun's raycast was catching on scenery. We moved the cursed objects onto their own collision layer so the shot can only register on a valid target — nothing else blocks it.

  • A hand-built HUD. Everything — clock, status text, the sleep prompt, the ammo panel — got moved into a single editable scene. The bottom-right ammo panel renders an actual 3D pistol next to six cannonballs that turn into rings (miss) or floating skulls (found).

  • A proper front door. We added a start menu that plays over the live game: the captain idles and chats on the deck, the camera does a slow orbit, and when you hit Play it smoothly eases into the over-the-shoulder gameplay view while the HUD fades up.


Giving the ship a voice

One of the biggest single passes was audio. Before wiring anything up, we prepped every sound file for efficiency — forcing positional sounds to mono so they could be placed in 3D space, trimming dead air off the gunshots, converting a big ambience loop to streamed Ogg (7.5 MB down to under half a meg), and setting loop points.

Then came a full sound manager built on a raytraced-audio system, so sounds are placed in the world and get muffled behind crates and masts. Every beat of the game got a voice: the gunshot echoing across the deck, a two-part reload, a clatter-and-scream when you shatter a cursed object, random knocks in the dark, day and night music that crossfades at dusk, and a grave-whispers ambience bed under the whole night.


Teaching the cursed to hide

A hide-and-seek game lives or dies on its hints, and we didn't want dead giveaways. Two systems do the quiet work:

  • Whispers. Every so often, one of the still-hidden cursed objects — the one nearest you — lets out a whisper from its exact position. Follow the sound.

  • The twitch. Every thirty seconds, one remaining curse breathes: a barely-there sway that eases in and out on a soft envelope. On a dead-still deck, a careful eye catches the wrongness. A hurried one doesn't.

There's also a hidden mode lurking for players who go looking for it — a blood-moon night where things are very different. We'll let you find that one yourselves.


Cutting the ship down to size

With the game feeling right, it was time to make it shippable. The working project had ballooned to 435 MB — the entire Synty pack, spare animation libraries, unused addons. We traced the actual dependency graph from the main scene outward and rebuilt a lean copy that keeps only what the game touches: 435 MB down to 92 MB, with zero broken references.

Then a final fine-tooth pass — deleting dead code, fixing stale comments, and catching a genuine performance bug where the HUD's little gun portrait was re-rendering a full 3D scene every single frame for the entire game. Now it renders once and holds. A last round of polish made the hitboxes a touch bigger than the objects they wrap, so if you're aiming at something, it counts.


Making port

Last stop: export presets for Windows, Mac, Linux, and web, all wired up so a build is a couple of clicks, and out the door to itch.io for Synty's 12th Birthday Jam.

From "a pirate looking for something cursed" to a lantern-lit deck you can actually hunt across — thanks for reading, and happy hunting. The cursed are waiting.

Comments


Join the Club

Join the email list and get access to exclusive insights!

Asset 2jc.png

Thanks for submitting!

bottom of page