Sarah Bradley's profile

Live at Strummer's Pond (Programming)

Live at Strummer’s Pond is a cozy, open world 3D platformer.

The player acts as a tiny bug who explores a vast pond with their frog pal. Along the way, they’ll pollinate flowers, collect musical instruments, and play some magical tunes.They can even bring along some friends (or visitors) for online co-op!

I'm the programmer for this project, and it's become my best work. We started the project in the Unity Engine, then swapped to the Godot Engine early on. We're currently using Godot 4.0, writing all of our code in C# with .NET 6.

It's open world, physics driven and fully multiplayer, which has been quite the challenge.
Five players jumping around.
Networking Technical Write-up:
    We're currently using Steamworks for peer to peer networking. I wrote my own serializer while we were on Unity, and ported it to Godot when we swapped. I'm using reflection to detect which fields and methods have been decorated by a custom attribute, and building a predictable method to convert to and from bytes. It's very strict about what it expects from peers, any deviations in byte length are unacceptable. Methods and fields without the Sync attribute aren't even known to the serializer.

Lobby creation and joining is automatic. When the player launches the game, they're already online. It'll prioritize lobbies with friends by looking at friends rich presence. The lobby host maintains a list of which player owns what entity. Players negotiate with the host if they want to take ownership of anything.

    There are currently two types of Serializable Entity: Normal, and Unique. Normal entities exist as a single entity for every peer. For example: You wouldn't expect there to be multiple copies of an NPC. Unique entities spawn a copy for every peer. For example: The player itself. Anytime a peer connects to the lobby a new copy of the player is instantiated. It can only be networked by the peer it spawned for.
The frog! Aren't they cute?
The Frog Technical Write-up:
    The player rides an overly energetic frog to help them traverse the pond. The frog is completely physics driven and clumsy to control (on purpose, it's fun!). When the player gets near the water, the frog will rush towards you to make sure you're okay. If you plug in a second controller, player 2 can control the frog in split-screen!

  I had to write a custom Look at IK solution for the frog, as Godot's IK is lacklustre for the task. I also wrote a somewhat custom navigation solution using Godot's AStar algorithm so it can navigate the water somewhat. If the frog does get stuck, it dives underwater and surfaces closer to the player with a smooth animation. Ideally it wouldn't need to do this, but perfect navigation for a physics object as clumsy as the frog is impossible.

    The frog gives me a good excuse to talk about the water which is also somewhat custom. Every networked physics object has water physics, including the ability to play splashing particles and sounds. Every physical entity also has tweak-able settings for how they interact with the water.

    The frog has some fun AI quirks as well. While you're in the water, it'll croak frequently with worry. If it slams it's head or belly into a wall, it'll react. The frog will also keep an eye on the player even out of water.

    Overall I'm incredibly pleased with the frog, all of our play-testers have fallen in love with it. It's goofy physics driven nature, protectiveness, and stupidity contributes alongside the model and animation to it's funny personality. I feel it's a great example of how code can be art too.
Live at Strummer's Pond (Programming)

Live at Strummer's Pond (Programming)

Live at Strummer’s Pond is a cozy, open world 3D platformer. The player acts as a tiny bug who explores a vast pond with their frog pal. Along th Read More