Difference between revisions of "TODO"

From ScummVM :: Wiki
Jump to navigation Jump to search
(→‎README / Manual: cvs -> svn)
(Add note about missing Broken Sword 2 feature.)
 
(205 intermediate revisions by 28 users not shown)
Line 1: Line 1:
Here is a list of things we plan to do 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.
{{Infobox_TODO|
taskname=Main TODO List|
techcontact=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.
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.
Line 10: Line 16:




== Docs, Web site ==
== Documentation ==
 
See also the [[Documentation/TODO]] page.


=== General ===
=== General ===
* Add port specific user documentation (dreamcast/palm especially). That would include things like:
** How to use ScummVM on system XYZ
** Which Palm / WinCE devices will run ScummVM, which definitely will not run it (or with which limitations)?
* Update/enhance man page
* Write a high level overview of how ScummVM and its engines work?
* Write a high level overview of how ScummVM and its engines work?


=== README / Manual ===
== Web sites ==
* Ender is working on a new multi-format manual/readme. Since so far we haven't seen anything of that, Fingolfin has started a DocBook based manual (and FAQ, and Developer's Guide). You can find it in the SVN module "docs". Finally, there is a LaTeX based version of the README in the "doc" subdir of the "scummvm" CVS module, but it tends to slip out of sync with the plain text README, and it's not really a manual, it's just the README in a different file format.
* Everybody is welcome to start helping out with the public manual project in the "docs" CVS module. You can either reuse content from the README, or replace it with new, better written stuff. Contact Fingolfin or our mailing list, scummvm-devel, if you are interested in helping out.
* It would be greate to have a "Developer's Guide to ScummVM" which explains the ScummVM framework, and also the engines, i.e.
** stuff in common/, like the config manager etc.
** the backend API, and how to create new backends
** the sound system
** how to create a new engine
** a chapter for each engine, with as many/little details as the resp. engine teams deem appropriate...
** ...


=== LaTeX docs ===
=== [[Buildbot]] ===
* These are constantly out of sync with the README :-/. Keep an eye on this and make sure that you always update both at once.


=== Code ===
=== [[Doxygen]] ===
* Add more Doxygen comments. However, quality is preferable over quantity
* Make it run again, upgrade
* Document the OSystem overlay API, it badly needs it...


=== Web site ===
== Common code, infrastructure ==
* Add the "Manual" / README to the site


=== Wiki ===
=== Audio ===
* Add some content to the Help:Editing link you see when editing a page.
 
=== Forum ===
* Implement the new layout (work in progress!)
 
== Common code, infrastructure ==


=== General ===
==== Mixer ====
* Revise the way "quit" is handled. Maybe add a global variable "g_quit" which we set when the application should be quit (e.g. when an EVENT_QUIT is received). This is useful if multiple levels of event loops have to be ended
* 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).
* Fix the Map<> template, make it more robust; maybe use a red-black tree?
* Make some generic "EventLoop" API/class which all backends and the GUI use. Initially this would just call the backend poll_event() etc. methods. But eventually the EventLoop object(s) could be made by the backend. This may allow for more efficient CPU usage etc. The current event handling model essentially is polling: the engines run some kind of main loop, which, besides many other things, also polls and dispatches events. The idea is to turn this around: the event loop frequently gives the engine time to do these "other things".
* Make the autosave interval configurable (via GUI, command line, config file).
* Maybe add ways to modify the game configs via the command line. E.g. allow
    ./scummvm --add new_target --path=/foo monkey2
    ./scummvm --remove new_target
* Maybe allow launching games even if no target is specified? I.e. the user only has to specify a path (or run ScummVM from the right directory), and ScummVM auto-detects the game in that location
    ./scummvm --auto-detect
* Some source files should be moved. But that's a pain with CVS, so let's wait until we switch to something better, like Subversion. In particular:
** consider moving the MIDI stuff from sound/ to sound/midi/
** move fmopl code to softsynth dir
** maybe common/system.h / system.cpp should go to backends/, too ?
* The following things should be put into namespaces:
** AudioStream and subclasses into Audio
** MIDI related classes either to Audio, or a new "MIDI" namespace
** backend specific stuff into ??? (maybe new namespace "Backends" ?) not sure about this one.
* Get rid of getenv in as many places as possible. Ideally, we'd only use it to query HOME on Unix systems.


=== Build System ===
==== CD ====
* Add test(s) for backend usability in the configure script.
* 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).
* Enhance the Makefile-based build system to support VPATH and stuff, so that one can compile scummvm in a directory tree separate from the source tree. That would make it possible to build ScummVM with different build options, e.g. have one debug build and one optimized build. Fingolfin implemented most of this; the only thing missing is that configure should detect when it is run in a directory outside the source tree, and in that case generate a custom Makefile, with content like this:
* 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
<pre>
srcdir = /path/to/source/dir
vpath %.cpp $(srcdir)
vpath %.h $(srcdir)
include $(srcdir)/Makefile
</pre>
* Allow automatic re-runs of configure (this would have to 'save' the values of env vars like CXXFLAGS and also command line params)
* Add an install target to the Makefile - Copy binary, install manpage, add menu items, install README. See also patch #891909 (Gnome/KDE .desktop file)


=== Audio ===
==== MIDI ====
* Get the high quality resample code to work [Fingolfin has started work on this]
* See also [[Music drivers redesign]]
* Consider changing the mixer volume to use range 0-255, for sake of consistency (but at a slight loss of efficiency). Note that this requires changes in at least rate.cpp and mixer.cpp.
* 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.
* 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.
* The Audio CD Manager, and especially the DigitalTrackInfo class could stand an overhaul. The system currently is not as easy to extend as one would wish. In particular, it would be nice if arbitrary AudioStream classes could be used here (this then would reduce code duplication and make it instantly possible to use WAV/VOC encoded audio tracks, should we desire to support those).
* Modify our audio stream classes (for MP3/Vorbis/FLAC/... playback) to use SeekableReadStream instead of Files -> allow from-memory-playback. And could take advantage of a new hypothetical "Sub(Seekable)Stream" class. (See below for more info on that).
* 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.
* 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".
**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.
**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"...
**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 [http://exult.sf.net Exult] project and the [http://www.thegleam.com/ke5fx/ 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 ===
=== Config Manager ===
* Add a 'notification' system. E.g. the SoundMixer could request to be notified whenever the value of the "volume" config option changes. In other words, instead of a "pull" approach (where each subsystem has to check whether any config option relevant to it has been changed) we use a "push" approach. Of course the current approach is "push", too: whenever e.g. the volume setting is changed, the code doing so has to updated the SoundMixer etc. That's cumbersome, and error prone. Would be much nicer if updating the volume config value automatically notifies the SoundMixer, iMuse etc.
* 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.
* Modify the ConfigManager to make use of the ConfigFile class.
* Maybe even follow the pentagram (http://pentagram.sf.net) approach and have three classes:
* Maybe even follow the pentagram (http://pentragram.sf.net) approach and have three classes:
** SettingsManager (like our current ConfigManager)
** SettingsManager (like our current ConfigManager)
** ConfigFileManager (manages a set of config files, possibly merging the data from multiple config files)
** ConfigFileManager (manages a set of config files, possibly merging the data from multiple config files)
** ConfigFile (a simple .ini file accessor).
** 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.
*: 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 ...
=== Files ===
** ... 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)
* Add a FilesystemManager or FileManager or so which should unify and/or replace the current File/FilesystemNode classes (and maybe SaveFileManager). The goal is to make these things as portable as possible while keeping it easy to use for the coder. Some new functionality we need:
** ... 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)
** check for existence of file/directory
** check whether given directory is readable/writeable
** convert FSNode into a string representation (for prefs file)
** convert said string representation back to FSNode
*: Of course that can be added w/o a FileManager class, too - but it might be nice to have all of these integrated.
* Get rid of the incRef/decRef API of class File. Instead, add a clone() method which generates a new (independant) File object for the same file (only would work for files in read mode, obviously). Convert the audio code to use this instead of the ref counting.<br> Reason: Using a shared file object can lead to race conditions if multiple threads try to use it at the same time; on some systems (Symbian) it is apparently not even possible to do it; iahd t can also cause problems even in non-threaded code, when we seek in one block of code, and then try to access it from another block, w/o reseeking first.


=== GUI ===
=== GUI ===
* [[GUI_Themes#To_Do|New GUI ToDo]]
* [[GUI Themes/TODO|GUI TODO]]
* EditableWidget: Make it possible to specify a min/max length for the text
* EditableWidget: Let setEditString filter the string it gets
* EditableWidget: Right now, custom filtering requires the user to subclass; it would be nice if there was simply a "validator hook" or so. Maybe take some inspiration from Java's Swing in this matter.
* Improve EditTextWidget::drawCaret and ListWidget::drawCaret support for alternate fonts (the current code overdraws chars partly, and relies on the fact that our default built-in font has a separation pixel column on the *left* side; most other bitmap fonts have it on the right, though). To this end, we maybe should backup the background before drawing the caret, and restore it when erasing the caret.
* PopUpDialog: Must be able to handle longer lists (by adding scrolling?). The language popup currently doesn't fit in the small version of the GUI.
* Add a new "options" dialog which is used by all frontends: for this, we'd agree on a hotkey used in all engines to invoke that dialog; it would sport settings for the volume, graphics, paths, etc.; it would co-exist with the engines "native" option dialogs. The about dialog would be reachable from here, too, as well as a quit button. Justification: This ensures that all settings are really reachable from all of the engines, which is not the case currently. Problem: It's not fully clear to me how to "best" deal with global vs. local settings here...
* Maybe add the ScummVM logo (+typeface?) to the about dialog
* There is currently no way to unset the SoundFont from the GUI, if any was set. Maybe add a 'clear' button for it? The same holds for other path settings.
* ScrollBarWidget: Add auto-repeat: if user clicks & holds on one of the arrows, then after a brief delay, it should start to contiously scroll.
* AboutDialog: Add a "fade" effect for the top/bottom text lines
* AboutDialog: Maybe prerender all of the text into another surface, and then simply compose that over the screen surface in the right way.


=== Graphics ===
=== Plugins ===
* Add some more fonts/font variants? Maybe a tool like ttf2bdf could be used to convert on (free!) TTF font to both a small and a big font for the GUI, maybe including bold/italic variants
* On OSX: Support a plugin build in the bundle target: *.plugin files should be put into ScummVM.app/Contents/PlugIns/; 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.
* Allow loading external fonts (BDF format?). Useful for GUI customization.
* Make DetectedGame::updateDesc a normal function, not a member function.
* Use 'complete' fonts, encoding wise. In particular, we should probably pick one encoding (e.g. ISO Latin 1) and standardize on it. Oh yeah, a map from the SCUMM  encoding to that encoding would be useful. That way, we can at least all systems/languages which use that encoding. Of course, kyrillic and asian users, amongst others, wouldn't be helped by this, but there is nothing we can do for them anyway, short of implementing an UTF8 based font rendering engine. (And no, there is no way we are going to do such an absurd thing. Better to implement native GUIs than to write our own OS :-).
* Consider implementing a new internal font format which
** takes up less space in the executable (ascii vs. binary encoding)
** allows for multi-color/anti-aliased fonts


=== Launcher ===
=== Launcher ===
* Add more options to global options dialog
* Enhance the Mass detector to show a list with the results (and optionally, allow the user to edit/cull that list before adding it).
* Add more options to game target options dialog
* 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


=== Plugins ===
=== Global Main Menu/Return to Launcher ===
* Add a plugin API that allows querying a plugin for the savegames associated with a given game; that is, you pass the name of a target from the config to the plugin, and it returns a list of savegames. How that list would look like exactly is debatable; but it should be possible to extract a user friendly name; a slot ID corresponding to the "-x" command line param; and possibly a filename. Justification: This API would make it possible to directly load savegames from the launcher.<br>This savegame API could return additional (optional) information for each savegame entry: name; creation date; thumbnail screenshot
* Confirm exit dialog woes:
* On OSX: Support a plugin build in the bundle target: *.plugin files should be put into ScummVM.app/Contents/PlugIns/; 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.
** 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.
* When creating an engine instance, there is currently no way for the plugin to indicate an error, except for returning a NULL value. It would be nice if the engine could specify why creating the engine instance failed (e.g. due to lack of memory, because a file couldn't be found, because the game was not recognized, etc.).
** Add/unify "confirm exit" dialog, globally (see [https://sourceforge.net/tracker/index.php?func=detail&aid=1731025&group_id=37116&atid=418823 FR #1731025])
* Split base/plugins.h into the part needed to implement a plugin, and the part needed by client code. Maybe also move DetectedGame and GameSettings to a new file base/game.h
* 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
* Replace DetectedGame by a 'map' containing essentially the same data that the config file would contain -- i.e. gameid, description, language, platform; but also any further data, like e.g. basename, target_md5, or *anything* the engine deems important. -> far more flexible, and helps to simplify the launcher code, too.
* Improve the look of the GMM: This could include displaying the engine name and the game name on the top of the GMM.
* Make DetectedGame::updateDesc a normal function, not a member function.
* 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


=== Streams ===
=== Error handling ===
* Add a Sub(Seekable)Stream wrapper class: You pass a (Seekable)Stream, an offset and a size to it. It will pass all calls on to the wrapped stream, but will restrict access to the specified byte range. This then can be used in various places, e.g. in many of the AudioStream classes, to simplify code.
* Add a "clone" method that makes a copy of the (seekable/readable) stream. In the case of files, this would create a new file descriptor. Purpose: Replace the Symbian hack in MP3InputStream and other places; in particular, often we need two parts of code to access the same file but in separate positions...


Sometimes, bugs are reported that are not easily reproducible, e.g. [https://sourceforge.net/p/scummvm/bugs/6751/ 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 [https://chromium.googlesource.com/breakpad/breakpad/ 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 ==
== Engines / frontends ==


=== General ===
=== [[SCUMM]] ===
* Fix engines so they clean up after themselves, to allow proper re-entry to the launcher. See "FIXME: LAUNCHERHACK" in base/main.cpp.
* see [[SCUMM/TODO|SCUMM TODO]] list
 
=== [[AGI]] ===
* see [[AGI/TODO|AGI TODO]] list
 
=== [[AGOS]] ===
* see [[AGOS/Bugs|AGOS Bugs]] list
* see [[AGOS/TODO|AGOS TODO]] list
 
=== [[Cine]] ===
* see [[Cine/TODO|Cine TODO]] list
 
=== [[CruisE]] ===
* see [[Cruise/TODO|CruisE TODO]] list
 
=== [[Drascula]] ===
* see [[Drascula/TODO|Drascula TODO]] list
 
=== [[Gob]] ===
* see [[Gob/TODO|Gob TODO]] list
 
=== [[Groovie]] ===
* see [[Groovie/TODO|Groovie TODO]] list
 
=== [[Hopkins]] ===
* see [[Hopkins/TODO|Hopkins TODO]] list
 
=== [[Hugo]] ===
* see [[Hugo/TODO|Hugo TODO]] list
 
=== [[Kyra]] ===
* see [[Kyra/TODO|Kyra TODO]] list
 
=== [[Lastexpress]] ===
* see [[Lastexpress/TODO|Lastexpress TODO]] list
 
=== [[MADE]] ===
* see [[MADE/TODO|MADE TODO]] list


=== [[SCUMM]] ===
=== [[Mohawk]] ===
* Make it possible to restart games properly
* see [[Mohawk/TODO|Mohawk TODO]] list
* Add method of setting initial debug channels from command-line
* Possibly implement a new resource manager, which then also could be shared by ScummEX. [Jamieson has some ideas about this].
* Figure out how to extract resources from Apple II versions
* Figure out how to extract resources from Turbografx/PC Engine version of Loom
* Loom EGA: Add support for music and sound effects in Macintosh version
* Add support for handling Kanji in FM-Towns games (foreground is rendered on a second plane at 640x480), text uses Shift_JIS encoding [implementation now that currently depends on font rom, not needing the rom would be preferable]
* Add support for TFMX music format in Amiga version of Monkey Island 1 Check http://darkstar.tabu.uni-bonn.de/~neo/audio.html for music format details
* When SMUSH movies end, their music track sometimes should last a bit longer; currently, we stop the audio together with the animation, leading to cut off music.
* Clean up class Gdi. This class right now mostly is about decoding various graphic formats. However some other functionality has crept into it, too. It would be nice if class Gdi would only contain the GFX decoding code, and nothing else (assuming that is feasible w/o too much trouble). OTOH, the code which is responsible for managing virtual screens, rendering virtual screens to the real display etc. could be grouped into a new class (e.g. VSManager or so).
* Reduce kMD5FileSizeLimit from 1MB to e.g. 80 kb (this will force us to recompute the MD5 for the mac bundles, but hopefully nothing else)


==== SCUMM C64 ====
=== [[Parallaction]] ===
* see [[SCUMM_C64|SCUMM C64 TODO list]]
* see [[Parallaction/TODO|Parallaction TODO]] list


==== SCUMM NES ====
=== [[SAGA]] ===
* see [[MMNES_Progress|MM NES TODO list]]
* see [[SAGA/TODO|SAGA TODO]] list


==== HE games ====
=== [[SCI]] ===
* see [[HE_Progress|HE Progress status]]
* see [[SCI/TODO|SCI TODO]] list


=== [[Simon]] ===
=== [[Sword1|Broken Sword 1]] ===
* see [[Simon Bugs]] list
* Modify MoviePlayer class to use ManagedArray for _movieTexts.
* see [[Simon TODO]] list
* Add support for Bink RDFT compressed audio in the Smacker videos (used in some later releases).


=== Broken Sword 2 ===
=== [[Sword2|Broken Sword 2]] ===
* Enforce ScummVM [[Code Formatting Conventions]]. (Mostly done?)
* Encapsulate the code into sensible objects. (Partly done.)
* Enable the CD swapping code. (Partly done.)
* Fix the credits so they look more like the original. (Did we ever get the source code for that?)
* 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.) See bug [https://sourceforge.net/support/tracker.php?aid=1214168 #1214168].
* 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.) {{Tracker|id=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.) {{Tracker|id=4483}}.
* Unify some of the code with Broken Sword 1 (e.g. in router.cpp).
* 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.


=== [[Gob]] ===
=== [[Sword25]] ===
* see [[Gob TODO]] list
* see [[Sword25/TODO|Sword25 TODO]] list


=== [[SAGA]] ===
=== [[Tinsel]] ===
* see [[SAGA TODO]] list
* see [[Tinsel/TODO|Tinsel TODO]] list


=== [[Kyra]] ===
=== [[Tony]] ===
* see [[Kyra#TODO|Kyra TODO]] list
* see [[Tony/TODO|Tony TODO]] list


=== [[Cine]] ===
=== [[Toon]] ===
* see [[Cine_TODO]] list
* see [[Toon/TODO|Tooon TODO]] list


== Backends ==
=== [[Touche]] ===
* see [[Touche/TODO|Touche TODO]] list


=== General ===
=== [[TsAGE]] ===
* Several of the backend factory functions take config parameters. It should be possible to get rid of those once the config system rewrite (see above) has been done. In that case, the backends simply can query the config manager for these parameters (or any others they might like :-).
* see [[TsAGE/TODO|TsAGE TODO]] list
* Change backends to directly access the config manager
* Add API to query backend for a list of available music engines. Useful for Options dialog
* Document key codes to be used for special keys, like F1-F15 etc.
* 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 ;-)
* OSystem::RGBToColor and OSystem::colorToRGB are very flexible, but cause a bottleneck: One doesn't want to use these virtual methods to convert a lot of colors in one go. Hence consider removing these and related function in favor of a new API with which client code can query the backend for a description of the pixel format (maybe similar in spirt to [http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fPixelFormat SDL_PixelFormat], but maybe we can also reuse / extend a variant of gBitFormat). This is in particular useful for the new GUI code which wants to do things like color fading. Of course, we must still accomodate for backends that only offer palette mode!


=== Potential ports ===
=== [[Tucker]] ===
* MS DOS port using [http://www.talula.demon.co.uk/allegro/ Allegro] and [http://www.delorie.com/djgpp/ DJGPP] ?
* see [[Tucker/TODO|Tucker TODO]] list
* [http://withintent.biz/ Intent] port (already done by David Given, merge?)
* [http://digita.mame.net/reviews.htm Digita OS port]? (play games on a select few digital cameras...)
* NintendoDS port is in the works by Neil Millstone
* XBox port(s) exist, but can not be legally distributed, since the use the XDK, which is incompatible with the GPL. [http://openxdk.sourceforge.net/ OpenXDK] lacks C++ support, though has SDL.


=== X11 backend ===
=== [[Wintermute]] ===
* Add frills used by SDL backend like graphic filters usage and CD audio
* see [[Wintermute/TODO|Wintermute TODO]] list


=== SDL backend ===
== Backends and ports ==
* Right now, the WinCE backend subclasses the regular SDL backend. The Symbian backend will do that, too (it is not yet in CVS, though). They both overload a lot of methods (mostly the graphics stuff). Since graphics.cpp uses the scalers (e.g. hq3x), these derived backends carry that baggage around, too, even though they don't need that code. Idea: split the SDL backend into two classes, one base class which only has the code which is used by all subclasses; and a "desktop" subclass, which implements the rest. Then WinCE/Symbian would only subclass the "base" SDL class.
* We implemented GFX transactions & commits some time ago -- but they are only half the story. We are still missing a rollback system -- that is, check whether the requested video mode works, if it doesn't, revert to the current settings -- at least "if it makes sense". That is, if the transaction only modified the scaler or aspect ratio, we can safely revert. Of course if the screen size changed (e.g. from 320x200 -> 640x480) we can't just revert to the old screen size -- unless we augment the API accordingly, and update all engines to deal with this possibility.


=== General ===
* 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 ;-)


== Tools ==
== Tools ==


=== General ===
=== General ===
* Try to unify the usage of the compression tools, where possible / necessary.
* 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...
* Make compress_san use the common encoder "API" in compress.c
 
* Make compress_queen use the common encoder "API" in compress.c
=== GUI ===
* Add FLAC support to compress_sword1 (and the sword1 engine)
* 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.
* Consider using library APIs to encode data, instead of invoking the lame/oggenc/flac binaries.
* 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.
*; Pro: Tighter integration, no need to create temporary files.
 
*; Con: Requires the resp. libs/headers to be compiled in, and the resulting binary would only run if all needed shared libs are present (unless we static link), whereas the current binary will work even if lame/oggenc/flac are missing
=== 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.


=== Descumm ===
=== Descumm ===
* 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)
* 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.
* 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 requre rewrite of core program logic
* Proper implementation of o6_startObjectQuick decompilation (see comment in descumm6.c). May require rewrite of core program logic.

Latest revision as of 12:26, 20 April 2022

TODO List
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.


Documentation

See also the Documentation/TODO page.

General

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

Web sites

Buildbot

Doxygen

  • Make it run again, upgrade

Common code, infrastructure

Audio

Mixer

  • 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).

CD

  • 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

MIDI

  • 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 (http://pentagram.sf.net) 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)

GUI

Plugins

  • On OSX: Support a plugin build in the bundle target: *.plugin files should be put into ScummVM.app/Contents/PlugIns/; 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.

Launcher

  • 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

SCUMM

AGI

AGOS

Cine

CruisE

Drascula

Gob

Groovie

Hopkins

Hugo

Kyra

Lastexpress

MADE

Mohawk

Parallaction

SAGA

SCI

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.

Sword25

Tinsel

Tony

Toon

Touche

TsAGE

Tucker

Wintermute

Backends and ports

General

  • 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 ;-)

Tools

General

  • 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...

GUI

  • 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.

Descumm

  • 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.