Difference between revisions of "OpenTasks"

From ScummVM :: Wiki
Jump to navigation Jump to search
(Remove custom table properties)
 
(223 intermediate revisions by 24 users not shown)
Line 1: Line 1:
This page contains a list of open tasks. Completing any of them would benefit the ScummVM project a lot. At least in theory, all of them should be doable even by somebody relatively new to the project -- in particular, as part of the Google [[Summer of Code]]. Besides the tasks listed here, there is of course also the [[TODO]] page listing more things that need to be done (but with far less details).
'''See [[GSoC Ideas]] if you're looking for Google Summer of Code ideas for 2014.'''


TODO: All of these need to be explained with more detail, in proper english sentences!
'''See [[ClosedTasks|Closed Tasks]] for a list of tasks proposed the previous years'''


== Improved plugins code ==
ScummVM contains by now over a dozen different engines for different adventure game systems. Each of these engines forms a "plugin", and it is possible to compile these plugins as loadable modules separate from the core of ScummVM itself. This makes it possible to (un)load engine code at will, ideal for systems with tight memory constraints: If you want to play a game, you only need to load the engine for that specific game, and can unload the others.


We always compile the engines as "plugins", but by default, they are compiled as so-called "static" plugins -- these are not real plugins, but rather the engine gets compiled into the application (i.e. "static linked", hence the name), but is still treated by the rest of the application as a plugin (only that it is not dynamically loaded). Support for true "dynamic" plugin is only available on a subset of all plugins -- essentially most POSIX systems (including Linux, *BSD, Mac OS X) and the Dreamcast.
<!-- This page contains a list of substantial open tasks from throughout the project. Completing any of them would be of great benefit to the ScummVM project.  


There are various ways in which this plugin code could be improved:
In theory, all of these tasks should be doable even by somebody relatively new to the project, in particular, as part of a Google [[Summer of Code]] project.  
* Add support for real "dynamic" plugins on Windows. This is currently not possible, because the ScummVM plugins rely on "backlinking" from the loaded modules to the core binary. This is not supported on Windows. There are various ways to solve this issue (use Google for more info). This is further complicated by the fact that while the interface of the *plugins* is well-defined (although not quite as well documented -- see base/plugins.h), the converse is not true -- plugins can call virtually arbitrary code within the core of ScummVM
* Add support for "dynamic" plugins on more systems which might benefit from them.
* Improve the way we search for plugins. Right now we only look in the current directory. Should this be made configurable? On Unix, maybe /use/share/scummvm should be searched, too? On Mac OS X, the CoreFoundation bundle API should be used to search for plugins inside the ScummVM.app bundle (which would also required the build system to be enhanced to properly bundle all plugins). Etc.


== Small devices backend  ==
It should be noted however that while we suggest that potential GSoC students looks at these tasks they are in no way exclusive to GSoC. Anyone is very welcome to work on any task (or any aspect of it).
ScummVM has been ported to many platforms, often by simply re-using the SDL backend (which is based on [[http:://www.libsdl.org|SDL]], which by itself has been ported to many platforms, making it usually easy to port ScummVM to any of these platforms, too).  


But for some platforms, dedicated backends are required -- either because SDL doesn't support them, or because we can't achieve all our needs by using the SDL port (e.g. because we need more speed, more control, etc.). These backends are typically made for what we call "small systems" -- systems like PDAs or smartphones (PalmOS, Symbian, WinCE), or game consoles (Dreamcast, GP2X/GP32, Nintendo DS, PlayStation 2, PlayStation Portable). These systems share many features. In particular they often have no (full) keyboard and quite limited resources: Little RAM, little permanent storage space, not that much CPU power, or a limited screen resolution.
Besides the tasks collected here, there are of course also the [[TODO]] pages listing more things that need to be done (but with far less details).


This makes it often necessary to (re)implement certain functionality, like virtual keyboards, or graphic downscalers. Since the same needs occur again and again, it would be nice to implement such functionality only once in a sufficiently portable and flexible way, making it possible for backends to pick and use whatever they need. Details and further suggestions as to how to achieved this can be found on the [[Small Devices Backend]] page.
__TOC__


Besides this, optimizing code for speed and memory usage benefits all our targets, and in particular these "small devices". Hence doing this is a worthy goal on its own.
== Introduction ==
=== Some basic rules ===


== Revise FilesystemNode system ==
Below follow some basic rules that anybody interested in one of these tasks should adhere to. Sometimes exceptions may be possible -- as always, common sense applies, and if in doubt, ask.
<font color="magenta">TODO</font>


Revise / improve the whole FilesystemNode system -- possibly by 
The projects below are sketches and ideas. Plus, things evolve over time, so the descriptions might be slightly outdated by the time you read them (although we strive to keep them up-to-date). Hence, you should talk with somebody from the team, probably the person(s) listed as Tech Contact, before starting work on any of them.
taking inspiration from other projects with similar code (e.g. 
boost), but always keeping both high portability and the needs of our 
engines in mind


== GUI ==
All code, unless stated differently, must be written in clean and portable C++, in particular, GCC must be able to compile it (portability exceptions can be made for platform specific code, of course). We also have some [[Code Formatting Conventions]]. Using the standard C++ lib for code used inside ScummVM is at this time not possible. Using it inside a non-essential tool should be fine, though.
Currently we have quite flexible system for defining GUI. Almost every aspect of it could be specified via external theme file
desribed [[GUI_Themes/Specs|here]].


However there are many things missing:
All of the code submitted must be contributed under the terms of the GPL v2+.


* Shadows are not configurable
We only accept clean and maintainable code. This is a somewhat vague requirement, but as a rule of thumb, if the code does what it is supposed to do, but is not extensible, a quick hack, or we need to rewrite it from scratch to properly integrate it, we will not accept it. In particular, we would rather have a maintainable, clean and incomplete piece of code that we could extend than a complete but unmaintainable piece of code.
* Not all widget aspects such as font to use are configurable
* We need to implement possibility for backends to extend GUI by adding their own tab in options dialog
* It would be good to implement antialiased fonts
* We need better About dialog
* Perhaps implement portable support for TrueType fonts
* There are [[GUI_Themes/TODO|number]] of small things to do which will make GUI behavior more predictive
* Modern Theme renderer should be reworked to make it faster, for example currently shadow drawing is rather slow (and hacked)


== Revive ScummEX (likely from scratch) ==
=== Some good advice for [[Summer of Code]] Applications ===
ScummEX (short for "Scumm EXplorer") is a tool which allows browsing the data files of games supported by ScummVM. That's the theory. Current reality is that the ScummEX version in our Subversion repository only supports a subset of SCUMM games (i.e. not even all SCUMM games, not even talking about *all* games supported by ScummVM). It also is based on an old version of wxWidgets, and written in a rather crude way. Hence, starting from a clean new code base likely is the best way to approach this.
The PostgreSQL folks have some real good
[http://www.postgresql.org/developer/summerofcodeadvice.html Advice to Students on Submitting GSoC Applications]. We recommend all students interested in applying with us (or any other GSoC project, for that matter) to read this.


So the goal of this would be to write a new graphical tool which allows browsing of data files of games supported by ScummVM. Some requirements:
==== Student application template ====
* It must run on at least Linux, Windows XP, Mac OS X -- more are preferable, of course. You could use wx
The following was adapted from the FreeBSD [http://www.freebsd.org/projects/summerofcode.html Proposal Guidelines].
* Should likely be written in C++ (other languages, like Python or Java, might be acceptable, if the result is sufficiently portable
* Browse at least the data of SCUMM v5 till v8 games.
* Support for older SCUMM versions, and HE SCUMM games, as well for non-SCUMM games, is not necessary, but the code should be written modular/abstract enough to make it possible to add support for more data formats w/o too much trouble
* Only viewing data is necessary, not being able to edit it (although we won't complain if that's possible :)
* The interface can be designed in many different ways, but at least SCUMM data tends to suggest a main view with some kind of "data tree", in which one can select specific resources, and view them
* Viewing the raw hex data of resources is required
* It should be possible to add custom "views" for data (e.g. viewing images as images, not just as hex data; or hooking up a script disassembler; etc.). It is *not* necessary to provide such viewers for all resources types initially, but it must be possible to add them


== Tools ==
* '''Name'''
* '''Email'''
* '''Project Title'''
* '''Possible Mentor''' (optional)
* '''Benefits to the ScummVM Community''' - A good project will not just be fun to work on, but also generally useful to others.
* '''Deliverables''' - It is very important to list quantifiable results here e.g.
** "Improve X modules in ways Y and Z."
** "Write 3 new man pages for the new interfaces."
** "Improve test coverage by writing X more unit/regression tests."
** "Improve performance in FOO by X%."
* '''Project Schedule''' - How long will the project take? When can you begin work?
* '''Availability''' - How many hours per week can you spend working on this? What other obligations do you have this summer?
* '''Skype ID''' - If you don't use Skype, install it.
* '''Phone Number''' - Cellular is preferable, for emergency contacts.
* '''Timezone''' - Where do you live.
* '''Bio''' - Who are you? What makes you the best person to work on this project?


=== Tools: Rewrite descumm ===
== Your task ==
<font color="magenta">TODO</font>


...to do proper recompilation (inspired by jode 
=== Anything you can dream of ===
and other Java decompilers), so that it can properly decompile 
''Technical Contact'': Our IRC channel, our mailing list, or contact [[User:Sev|Eugene Sandulenko]], [[User:DJWillis|John Willis]]
constructs like switch, do{}while() loops, etc. (I have lots of notes 
on this :)


=== Tools: Overhaul the compression tools ===
''The Task:''
<font color="magenta">TODO</font>


to share more code / share it 
Come up with your personal clever way to improve ScummVM and its various side projects. Be creative. Incorporate the ideas listed below and in our [[TODO]], but don't let yourself be limited by them. Come up with something totally new, or enhance existing features. It's up to you.
better / to compress by using suitable compression libs instead of 
calling external binaries (thus allowing more in-memory operations etc.)


=== Tools: Write a portable GUI for the tools ===
But of course like with all the other tasks, we recommend that you first talk to us (see above).-->
We offer a multitude of command line tools in a separate packages (scummvm-tools). Several of these tools are to be used by end users, mainly to (re)compress their data files (good for systems which have not that much storage, like cell phones).


Now, asking end users to use command line tools to perform common tasks is not quite unproblematic. We would like to make it easier for users to compress their data files, by offering them a nice graphical user interface (GUI). It  should support at least Linux, Windows, Mac OS X, ideally more. This could for example be achieved by using [[http://wxwidgets.org|wxWidgets] or [[http://www.trolltech.com/products/qt/|Qt]].
== Current Open Tasks ==


Note that the command line versions of the tools should still be available, for use in shell scripts or on systems where the GUI is not available. This likely requires modularizing the code sufficiently.
Below is a table of some open tasks that people may wish to consider working on and links for more information.
These tasks can be considered in addition or in conjunction with anything on our [[TODO]], any other task or your own 'Anything you can dream of' project.


Also note that this task meshes well with the previous task (of overhauling the compression tools).
They are usually NOT kept up to date. Please contact us (ideally via IRC) before you even start thinking about one of these tasks. Again, see [[GSoC Ideas]] if you're looking for Google Summer of Code ideas for 2014.


== Residual ==
<!--The GSoC workload figure was used to indicate the percentage of GSoC project time we consider this task will take an average competent programmer. These are just rough guides and should you feel you can undertake a task well in less time (or take longer but deliver a much better or more feature rich result) please feel free to mention this on your application and select your tasks accordingly.-->
=== Light-weight software renderer ===
Residual currently offers two different renderers: OpenGL and TinyGL. Neither offers an ideal solution. Not all OpenGL drivers accelerate the operations needed by Grim Fandango, and the TinyGL renderer, apart from being somewhat glitchy, doesn't run well on low-end hardware. It would be nice to have a more light-weight cross-platform renderer. Since Grim Fandango uses mostly static backgrounds, we could probably gain a lot just from more intelligent screen redrawing.


This shouldn't require any deeper knowledge of the game engine. The renderer appears to be fairly well separated from the rest of the engine already.


== Port specific projects ==
<dpl>
<font color="magenta">Porters, add your ideas here -- and soon, ''before'' we submit the project fo review!</font>
category = Open Tasks
include = {Infobox_OpenTasks} Inforow
table = class="wikitable sortable" ,-, Task, (Outdated) Workload, Technical Contact(s), Subsystem
</dpl>


== Objectify CinE engine. ==
== Current TODO Lists ==
cinE engine was borrowed from external project started by Yaz0r. Originally it was written in plain C.
ScummVM is a C++ project, so we need to objectify this engine without changing its behavior.


The engine itself is well-structured, so many functions which could be gathered into one class are
Below is a table of all the TODO lists currently on the wiki. These less detailed tasks can be considered in conjunction with anything from our larger open task list or your own 'Anything you can dream of' project.
already grouped by files.


No deep knowledge of the engine internals is required, but in any case it is not that big, and thus
A TODO list by its very nature if often made up of vague pointers or ''one line'' ideas. Please seek clarification if you are unsure of any [[TODO]].
could be understood without much efforts.


Also we have objectified several other engines, namely SAGA, Gob and AGI, so history and approaches of such
conversion could be traced in our SVN repository.


== Add 16bit graphics support to SCUMM engine ==
<dpl>
<font color="magenta">TODO</font>
category = TODO List
 
include = {Infobox_TODO} Inforow
Requires good knowledge of
table = class="wikitable sortable" ,-, Task, Technical Contact(s), Subsystem
C++ as there should be found a solution which will not clobber our code,
</dpl>
will have minimal impact on 8bits games and should be optionally turned
off at compilation stage. See [[Humongous Entertainment/Progress/16bits Support|here]] for more information.
 
== Implement "return to launcher" feature ==
Presently we have to exit ScummVM application completely when users exits a game because most
engines do not clean up memory properly on their exit.
 
What we need is to analyze what's going on there and plug all memory leaks, properly shut down
subsystems like sound, so it will be possible to play more than a single game within one
session.
 
The task will require good use of memory leak analyzer and C++.
 
== Mixer improvements ==
<font color="magenta">TODO</font>
 
* High quality resampling
* reduced latency (e.g. by using double buffering) to avoid stutter issues
 
== Add support for TFMX, and more Amiga MOD formats ==
<font color="magenta">TODO</font>: Extract info from https://sourceforge.net/tracker/index.php?func=detail&aid=1372271&group_id=37116&atid=418822  write a nice entry here.
 
There is TFMX player written, but the code is bad.
 
For some Amiga MOD formats, there are well written
m68k assembly sources. DrMcCoy (a student) recently took binary player
for Infogrames modules, learned m68k assembly, REd the binaries and
rewrote them in C++.
 
== Rewrite FMOPL emulator ==
In ScummVM we use well-known FMOPL emulator from MAME V0.37a with some modifications. That was one of the few
versions on MAME released under GPL. Jarek Burczynski later rewrote FMOPL emulator to be bit-precise,
but unfortunately for us his work is under GPL-incompatible license.
 
What needs to be done is to understand current Jarek's code and write a new emulator. The efforts should
be made to avoid verbatim copying of his code, so license violation will not take place.
 
There are several approaches to do it, and even less are suitable for a single developer. One of good
ways would be either fix current FMOPL code looking on how Jarek's code works, or fix completely different
emulator which we have. It was written under GPL by Ken Silverman.
 
== MIDI enhancements ==
Many of the adventures supported by ScummVM make use of MIDI music. Which is why we already include several devide drivers for varios MIDI APIs and emulators (e.g. ALSA, Windows MIDI, Mac OS X CoreAudio/CoreMIDI, fluidsynth...).
 
=== MIDI device configuration ===
Right now, the MIDI drivers are treated by ScummVM in a rather single minded fashion: Either a driver is linked in and hence "available", or not. It's not possible to configure anything about them (like ports to be used etc.), nor does it ever take into account that a single driver might correspond to multiple devices (after all, you can plug several sequenecers into your MIDI port; or you could have configured several different sound font settings in your MIDI emulator). Hence, this needs to be enhanced:
* An API is needed to query the OSystem backend for a list of available MIDI *devices*, not drivers
* These devices should be configurabl via the GUI; this needs to be done in a flexible (different devices/drivers offer different settings) and portable fashion.
 
=== XMIDI parser ===
Various of our games make use of the XMIDI format. We already have a parser for it (see sound/midiparser_xmidi.cpp), but it is incomplete. A full-blown XMIDI parser would be nice -- rumors say that the [http://exult.sf.net Exult] has more advanced parser than we do, maybe that could be used as a foundation.
 
== Add sound to C64 games ==
<font color="magenta">TODO</font>
 
Basically take some free SID implementation,
strip it down and plug into our code
 
== Many tasks with AGI engine ==
<font color="magenta">TODO</font>
 
I.e. bunch of fanmade games do not work. This could be accomplished by
comparing our code with NAGI and DAGII. The engine is one of the
smallest and is easy to understand, not to mention that there is
extensive in-depth documentation on it.

Latest revision as of 18:40, 29 May 2016

See GSoC Ideas if you're looking for Google Summer of Code ideas for 2014.

See Closed Tasks for a list of tasks proposed the previous years


Current Open Tasks

Below is a table of some open tasks that people may wish to consider working on and links for more information. These tasks can be considered in addition or in conjunction with anything on our TODO, any other task or your own 'Anything you can dream of' project.

They are usually NOT kept up to date. Please contact us (ideally via IRC) before you even start thinking about one of these tasks. Again, see GSoC Ideas if you're looking for Google Summer of Code ideas for 2014.


<dpl> category = Open Tasks include = {Infobox_OpenTasks} Inforow table = class="wikitable sortable" ,-, Task, (Outdated) Workload, Technical Contact(s), Subsystem </dpl>

Current TODO Lists

Below is a table of all the TODO lists currently on the wiki. These less detailed tasks can be considered in conjunction with anything from our larger open task list or your own 'Anything you can dream of' project.

A TODO list by its very nature if often made up of vague pointers or one line ideas. Please seek clarification if you are unsure of any TODO.


<dpl> category = TODO List include = {Infobox_TODO} Inforow table = class="wikitable sortable" ,-, Task, Technical Contact(s), Subsystem </dpl>