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.2.1, writing all of our code in C# with .NET 8.

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. If the frog does get stuck on geometry, 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 the frog is nearby when you get attacked, it'll jump into action and help you fight back! If another players frog is nearby and you don't need any assistance, they'll play together. If you play music, the frog will listen and bop their head. The frog will also keep an eye on the player even out of water.

    It's all powered by an AI state machine where each potential AI state reports a priority, and the highest priority gets chosen to run. If you're near the water, getting to you will be the highest priority. But if you're busy playing a level, the frog might wander and find a friend to play with. If you've been hurt and hurtle into the water, the frog might be so blind with rage that they'll focus on fighting whatever hurt you for a few seconds before coming to your aid. There's a lot of randomness involved as well, which makes the Frog feel like a real animal.

    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. My skills as an animator influence my skills as a coder.
Live at Strummer's Pond (Programming)
Published:

Owner

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

Published: