* Split systemRandom into graphicsRandom (particles, eye candy, etc.) and gameRandom...
[supertux.git] / TODO
1 SuperTux TODO
2 =============
3
4 This is a list of tasks and issues that might be worth to implement or
5 fix. This list is however not an authorative list of things that must
6 be done, its a collection of random things that pop up during
7 development, therefore not everything in here might be well thought
8 out or worth to implement. Use your brain before implementing anything
9 on this list and always think about how useful a new feature would be
10 in the context of the whole game or if a potential performance
11 enhanchment, actually enhanchmes anything at all.
12
13 Coding Standard Stuff
14 =====================
15
16 * make code clean: "-O2", "-g3",
17                      "-ansi",
18                      "-pedantic",
19                      "-Wall",
20                      "-Wextra",
21                      "-Wnon-virtual-dtor",
22                      "-Weffc++",
23                      "-Wconversion",
24                      "-Werror",
25                      "-Wshadow",
26                      "-Wcast-qual",
27                      "-Winit-self", # only works with >= -O1
28                      "-Wno-unused-parameter",
29
30 * remove overuse of multi-inheritance 
31
32 * remove overuse of friend'ship
33
34 * maybe mark interfaces as interfaces (ISerializable or SerializableInterface)
35
36 * split files with multiple classes into multiple files with one class each
37
38 * Decide what to do with magic constants of objects (static vs anonymous namespace vs lisp property)
39
40 * check the code with Valgrind and profilers
41
42 * use Vector in Physics for 'a' and 'v'
43
44 * replace random generator with mersenne twister and/or move to external/
45
46 * md5.hpp and random_generator.hpp could go to external/
47
48 * write/finish scripts to automatically:
49
50   - make all includes relative to top level dir
51
52   - sort includes (.hpp file, then system includes, then other project files)
53
54   - include guards proper and of the form HEADER_SUPERTUX_${PATH_TO_FILE}_HPP
55
56 TODO
57 ====
58
59 * GameObject::RemoveListenerListEntry: Ughs, somebody trying to
60   implement a list class within in the GameObject?!
61
62 * add --datadir DIR (data/) and --userdir DIR (~/.supertux/)
63
64 * make gravity constant
65
66 * rename Vector -> Vector2f
67
68 * get rid of global SDL_Screen* screen variable
69
70 * get rid of SCREEN_WIDTH/SCREEN_HEIGHT overuse
71
72 * resolution menu entry moves the wrong way around
73
74 * having dictionary_manager in Lisp is extremely ugly
75
76 * enforce proper naming of files to match their class (SomeClass -> some_class.?pp or so)
77
78 * file naming is inconsistent: some times we use '_' to separate
79   words, sometimes we don't
80
81 * collect all manager classes into globals.hpp
82
83 * more moving directories around?
84
85 addon/  
86 audio/  
87 control/
88 gui/    
89 lisp/   
90 math/
91 physfs/ 
92 sprite/ 
93 util/
94 video/
95 squirrel/
96   for generic squirrel code
97 supertux/
98   worldmap/
99   trigger/
100   scripting/
101     for scripting wrapper code
102   badguy/
103   object/
104
105 * implement PNG screenshot
106
107 * having hitbox in Sprite is fugly
108
109 * write decal object that doesn't have hitbox
110
111 * implement surface and/or sprite scaling (MipMaps?)
112
113 * add code that compares the last Log line with the current, if they
114   are the same reject them and just output something like:
115
116   * last line has been repeated X times
117
118 * implement: http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
119
120 * workaround for Ubuntu pulseaudio/OpenAL brokeness:
121
122 $ cat ~/.alsoftrc
123 drivers = oss
124
125 * peaking up/down doesn't work properly
126
127 * peaking left/right should make Tux look into that direction (up/down to, needs new sprites)
128
129 * add pipe graphics that makes a 90 degree turn
130
131 * keep possible future SDL1.3 upgrade in mind (what has changed?)
132
133 * cleanup scripting interface
134
135 * replace cloud tiles with decals
136
137 * option menu has text overlap in "aspect ratio"
138
139 * jumping up from an enemy doesn't make a sound?
140
141 * add support for automatic scrolling backgrounds
142
143 * add direct reading of Vector2f to Reader/lisp
144
145 * replace bell with 'reset block', that starts to glow once bumped
146   into (or something different)
147
148 * refactor Camera code, break ugly long functions into pieces and such
149
150 * allow fully custom magnification levels from command line (maybe GUI
151   to if there is a proper/easy way to let the user enter numbers)
152   (--magnification or -g WIDTHxHEIGHT:ASPECTX:ASPECTY@MAGNIFICATION)
153
154 * use AnchorPoint in Background instead of Alignment
155
156 * allow gradients to parallax scroll like Background (make it optional)
157
158 * add multicolored gradients (see Windstille source code, which can deal with Gimp gradients)
159
160 * fix alpha blending in the SDL renderer, currently all sprites (Tux,
161   etc.) appear transparent
162
163 * position of statistics text on the worldmap doesn't scale properly with resolution it seems
164
165 * gluBuild2DMipmaps leads to blurriness, maybe lack of magic offset
166   (0.375f, 0.375f, 0.0f) or something else
167
168 * font system has blending artifacts at non-1x magnifications, need to
169   have an transparent pixel between letters
170
171 * add a (border #t) flag to fonts, that allows to use fonts which have
172   a 1px transparent border around glyphs, which is needed to get rid
173   of blending artifacts in OpenGL
174
175 * mouse cursor has blend artifact on high magnification
176
177 * shadow font glyphs bleed into other glyphs
178
179 * in DrawingRequest "void* request_data;" is only free'ed, but the
180   destructor never gets called
181
182 * sprite/sprite.cpp: frame should never get out of range:
183
184   if((int)frame >= get_frames() || (int)frame < 0)
185     log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl;
186
187 * Surface::hflip() is used exactly once, should probally be part of the constructor
188 \f
189 Scenegraph and Physics Engine Restructuring
190 ===========================================
191
192 * random idea to restructure engine stuff (might lead to nicer code
193   and easier scriptability (and a need to rewrite lots of stuff...):
194
195 class SomeBadGuy : public PhysicsCallbackListener // or use boost::function
196 {
197 private:
198       PhysicsPtr box;
199       SpritePtr sprite;
200         
201 public:
202       SomeBadGuy(Engine& engine)  
203       {
204          box    = engine.physics().create_box(Rectf(0,0,32,32));
205          box->register_listener(this);
206          sprite = engine.graphics().create_and_add_sprite("Foobar");
207       }
208
209       void update(float delta)
210       {
211          // not much to do, as most stuff is done internally in the engine
212          if (dead)
213          {
214                   sprite->replace_with("Foobar_dead");
215          }
216          else
217          {
218                 sprite->hide();
219                 sprite->set_pos(box->get_pos());
220         }
221       }
222
223       // no more draw(), done by the scene graph
224
225       void on_collision(CollisionData data)
226       {
227         // respond
228       }
229 };
230 \f
231 Subversion->Git/Mercurial/Bzr Move
232 ==================================
233
234 * right now a switch doesn't seem to be worth it
235
236 * core issue right now isn't SVN, but old SVN version on lethargik.org
237   (lacks merge tracking, issues with viewvc)
238
239 * cleanup SVN to make import into other version control systems possible:
240
241  - Should we merge trunk/supertux-milestone1 and trunk/supertux when switching to Git/Hg/...?
242
243 Mistakes: incorrect branch creation: r5201-5207
244
245 tags/start           # unknown
246 tags/supertux        # unknown
247 tags/supertux_0_1_0
248 tags/supertux_0_1_1
249 tags/supertux_0_1_2
250 tags/supertux_0_1_3
251
252 branches/cobble      # unknown
253 branches/milestone1  # unknown
254 branches/new-collision-detection # unknown
255 branches/README      # documentation that will be lost in conversion
256 branches/supertux    # unknown
257 branches/supertux_0_1_1_branch
258 branches/supertux-box2d  # mathnerd (trash)
259 branches/supertux-editor-newdrawing # editor
260 branches/supertux-editor-newdrawing2 # editor
261 branches/supertux-milestone1-olpc    # supertux-milestone1
262 branches/supertux-milestone2-grumbel # supertux
263 branches/supertux-nogl               # supertux(?)
264 branches/supertux-sharp              # another supertux editor
265 branches/unison-video                # ???
266 branches/vendor                      # ??? CVS crap
267
268 trunk/cobble          # some editor?
269 trunk/CVSROOT         # ??? CVS crap
270 trunk/htdocs          # htdocs
271 trunk/jnrcol
272 trunk/media
273 trunk/SDL_tty
274 trunk/setup2x
275 trunk/supertux
276 trunk/supertux-editor
277 trunk/supertux-milestone1
278 trunk/supertux-portable
279 trunk/supertux-sharp
280 trunk/wiz-test
281
282
283 Potential Git Issues
284 ====================
285
286 * lack of sparse/narrow/shallow checkout, this means initial checkout
287   will be 200MB instead of 100MB
288
289 * no free hoster that allow multiple >1GB repositories -> could use lethargik.org
290
291 * git submodule doesn't seem to be quite ready to replace our
292   trunk/supertux, trunk/supertux-editor, trunk/media/, ... layout as
293   it for example doesn't support automatic tracking of HEAD from the
294   remote repositories, it also feels rather hacky and not properly
295   integrated into git
296
297 * lack of metadata versioning, if you delete a branch in git that you
298   haven't merged, then its gone after the next gc/repack (+ two weeks
299   time limit it seems), in SVN on the other side you can checkout the
300   way the tree was at a specific date, its impossible to lose history
301   unless you hack the repository
302
303 svn2bzr.py
304 ==========
305
306 Committed revision 5727
307 Committed revision 5728
308 Committed revision 5729
309 Committed revision 5730
310 Traceback (most recent call last):
311   File "./svn2bzr.py", line 194, in <module>
312     main()
313   File "./svn2bzr.py", line 187, in main
314     log=log)
315   File "./svn2bzr.py", line 88, in svn2bzr
316     creator.run()
317   File "/mnt/bzr/svn2bzr/branchcreator.py", line 622, in run
318     entries = self.filter_entries(entries)
319   File "/mnt/bzr/svn2bzr/branchcreator.py", line 671, in filter_entries
320     entries = self.filter_moves(entries)
321   File "/mnt/bzr/svn2bzr/branchcreator.py", line 727, in filter_moves
322     entries = self.filter_simult_fren_dirmove(entries)
323   File "/mnt/bzr/svn2bzr/branchcreator.py", line 784, in filter_simult_fren_dirmove
324     newfname = svnrelpath(newdpth, newfpth)
325   File "/mnt/bzr/svn2bzr/branchcreator.py", line 60, in svnrelpath
326     raise errors.PathNotChild(path, base)
327 bzrlib.errors.PathNotChild: Path "trunk/media/images/creatures/mr_cherry/cherrybomb.xcf" is not a child of path "trunk/media/images/creatures/mr_bomb"
328 \f
329 Random Notes
330 ============
331
332 * calculate the size of an background image that should fill the screen:
333
334   image_size = (1 - parallax_speed) * screen_size + level_size * parallax_speed
335
336 def calc(parallax, screen, tiles):
337     return (1 - parallax) * screen + parallax * tiles * 32
338
339 \f
340 Supported Resolutions
341 ====================
342
343 SuperTux shall support resolutions from 640x480 to 1280x800 at a magnification of 1x.
344 For resolutions higher, such as 2560x1600, upscaling will be used.
345 For resolutions smaller, like 320x240 downscaling will be used.
346
347 Higher resolution graphics for 2x maginification might be provided.
348 Lower res graphics for 0.5x maginification might be provided as well.
349
350 Resolution and magnification can be freely configured by the user within the given limits.
351
352 In tiles this means we have 40x25 (=1280x800px) tiles per screen.
353
354 # EOF #