Thimbleweed Park 2 dev blog

Sep 12, 2026

David here again!

In Thimbleweed Park 1, there was a large puddle the actors walked through, and we saw splashing around their feet, and heard splashing for each step. I’m going to talk about how we did that by setting up room triggers and turning on a special animation layer in the actor’s animation file.

Triggers

In the Dinky engine, triggers are quadrilaterals on the screen, usually placed somewhere in the area where the actors are going to walk. When an actor enters a trigger, the triggerEnter() function is called, and when they exit the trigger, the triggerLeave() function is called.

Triggers are added using our room setup tool, Wimpy. We add a generic object, indicate it’s a trigger, and adjust the four corners of the quadrilateral to match the desired trigger area. More on this below.

Animation Layers

In my last blog post on animation, I mentioned we could have multiple layers for things like hats, heads and nose glasses. We also used layers for splashes.

In the above screenshot you can see all the layers that make up the basic Agent Ray animation, including one for eye blinks (the blink is made up of a few pixels which cover her eyes), eyes looking left or right, a collection of six heads that each have a different mouth shape (maybe we’ll go into lipsync in another blog), and near the bottom, you see the splash layer.

There’s also a layer near the bottom called _trigger. This has nothing to do with room triggers, but is a flag we can set to trigger a sound effect (footstep), or some other event we need synchronized with the animation.

The _floor layer is for reference only, and helps us align the actor to where the floor will be. I have it turned off in the above screen capture.

The splash animation is made up of three frames. We position the frames over the actor’s feet, timed to the moment the foot hits the ground (or water).

Here’s the splash animation of Agent Ray.

Trigger Code

Now that we have the animation working, here’s the code to turn on and off the splash layer on Agent Ray. splashTrigger is what I named the room trigger in Wimpy:

splashTrigger = {
	function triggerEnter(actor) {
		footstepsWater(actor)
	}
	function triggerLeave(actor) {
		footstepsNormal(actor)
	}
}

and elsewhere we have the actual footstep functions:

function footstepsNormal(actor) {
	actor.footstep_sound = actor.footstep_save
	actorShowLayer(actor, "splash", false)
}

function footstepsWater(actor) {
	actor.footstep_sound = SOUNDID(footstep_water)
	actorShowLayer(actor, "splash", true)
}

function footstepsGrass(actor) {
	actor.footstep_sound = SOUNDID(footstep_grass)
	actorShowLayer(actor, "splash", false)
}

Each actor has a default footstep, and we save that off in the footstep_save variable for each actor.

The actorShowLayer command turns on and off the specified layer.

I threw in another function above, footstepsGrass(), where I was testing out the sound of walking on grass and added another room trigger area over the grass outside the Nickel News.

Finally, we have a system function that is called when there’s a _trigger in the animation, as I described above. Again, this is a different kind of trigger from a room-defined trigger quadrilateral. For animation events, the _triggerEvent() function is called.

function _triggerEvent(actor, event) {
	if (event == "@step") {
		local sid = actor?.footstep_sound
		if (sid) {
			playSoundAt(sid, actor)
		}
	} else {
		if (is_function(actor?.triggerEvent, 1)) {
			actor.triggerEvent(event)
		}
	}
}

The event name in Aseprite for footstep _trigger events is @step. If there are other event names in the animation, the else portion of the code is run, but only if the specified actor has its own triggerEvent code. For example, the Sheriff from Thimbleweed Park 1 had an animation of flipping a coin, and this is the code that’s triggered when that event is detected in his animation:

function triggerEvent(sound) {
	if (sound == "@coinFlip") playSoundAt(SOUNDID(coin_flip), sheriff)
}

Here’s what the splash animation looks and sounds like in the game. I don’t have a puddle here, but I’ve made the trigger quadrilaterals visible for you to see.

– David Fox


Comments:

Agent Fury Sep 11, 2026
This might be like cursing in church, but it's a bit reminiscent of adventure game studio. Where you can draw out a invisible square-box and have a leave or when entering or walking on or walking off the box and then a simplistic code in it, very neat features indeed!
Passer by Sep 11, 2026
I love the fact that most of the engine and tools are in-house.

Twice the work, but double the pride :-)
Ron Gilbert ✔ Sep 11, 2026
I love the fact that most of the engine and tools are in-house.
I attribute it to stubbornness.
Agent V Sep 12, 2026
Just happened to stumble upon this blog and I’m so excited to learn Thimbleweed Park 2 is in the works! Thank you so much for sharing these behind-the-scenes insights into your processes. As a long-time fan of point & click adventures, the posts have been really interesting to read, and I’ll definitely check out the podcast. Keep up the good work!
Balance Sep 12, 2026
How much of the work in the 2020 ‘Delores’ keep-yourself-sane project is being used for this game? Anything you learned from that project? (“Don’t do it this way.” Is of course learning.)
Quin Sep 12, 2026
This post definitely needs a trigger warning...
Moonpie Sep 12, 2026
Bring back LaserDiscs!!
taizo Sep 12, 2026
Hi, could you also use the engine and tools to create an adventure with high-resolution graphics, like in Return to Monkey Island? Why did the decision go for the retro look? I seem to recall that Ron wasn't always happy with the pixelated look. It would have been nice to experience Thimbleweed Park in high resolution too. Will there be arcades again and will you publish the source? Thanks for the blog and good luck.
Barbara Sep 12, 2026
quote I love the fact that most of the engine and tools are in-house.
Agreed, this blog is so interesting. Thanks for sharing with us!
fugu Sep 12, 2026
'great', *wonderful*, thanks
tcmsurfer Sep 12, 2026
Thanks for sharing this very extensive "Hello World" 😅

So how is the solution for TP2? Do you have a workflow already? Or will it be similar?

Can you use existing code or are the concepts vastly different? (Bet this would be another blog post itself)

Thanks, David!
El Barto Sep 12, 2026
If this was a Sierra game, Agent Rayes would have drowned in a non-existent puddle :D
LichiMan Sep 12, 2026
Nice post David!

The only thing I don’t get is, what’s in the _trigger frame number 5 in the Aseprite file? Is there really something? Or is just a check for you know where the trigger should start, and save that frame number in a variable in the code manually?

Really enjoining all the blogs! Thank you.
Skelovade Sep 12, 2026
cooooooL :)
Rankles75 Sep 12, 2026
Wow, completely missed TP2 being announced… 😬 Very much looking forward to this!
David Fox ✔ Sep 13, 2026
@tcmsurfer: So how is the solution for TP2? Do you have a workflow already? Or will it be similar?
I wouldn't say we have a workflow formalized yet, mostly because we're still in the preproduciton/planning stage. When we do, it's likely going to be much closer to the RtMI flow than TWP1.
Can you use existing code or are the concepts vastly different? (Bet this would be another blog post itself)
I'm definitely pulling code snippets from both Delores and RtMI as inspiration. This engine is an evolved version from those two games, so much of the code is similar, and when there's an engine function that Ron hasn't yet implemented, we talk about it and he either brings it over, or it goes on a wishlist for later.

So, concepts are nearly identical in terms of the way we code. The tools keep getting better, and we now have even more experience to draw upon.
David Fox ✔ Sep 13, 2026
@El Barto: If this was a Sierra game, Agent Rayes would have drowned in a non-existent puddle :D
Hah. Agent Reyes should have noticed those trigger outlines and avoiced them.
David Fox ✔ Sep 13, 2026
@LichiMan The only thing I don’t get is, what’s in the _trigger frame number 5 in the Aseprite file?
These are sound effect triggers. We trigger a footstep sound at these points. Take a look at my post, especially the bottom section starting with _"Finally, we have a system function that is called when there’s a trigger in the animation"
Enlo17 Sep 13, 2026
Again a big thank you for sharing all this nice information on the process.

I wish I could jump into all this and be part of developing a game like this.

Keep up the good work, you surely triggered me!
Sushi Sep 13, 2026
It looks/sounds as if there is a bit of latency when entering the trigger box. The first visible splashes are without sound effect. Probably this is because it just a quick mockup. If not, how would you fix this? Draw the box a bit larger than the background puddle? Then again that might cause extra splashing after leaving.
David Fox ✔ Sep 13, 2026
@Sushi It looks/sounds as if there is a bit of latency when entering the trigger box.
Yes, I noticed that. You'll notice that the splash layer shows up immediately, and that it's just the sound of the footsteps that seem delayed. That's probably because we're currently only triggering the footstep sound on every other step to avoid the cacophony of constant footsteps (especially if several characters are walking around in a cutscene). I'd probably set it up so that during splashes, every footstep triggered the splash.

Also, I'm currently not cutting off the splash sound, so it can last longer than the character in the puddle. That's probably less of an issue. If we do use splashes in the game, I'll be sure to tune it better than this demo.
Karim Sep 13, 2026
I'm fascinated that footsteps are triggered by the actor, not the room; my instinct would be to link it to the quad itself, instead of the actoe. But I'm an amateur coder at best and maybe that's not possible? Or is bad design in some way?

Animation layers were also in Return to Monkey Island too, right? I've wanted to know what that was; it gave the walk-n-talk scene near the end with Guybrush and Elaine life.
Ron Gilbert ✔ Sep 13, 2026
triggered by the actor, not the room
The footsteps are linked to the actor because it is the actor making the sound, the triggers determine the type of sound (water, grass, etc) but the actor makes it.
Ronald Sep 14, 2026
This was probably the puzzle I struggled with the most in TP!
BonAntza Sep 15, 2026
This was a great read! Hope you don't mind a small piece of constructive feedback.

I don't think the water sprite should follow the character. If you step through it frame by frame, the splash stays attached to them for a couple of extra frames before the next animation frame and eventually disappearing. Since the splash happens in world space, the physics should behave that way too - once the water is in the air, it's on its own and the character's movement shouldn't carry it along.

It might be easier to picture if you imagine the character running through the puddle at high speed. A splash glued to them at that point would look really out of place. :)

I can imagine that having the splash live on the character rather than in the environment makes this tricky to keyframe, since the walk speed affects where the water should end up.
Idanski Sep 15, 2026
Is footstep_sound exactly one sound clip? Or is it chosen from a list of possible sounds for diversity? is it noticeable at all? or do you differentiate between left and right foot?

This is so interesting and yet raises so many follow up questions. 😅
Thanks for sharing!
Ron Gilbert ✔ Sep 15, 2026
It's an event triggered in FMOD, so it can be random as needed. We don't do left/right feet, but could just by doing different triggers on each foot. It's very quiet so I doubt you'll notice.
Nicky Ramone Sep 15, 2026
I love reading the snippets and seeing the in-house tools
Rooftop Joe Sep 16, 2026
Felt like maybe the sounds were kicking in a little too late on both the grass and the water splashes? E.g., the first splash has no sound.
David Fox ✔ Sep 19, 2026
@Rooftop Joe Felt like maybe the sounds were kicking in a little too late on both the grass and the water splashes? E.g., the first splash has no sound.
Yes, see my comment to Sushi above.

If we use this in the new game, we'll adjust so it synchs better.
Alex Sep 20, 2026
It's fascinating how much work is behind this small detail. Will there be some kind of animation reusability from Part 1 or do you start from the beginning?
David Fox ✔ Sep 28, 2026
@Alex Will there be some kind of animation reusability from Part 1 or do you start from the beginning?
I think we'll be able to re-use certain animations, like a standard walk, reach, or climb.
toshi Sep 30, 2026
I'm rolling a prime: 1033.

Add comment: