Catching momentum

Coming back to a large codebase after a break is disorienting.

I returned this week after a 3-week gap and barely recognized the code I’d been working on. So I planned the week around small, finishable tasks. Nothing ambitious. Just things I could complete and feel good about, to rebuild momentum.

Start small

Sev assigned me my Planka board (the task tracker we use) and pointed me toward a set of Gus games: Gus Goes to Kooky Carnival, Cybertown, and a few others. I went through the tickets, broke each issue into its own card, and we had a Zoom call where he helped me set up the environment properly.

This call is worth describing because it’s a good example of what mentorship looks like here. We talked about Dumper Companion (a tool for inspecting Director movie internals), useful ScummVM debug flags, debugging workflows. The non-technical conversation ended up being just as helpful for reorientation as the technical one. If you’re new and a maintainer makes space for this kind of call, take it.

cast viewer in the visual debugger

It wasn’t loading shared cast members. I fixed that and removed some duplicate code while I was there. Small, satisfying, done. That’s the point of starting small.


Bug 1: Crashing on empty cast slots

The hard part of a fix is often defining the boundary correctly, not writing the code

In original Director, if you set a property on a cast member slot that exists but is empty, it fails silently. ScummVM was throwing an error, which crashed games that relied on that behavior.

Imagine cast slots are numbered 1 through “b”, where “b” is the last populated member. Accessing slot “a” (within bounds but empty) should fail silently. Accessing slot “c” should throw an error. The bounds are defined by the last populated cast member, not the total allocated size.

The fix seemed obvious: skip the error if the cast member isn’t found. But that would also swallow errors for genuinely out-of-bounds IDs, real bugs you’d want to catch. The problem wasn’t the error. It was defining “in-bounds” correctly.

test movies

This is also where Sev introduced me to test movies, minimal Director movies that reproduce a single buggy behavior in isolation. Instead of loading an entire game to verify a fix, you create the smallest possible movie that triggers the issue. Much faster, much cleaner.

The solution: teach ScummVM to distinguish between an empty cast slot within a valid range and a genuinely invalid cast member ID (error).


Bug 2: Sprite dragging not working

The symptom and the cause can live in completely different systems

In one of the Gus games, clicking a puzzle piece should let you drag it around the screen. In ScummVM, clicking did nothing. The piece stayed frozen.

I assumed the drag logic was broken. It wasn’t. The drag code was fine. The real issue was buried in the event pipeline, and finding it meant tracing the entire event flow from click to handler.

ground truth testing

I needed to confirm how Director 4 actually behaves, so I ran the original Director inside Basilisk II (a classic Mac emulator) to observe the real immediate sprite property. You can’t rely on documentation alone (shocker for me), some features are marked obsolete but still functional, and behavior varies between versions.

Here’s what immediate does in Director 4 (5 & 6 too):

normally, mouseDown fires on press and mouseUp fires on release. When immediate is set on a sprite, both mouseDown  and  mouseUp  fire on the press.

The drag handler works by running a repeat while the stillDown loop inside on mouseUp. If mouseUp only fires after the physical release, stillDown is already false and the loop exits instantly. Nothing moves.

The fix was in queueEvent(): when a press arrives on an immediate sprite in D4, queue both mouseDown and  mouseUp  events immediately, then suppress the physical mouseUp later to prevent double-firing.

version boundaries

sev pointed out something: does immediate behave the same in D3? Does it stop working in D5? 

Turns out immediate works in D4, D5, D6. Not tested D3 yet. Will update this after.

the director-tests repo

Instead of loading full games to test a behavior, we use the director-tests repo, a collection of minimal test movies that verify specific Director engine behaviors. You create the smallest possible movie that reproduces just the thing you care about, and it lives in the repo as a permanent regression test.


What I’m aiming for next week

  • Work through more Gus bugs. 

  • Look at build-bot issues. 

  • Go deep on one subsystem end-to-end.

  • Improve tests and stress the visual debugger.

Week 1

We are into the first week and I have a lot of work to brief about which also includes the work done before the official start of gsoc.

For ibass, I started off by adding it to the detection table. Unlike og bass, ibass doesn’t have a separate file for the dinner table entries. Hence, adding it to the skyVersions[] array seemed a bit incorrect. So, I created a separate PlainGameDescriptor for ibass.

After the detection, the next milestone was to make the game start. But the problem was, the UI icons used in ibass are 32-bit images but our sky engine was 8-bit. So, what I did to solve this mismatch was turning the engine into a 32-bit one, keeping the game screen separately at 8-bit and clapped them together before the output.

I have skipped the intro for now because it has a separate video for the intro(and for the outro too). I have saved it for later.

The next natural step was to overlay the icons. To load the bitmaps, I ported the loadAnim() function from the ibass sources and wrote an icon renderer that we then call from our screen compositor. And finally, we have the icons rendered on our screen-

Next step was to trigger the respective actions for those icons. Upon a click, it incorporates something called “_actionFlash”. When we click, the “_actionFlashTime” starts decrementing if _actionFlash is set. So, it gives a flickering effect to the icon until _actionFlashTime becomes zero. It happens like this. As you can see, when _actionFlashTime is even, the icon is cleared and vice versa. In the game, it looks like this-

Thanks for reading 🙂

Day 0

Hi, I am Ramyak Sharma, a third year computer engineering student. I like C++ and systems, so this summer is a great opportunity to learn from my mentor Sev and some of the best engineers in reverse engineering, and hopefully be one step closer to becoming a good engineer myself. I will be working on the Director Engine.

Today is the 24th of May, 2026. My work officially starts tomorrow. Because of my finals, I haven’t been able to catch up with everything yet, so I’ll be reading through the code and skimming through some Director books. My first task will be completing film loops and movie cast members.

See you in the next blog.

About Me and My GSoC 2026 Project

Hello everyone! My name is Mohit, and I’m a 2nd-year Engineering student. I’m excited to participate in Google Summer of Code 2026 with ScummVM and very thankful for this opportunity.

I was drawn to ScummVM because of my interest in C++ and low-level programming. Working with a large legacy codebase has already been a great learning experience during my contributions so far.

My project this summer focuses on completing the implementation for four incomplete engines in ScummVM. The main challenges involve architectural issues, missing core features, and gameplay bugs.

Excited to learn more throughout the summer while doing my best to successfully deliver the project and share my progress along the way.

Stay tuned for upcoming blogs and progress updates throughout the summer!

Porting iBASS engine to ScummVM

Hello everyone, I am Priyanshu Kumar and I will be porting the iBASS engine to ScummVM this summer as part of the Google Summer of Code. In this post, I will be covering a little background of this task and what exactly needs to be done.

By “porting”, we usually get an idea that it must be about an engine that needs to be ported and integrated to ScummVM in order to get the games based on that particular engine running through ScummVM. iBASS is not any different but still a lot different.

Sky engine is one of the oldest engines to be supported by ScummVM and the most popular game it powers is Beneath a Steel Sky. This engine was created by Revolution Software in 1994 and ported to ScummVM in 2003. Later, Revolution Software created a remastered version of the game in 2009 with enhanced UI controls for iOS which they built on top of ScummVM’s sky engine.

So, the goal of this project is to port(you may call it “backport”) the changes done for the remastered version and integrate them with ScummVM’s Sky engine to make the remastered version(iBASS) playable on ScummVM. The efforts have already been started and in the next post, I will be briefing about the progress.

Thanks for reading.

Finishing Incomplete ScummVM Engines

Hello everyone! My name is Andy and I’m a 2nd-year Computer Science student. I am incredibly excited to announce that I will be participating in Google Summer of Code 2026 with ScummVM!

I am deeply drawn to ScummVM because of its core mission of digital preservation, coupled with my deep passion for retro gaming. For this summer, my project is titled “Finishing implementation of incomplete engines”. The ultimate goal is to push three nearly-finished ScummVM engines over the finish line, ensuring they are stable and ready for official ScummVM releases.

Currently, these engines face various challenges, ranging from incomplete low-level graphics and legacy code structures to unresolved gameplay bugs.

I am looking forward to diving deep into the codebase and sharing my progress, technical challenges, and bug-hunting stories right here.

Stay tuned for more updates, and let the coding begin!

5 Million Lines of Code. 5 Million Stories.

A couple of weeks ago, we silently crossed an important milestone for the ScummVM project; a milestone we are very proud of.

According to repository analysis performed by Open Hub, ScummVM’s code base now contains more than 5 Million Lines of Code, crafted by more than 900 contributors over almost 25 years.

Dear contributors, on behalf of the entire ScummVM community: Thousands of people are using your code every day, reliving their childhood memories or exploring stories they have yet to discover.

Your passion and endurance are what makes this possible. You are not only writing history, you are preserving it.

Thank you!

Google Summer of Code 2026 – Let's welcome our new students

GSoC Logo

This year again, we had the privilege to receive many impressive proposals, and Google gave us the opportunity to mentor 4 of them for the GSoC this summer.

  • Ion Andrei Cristian and Mohit Bankar will both be working on helping to finish incomplete engines from our backlog, leading to yet more games being supported and helping with our preservation efforts.

  • Priyanshu Kumar will port the iBASS engine to ScummVM. This engine was written by Revolution Software in order to release Beneath a Steel Sky with enhanced controls and features on iOS, and the upgrades to the engine will be incorporated into ScummVM to benefit all platforms.

  • Ramyak Sharma will be dedicating his summer to focus on the DIRECTOR engine, bringing more features and compatibility to the Macromedia Director preservation effort, and enhancing its Visual Debugger.

Please give them all a warm welcome and feel free to visit our Discord server to discuss their projects.

The community bonding period starts today, and the coding period will follow, starting on the 25th of May. You can expect regular updates on their respective blogs on Planet.

With the four GSoC students on board, the team is already in a Summer of Coding state of mind — we hope you’re joining us in the countdown!

We would also like to take the opportunity to thank everybody that applied to GSoc with us, and hope you are interested in helping us continue to build and grow the project going forwards as well.

Nancy Drew 8 & 9 join the investigation!

The mystery deepens! It’s time once again to step into Nancy’s shoes and follow the clues...

We are pleased to announce that ScummVM now supports two more titles from the long-running Nancy Drew adventure game series.

In Nancy Drew: The Haunted Carousel, Nancy is called to investigate a series of strange events at Captain’s Cove Amusement Park, where a carousel horse has vanished and rumors of a curse are beginning to spread. Is it sabotage, superstition, or something else entirely?

In Nancy Drew: Danger on Deception Island, Nancy heads to the Pacific Northwest to look into suspicious incidents involving a marine research facility and reports of aggressive orca behavior. However, things are rarely what they seem...

As usual, you will need the original game data files to play these games. The games are available for purchase through HeR Interactive’s website or Steam. To play them with ScummVM, you will need a daily development build.

If you encounter any issues, please submit a bug report to our issue tracker.

Stay curious, and happy sleuthing!

ScummVM 2026.2.0 "Railmonicon" sees the light

Three months have passed since the last release, and here we are again, with our new release approach. We are both worried and excited, but hope that in the current reality of the absence of pre-release testing, with more frequent releases, we will be able to deliver critical fixes faster.

Let's talk about the release scope. Three months have passed, but the amount of new features is very noticeable.

Newly Supported Games:

  • Necronomicon: The Dawning of Darkness
  • Crime Patrol
  • Crime Patrol 2: Drug Wars
  • The Last Bounty Hunter
  • Mad Dog McCree
  • Mad Dog II: The Lost Gold
  • Space Pirates
  • Who Shot Johnny Rock?

Besides these newly supported games, which come from two new engines, we improved PC Speaker emulation, support multiselect (with Shift/Ctrl keys) in the Launcher, made our internal Help system more noticeable by adding buttons “Help” to several dialogs, and made several improvements to make the lives of our GUI translation team easier.

Regarding improvements to specific engines and games, the notable changes are: music support to Atari ST releases of Elvira 1, Elvira 2, I, and MIDI music for Ripley's Believe It or Not!: The Riddle of Master Lu. After intensive testing, we improved the overall stability of Hodj'n'Podj, Might and Magic: Book One - Secret of the Inner Sanctum, Myst III: Exile, Pilots Brothers 3D and 3D-2, The Lost Files of Sherlock Holmes: Case of the Rose Tattoo, Nathan's Second Chance, Broken Sword II: The Smoking Mirror, Discworld 1 and numerous WAGE engine-based games.

For the platform-specific fixes, Broken Sword 1 plays better on big-endian systems such as PS3, Wii, and OSXPPC. The Atari port has some handcrafted optimizations in the SCUMM engine. On iOS, we now support Text-to-Speech, and there is better support for external MIDI devices.

These are only the highlights of the release; the release notes contain the full list.

Since this is our first release in the new format, the number of ports ready on day one is limited. Please be patient with us when looking for your specific platform updates. You will find them on our downloads page. The iOS version Store and the Android versions should soon be available in their respective platform's app stores.