General ======= * 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 * Fix the Map<> template, make it more robust; maybe use a red-black tree? * Fix engines so they clean up after themselves, to allow proper re-entry to the launcher. See "FIXME: LAUNCHERHACK" in base/main.cpp * 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". * 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: - 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 hardcoded (sub)directory list in the File class. At the very least, that list should be set by the engine (since not all engines need all of the subdirs). Better would be to introduce a somewhat higher level API, a replacement for File::open() which (optionally) takes a list of subdirs. E.g. for Scumm, only certain files are to be expected in the VIDEO subdir). * Use RandomSource for all random numbers. Right now there are a few places where we don't: - sound/fmopl.cpp uses rand() in one function - backends/midi/adlib.cpp has its own random_nr() function. Any others? * In OSystem, replace Property functions with virtual methods, e.g void OSystem::setFullscreen(bool) and bool OSystem::getFullscreen() instead of PROP_TOGGLE_FULLSCREEN and ::property() That is easier to use and has no obvious drawbacks over the "property()" approach (given that you always can provide empty dummy implementations for new OSystem APIs). Build System ============ * Add test(s) for backend usability in the configure script. * 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: srcdir = /path/to/source/dir vpath %.cpp $(srcdir) vpath %.h $(srcdir) include $(srcdir)/Makefile * Allow automatic re-runs of configure (this would have to 'save' the values of env vars like CXXFLAGS and also command line params) * It would be nice to get rid of Makefile.noconf (so that we can implement certain improvements which aren't possible as long as we have to maintain that). To this end, find out 1) Which platforms/systems require Makefile.noconf? 2) What stops them from using 'configure' ? Document this! 3) If possible fix all the issue listed in 2) * Add an install target to the Makefile - Copy binary, install manpage, add menu items. See also patch #891909 (Gnome/KDE .desktop file) Documentation ============= [Ender is working on a new multi-format manual/readme] * Update/enhance man page * Would be nice to have a HTML version of the README on the web page (and I don't just mean a big
 section; rather I mean "real" HTML with links
  and lists and tables etc.)
* Ideally, maybe we can convert the README to some meta format, and then from 
  that generate the text README, as well as a HTML one (and maybe also PDF?)
  Some candidates:
  - DocBook
  - texinfo
  - nroff/troff + PolyglotMan  (http://polyglotman.sourceforge.net/)
  - tbook (http://tbookdtd.sourceforge.net/)
  - xml2doc (http://xml2doc.sourceforge.net/)
  - ...
* Some parts of the README probably could stand a workover. Right now the
  README is trying to be brief (it's "just" a README after all), but it really
  is the closest thing we have to a proper ScummVM manual. So either we just
  decide to turn it into a full blown manual, or maybe make a even shorter
  README, and a MANUAL with full details, examples, screen shots etc.
* Restructure the contents of our README (our manual...) a bit. A rough and
  incomplete draft of how that might look:
  + Introduction
    - What is ScummVM
    - History
    - Contacting the developers
    - Reporting bugs
  + Supported Platforms
  + Supported Games
    - Copy Protection
    - Simon
    - BS notes
    - Using mac data files
  + Getting started
    - How to get ScummVM (binary, source)
    - Compiling (with more detail than now)
    - First steps (basic setup, getting a first game to run)
  + Running ScummVM
    - Command line options
    - Hot Keys
    - Savegames
  + Configuration
    - Using the launcher
    - All config file switches in detail
    - Graphics Filters
    - Music and Sound (mostly like now; maybe under the 'Configuration' section)
  + Glossary? (explaining abbreviations etc.)
  + Credits
  + Index? (would be nice, for example 'fullscreen' would link to the hotkey,
     the config file setting, and the command line option)
* Add more doxygen comments. However, quality is preferable over quantity

Web site
========
* Redo the screenshots. Mostly this means adding more (and maybe removing or
  replacing a few). What I have in mind are that we follow these guidelines
  (which aren't set in stone nor laws, just guidelines :-)
  - for each unique game, provide 2-3 screenshots
  - have at least one shot for each major variant of a game (with major variant
    I mean visibly distinct versions, like Zak V1 vs. V2 vs. FM-TOWNS; or
    Monkey Island EGA vs VGA vs CD).
  If I am counting right, that should place us at about 2*(18+2+1+1+1)=46
  screenshots, compared to the current 32 (and more if we start adding HE
  games).

GUI
===
* LAUNCHER: add more options to global options dialog
* LAUNCHER: add more options to game target options dialog 
* Remove hardcoded 320x200 assumptions, use game screen size
* Add ability to scale GUI (ie. to make the GUI less tiny in COMI)
* Remove code duplication between EditTextWidget and ListWidget (i.e. text 
  editing code; maybe we can factor that out into a common base or aggregate
  class... not yet sure).
* Fix 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 seperation 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.

Game Detector
=============
* Improve the detector for games with all datafiles in subdirs (i.e.
  Broken Sword 1 & 2). This could work by letting the detector proc recurse
  into sub directories...
* Remove "detectname" from GameSettings struct. On the long run, "midi" and/or
  "features" might be removed, too.

Audio
=====
* Get the high quality resample code to work
   [Fingolfin has started work on this]
* Add a command line/config file option for the output sample rate (to allow
  for output sample rates other than 22050 Hz, e.g. 44100). Code should do
  sanity checking (e.g. restrict to rates between 8000 - 65535 Hz)
* Clean up the "premixer mess": instead of having a custome premixer hook, add
  a "callback channel" or something like this. This removes special cases from
  the code, and it also makes it possible to apply sound rate conversion to
  premixers, which makes it easier to write and maintain a premixer proc.

Config Manager
==============
* Preserve comments in config file somehow
* 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.
* Change backends to directly access the config manager

SCUMM
=====
* Fix C64 costume code
* Make it possible to restart games properly
* 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]
* Figure out how to extract resources from Apple II and Commodore 64 versions
* Figure out how to extract resources from Turbografx/PC Engine version of Loom
* Document and fix AKOS differences in Humongous Entertainment games
* Support various newer Humongous Entertainment games
* Add support for returning the correct music status for the digital music used 
  in 3DO versions of Humongous games.
* Proper handling of .tlk files for Humongous games
* 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
* Add support for sound effects format found in Sega CD version of Monkey
  Island
* Rename scummvm.cpp to scumm.cpp for consistency. [Fingolfin is working on
  this, please don't do anything about this before talking to him].
  1) Try to get scummvm.cpp fixed for ViewCVS [in progress!]
  2a) If 1) succeeded, file SF.net CVS file rename request
  2b) If 2) failed, do brute force file rename (cp && cvs add && cvs rm)
  3) Adjust Makefile and project files to use the new name
* Possible implement a new resource manager, which then also could be shared
  by ScummEX. [Jamieson has some ideas about this and might work on it|
* Support all Mac games without needing rescumm. These games being: dott,
  samnmax, dig & ft. See above point.
* COMI: Fix setActorChoreLimbFrame opcode (see bug #754419, "Wally's Fake
  piratehook still on ground after pick up")
* V7-8 games: Implement smooth horizontal scrolling (instead of scrolling in
  increments of 8 pixels). See bug #629417.
* Fix bugs in o6_actorOps case 218 implementation as used in Humongous games
* Add method of setting initial debug channels from command-line
* COMI (maybe V7 games, too?): "Fix" CHARSET_1 behaviour when the room scrolls.
  In particular, when text is drawn via CHARSET_1 and then scrolling takes
  place, the text scrolls, too - but it really should stay fixed. There are
  several ways to do this that I can think of. One would be to use an overlay
  screen (i.e. use virtscreen 3, which isn't used at all currently) to draw
  the text; then "compose" that screen over the main screen.
  Or constantly (well, at least whenever the camera moves) redraw the text.
  That would require buffering the text; maybe the blast text code could be
  reused for this...
* Add support for NES version of Maniac Mansion
* Finish formating stuff in subtitles/translation code in the dig.
* In the very long distance future add translation stuff(hashing original and replacing with translation)
* (maybe) Add tools for encoding smush sequences into mpeg format to fit on small devices
* (maybe) Add tools for encoding resources (ex. sounds) to fit on small devices 
* fix codec44 for nut fonts
* Imuse Digital:
  - fix continue playing 'state' music paused by 'sequence' music
  - decrease number tracks to 8
  - implement sounds priority in tracks for deleting lower priority sounds
  - recheck music code
  - add sound mixer procedure for pool method
  - change code to new mixer pool method procedure
  - check if VAR_SYNC if it's set to nonzero value
  - add pool method for FT voc samples from resource
  - add missing volume channels into sound mixer needed by imuse and add code into imuse
  - implement tuning volume level or something(not sure yet what is)
  - implement stuff for fadeParam in JUMP opcode and recheck 'next region' code 
  - recheck original imuse stream stuff if match logicaly our code
  - make struct sync, jump, regions use dynamic memory usage
  - split startSound mess into more clear code
  - fix akos sound related stuff
  - add save/load code
  - add code for mp3 and ogg
 * SMUSH:
  - get rid smush mixer add code for imuse to handle smush tracks
  - fix SAUD bug, reported in bug tracker
  - cleanup channel mess
  - make code more clear in some places (subtiles code for ex.)
  - add code for mp3/mad encoded sound tracks (distans future)

Broken Sword 1 & 2
==================
* Currently BS1 & BS2 duplicate some code for MPEG2 playback. It would seem
  logical to share that code (for all the usual good reasons).
  We might even want to add a "video" dir (analog to "sound") for the shared
  code, if it can be rewritten so that it's reusable.
  DO NOT ADD SUCH A DIR without first consulting with Ender and Fingolfin !

Broken Sword 2
==============
* Enforce ScummVM code formatting guidelines. (Mostly done?)
* Encapsulate the code into sensible objects. (Partly done.)
* Enable the CD swapping code. (Partly done.)
* Support cutscenes in some kind of open video format. (Partly done.)
* Fix the credits so they look more like the original. (Did we ever get the
  source code for that?)
* Compressed speech / music clusters. (Some work done, but not in CVS yet.)

SIMON
=====
* Add support for dictionary files in Amiga and Macintosh versons of
  Simon the Sorcerer 2
* Add support for Protracker music format used in Amiga versions
* Add support for drawing main graphics correctly in Amiga versions

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 requre rewrite of core program logic

Backends
========
* 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 :-).
* Add API to query backend for a list of available music engines
  Useful for Options dialog
* Add API to query backend for a list of available scalers/screenmodes
  (that is, a list of user presentable names, and corresponding
  PROP_SET_GFX_MODE values). This is useful for the options dialog
* Add PROP_GET_GFX_MODE (mirroring PROP_SET_GFX_MODE)
* Consider replacing the PROP_TOGGLE_* properties with GET/SET ones -> 
  this allows more control over these properties (like, it allows the GUI to
  display checkboxes for these in the options dialog)

X11 backend
===========
* Make it work with multiple bitdepths
* Add frills used by SDL backend like graphic filters usage and CD audio