SuperTux TODO
=============

This is a list of tasks and issues that might be worth to implement or
fix. This list is however not an authorative list of things that must
be done, its a collection of random things that pop up during
development, therefore not everything in here might be well thought
out or worth to implement. Use your brain before implementing anything
on this list and always think about how useful a new feature would be
in the context of the whole game or if a potential performance
enhanchment, actually enhanchmes anything at all.

Coding Standard Stuff
=====================

* make code clean: "-O2", "-g3",
                     "-ansi",
                     "-pedantic",
                     "-Wall",
                     "-Wextra",
                     "-Wnon-virtual-dtor",
                     "-Weffc++",
                     "-Wconversion",
                     "-Werror",
                     "-Wshadow",
                     "-Wcast-qual",
                     "-Winit-self", # only works with >= -O1
                     "-Wno-unused-parameter",

* remove overuse of multi-inheritance 

* remove overuse of friend'ship

* maybe mark interfaces as interfaces (ISerializable or SerializableInterface)

* split files with multiple classes into multiple files with one class each

* Decide what to do with magic constants of objects (static vs anonymous namespace vs lisp property)

* check the code with Valgrind and profilers

* use Vector in Physics for 'a' and 'v'

* replace random generator with mersenne twister and/or move to external/ (maybe use boost's random stuff)

* md5.hpp and random_generator.hpp could go to external/

* write/finish scripts to automatically:

  - make all includes relative to top level dir

  - sort includes (.hpp file, then system includes, then other project files)

  - include guards proper and of the form HEADER_SUPERTUX_${PATH_TO_FILE}_HPP

TODO
====

* implement a system that allows to attach comments to specific regions in a level

* implement a tool to "screenshot" a complete level

* carrying an object while running through the exit causes the item to be kicked, falling through the iglo

* GameObject::RemoveListenerListEntry: Ughs, somebody trying to
  implement a list class within in the GameObject?!

* add --datadir DIR (data/) and --userdir DIR (~/.supertux/), allow multiple --datadir's

* make gravity constant

* rename Vector -> Vector2f

* get rid of global SDL_Screen* screen variable

* get rid of SCREEN_WIDTH/SCREEN_HEIGHT overuse, give them a proper name at least

* resolution menu entry moves the wrong way around

* having dictionary_manager in Lisp is extremely ugly

* enforce proper naming of files to match their class (SomeClass -> some_class.?pp or so)

* file naming is inconsistent: some times we use '_' to separate
  words, sometimes we don't

* collect all manager classes into globals.hpp

* more moving directories around?

addon/	
audio/	
control/
gui/	
lisp/	
math/
physfs/	
sprite/	
util/
video/
squirrel/
  for generic squirrel code
supertux/
  worldmap/
  trigger/
  scripting/
    for scripting wrapper code
  badguy/
  object/

* implement PNG screenshot

* having hitbox in Sprite is fugly

* write decal object that doesn't have hitbox

* implement surface and/or sprite scaling (MipMaps?)

* add code that compares the last Log line with the current, if they
  are the same reject them and just output something like:

  * last line has been repeated X times

* implement: http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html

* workaround for Ubuntu pulseaudio/OpenAL brokeness:

$ cat ~/.alsoftrc
drivers = oss

* peaking up/down doesn't work properly

* peaking left/right should make Tux look into that direction (up/down to, needs new sprites)

* add pipe graphics that makes a 90 degree turn

* keep possible future SDL1.3 upgrade in mind (what has changed?)

* cleanup scripting interface

* replace cloud tiles with decals

* option menu has text overlap in "aspect ratio"

* jumping up from an enemy doesn't make a sound?

* add support for automatic scrolling backgrounds

* add direct reading of Vector2f to Reader/lisp

* replace bell with 'reset block', that starts to glow once bumped
  into (or something different)

* refactor Camera code, break ugly long functions into pieces and such

* allow fully custom magnification levels from command line (maybe GUI
  to if there is a proper/easy way to let the user enter numbers)
  (--magnification or -g WIDTHxHEIGHT:ASPECTX:ASPECTY@MAGNIFICATION)

* use AnchorPoint in Background instead of Alignment

* allow gradients to parallax scroll like Background (make it optional)

* add multicolored gradients (see Windstille source code, which can deal with Gimp gradients)

* fix alpha blending in the SDL renderer, currently all sprites (Tux,
  etc.) appear transparent

* position of statistics text on the worldmap doesn't scale properly with resolution it seems

* gluBuild2DMipmaps leads to blurriness, maybe lack of magic offset
  (0.375f, 0.375f, 0.0f) or something else

* font system has blending artifacts at non-1x magnifications, need to
  have an transparent pixel between letters

* add a (border #t) flag to fonts, that allows to use fonts which have
  a 1px transparent border around glyphs, which is needed to get rid
  of blending artifacts in OpenGL

* mouse cursor has blend artifact on high magnification

* shadow font glyphs bleed into other glyphs

* in DrawingRequest "void* request_data;" is only free'ed, but the
  destructor never gets called

* sprite/sprite.cpp: frame should never get out of range:

  if((int)frame >= get_frames() || (int)frame < 0)
    log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl;

* Surface::hflip() is used exactly once, should probally be part of the constructor

Scenegraph and Physics Engine Restructuring
===========================================

* random idea to restructure engine stuff (might lead to nicer code
  and easier scriptability (and a need to rewrite lots of stuff...):

class SomeBadGuy : public PhysicsCallbackListener // or use boost::function
{
private:
      PhysicsPtr box;
      SpritePtr sprite;
        
public:
      SomeBadGuy(Engine& engine)  
      {
         box    = engine.physics().create_box(Rectf(0,0,32,32));
         box->register_listener(this);
         sprite = engine.graphics().create_and_add_sprite("Foobar");
      }

      void update(float delta)
      {
         // not much to do, as most stuff is done internally in the engine
         if (dead)
         {
                  sprite->replace_with("Foobar_dead");
         }
         else
         {
                sprite->hide();
                sprite->set_pos(box->get_pos());
        }
      }

      // no more draw(), done by the scene graph

      void on_collision(CollisionData data)
      {
        // respond
      }
};

Subversion->Git/Mercurial/Bzr Move
==================================

* right now a switch doesn't seem to be worth it

* core issue right now isn't SVN, but old SVN version on lethargik.org
  (lacks merge tracking, issues with viewvc)

* cleanup SVN to make import into other version control systems possible:

 - Should we merge trunk/supertux-milestone1 and trunk/supertux when switching to Git/Hg/...?

Mistakes: incorrect branch creation: r5201-5207

tags/start           # unknown
tags/supertux        # unknown
tags/supertux_0_1_0
tags/supertux_0_1_1
tags/supertux_0_1_2
tags/supertux_0_1_3

branches/cobble      # unknown
branches/milestone1  # unknown
branches/new-collision-detection # unknown
branches/README      # documentation that will be lost in conversion
branches/supertux    # unknown
branches/supertux_0_1_1_branch
branches/supertux-box2d  # mathnerd (trash)
branches/supertux-editor-newdrawing # editor
branches/supertux-editor-newdrawing2 # editor
branches/supertux-milestone1-olpc    # supertux-milestone1
branches/supertux-milestone2-grumbel # supertux
branches/supertux-nogl               # supertux(?)
branches/supertux-sharp              # another supertux editor
branches/unison-video                # ???
branches/vendor                      # ??? CVS crap

trunk/cobble          # some editor?
trunk/CVSROOT         # ??? CVS crap
trunk/htdocs          # htdocs
trunk/jnrcol
trunk/media
trunk/SDL_tty
trunk/setup2x
trunk/supertux
trunk/supertux-editor
trunk/supertux-milestone1
trunk/supertux-portable
trunk/supertux-sharp
trunk/wiz-test


Potential Git Issues
====================

* lack of sparse/narrow/shallow checkout, this means initial checkout
  will be 200MB instead of 100MB

* no free hoster that allow multiple >1GB repositories -> could use lethargik.org

* git submodule doesn't seem to be quite ready to replace our
  trunk/supertux, trunk/supertux-editor, trunk/media/, ... layout as
  it for example doesn't support automatic tracking of HEAD from the
  remote repositories, it also feels rather hacky and not properly
  integrated into git

* lack of metadata versioning, if you delete a branch in git that you
  haven't merged, then its gone after the next gc/repack (+ two weeks
  time limit it seems), in SVN on the other side you can checkout the
  way the tree was at a specific date, its impossible to lose history
  unless you hack the repository

svn2bzr.py
==========

Committed revision 5727
Committed revision 5728
Committed revision 5729
Committed revision 5730
Traceback (most recent call last):
  File "./svn2bzr.py", line 194, in <module>
    main()
  File "./svn2bzr.py", line 187, in main
    log=log)
  File "./svn2bzr.py", line 88, in svn2bzr
    creator.run()
  File "/mnt/bzr/svn2bzr/branchcreator.py", line 622, in run
    entries = self.filter_entries(entries)
  File "/mnt/bzr/svn2bzr/branchcreator.py", line 671, in filter_entries
    entries = self.filter_moves(entries)
  File "/mnt/bzr/svn2bzr/branchcreator.py", line 727, in filter_moves
    entries = self.filter_simult_fren_dirmove(entries)
  File "/mnt/bzr/svn2bzr/branchcreator.py", line 784, in filter_simult_fren_dirmove
    newfname = svnrelpath(newdpth, newfpth)
  File "/mnt/bzr/svn2bzr/branchcreator.py", line 60, in svnrelpath
    raise errors.PathNotChild(path, base)
bzrlib.errors.PathNotChild: Path "trunk/media/images/creatures/mr_cherry/cherrybomb.xcf" is not a child of path "trunk/media/images/creatures/mr_bomb"

Random Notes
============

* calculate the size of an background image that should fill the screen:

  image_size = (1 - parallax_speed) * screen_size + level_size * parallax_speed

def calc(parallax, screen, tiles):
    return (1 - parallax) * screen + parallax * tiles * 32


Supported Resolutions
=====================

SuperTux shall support resolutions from 640x480 to 1280x800 at a magnification of 1x.
For resolutions higher, such as 2560x1600, upscaling will be used.
For resolutions smaller, like 320x240 downscaling will be used.

Higher resolution graphics for 2x maginification might be provided.
Lower res graphics for 0.5x maginification might be provided as well.

Resolution and magnification can be freely configured by the user within the given limits.

In tiles this means we have 40x25 (=1280x800px) tiles per screen.

Graphic Tasks
=============

* animate cave background torch: data/images/tiles/background/backgroundtile3.png

* do parallax tiles

* remove lightmap tiles

* redraw/replace data/images/tiles/waterfall/

Music Recode
============

Currently the music makes up a large chunk of the total tarball
size. Compression could fix this:

  ,-- Size of data/music/*.ogg
  V
40MB - Current quality in SVN
24MB - Default oggenc quality (3)
14MB - oggenc at 0 quality
10MB - oggenc at -1 quality

No audible difference on my sound setup. -- grumbel

# EOF #
