From ScummVM :: Wiki
Jump to navigation Jump to search
Name Main TODO List
Technical Contact(s) The ScummVM Team
Subsystem Generic

Here is a list of things we consider doing in the future. Note that we don't promise to do any of these, nor when we will do them. It's just a list of what we hope to be able to do one day, and some items on the list really are more like ideas than real proposals, so take it with a grain of salt.

If you want to dig in, this is the stuff where you might make the most useful contribution. Note that this list is never complete, and may be partially outdated, so just because you don't see something here doesn't mean it is not important.

Before you start work on something, you should first talk to the team! Ideally ask on scummvm-devel, our mailing list. This will help us to prevent double work, i.e. several people working on the same stuff at once without knowing about each other. Furthermore, sometimes entries on our list are actually obsolete (because the feature has been implemented, or because for some reason we no longer think it to be desirable). Special caution should be taken for TODO entries that say "we may want to" or similar things; that usually means that we aren't sure whether we really want to implement that feature.

So, to repeat it: Always talk to the team before implementing a change on this list, or else risk having your patch rejected :-/.

Finally, always make sure to check out our bug tracker and our feature request tracker for things that need work.


See also the Documentation/TODO page.


  • Write a high level overview of how ScummVM and its engines work?

Web sites



  • Make it run again, upgrade

Common code, infrastructure



  • the "isReady" code is irritating. Most engines ignore it anyway. It's primary purpose is to allow ScummVM to run even if not digitial audio out is available. A better solution would likely be to enforce that all backends always return a valid mixer. In the worst case, if a backend cannot produce audio output, it should still instantiate an Audio::MixerImpl, with some arbitrary sample rate (I recommend 22050 Hz), and a fake playback thread, which acts like an audio output callback but simply discards the generated audio data. (Note: It doesn't suffice to just throw away input data in Mixer::playInputStream, as this breaks with QueuingAudioStream).


  • Consider extending the Audio CD Manager with WAV or VOC support (essentially, the WAV/VOC code would need to be enhanced by adding a factory function similar to that provided for the FLAC/Vorbis/MP3 streams).
  • add a "pause" feature to the AudioCDManager (might require us to extend the OSystem CD API, too). Useful to be able to fully pause the currently running engine


  • See also Music drivers redesign
  • MIDI: Add API to OSystem which allows client code to query for "native" MIDI drivers (like Windows, ALSA, Zodiac, CoreAudio). Then change the MIDI interfacing code (GUI, command line, config file, etc.) and also MidiDriver::createMidi() to use both that list and the list of 'emulated' MIDI devices (AdLib, MT-32, PC Speaker, etc.) in an appropriate way.
  • Make it possible to pass options to the midi/music drivers. This would allow us to get rid of the getenv hacks in the alsa & seq drivers.
    • A simple approach would be to allow the user to specify "extended" driver descriptions. E.g. "alsa:1234" could indicate the alsa driver with port 1234; alternatively, "alsa:port=1234".
    • This doesn't allow for easy tweaking of those settings via the GUI.... to achieve that, one approach would be to invent a 'parameter description language' which allows a driver to specify which options with which kind of values it supports... very flexible, but possibly overkill.
    • Instead, one could add a hook method to MIDI drivers that let's them add a few controls of their own to the options dialog. This is probably a lot easier to implement, though not quite as "clean"...
  • Our XMIDI parser seems to have a couple of missing features, but it's unclear which ones are actually needed. Possible references for a better implementation include the Exult project and the source code for AIL Version 2. The KYRA engine contains some more complete XMIDI implementation on top of our XMIDI parser class too, so it might also be a place to look at for reference.

Config Manager

  • Modify the ConfigManager to make use of the ConfigFile class. This is more difficult than it sounds at first, because currently our ConfigManager is not just used for managing the active config, but also ab-used for editing config data (once for specific targets, in the launcher's "edit game" dialog, and once for editing the "active config" in the engines/dialog.cpp ConfigDialog). This mess needs to be untangled first.
  • Maybe even follow the pentagram ( approach and have three classes:
    • SettingsManager (like our current ConfigManager)
    • ConfigFileManager (manages a set of config files, possibly merging the data from multiple config files)
    • ConfigFile (a simple .ini file accessor).
    This makes it easy to add additional config sources (e.g. XMLConfigFile); makes it possible to treat the command line data like another config file (CommandLineConfig); and simply follows the good old MVC approach, which is always a good idea.
  • Add a proper version to the Config file, which indicates true changes in the format / data in it. Right now, we only have a "fake" version number where any ScummVM instance will just write its version in. Which is totally useless. A proper version would allow us to ...
    • ... produce a warning if an older ScummVM version tries to load a config file written by a newer version with potentially incompatible changes (such as the switch from language code "hb" to "he" for Hebrew)
    • ... detect when we an old config file is loaded which needs to be updated (e.g. by changing language "hb" to "he"; by adding "guioptions" to targets; by fixing trailing slashes in "path"; maybe even updating old style; and maybe in the future by adding "engineid" fields to all targets)



  • On OSX: Support a plugin build in the bundle target: *.plugin files should be put into; this also means that the loader needs to search in the plugin dir of the active bundle. So use the CF bundle API, inside a #ifdef MACOSX block.
  • Make DetectedGame::updateDesc a normal function, not a member function.


  • Enhance the Mass detector to show a list with the results (and optionally, allow the user to edit/cull that list before adding it).
  • Make the gameid editable via an "advanced" tab entry?
  • The global options dialog may show a button for configuring the savepath even on systems where it is fixed -> not good. This button should be hidden/removed for these systems
  • separate launcher code even more from rest of ScummVM, to make custom launchers easier?
    • maybe separate launcher using MVC approach? Separate code which scans for games etc. from the presentation layer, to make it easier to write custom launchers with behavior matching that of the default launcher?
  • show cover art in launcher
    • this would only be done on "high end" systems, must be possible to disable code
    • we can't ship artwork directly, due to copyright concerns; so only ship artwork where it is legally possible, and otherwise allow users to setup "artwork packs"
    • control what artwork is shown using a config key

Global Main Menu/Return to Launcher

  • Confirm exit dialog woes:
    • Double "confirm exit" dialog: When confirm exit is enabled in ScummVM, the ScummVM quit confirm dialog shows up in addition to the quit confirm dialogs for those games which have their own. For example, when you select 'Quit' from Beneath a Steel Sky's in-game menu, it asks you if you really want to quit. Then, after answering, ScummVM gives you another dialog asking you if you really want to quit. So, ScummVM should not show the quit confirm dialog if the in-game dialog has already been displayed. This affects any game which has it's own menu system from where you can quit, or has a native quit confirm dialog. So this means most games.
    • Add/unify "confirm exit" dialog, globally (see FR #1731025)
  • Options Dialog: Implement engine flags to define which features in the Options dialog are supported by the current running game. Use these flags to hide/show the appropriate sliders and buttons in the Options Dialog
  • Improve the look of the GMM: This could include displaying the engine name and the game name on the top of the GMM.
  • Config Dialog code: Resolve the FIXME in engines/dialogs.cpp which pertains to having to use the empty string as the domain name. This is a bigger task, but will enable many other changes (thus as finally changing ConfigManager to use ConfigFile). Essentially, the current game config dialog tries to abuse the system by editing the *active* settings via the config manager, in order to fully reduce the options dialog code from the launcher. But there is a big difference between editing the config settings of a specific target, and the active settings. So, one probably needs to rewrite the code for the config dialog shown from the GMM

Error handling

Sometimes, bugs are reported that are not easily reproducible, e.g. Bug #6751. In such cases, it would be useful to have the error handler in ScummVM generate (and, optionally, automatically send) minidumps that can be used by us to successfully examine crashed ScummVM processes. Integration of something like Google Breakpad is one reasonable option. While it is not likely to be able to get such crash handling into all ports, just supporting the most popular platforms would be enough to make this feature very useful.

Engines / frontends


















Broken Sword 1

  • Modify MoviePlayer class to use ManagedArray for _movieTexts.
  • Add support for Bink RDFT compressed audio in the Smacker videos (used in some later releases).

Broken Sword 2

  • Fix the credits so they look more like the original. (Did we ever get the source code for that?)
  • Maybe work around script bug which causes the mop to disappear briefly when trying to pick it up from the top of the boat at the London docks. (The event to hide the mop is sent too early.) [Bug #2058].
  • Maybe (but probably not) work around a graphics glitch where George can be drawn partially in front of a metal beam he's walking behind. (He's obscured properly by the beam sprite, but part of the beam is only background.) [Bug #4483].
  • Unify some of the code with Broken Sword 1 (e.g. in router.cpp).
  • Lower the music volume when a character is speaking, like the original did.









Backends and ports


  • Add API to query backend for a list of available music engines. Useful for Options dialog. See Music drivers redesign.
  • Right now gBitFormat is part of common/scaler.cpp; we might want to move it to common/system.cpp, or replace it with something better. No hasty changes here, please, make sure you understand how it is used right now before messing with it ;-)



  • Use doxygen (or something else) to turn the short descs from the README into short man pages AND a single text file (replacing README) and a HTML file...


  • One of the GUI assistants pages shows the following text to the user: "Note: Some tools display file picker here, this should perhaps be changed to always be directory output, since often don't want to name the output file." Clearly this should *not* be shown to the user, but rather is something we devs need to address.
  • The last page of the assistant is weird. E.g. after successful run, it shows a "Finish" button in the lower right, and two checkboxes: "Open output folder" and "Process another file". This seems unintuitive and artificial to me. An IMHO better alternative would be to remove the "Finish" button, and instead show some big buttons with captions like "Process another file" (which does just that), "Open output folder", and "Quit". One can probably still do better, somebody should think about this.

Compression tools

  • (Semi-)automatically provide showhelp function
  • Modify encodeAudio to accept "input streams", so that we can avoid creating temporary WAVE files
  • Improved error checking !!! esp. for FT we got several reports about problems caused by the compression tool being called from the wrong directory. This should be avoidable by implementing suitable checks.


  • Turn it into a library, to be used by a command line frontend (like now), ScummVM debugger, and ScummEX. Basically, the API could consist of a single function, which takes a pointer to a memory buffer, its length, the Scumm version and optionally a game id. Also, it would get a pointer to a print function (in the case of the CLI tool, print to stdout; for ScummVM, print to our GUI console; for ScummEX, append to some window/widget)
  • Rewrite code to use 2 passes; first pass builds an intermediate graph, the second pass then tries to detect loops, break/continue statements etc.
  • Proper implementation of o6_startObjectQuick decompilation (see comment in descumm6.c). May require rewrite of core program logic.