<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Thimbleweed Park 2 dev blog</title>
    <link>https://blog2.thimbleweedpark.com/</link>
    <description>Recent content on Thimbleweed Park 2 dev blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 22 Aug 2026 08:39:12 +1200</lastBuildDate>
    <atom:link href="https://blog2.thimbleweedpark.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Podcasts Part 2</title>
      <link>https://blog2.thimbleweedpark.com/podcasts2/</link>
      <pubDate>Sat, 22 Aug 2026 08:39:12 +1200</pubDate>
      <guid>https://blog2.thimbleweedpark.com/podcasts2/</guid>
      <description>&lt;p&gt;Big news. We got someone to help us edit the podcasts. Thanks to everyone who offered support and help.&lt;/p&gt;&#xA;&lt;p&gt;First, the old podcasts are back. You can get them here:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://podcasts.apple.com/us/podcast/thimbleweed-park/id1076754899&#34;&gt;Apple Podcasts&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://open.spotify.com/show/6f37JUBW3AMMDXnrwA7TLQ?si=fd56d3dab9104df7&#34;&gt;Spotify&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://music.amazon.com/podcasts/cacbcad6-6418-4fee-a687-77363d7bde6c/thimbleweed-park&#34;&gt;Amazon Music&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is Thimbleweed Park podcast #1 just to get your nostalgia going.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://play.prx.org/e?uf=https%3A%2F%2Ffeeds.redcircle.com%2Fc2f93a56-100a-4956-b688-578bbec7aa53&amp;ge=452f6ff3-d3dc-42d2-b7dc-b97334b8d25b&amp;ac=3a5a9c&#34;&#xA;&#x9;width=&#34;85%&#34; height=&#34;200&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34; allow=&#34;autoplay&#34; loading=&#34;lazy&#34;&#xA;&#x9;style=&#34;display: block; margin: 0 auto;&#34;&gt;&lt;/iframe&gt;&#xA;&#xA;&lt;p&gt;We&amp;rsquo;re going to start up the podcast again as soon as my people talk to David&amp;rsquo;s people and Gary&amp;rsquo;s people talk to my people.  It might be a few weeks to get everything set up.&lt;/p&gt;&#xA;&lt;p&gt;One suggestion I get a lot is wanting to hear from the other team members, so we we&amp;rsquo;ll do that more.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;re also bringing back Friday Questions, so be on the look out for those.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; Ron&lt;/p&gt;&#xA;&lt;p&gt;P.S. I redid the &lt;a href=&#34;https://thimbleweedpark.com&#34;&gt;Thimbleweed Park website&lt;/a&gt; and added a newsletter sign-up. This isn&amp;rsquo;t for new dev blog posts, but larger events and news closer to release.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Animation and Aseprite</title>
      <link>https://blog2.thimbleweedpark.com/animation1/</link>
      <pubDate>Tue, 18 Aug 2026 16:25:17 +1200</pubDate>
      <guid>https://blog2.thimbleweedpark.com/animation1/</guid>
      <description>&lt;p&gt;David here!&lt;/p&gt;&#xA;&lt;p&gt;This is my first blog post for the Thimbleweed Park 2 dev blog, and I hope not the last. I’m going to talk about character animation in the game, a bit about process and tools.&lt;/p&gt;&#xA;&lt;p&gt;In Thimbleweed Park 1 (ok, it was never called that, just Thimbleweed Park, are we retconning the game name?), we used a home-grown (Ron-created) character animation program called Compy. It had some basic features, and emitted json files describing the animation sequences along with the individual cells that could be layered on top of each other to create the character animations you saw in the game. For example, Agent Ray’s body was separate from her head, so while her body was walking, we could independently animate her head and mouth. Likewise we had another layer for eye blinks, another for accessories (hats, nose glasses).&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://images-grumpygamer.nyc3.digitaloceanspaces.com/ray-aseprite.png&#34; style=&#34;width: 75%;&#34;&gt;&#xA;&#xA;&lt;p&gt;In Return to Monkey Island, our characters were all vector-based, created with the animation tool, Spine. For Thimbleweed Park 2 we’re back to pixel-based characters. Rather than updating Compy, we selected the popular Aseprite for 2D pixel animations ($19.99 on Steam or Aseprite’s website). Ron used it on his recent pixel-based RPG Death by Scrolling, and wanted to stick with it.&lt;/p&gt;&#xA;&lt;p&gt;I learned enough about Aseprite to import some of the animated characters from the first game… a somewhat mind-numbing and tedious task… opening all the frames in the Mac app Preview, then copying/pasting each image into Aseprite’s cell in the timeline. Then apply some magic (Ron’s Python script exportaseprite.py) which exports each animation cell as a PNG, and then packs them into sprite sheets, and keeps track of all the named animation sequences.&lt;/p&gt;&#xA;&lt;p&gt;First spoiler: there are Polaroid cameras in this game just like Thimbleweed Park 1 (opening scene with the agents) and in the Delores standalone game. This time both Agents Ray and Reyes have their own cameras, and we needed more animation sequences than just the right-facing and kneeling photo-taking animation from the first game.&lt;/p&gt;&#xA;&lt;p&gt;In fact, we needed nine sequences… versions for taking photos of low objects, medium height objects, and tall objects. Plus versions for right-facing, back-facing, and front-facing, so 3 x 3 = 9. (When the character faces left we just flip the right-facing animations.)&lt;/p&gt;&#xA;&lt;p&gt;Each animation is made up of multiple short segments, to give us more control of timing. For example, when we want to trigger a sound effect and a screen flash. Octavi took this on as his first project for the game:&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://images-grumpygamer.nyc3.digitaloceanspaces.com/ray-camera1.gif&#34; style=&#34;width: 50%;&#34;&gt;&#xA;&#xA;&lt;p&gt;Camera out—actor takes the camera out of their jacket, or wherever they magically store it&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://images-grumpygamer.nyc3.digitaloceanspaces.com/ray-camera3.gif&#34; style=&#34;width: 50%;&#34;&gt;&#xA;&#xA;&lt;p&gt;Camera hold—actor holds the last frame with the camera in position to take the photo&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://images-grumpygamer.nyc3.digitaloceanspaces.com/ray-camera4.gif&#34; style=&#34;width: 50%;&#34;&gt;&#xA;&#xA;&lt;p&gt;Camera shot—photo is taken as the flash goes off in four frames, and separately we trigger the sound effect and also flash the screen for a quarter of a second&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&lt;img loading=&#34;lazy&#34; src=&#34;https://images-grumpygamer.nyc3.digitaloceanspaces.com/ray-camera2.gif&#34; style=&#34;width: 50%;&#34;&gt;&#xA;&#xA;&lt;p&gt;Camera in—camera ejects the photo, actor shakes out the instant photo to dry it off, puts away the camera and returns to a standing position&lt;/p&gt;&#xA;&lt;p&gt;That means our original nine sequences are made up of four segments each, for a total of 36 segments. Fortunately, all elements of each frame were flattened, so we didn’t have separate talking heads, moving eyeballs, etc.&lt;/p&gt;&#xA;&lt;p&gt;To keep this all straight, we used a naming convention and tagged the object to be photographed with low, med, or high, and we also set the actor’s facing in the object (front, right, back). Gathering that information from the object, we knew which animations to trigger:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;camera_out_[low, med, high]_[front, right, back]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;camera_hold_[low, med, high]_[front, right, back]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;camera_shot_[low, med, high]_[front, right, back]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;camera_in_[low, med, high]_[front, right, back]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Octavi started with the Delores camera animations as a template (from the Delores game), and then created a similar set for Agent Ray. It took a few iterations to get everything perfect. Rather than trying to figure out if it was correct in Aseprite (challenging when there were so many segments to check), I set up a test room so we could check the animations in context… of course I picked the disgustingly gross Thimbleweed Park QuickiePal Bathroom for the photoshoot!&lt;/p&gt;&#xA;&lt;p&gt;The bathroom doesn&amp;rsquo;t appear in Thimbleweed Park 2, but it&amp;rsquo;s finished art and a good test.&lt;/p&gt;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;div&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;iframe&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;src=&#34;https://player.vimeo.com/video/1219121531?dnt=0&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allow=&#34;fullscreen&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/iframe&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I didn’t have any targets for a front-facing photo, so I used temp programmer art, then made a QuickTime video and shared it with Octavi.&lt;/p&gt;&#xA;&lt;p&gt;When we looked at the animation in the room, we spotted a few issues. One showed a several-pixel jump from the end of the camera animation to the beginning of the normal standing animation. Once corrected, Octavi then created the same animations for Agent Reyes, and I again sent him a movie for him to confirm all was perfect.&lt;/p&gt;&#xA;&lt;p&gt;For the in-game test interactions, we started with the Delores UI, where the player can drag an inventory object (the camera) out of their inventory and place it over the item to be photographed. Note that the UI in this video is WIP, and will likely go through multiple iterations throughout the development of the game.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; David Fox&lt;/p&gt;&#xA;&lt;p&gt;P.S.&lt;/p&gt;&#xA;&lt;p&gt;We have the following .aseprite files&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;animation/Reyes-base.aseprite&#xA;animation/Reyes-camera.aseprite&#xA;animation/Reyes-climbing.aseprite&#xA;animation/Reyes-reaches.aseprite&#xA;animation/Reyes-toilet.aseprite&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And in the Dinky code we do this&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;default_costume = [ &amp;#34;animation/Reyes-base&amp;#34;,&#xA;                    &amp;#34;animation/Reyes-reaches&amp;#34;,&#xA;                    &amp;#34;animation/Reyes-climbing&amp;#34;,&#xA;                    &amp;#34;animation/Reyes-camera&amp;#34;,&#xA;                    &amp;#34;animation/Reyes-toilet&amp;#34; ]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That adds all the .aseprite animations to a single animated sprite. Then we run this code when taking a picture.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;local position = match(getvalue(subject?.photo_reach)) {&#xA;    REACH_HIGH: &amp;#34;high&amp;#34;&#xA;    REACH_LOW: &amp;#34;low&amp;#34;&#xA;    default: &amp;#34;med&amp;#34;&#xA;}&#xA;local anim = playAnimation(selectedActor, &amp;#34;camera_out_&amp;#34;+position)&#xA;breakwhileanimation(selectedActor, anim)&#xA;anim = playAnimation(selectedActor, &amp;#34;camera_hold_&amp;#34;+position)&#xA;if (is_function(subject?.startTakingPhoto)) {&#xA;    subject.startTakingPhoto(subject.photo)&#xA;}&#xA;breakwhileanimation(selectedActor, anim)&#xA;anim = playAnimation(selectedActor, &amp;#34;camera_shot_&amp;#34;+position)&#xA;playSound(SOUNDID(take_photo))&#xA;breaktime(0.2) // wait a beat to let the sound sync better with the animation&#xA;overlayFlashColor(COLOR_WHITE, 0.25)&#xA;breakwhileanimation(selectedActor, anim)&#xA;anim = playAnimation(selectedActor, &amp;#34;camera_in_&amp;#34;+position)&#xA;breakwhileanimation(selectedActor, anim)&#xA;actorStand(selectedActor)&#xA;if (is_function(subject?.doneTakingPhoto)) {&#xA;    subject.doneTakingPhoto(subject.photo)&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Podcasts</title>
      <link>https://blog2.thimbleweedpark.com/podcasts/</link>
      <pubDate>Wed, 12 Aug 2026 15:53:50 +1200</pubDate>
      <guid>https://blog2.thimbleweedpark.com/podcasts/</guid>
      <description>&lt;p&gt;David, Gary and I really enjoyed doing the Thimbleweed Park 1 podcast and want to continue it for Thimbleweed Park 2, but there are a couple of issues.&lt;/p&gt;&#xA;&lt;p&gt;First is where to host.  I&amp;rsquo;m not a consumer of podcasts, so I don&amp;rsquo;t know all the ins-and-outs. I assume Dropbox isn&amp;rsquo;t a good idea.&lt;/p&gt;&#xA;&lt;p&gt;The Thimbleweed Park 1 podcast was hosted on SoundCloud and for reason I don&amp;rsquo;t fully remember I had a free account, but a few years ago they started charging me so I pull them all down and saved them so I can re-post later.&lt;/p&gt;&#xA;&lt;p&gt;For Thimbleweed Park 2 we need to find a place to host that 1) Doesn&amp;rsquo;t charge a lot of money and 2) doesn&amp;rsquo;t insert ads in the middle. I also don&amp;rsquo;t want to have to upload them to 5 different places, I want one place that all podcast apps can read from.&lt;/p&gt;&#xA;&lt;p&gt;The second issue is they took a lot of time. It basically ate up half of my Saturday recording and editing, prepping, and uploading the podcast.&lt;/p&gt;&#xA;&lt;p&gt;We need to find someone that will take on that job (paid). I&amp;rsquo;m not asking for volunteers so please don&amp;rsquo;t suggest yourself unless it is literally your day job.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d also like to upload them to YouTube, not as video podcasts, but just audio and maybe an pixel image of each of us when we are talking.&lt;/p&gt;&#xA;&lt;p&gt;There are few (physics) podcasts I listen to that do this. It works well for me.&lt;/p&gt;&#xA;&lt;p&gt;Stay tuned and we hope to start recording in the next month or so. Lots of fun design stuff to talk about.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Thimbleweed Park Engines</title>
      <link>https://blog2.thimbleweedpark.com/twp2_tech/</link>
      <pubDate>Sat, 08 Aug 2026 09:40:33 +1200</pubDate>
      <guid>https://blog2.thimbleweedpark.com/twp2_tech/</guid>
      <description>&lt;p&gt;A few people have asked what the difference with the engine we used for Thimbleweed Park 1 and what we are using for Thimbleweed Park 2.&lt;/p&gt;&#xA;&lt;p&gt;They are basically two different engines with a few similarities, mostly in the format of the room images.&lt;/p&gt;&#xA;&lt;p&gt;Thimbleweed Park 1 used SDL for graphics and sound and a scripting language called &lt;a href=&#34;http://squirrel-lang.org&#34;&gt;Squirrel&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Squirrel is a good language, but it couldn&amp;rsquo;t do the code optimizing I wanted and was missing a few convenience features.&lt;/p&gt;&#xA;&lt;p&gt;You had to ship your game with full source and it compiled it at run-time. I wanted it to emit byte code so I could run an optimization pass.&lt;/p&gt;&#xA;&lt;p&gt;After Thimbleweed Park 1 I started working on a early version of &lt;a href=&#34;https://store.steampowered.com/app/3773590/Death_by_Scrolling/&#34;&gt;Death by Scrolling&lt;/a&gt; (called Runner back then) and in a fit of insanity I wrote a new scripting language called Dinky. It compiled to byte-code and had an optimization pass. It  was still 80% compatible with Squirrel, but I added some new features and it was a lot faster.&lt;/p&gt;&#xA;&lt;p&gt;About this time the idea of &lt;a href=&#34;https://store.steampowered.com/app/2060130/Return_to_Monkey_Island/&#34;&gt;Return to Monkey island&lt;/a&gt; was starting to become real so I started (with David&amp;rsquo;s help) the game &lt;a href=&#34;https://store.steampowered.com/app/1305720/Delores_A_Thimbleweed_Park_MiniAdventure/&#34;&gt;Delores&lt;/a&gt;. It was going to serve as a test bed for porting Thimbleweed Park 1 to my new engine that we&amp;rsquo;d use for Return to Monkey Island.&lt;/p&gt;&#xA;&lt;p&gt;Thimbleweed Park 1 used the SDL sound engine which is very limited and porting to mobile and consoles required re-writing the sound engine.  I initially poo-poo&amp;rsquo;d using FMOD because it would cost $6000 to use it for Thimbleweed Park 1, but in the end I spent more than $6000 porting to all the different platforms. Penny-wise, pound-foolish.&lt;/p&gt;&#xA;&lt;p&gt;So Delores used FMOD and it&amp;rsquo;s a dream.&lt;/p&gt;&#xA;&lt;p&gt;I also teamed up again with Derek who I had worked with on &lt;a href=&#34;https://store.steampowered.com/app/18040/DeathSpank/&#34;&gt;DeathSpank&lt;/a&gt; and he removed SDL and began a new graphics back-end that would use Vulkan, Metal, DirectX, etc. It would make porting to other platforms a lot easier and allow for better use of shaders.&lt;/p&gt;&#xA;&lt;p&gt;We started Return to Monkey Island and basically used the Delores Engine. The big change we had to make was supporting hires images. It was just scaling the rendering, but we had to add a lot of smart caching because the texture were a lot bigger than pixel art.&lt;/p&gt;&#xA;&lt;p&gt;I then started working on Death by Scrolling again and used the Return to Monkey Island engine with a new tile map renderer.&lt;/p&gt;&#xA;&lt;p&gt;Death by Scrolling shipped and then Thimbleweed Park 2 became a reality.&lt;/p&gt;&#xA;&lt;p&gt;Back to the Return to Monkey Island engine.  The changes were pretty simple since we just need to scale it for pixel art again.&lt;/p&gt;&#xA;&lt;p&gt;The big changes were in the Dinky scripting code since I want to re-look at the UI and verbs. I wasn&amp;rsquo;t happy with Thimbleweed Park 1, Delores or Return to Monkey Island and wanted to try something new, kind of a hybrid between the best of the three.&lt;/p&gt;&#xA;&lt;p&gt;But more on that later&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;So, it&amp;rsquo;s a very different engine.&lt;/p&gt;&#xA;&lt;p&gt;Thimbleweed Park 1 -&amp;gt; Runner -&amp;gt; Delores -&amp;gt; Return to Monkey Island -&amp;gt; RPGTBD -&amp;gt; Death by Scrolling -&amp;gt; Thimbleweed Park 2 -&amp;gt; TBD&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>First Post</title>
      <link>https://blog2.thimbleweedpark.com/first_post/</link>
      <pubDate>Sat, 01 Aug 2026 09:53:37 +1200</pubDate>
      <guid>https://blog2.thimbleweedpark.com/first_post/</guid>
      <description>&lt;p&gt;Welcome to the all new Thimbleweed Park 2 dev blog.&lt;/p&gt;&#xA;&lt;p&gt;The response to &lt;a href=&#34;https://www.grumpygamer.com/twp2_announce/&#34;&gt;our announcement&lt;/a&gt; has been overwhelming. Thanks so much for your enthusiasm. It keeps us going.&lt;/p&gt;&#xA;&lt;p&gt;We hope to post at least once a week with all the happenings but no spoilers.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;d like to get the podcast going again, but no promises. It was a lot of work each week.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll post updates on Mastodon or you can use RSS like it&amp;rsquo;s 2004 or you can hit refresh obsessively.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;d like to do Big Box versions, but we&amp;rsquo;re a long way from making any decisions.&lt;/p&gt;&#xA;&lt;p&gt;The game will be on Steam and GOG for Mac, Windows and Linux.  It will also be on Switch, Xbox and PlayStation.&lt;/p&gt;&#xA;&lt;p&gt;iOS and Android are hard because premium (paid) games don&amp;rsquo;t do well unless we can get into Apple Arcade or Google Play Pass and being included in those is largely not up to us.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;re not doing a Kickstarter as the game is already funded, but we would like to figure out ways to do fun things like the phonebook and other goodies.&lt;/p&gt;&#xA;&lt;p&gt;Please don&amp;rsquo;t suggest we put it on retro platforms because while the game is pixel art it uses shaders, FMOD and other modern tech.&lt;/p&gt;&#xA;&lt;p&gt;It will be translated into EFIGS and a few other languages. Only English is planned for voice recording.&lt;/p&gt;&#xA;&lt;p&gt;Not happy with the colors on the dev blog, open to suggestions, but I&amp;rsquo;m stubborn.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; Ron&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
