Thimbleweed Park 2 dev blog

Oct 24, 2026

If ChatGPT is letting you down, it’s time to go right to the source.

Announcing the first Ask Us Anything Thimbleweed Park 2 podcast.

Reply this is post with your question.

Put a Q: at the start the your reply so we can grep the questions, if you don’t put a Q: then your question will be missed. Also keep it brief, long winded questions will also be skipped. Slipping one of us a twenty can also help.

We’ll be accepting questions for the next 5 days

Stand by for fun!

!!! Comments are now closed. We will sort through all the question and pull the cream of the crop and maybe a few duds. !!!

Read Comments (147)
Oct 19, 2026

Thimbleweed Park 2 uses 5 different Git repos and one SVN repo.

Both the Git and SVN repos are self-hosted. Git’s Large File System (LFS) is used for large binary files (.png and .bank). Although any GUI client can be used, we encourage Fork and SmartSVN because they are cross-platform and, unless you are an expert, we can support them with help and assistance. I mostly use the Git CLI or lazygit, but they are not for everyone.

  1. Game

This is a Git repo that holds the game’s code, mostly .dinky, .yack, .txt, .wimpy files and the processed .png files for the rooms and UI. Game programmers have access and primarily use it. If you’re just doing game programming, this is the only one you need and has the most check-ins of the game.

  1. Game Engine

This is the engine for the game. It is mostly .cpp/.h files. Derek and I are the only two who use it. It produces the compiled engine that is distributed to game programmers as well as used for the released game.

  1. Engine Library

This is the shared library that all game engines use. It’s been used for Scurvy Scallywags, Thimbleweed Park 1, Delores, Return to Monkey Island, Death by Scrolling, and now Thimbleweed Park 2. It gets very few commits unless we’re adding a new feature that is not game specific.

  1. Game Sound

This repo is for the FMOD audio. Sound and music people have access. Game programmers might have access if they are changing sound, which can be common but is not required. When the FMOD .bank files are built, they get put into the Game repo so game programmers don’t need access.

  1. Art SVN

Art (mostly .psd and .aseprite files) is kept in SVN so it can be locked. Git’s large file system has the ability to lock files but tests for locked status only on push, whereas SVN keeps the file read-only until it’s locked. SVN is very long-in-the-tooth but I haven’t found a better solution. Perforce is way too expensive. Ark is a new one, but the maintainer doesn’t see a use case for making locked files read-only, which baffles me. Locking art files is critical because they can’t be merged.

  1. Art Git

No one has access to this, it’s an automatic mirror of the SVN repo. When a game is done, I shut down the SVN server and this provides a long-term backup. If the game becomes active again, I can push this to a new SVN repo. This repo is probably pointless until the game releases.

Read Comments (36)
Oct 15, 2026

*** Spoilers ***

Not real spoilers. Only maybe spoils some of the game structure. If you want to remain 100% pure on your first play through yell “Oh My God!” and quickly close your browser. Works best in a busy office.

*** Spoilers ***

The game is divided into four parts and there is a murder in each of the first three parts you have to solve, and the fourth part ties it all together.

In each part, you get to play the murdered person as a small flashback. The red box is one puzzle we have not figured out yet.

This is the Puzzle Dependency Chart for the murder flashback in Part 2.

How to read Puzzle Dependency Charts

Read Comments (28)
Oct 7, 2026

Another exciting announcement from the world of Thimbleweed Park 2.

Dave Grossman will be joining the team as a writer. We had our first meeting the other day and went over all the characters and motivations for MURDER.

I’ve known Dave since Monkey Island. I wanted to hire him back then because his resume stated one of his interests was “Applesauce”.

Dave also worked on Monkey Island 2, was the writer and co-designer of Day of the Tentacle, writer for Pajama Sam, mainstay at Telltale Games plus other stuff.

He was also my co-designer and co-writer on Return to Monkey Island.

This is starting to sound like an obituary… I better stop writing.

It will be great to work together again.

Read Comments (39)
Sep 29, 2026

I’m heading to Auckland for NZGDC so there won’t be a podcast this week.

Last year NZGDC was here in Wellington which was super convenient but alas, not this time.

Thimbleweed Park 2 is up to build 172. On previous games I’ve started the build at 100 and they went up to 999 and then I’d have to reset them. There were historical reasons they had to be 3 digits.

For Thimbleweed Park 2 I said screw it, I’m not going to limit it to 3 digits. I’m throwing caution to the wind. As long as the build number stays a 32-bit signed int, we’re good.

Any predictions on the build number of the release? I do one or two builds a day for dev and testers. The build number also increases when I happen to do a failed build, but that doesn’t happen very often.

On Return to Monkey Island we had a contest to see who could come closest to predicting the number of bugs in the bug report.

If I remember it correctly, Kenny Sun got it at 6900 bugs.

I wonder what the Polymarket odds for the final build number is?

– Ron

Read Comments (38)
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

Read Comments (33)