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