summaryrefslogtreecommitdiff
path: root/recipes/supertux
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/supertux
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/supertux')
-rw-r--r--recipes/supertux/files/gp2x.patch2614
-rw-r--r--recipes/supertux/files/img-resize.sh28
-rw-r--r--recipes/supertux/files/supertux-smallsize-data.tar.bz2bin0 -> 41782 bytes
-rw-r--r--recipes/supertux/files/supertux.desktop20
-rw-r--r--recipes/supertux/files/supertux.pngbin0 -> 4097 bytes
-rw-r--r--recipes/supertux/supertux-qvga_0.1.3.bb57
-rw-r--r--recipes/supertux/supertux_0.1.2.bb18
-rw-r--r--recipes/supertux/supertux_0.1.3.bb22
8 files changed, 2759 insertions, 0 deletions
diff --git a/recipes/supertux/files/gp2x.patch b/recipes/supertux/files/gp2x.patch
new file mode 100644
index 0000000000..9d5d9a6d02
--- /dev/null
+++ b/recipes/supertux/files/gp2x.patch
@@ -0,0 +1,2614 @@
+Only in supertux-0.1.3: aclocal.m4
+diff -ur supertux-0.1.3/AUTHORS supertux-0.1.3-gp2x/AUTHORS
+--- supertux-0.1.3/AUTHORS 2005-07-02 14:37:30.000000000 +0300
++++ supertux-0.1.3-gp2x/AUTHORS 2006-04-13 06:11:02.000000000 +0300
+@@ -91,6 +91,12 @@
+
+ Royalty free CDROMs and FTP sites sounds
+
++Port to GP2X
++-----------
++ Ingo Arndt
++ scachi@gmx.de
++ http://www.bitmage.de
++
+ More information and contacts
+ =============================
+
+Only in supertux-0.1.3: autom4te.cache
+Only in supertux-0.1.3-gp2x: autoscan.log
+Only in supertux-0.1.3-gp2x: COMPILE4GP2X
+Only in supertux-0.1.3: config.guess
+Only in supertux-0.1.3: config.log
+Only in supertux-0.1.3: config.status
+Only in supertux-0.1.3: config.sub
+Only in supertux-0.1.3: configure
+diff -ur supertux-0.1.3/configure.ac supertux-0.1.3-gp2x/configure.ac
+--- supertux-0.1.3/configure.ac 2005-07-06 12:26:15.000000000 +0300
++++ supertux-0.1.3-gp2x/configure.ac 2006-04-19 22:29:05.000000000 +0300
+@@ -76,13 +76,33 @@
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+
++AM_PATH_LIBMIKMOD(,
++ :,
++ AC_MSG_ERROR([*** mikmod not found!]))
++CXXFLAGS="$CXXFLAGS $LIBMIKMOD_CFLAGS"
++CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS"
++LIBS="$LIBS $LIBMIKMOD_LIBS"
++
+ dnl Checks for additional libraries.
++AC_CHECK_LIB(smpeg, SMPEG_status)
++
++AC_CHECK_LIB(mikmod, MikMod_Init)
++
+ AC_CHECK_LIB(SDL_mixer, Mix_OpenAudio,,
+ AC_MSG_ERROR([SDL_mixer library required]))
+
++AC_CHECK_LIB(jpeg,jpeg_abort)
++
++AC_CHECK_LIB(z,compress)
++
++AC_CHECK_LIB(png,png_free)
++
+ AC_CHECK_LIB(SDL_image, IMG_Load,,
+ AC_MSG_ERROR([SDL_image library required]))
+
++AC_CHECK_LIB(SDL_gfx, rotozoomSurface,,
++ AC_MSG_ERROR([SDL_gfx library required]))
++
+ if test "x${enable_opengl}" != "xno"; then
+ AX_CHECK_GL
+ fi
+@@ -95,7 +115,30 @@
+ LIBS="$LIBS $GL_LIBS"
+ fi
+
+-AC_CHECK_LIB(z, gzopen,, AC_MSG_ERROR([*** zlib is missing]))
++# compile for the testing the 320x240 resolution
++# compile for the gp2x
++AC_ARG_ENABLE(gp2x,
++[ --enable-gp2x Build the gp2x version [default=no]],
++ , enable_gp2x=no)
++if test x$enable_gp2x = xyes; then
++ CXXFLAGS="$CXXFLAGS -DGP2X"
++fi
++
++AC_ARG_ENABLE(320x240,
++[ --enable-320x240 Test the 320x240 resolution [default=no]],
++ , enable_320x240=no)
++if test x$enable_320x240 = xyes; then
++ CXXFLAGS="$CXXFLAGS -DRES320X240"
++fi
++
++# compile static
++AC_ARG_ENABLE(static,
++[ --enable-static Build the static version [default=no]],
++ , enable_static=no)
++if test x$enable_static = xyes; then
++ CXXFLAGS="$CXXFLAGS -static"
++fi
++
+
+ CXXFLAGS="$CXXFLAGS -DDATA_PREFIX='\"$datadir/supertux\"'"
+
+@@ -110,6 +153,9 @@
+ echo " Profile Mode: $enable_gprof"
+ echo " Debug Mode: $enable_debug"
+ echo " OpenGL Support: $enable_opengl"
++echo " 320x240 Resolution: $enable_320x240"
++echo " GP2X Build (+320x240): $enable_gp2x"
++echo " Static Build: $enable_static"
+ echo ""
+
+ # EOF #
+Only in supertux-0.1.3/data: CREDITS
+Only in supertux-0.1.3/data: extro-bonus2.txt
+Only in supertux-0.1.3/data: extro-bonus.txt
+Only in supertux-0.1.3/data: extro.txt
+Only in supertux-0.1.3/data: images
+Only in supertux-0.1.3/data: intro.txt
+Only in supertux-0.1.3/data: levels
+Only in supertux-0.1.3/data: Makefile
+Only in supertux-0.1.3/data: Makefile.in
+Only in supertux-0.1.3/data: music
+Only in supertux-0.1.3/data: sounds
+Only in supertux-0.1.3/data: supertux.strf
+Only in supertux-0.1.3: depcomp
+Only in supertux-0.1.3: install-sh
+Only in supertux-0.1.3: m4
+Only in supertux-0.1.3: Makefile
+Only in supertux-0.1.3: Makefile.in
+Only in supertux-0.1.3: missing
+Only in supertux-0.1.3: mkinstalldirs
+Only in supertux-0.1.3: patches
+diff -ur supertux-0.1.3/src/badguy.cpp supertux-0.1.3-gp2x/src/badguy.cpp
+--- supertux-0.1.3/src/badguy.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/badguy.cpp 2006-04-20 21:32:23.000000000 +0300
+@@ -250,7 +250,11 @@
+ tux.kick_timer.start(KICKING_TIME);
+ set_sprite(img_mriceblock_flat_left, img_mriceblock_flat_right);
+ physic.set_velocity_x((dir == LEFT) ? -3.5 : 3.5);
++#ifndef GP2X
+ play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_KICK);
++#endif
+ }
+ }
+
+@@ -260,6 +264,7 @@
+ check_horizontal_bump();
+ if(mode == KICK && changed != dir)
+ {
++#ifndef GP2X
+ /* handle stereo sound (number 10 should be tweaked...)*/
+ if (base.x < scroll_x + screen->w/2 - 10)
+ play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
+@@ -267,6 +272,9 @@
+ play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
+ else
+ play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_RICOCHET);
++#endif
+ }
+ }
+
+@@ -455,11 +463,15 @@
+
+ /* play explosion sound */ // FIXME: is the stereo all right? maybe we should use player cordinates...
+ if (base.x < scroll_x + screen->w/2 - 10)
++#ifndef GP2X
+ play_sound(sounds[SND_EXPLODE], SOUND_LEFT_SPEAKER);
+ else if (base.x > scroll_x + screen->w/2 + 10)
+ play_sound(sounds[SND_EXPLODE], SOUND_RIGHT_SPEAKER);
+ else
+ play_sound(sounds[SND_EXPLODE], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_EXPLODE);
++#endif
+
+ } else if(mode == BOMB_EXPLODE) {
+ remove_me();
+@@ -677,13 +689,21 @@
+ }
+
+ // BadGuy fall below the ground
++#ifndef RES320X240
+ if (base.y > screen->h) {
++#else
++ if (base.y > 640) {
++#endif
+ remove_me();
+ return;
+ }
+
+ // Once it's on screen, it's activated!
++#ifndef RES320X240
+ if (base.x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
++#else
++ if (base.x <= scroll_x + 640 + OFFSCREEN_DISTANCE)
++#endif
+ seen = true;
+
+ if(!seen)
+@@ -743,7 +763,11 @@
+ BadGuy::draw()
+ {
+ // Don't try to draw stuff that is outside of the screen
++#ifndef RES320X240
+ if(base.x <= scroll_x - base.width || base.x >= scroll_x + screen->w)
++#else
++ if(base.x <= scroll_x - base.width || base.x >= scroll_x + 640)
++#endif
+ return;
+
+ if(sprite_left == 0 || sprite_right == 0)
+@@ -811,7 +835,11 @@
+
+ World::current()->add_score(base.x - scroll_x,
+ base.y, 50 * player_status.score_multiplier);
++#ifndef GP2X
+ play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_SQUISH);
++#endif
+ player_status.score_multiplier++;
+
+ dying = DYING_SQUISHED;
+@@ -830,7 +858,11 @@
+
+ player->jump_of_badguy(this);
+ World::current()->add_score(base.x - scroll_x, base.y, 50 * player_status.score_multiplier);
++#ifndef GP2X
+ play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_SQUISH);
++#endif
+ player_status.score_multiplier++;
+ remove_me();
+ return;
+@@ -839,7 +871,11 @@
+ if (mode == NORMAL || mode == KICK)
+ {
+ /* Flatten! */
++#ifndef GP2X
+ play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_STOMP);
++#endif
+ mode = FLAT;
+ set_sprite(img_mriceblock_flat_left, img_mriceblock_flat_right);
+ physic.set_velocity_x(0);
+@@ -847,7 +883,11 @@
+ timer.start(4000);
+ } else if (mode == FLAT) {
+ /* Kick! */
++#ifndef GP2X
+ play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_KICK);
++#endif
+
+ if (player->base.x < base.x + (base.width/2)) {
+ physic.set_velocity_x(5);
+@@ -925,7 +965,11 @@
+ score * player_status.score_multiplier);
+
+ /* Play death sound: */
++#ifndef GP2X
+ play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_FALL);
++#endif
+ }
+
+ void BadGuy::explode(BadGuy *badguy)
+@@ -1053,7 +1097,11 @@
+ /* Get kicked if were flat */
+ if (mode == FLAT && !dying)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_KICK);
++#endif
+
+ // Hit from left side
+ if (player->base.x < base.x) {
+diff -ur supertux-0.1.3/src/configfile.cpp supertux-0.1.3-gp2x/src/configfile.cpp
+--- supertux-0.1.3/src/configfile.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/configfile.cpp 2006-04-10 13:32:19.000000000 +0300
+@@ -92,12 +92,22 @@
+ else
+ use_joystick = true;
+
++#ifndef GP2X
+ reader.read_int ("joystick-x", &joystick_keymap.x_axis);
+ reader.read_int ("joystick-y", &joystick_keymap.y_axis);
+ reader.read_int ("joystick-a", &joystick_keymap.a_button);
+ reader.read_int ("joystick-b", &joystick_keymap.b_button);
+ reader.read_int ("joystick-start", &joystick_keymap.start_button);
+ reader.read_int ("joystick-deadzone", &joystick_keymap.dead_zone);
++#else
++ reader.read_int ("joystick-up", &joystick_keymap.up_button);
++ reader.read_int ("joystick-down", &joystick_keymap.down_button);
++ reader.read_int ("joystick-right", &joystick_keymap.right_button);
++ reader.read_int ("joystick-left", &joystick_keymap.left_button);
++ reader.read_int ("joystick-a", &joystick_keymap.a_button);
++ reader.read_int ("joystick-b", &joystick_keymap.b_button);
++ reader.read_int ("joystick-start", &joystick_keymap.start_button);
++#endif
+
+ reader.read_int ("keyboard-jump", &keymap.jump);
+ reader.read_int ("keyboard-duck", &keymap.duck);
+@@ -130,12 +140,22 @@
+ fprintf(config, "\n\t;; joystick number (-1 means no joystick):\n");
+ fprintf(config, "\t(joystick %d)\n", use_joystick ? joystick_num : -1);
+
++#ifndef GP2X
+ fprintf(config, "\t(joystick-x %d)\n", joystick_keymap.x_axis);
+ fprintf(config, "\t(joystick-y %d)\n", joystick_keymap.y_axis);
+ fprintf(config, "\t(joystick-a %d)\n", joystick_keymap.a_button);
+ fprintf(config, "\t(joystick-b %d)\n", joystick_keymap.b_button);
+ fprintf(config, "\t(joystick-start %d)\n", joystick_keymap.start_button);
+ fprintf(config, "\t(joystick-deadzone %d)\n", joystick_keymap.dead_zone);
++#else
++ fprintf(config, "\t(joystick-up %d)\n", joystick_keymap.up_button);
++ fprintf(config, "\t(joystick-down %d)\n", joystick_keymap.down_button);
++ fprintf(config, "\t(joystick-right %d)\n", joystick_keymap.right_button);
++ fprintf(config, "\t(joystick-left %d)\n", joystick_keymap.left_button);
++ fprintf(config, "\t(joystick-a %d)\n", joystick_keymap.a_button);
++ fprintf(config, "\t(joystick-b %d)\n", joystick_keymap.b_button);
++ fprintf(config, "\t(joystick-start %d)\n", joystick_keymap.start_button);
++#endif
+
+ fprintf(config, "\t(keyboard-jump %d)\n", keymap.jump);
+ fprintf(config, "\t(keyboard-duck %d)\n", keymap.duck);
+diff -ur supertux-0.1.3/src/defines.h supertux-0.1.3-gp2x/src/defines.h
+--- supertux-0.1.3/src/defines.h 2005-07-07 02:05:03.000000000 +0300
++++ supertux-0.1.3-gp2x/src/defines.h 2006-04-11 22:02:05.000000000 +0300
+@@ -91,7 +91,11 @@
+
+ /* Scrolling text speed */
+
++#ifndef RES320X240
+ #define SCROLL_SPEED_CREDITS 1.2
++#else
++#define SCROLL_SPEED_CREDITS 2.4
++#endif
+ #define SCROLL_SPEED_MESSAGE 1.0
+
+ /* Debugging */
+Only in supertux-0.1.3/src: .deps
+diff -ur supertux-0.1.3/src/gameloop.cpp supertux-0.1.3-gp2x/src/gameloop.cpp
+--- supertux-0.1.3/src/gameloop.cpp 2005-07-02 15:16:08.000000000 +0300
++++ supertux-0.1.3-gp2x/src/gameloop.cpp 2006-05-05 23:22:58.000000000 +0300
+@@ -288,6 +288,7 @@
+
+ switch(event.type)
+ {
++#ifndef GP2X
+ case SDL_QUIT: /* Quit event - quit: */
+ st_abort("Received window close", "");
+ break;
+@@ -434,22 +435,60 @@
+ tux.input.down = UP;
+ }
+ break;
+-
++#endif
+ case SDL_JOYBUTTONDOWN:
++#ifndef GP2X
++ if (event.jbutton.button == joystick_keymap.a_button)
++ tux.input.up = DOWN;
++ else if (event.jbutton.button == joystick_keymap.b_button)
++ tux.input.fire = DOWN;
++ else if (event.jbutton.button == joystick_keymap.start_button)
++ on_escape_press();
++ break;
++#else
+ if (event.jbutton.button == joystick_keymap.a_button)
+ tux.input.up = DOWN;
+ else if (event.jbutton.button == joystick_keymap.b_button)
+ tux.input.fire = DOWN;
+ else if (event.jbutton.button == joystick_keymap.start_button)
+ on_escape_press();
++ else if (event.jbutton.button == joystick_keymap.up_button)
++ tux.input.up = DOWN;
++ else if (event.jbutton.button == joystick_keymap.down_button)
++ tux.input.down = DOWN;
++ else if (event.jbutton.button == joystick_keymap.right_button)
++ tux.input.right = DOWN;
++ else if (event.jbutton.button == joystick_keymap.left_button)
++ tux.input.left = DOWN;
++ else if (event.jbutton.button == joystick_keymap.voldown_button)
++ decreaseSoundVolume();
++ else if (event.jbutton.button == joystick_keymap.volup_button)
++ increaseSoundVolume();
+ break;
++#endif
++
+ case SDL_JOYBUTTONUP:
++#ifndef GP2X
+ if (event.jbutton.button == joystick_keymap.a_button)
+ tux.input.up = UP;
+ else if (event.jbutton.button == joystick_keymap.b_button)
+ tux.input.fire = UP;
+ break;
+-
++#else
++ if (event.jbutton.button == joystick_keymap.a_button)
++ tux.input.up = UP;
++ else if (event.jbutton.button == joystick_keymap.b_button)
++ tux.input.fire = UP;
++ else if (event.jbutton.button == joystick_keymap.up_button)
++ tux.input.up = UP;
++ else if (event.jbutton.button == joystick_keymap.down_button)
++ tux.input.down = UP;
++ else if (event.jbutton.button == joystick_keymap.right_button)
++ tux.input.right = UP;
++ else if (event.jbutton.button == joystick_keymap.left_button)
++ tux.input.left = UP;
++ break;
++#endif
+ default:
+ break;
+ } /* switch */
+@@ -464,7 +503,7 @@
+ Player* tux = world->get_tux();
+
+ /* End of level? */
+- int endpos = (World::current()->get_level()->width-5) * 32;
++ int endpos = (World::current()->get_level()->width-5) * (32);
+ Tile* endtile = collision_goal(tux->base);
+
+ // fallback in case the other endpositions don't trigger
+@@ -545,7 +584,7 @@
+ Menu::current()->draw();
+ mouse_cursor->draw();
+ }
+-
++ //updateSound();
+ updatescreen();
+ }
+
+@@ -599,6 +638,7 @@
+
+ while (exit_status == ES_NONE)
+ {
++ SDL_Delay(10);
+ /* Calculate the movement-factor */
+ double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
+
+@@ -686,6 +726,7 @@
+ fps_cnt = 0;
+ }
+ }
++ //updateSound();
+ }
+
+ return exit_status;
+@@ -694,21 +735,32 @@
+ /* Bounce a brick: */
+ void bumpbrick(float x, float y)
+ {
+- World::current()->add_bouncy_brick(((int)(x + 1) / 32) * 32,
+- (int)(y / 32) * 32);
++ World::current()->add_bouncy_brick(((int)(x + 1) / (32)) * (32),
++ (int)(y / (32)) * (32));
+
++#ifndef GP2X
+ play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_BRICK);
++#endif
+ }
+
+ /* (Status): */
+ void
+ GameSession::drawstatus()
+ {
++ int xdiv;
++#ifdef RES320X240
++ xdiv=2;
++#else
++ xdiv=1;
++#endif
++
+ char str[60];
+
+ sprintf(str, "%d", player_status.score);
+ white_text->draw("SCORE", 0, 0, 1);
+- gold_text->draw(str, 96, 0, 1);
++ gold_text->draw(str, 96/xdiv, 0, 1);
+
+ if(st_gl_mode == ST_GL_TEST)
+ {
+@@ -716,28 +768,33 @@
+ }
+
+ if(!time_left.check()) {
+- white_text->draw("TIME'S UP", 224, 0, 1);
++ white_text->draw("TIME'S UP", 224/xdiv, 0, 1);
+ } else if (time_left.get_left() > TIME_WARNING || (global_frame_counter % 10) < 5) {
+ sprintf(str, "%d", time_left.get_left() / 1000 );
+- white_text->draw("TIME", 224, 0, 1);
+- gold_text->draw(str, 304, 0, 1);
++ white_text->draw("TIME", 224/xdiv, 0, 1);
++ gold_text->draw(str, 304/xdiv, 0, 1);
+ }
+
+ sprintf(str, "%d", player_status.distros);
+ white_text->draw("COINS", screen->h, 0, 1);
+- gold_text->draw(str, 608, 0, 1);
++ gold_text->draw(str, 608/xdiv, 0, 1);
+
+- white_text->draw("LIVES", 480, 20);
++ white_text->draw("LIVES", 480/xdiv, 20);
+ if (player_status.lives >= 5)
+ {
+ sprintf(str, "%dx", player_status.lives);
++#ifdef RES320X240
++ gold_text->draw_align(str, 617/xdiv-5, 20, A_RIGHT, A_TOP);
++ tux_life->draw(565+(18*3)/xdiv+10, 20);
++#else
+ gold_text->draw_align(str, 617, 20, A_RIGHT, A_TOP);
+ tux_life->draw(565+(18*3), 20);
++#endif
+ }
+ else
+ {
+ for(int i= 0; i < player_status.lives; ++i)
+- tux_life->draw(565+(18*i),20);
++ tux_life->draw(565+(18*i)/xdiv,20);
+ }
+
+ if(show_fps)
+@@ -746,6 +803,7 @@
+ white_text->draw("FPS", screen->h, 40, 1);
+ gold_text->draw(str, screen->h + 60, 40, 1);
+ }
++// updateSound();
+ }
+
+ void
+@@ -824,4 +882,3 @@
+ return tmp;
+ }
+
+-
+diff -ur supertux-0.1.3/src/gameobjs.cpp supertux-0.1.3-gp2x/src/gameobjs.cpp
+--- supertux-0.1.3/src/gameobjs.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/gameobjs.cpp 2006-04-11 21:52:52.000000000 +0300
+@@ -98,6 +98,9 @@
+ src.h = 16;
+
+ dest.x = (int)(base.x - scroll_x);
++#ifdef RES320X240
++ dest.x=dest.x/2;
++#endif
+ dest.y = (int)base.y;
+ dest.w = 16;
+ dest.h = 16;
+@@ -143,8 +146,13 @@
+ {
+ SDL_Rect dest;
+
++#ifndef RES320X240
+ if (base.x >= scroll_x - 32 &&
+ base.x <= scroll_x + screen->w)
++#else
++ if (base.x >= scroll_x - 32 &&
++ base.x <= scroll_x + 640)
++#endif
+ {
+ dest.x = (int)(base.x - scroll_x);
+ dest.y = (int)base.y;
+@@ -165,8 +173,14 @@
+ else
+ {
+ int s = ((int)scroll_x / 2)%640;
++
++#ifdef RES320X240
++ plevel->img_bkgd->draw_part(dest.x/2 + s/2, dest.y/2,
++ dest.x/2, dest.y,dest.w/2,dest.h/2);
++#else
+ plevel->img_bkgd->draw_part(dest.x + s, dest.y,
+ dest.x, dest.y,dest.w,dest.h);
++#endif
+ }
+
+ Tile::draw(base.x - scroll_x,
+diff -ur supertux-0.1.3/src/globals.cpp supertux-0.1.3-gp2x/src/globals.cpp
+--- supertux-0.1.3/src/globals.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/globals.cpp 2006-04-11 22:39:03.000000000 +0300
+@@ -25,6 +25,7 @@
+
+ JoystickKeymap::JoystickKeymap()
+ {
++#ifndef GP2X
+ a_button = 0;
+ b_button = 1;
+ start_button = 2;
+@@ -33,6 +34,17 @@
+ y_axis = 1;
+
+ dead_zone = 4096;
++#else
++ a_button = GP2X_BUTTON_A;
++ b_button = GP2X_BUTTON_X;
++ start_button = GP2X_BUTTON_START;
++ up_button = GP2X_BUTTON_UP;
++ down_button = GP2X_BUTTON_DOWN;
++ left_button = GP2X_BUTTON_LEFT;
++ right_button = GP2X_BUTTON_RIGHT;
++ volup_button = GP2X_BUTTON_VOLUP;
++ voldown_button = GP2X_BUTTON_VOLDOWN;
++#endif
+ }
+
+ JoystickKeymap joystick_keymap;
+diff -ur supertux-0.1.3/src/globals.h supertux-0.1.3-gp2x/src/globals.h
+--- supertux-0.1.3/src/globals.h 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/globals.h 2006-04-11 23:45:27.000000000 +0300
+@@ -28,10 +28,33 @@
+ #include "menu.h"
+ #include "mousecursor.h"
+
++#ifdef GP2X
++#define GP2X_BUTTON_UP (0)
++#define GP2X_BUTTON_DOWN (4)
++#define GP2X_BUTTON_LEFT (2)
++#define GP2X_BUTTON_RIGHT (6)
++#define GP2X_BUTTON_UPLEFT (1)
++#define GP2X_BUTTON_UPRIGHT (7)
++#define GP2X_BUTTON_DOWNLEFT (3)
++#define GP2X_BUTTON_DOWNRIGHT (5)
++#define GP2X_BUTTON_CLICK (18)
++#define GP2X_BUTTON_A (12)
++#define GP2X_BUTTON_B (13)
++#define GP2X_BUTTON_X (15)
++#define GP2X_BUTTON_Y (14)
++#define GP2X_BUTTON_L (10)
++#define GP2X_BUTTON_R (11)
++#define GP2X_BUTTON_START (8)
++#define GP2X_BUTTON_SELECT (9)
++#define GP2X_BUTTON_VOLUP (16)
++#define GP2X_BUTTON_VOLDOWN (17)
++#endif
++
+ extern std::string datadir;
+
+ struct JoystickKeymap
+ {
++#ifndef GP2X
+ int a_button;
+ int b_button;
+ int start_button;
+@@ -42,6 +65,19 @@
+ int dead_zone;
+
+ JoystickKeymap();
++#else
++ int a_button;
++ int b_button;
++ int start_button;
++ int up_button;
++ int down_button;
++ int left_button;
++ int right_button;
++ int volup_button;
++ int voldown_button;
++
++ JoystickKeymap();
++#endif
+ };
+
+ extern JoystickKeymap joystick_keymap;
+diff -ur supertux-0.1.3/src/lispreader.h supertux-0.1.3-gp2x/src/lispreader.h
+Only in supertux-0.1.3/src: Makefile
+diff -ur supertux-0.1.3/src/Makefile.am supertux-0.1.3-gp2x/src/Makefile.am
+--- supertux-0.1.3/src/Makefile.am 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/Makefile.am 2006-04-19 21:55:54.000000000 +0300
+@@ -77,3 +77,5 @@
+ musicref.h
+
+ # EOF #
++
++#supertux_LDADD = libmikmod
+Only in supertux-0.1.3/src: Makefile.in
+diff -ur supertux-0.1.3/src/menu.cpp supertux-0.1.3-gp2x/src/menu.cpp
+--- supertux-0.1.3/src/menu.cpp 2005-06-29 15:44:13.000000000 +0300
++++ supertux-0.1.3-gp2x/src/menu.cpp 2006-05-04 23:59:29.000000000 +0300
+@@ -53,6 +53,8 @@
+ Menu* options_menu = 0;
+ Menu* options_keys_menu = 0;
+ Menu* options_joystick_menu = 0;
++Menu* options_joystick_axis_menu = 0;
++Menu* options_joystick_button_menu = 0;
+ Menu* highscore_menu = 0;
+ Menu* load_game_menu = 0;
+ Menu* save_game_menu = 0;
+@@ -240,8 +242,10 @@
+ }
+
+ /* Set ControlField a key */
++//TODO: get joystick in here somehow
+ void Menu::get_controlfield_key_into_input(MenuItem *item)
+ {
++#ifndef GP2X
+ switch(*item->int_p)
+ {
+ case SDLK_UP:
+@@ -288,6 +292,11 @@
+ }
+ break;
+ }
++#else
++ char tmp[64];
++ snprintf(tmp, 64, "%d", *item->int_p);
++ item->change_input(tmp);
++#endif
+ }
+
+ /* Free a menu and all its items */
+@@ -497,8 +506,13 @@
+ int menu_height)
+ {
+ MenuItem& pitem = item[index];
+-
++
++#ifndef RES320X240
+ int font_width = 16;
++#else
++ int font_width = 16/2;
++#endif
++
+ int effect_offset = 0;
+ {
+ int effect_time = 0;
+@@ -510,7 +524,7 @@
+ }
+
+ int x_pos = pos_x;
+- int y_pos = pos_y + 24*index - menu_height/2 + 12 + effect_offset;
++ int y_pos = pos_y + (int)(24)*index - menu_height/2 + 12 + effect_offset;
+ int shadow_size = 2;
+ int text_width = strlen(pitem.text) * font_width;
+ int input_width = (strlen(pitem.input)+ 1) * font_width;
+@@ -518,7 +532,7 @@
+ Text* text_font = white_text;
+
+ if (arrange_left)
+- x_pos += 24 - menu_width/2 + (text_width + input_width + list_width)/2;
++ x_pos += (int)(24) - menu_width/2 + (text_width + input_width + list_width)/2;
+
+ if(index == active_item)
+ {
+@@ -538,7 +552,11 @@
+
+ case MN_HL:
+ {
++#ifndef RES320X240
+ int x = pos_x - menu_width/2;
++#else
++ int x = pos_x - menu_width/4;
++#endif
+ int y = y_pos - 12 - effect_offset;
+ /* Draw a horizontal line with a little 3d effect */
+ fillrect(x, y + 6,
+@@ -551,9 +569,15 @@
+ }
+ case MN_LABEL:
+ {
++#ifndef RES320X240
+ white_big_text->draw_align(pitem.text,
+ x_pos, y_pos,
+ A_HMIDDLE, A_VMIDDLE, 2);
++#else
++ white_text->draw_align(pitem.text,
++ x_pos, y_pos,
++ A_HMIDDLE, A_VMIDDLE, 2);
++#endif
+ break;
+ }
+ case MN_TEXTFIELD:
+@@ -570,8 +594,9 @@
+ input_width + font_width, 18,
+ 0,0,0,128);
+
+- if(pitem.kind == MN_CONTROLFIELD)
++ if(pitem.kind == MN_CONTROLFIELD) {
+ get_controlfield_key_into_input(&pitem);
++ }
+
+ if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD)
+ {
+@@ -663,7 +688,7 @@
+ menu_width += 2;
+ }
+ }
+-
++
+ return (menu_width * 16 + 24);
+ }
+
+@@ -680,10 +705,17 @@
+ int menu_width = get_width();
+
+ /* Draw a transparent background */
++#ifndef RES320X240
+ fillrect(pos_x - menu_width/2,
+ pos_y - 24*item.size()/2 - 10,
+ menu_width,menu_height + 20,
+ 150,180,200,125);
++#else
++ fillrect(pos_x - menu_width/4,
++ pos_y - 24*item.size()/2 - 10,
++ menu_width,menu_height + 20,
++ 150,180,200,125);
++#endif
+
+ for(unsigned int i = 0; i < item.size(); ++i)
+ {
+@@ -723,6 +755,8 @@
+ SDLKey key;
+ switch(event.type)
+ {
++
++#ifndef GP2X
+ case SDL_KEYDOWN:
+ key = event.key.keysym.sym;
+ SDLMod keymod;
+@@ -754,7 +788,6 @@
+ return;
+ }
+
+-
+ switch(key)
+ {
+ case SDLK_UP: /* Menu Up */
+@@ -800,12 +833,14 @@
+ break;
+ }
+ break;
++
+ case SDL_JOYHATMOTION:
+ if(event.jhat.value == SDL_HAT_UP)
+ menuaction = MENU_ACTION_UP;
+ if(event.jhat.value == SDL_HAT_DOWN)
+ menuaction = MENU_ACTION_DOWN;
+ break;
++
+ case SDL_JOYAXISMOTION:
+ if(event.jaxis.axis == joystick_keymap.y_axis)
+ {
+@@ -815,9 +850,88 @@
+ menuaction = MENU_ACTION_UP;
+ }
+ break;
++#endif
++
+ case SDL_JOYBUTTONDOWN:
++#ifndef GP2X
+ menuaction = MENU_ACTION_HIT;
+ break;
++#else
++
++ if(item[active_item].kind == MN_CONTROLFIELD)
++ {
++ if( event.jbutton.button == joystick_keymap.start_button )
++ {
++ Menu::pop_current();
++ return;
++ }
++
++ static int save[8]={-1,-1,-1,-1,-1,-1,-1,-1};
++ int itemid=get_active_item_id();
++ int inputkey;
++ switch ( itemid ) {
++ case 11 : inputkey=joystick_keymap.up_button;
++ break;
++ case 12 : inputkey=joystick_keymap.down_button;
++ break;
++ case 13 : inputkey=joystick_keymap.left_button;
++ break;
++ case 14 : inputkey=joystick_keymap.right_button;
++ break;
++ case 15 : inputkey=joystick_keymap.a_button;
++ break;
++ case 16 : inputkey=joystick_keymap.b_button;
++ break;
++ default : break;
++ }
++
++ *item[active_item].int_p = event.jbutton.button;
++
++ bool okay=true;
++
++ save[itemid-11]=event.jbutton.button;
++
++ int i;
++ for ( i=0;i<itemid-11;i++ ) {
++ if ( save[i] == event.jbutton.button ) okay=false;
++ }
++ if ( okay == true ) menuaction = MENU_ACTION_DOWN;
++ else menuaction = MENU_ACTION_NONE;
++
++ return;
++ }
++
++ if (event.jbutton.button == joystick_keymap.a_button)
++ menuaction = MENU_ACTION_HIT;
++ else if (event.jbutton.button == joystick_keymap.b_button)
++ menuaction = MENU_ACTION_HIT;
++ else if (event.jbutton.button == joystick_keymap.start_button)
++ menuaction = MENU_ACTION_HIT;
++ else if (event.jbutton.button == joystick_keymap.up_button)
++ menuaction = MENU_ACTION_UP;
++ else if (event.jbutton.button == joystick_keymap.down_button)
++ menuaction = MENU_ACTION_DOWN;
++ else if (event.jbutton.button == joystick_keymap.right_button)
++ menuaction = MENU_ACTION_RIGHT;
++ else if (event.jbutton.button == joystick_keymap.left_button)
++ menuaction = MENU_ACTION_LEFT;
++ else if (event.jbutton.button == joystick_keymap.volup_button)
++#ifdef GP2X
++ increaseSoundVolume();
++#else
++ sound_volume(2);
++#endif
++ else if (event.jbutton.button == joystick_keymap.voldown_button)
++#ifdef GP2X
++ decreaseSoundVolume();
++#else
++ sound_volume(1);
++#endif
++ break;
++
++#endif
++
++#ifndef GP2X
+ case SDL_MOUSEBUTTONDOWN:
+ x = event.motion.x;
+ y = event.motion.y;
+@@ -847,6 +961,7 @@
+ break;
+ default:
+ break;
++#endif
+ }
+ }
+
+diff -ur supertux-0.1.3/src/menu.h supertux-0.1.3-gp2x/src/menu.h
+--- supertux-0.1.3/src/menu.h 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/menu.h 2006-05-04 23:48:30.000000000 +0300
+@@ -236,6 +236,8 @@
+ extern Menu* options_menu;
+ extern Menu* options_keys_menu;
+ extern Menu* options_joystick_menu;
++extern Menu* options_joystick_axis_menu;
++extern Menu* options_joystick_button_menu;
+ extern Menu* highscore_menu;
+ extern Menu* load_game_menu;
+ extern Menu* save_game_menu;
+diff -ur supertux-0.1.3/src/music_manager.cpp supertux-0.1.3-gp2x/src/music_manager.cpp
+--- supertux-0.1.3/src/music_manager.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/music_manager.cpp 2006-04-22 13:16:32.000000000 +0300
+@@ -59,7 +59,14 @@
+ return true;
+ }
+
++#ifndef GP2X
+ Mix_Music* song = Mix_LoadMUS(file.c_str());
++#else
++ char mfile[100];
++ snprintf(mfile,sizeof(mfile),"%s",file.c_str());
++ MODULE *song=Player_Load(mfile, 64, 0);
++#endif
++
+ if(song == 0)
+ return false;
+
+@@ -84,6 +91,8 @@
+ void
+ MusicManager::play_music(const MusicRef& musicref, int loops)
+ {
++// printf("loop: %d, musicref: %d\n",loops,musicref.music);
++
+ if(!audio_device)
+ return;
+
+@@ -97,7 +106,16 @@
+ current_music->refcount++;
+
+ if(music_enabled)
++#ifndef GP2X
+ Mix_PlayMusic(current_music->music, loops);
++#else
++ {
++ if ( loops == -1 ) current_music->music->wrap=1;
++ Player_Stop();
++ Player_Start(current_music->music);
++ Player_SetPosition(0);
++ }
++#endif
+ }
+
+ void
+@@ -106,13 +124,17 @@
+ if(!audio_device)
+ return;
+
++#ifndef GP2X
+ Mix_HaltMusic();
++#else
++ Player_Stop();
++#endif
+
+ if(current_music) {
+ current_music->refcount--;
+ if(current_music->refcount == 0)
+ free_music(current_music);
+- current_music = 0;
++ current_music = 0;
+ }
+ }
+
+@@ -127,9 +149,17 @@
+
+ music_enabled = enable;
+ if(music_enabled == false) {
++#ifndef GP2X
+ Mix_HaltMusic();
++#else
++ Player_Stop();
++#endif
+ } else {
++#ifndef GP2X
+ Mix_PlayMusic(current_music->music, -1);
++#else
++ Player_Start(current_music->music);
++#endif
+ }
+ }
+
+diff -ur supertux-0.1.3/src/music_manager.h supertux-0.1.3-gp2x/src/music_manager.h
+--- supertux-0.1.3/src/music_manager.h 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/music_manager.h 2006-04-22 04:51:32.000000000 +0300
+@@ -20,6 +20,10 @@
+ #ifndef HEADER_MUSIC_MANAGER_H
+ #define HEADER_MUSIC_MANAGER_H
+
++#ifdef GP2X
++#include "mikmod.h"
++#endif
++
+ #include <SDL_mixer.h>
+ #include <string>
+ #include <map>
+@@ -51,7 +55,12 @@
+ ~MusicResource();
+
+ MusicManager* manager;
++#ifndef GP2X
+ Mix_Music* music;
++#else
++ MODULE *music;
++#endif
++
+ int refcount;
+ };
+
+diff -ur supertux-0.1.3/src/particlesystem.cpp supertux-0.1.3-gp2x/src/particlesystem.cpp
+--- supertux-0.1.3/src/particlesystem.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/particlesystem.cpp 2006-04-12 22:20:41.000000000 +0300
+@@ -28,8 +28,13 @@
+
+ ParticleSystem::ParticleSystem()
+ {
++#ifndef RES320X240
+ virtual_width = screen->w;
+ virtual_height = screen->h;
++#else
++ virtual_width = 640;
++ virtual_height = 480;
++#endif
+ }
+
+ ParticleSystem::~ParticleSystem()
+@@ -57,13 +62,24 @@
+ float ymax = fmodf(y + particle->texture->h, virtual_height);
+
+ // particle on screen
++#ifndef RES320X240
+ if(x >= screen->w && xmax >= screen->w)
+ continue;
+ if(y >= screen->h && ymax >= screen->h)
+ continue;
+-
++
+ if(x > screen->w) x -= virtual_width;
+ if(y > screen->h) y -= virtual_height;
++#else
++ if(x >= 640 && xmax >= 640)
++ continue;
++ if(y >= 480 && ymax >= 480)
++ continue;
++
++ if(x > 640) x -= virtual_width;
++ if(y > 480) y -= virtual_height;
++#endif
++
+ particle->texture->draw(x, y);
+ }
+ }
+@@ -74,14 +90,21 @@
+ snowimages[1] = new Surface(datadir+"/images/shared/snow1.png", USE_ALPHA);
+ snowimages[2] = new Surface(datadir+"/images/shared/snow2.png", USE_ALPHA);
+
++#ifndef RES320X240
+ virtual_width = screen->w * 2;
+-
++#else
++ virtual_width = 640 * 2;
++#endif
+ // create some random snowflakes
+ size_t snowflakecount = size_t(virtual_width/10.0);
+ for(size_t i=0; i<snowflakecount; ++i) {
+ SnowParticle* particle = new SnowParticle;
+ particle->x = rand() % int(virtual_width);
++#ifndef RES320X240
+ particle->y = rand() % screen->h;
++#else
++ particle->y = rand() % 480;
++#endif
+ particle->layer = i % 2;
+ int snowsize = rand() % 3;
+ particle->texture = snowimages[snowsize];
+@@ -106,7 +129,11 @@
+ for(i = particles.begin(); i != particles.end(); ++i) {
+ SnowParticle* particle = (SnowParticle*) *i;
+ particle->y += particle->speed * elapsed_time;
++#ifndef RES320X240
+ if(particle->y > screen->h) {
++#else
++ if(particle->y > 480) {
++#endif
+ particle->y = fmodf(particle->y , virtual_height);
+ particle->x = rand() % int(virtual_width);
+ }
+diff -ur supertux-0.1.3/src/player.cpp supertux-0.1.3-gp2x/src/player.cpp
+--- supertux-0.1.3/src/player.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/player.cpp 2006-05-05 22:59:52.000000000 +0300
+@@ -261,6 +261,7 @@
+ }
+ }
+ }
++// updateSound();
+
+ /* ---- DONE HANDLING TUX! --- */
+
+@@ -337,7 +338,11 @@
+ if(on_ground() && ((vx < 0 && dirsign >0) || (vx>0 && dirsign<0))) {
+ if(fabs(vx)>SKID_XM && !skidding_timer.check()) {
+ skidding_timer.start(SKID_TIME);
++#ifndef GP2X
+ play_sound(sounds[SND_SKID], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_SKID);
++#endif
+ ax *= 2.5;
+ } else {
+ ax *= 2;
+@@ -391,9 +396,17 @@
+ jumping = true;
+ can_jump = false;
+ if (size == SMALL)
++#ifndef GP2X
+ play_sound(sounds[SND_JUMP], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_JUMP);
++#endif
+ else
++#ifndef GP2X
+ play_sound(sounds[SND_BIGJUMP], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_BIGJUMP);
++#endif
+ }
+ }
+ // Let go of jump key
+@@ -533,7 +546,11 @@
+ if(player_status.lives < MAX_LIVES)
+ ++player_status.lives;
+ /*We want to hear the sound even, if MAX_LIVES is reached*/
++#ifndef GP2X
+ play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_LIFEUP);
++#endif
+ }
+ }
+
+@@ -665,7 +682,11 @@
+ else
+ {
+ pbad_c->dying = DYING_FALLING;
++#ifndef GP2X
+ play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_FALL);
++#endif
+ World::current()->add_score(pbad_c->base.x - scroll_x,
+ pbad_c->base.y,
+ 25 * player_status.score_multiplier);
+@@ -696,7 +717,12 @@
+ void
+ Player::kill(HurtMode mode)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_HURT);
++ updateSound();
++#endif
+
+ physic.set_velocity_x(0);
+
+@@ -734,7 +760,11 @@
+
+ bool Player::is_dead()
+ {
++#ifndef RES320X240
+ if(base.y > screen->h || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL) // last condition can happen in auto-scrolling
++#else
++ if(base.y > 640 || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL) // last condition can happen in auto-scrolling
++#endif
+ return true;
+ else
+ return false;
+@@ -760,9 +790,20 @@
+ }
+
+ /* Keep in-bounds, vertically: */
++#ifndef RES320X240
+ if (base.y > screen->h)
++#else
++ if (base.y > 640)
++#endif
+ {
+ kill(KILL);
++#ifdef GP2X
++ float wait=SDL_GetTicks()+800;
++ while ( wait > SDL_GetTicks()) {
++ updateSound();
++ }
++#endif
++
+ }
+
+ if(base.x < scroll_x && (!back_scrolling || hor_autoscroll)) // can happen if back scrolling is disabled
+@@ -777,7 +818,6 @@
+ if(base.x + base.width > scroll_x + screen->w)
+ base.x = scroll_x + screen->w - base.width;
+ }
+-
+ }
+
+ // EOF //
+diff -ur supertux-0.1.3/src/resources.cpp supertux-0.1.3-gp2x/src/resources.cpp
+--- supertux-0.1.3/src/resources.cpp 2005-07-02 15:20:14.000000000 +0300
++++ supertux-0.1.3-gp2x/src/resources.cpp 2006-04-22 13:14:01.000000000 +0300
+@@ -18,6 +18,7 @@
+ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ #include "globals.h"
++#include "sound.h"
+ #include "scene.h"
+ #include "player.h"
+ #include "badguy.h"
+@@ -187,11 +188,13 @@
+ // This is also true with if (use_music)
+ Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :)
+ */
++#ifndef GP2X
+ for (i = 0; i < NUM_SOUNDS; i++)
+ sounds[i] = load_sound(datadir + soundfilenames[i]);
++#endif
+
+ /* Herring song */
+- herring_song = music_manager->load_music(datadir + "/music/SALCON.MOD");
++ herring_song = music_manager->load_music(datadir + "/music/SALCON.MOD");
+ level_end_song = music_manager->load_music(datadir + "/music/leveldone.mod");
+ }
+
+@@ -223,8 +226,10 @@
+
+ delete tux_life;
+
++#ifndef GP2X
+ for (i = 0; i < NUM_SOUNDS; i++)
+ free_chunk(sounds[i]);
++#endif
+
+ delete sprite_manager;
+ sprite_manager = 0;
+diff -ur supertux-0.1.3/src/screen.cpp supertux-0.1.3-gp2x/src/screen.cpp
+--- supertux-0.1.3/src/screen.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/screen.cpp 2006-04-14 18:18:47.000000000 +0300
+@@ -81,7 +81,6 @@
+ else
+ {
+ #endif
+-
+ for(float y = 0; y < 480; y += 2)
+ fillrect(0, (int)y, 640, 2,
+ (int)(((float)(top_clr.red-bot_clr.red)/(0-480)) * y + top_clr.red),
+@@ -199,11 +198,23 @@
+ SDL_UnlockSurface(screen);
+ }
+ /* Update just the part of the display that we've changed */
++#ifndef RES320X240
+ SDL_UpdateRect(screen, x, y, 1, 1);
++#else
++ SDL_UpdateRect(screen, x/2, y/2, 1, 1);
++#endif
+ }
+
+ void drawline(int x1, int y1, int x2, int y2, int r, int g, int b, int a)
+ {
++
++#ifdef RES320X240
++ x1=x1/2;
++ x2=x2/2;
++ y1=y1/2;
++ y2=y2/2;
++#endif
++
+ #ifndef NOOPENGL
+ if(use_gl)
+ {
+@@ -280,6 +291,13 @@
+ y += h;
+ h = -h;
+ }
++
++#ifdef RES320X240
++ x=x;
++ y=y/2;
++ w=w/2;
++ h=h/2;
++#endif
+
+ #ifndef NOOPENGL
+ if(use_gl)
+@@ -367,6 +385,9 @@
+ void update_rect(SDL_Surface *scr, Sint32 x, Sint32 y, Sint32 w, Sint32 h)
+ {
+ if(!use_gl)
++#ifndef RES320X240
++ SDL_UpdateRect(scr, x, y, w, h);
++#else
+ SDL_UpdateRect(scr, x, y, w, h);
++#endif
+ }
+-
+diff -ur supertux-0.1.3/src/setup.cpp supertux-0.1.3-gp2x/src/setup.cpp
+--- supertux-0.1.3/src/setup.cpp 2005-07-08 15:19:17.000000000 +0300
++++ supertux-0.1.3-gp2x/src/setup.cpp 2006-05-03 23:32:49.000000000 +0300
+@@ -62,10 +62,19 @@
+ #define DATA_PREFIX "./data/"
+ #endif
+
+-/* Screen proprities: */
++/* Screen properties: */
+ /* Don't use this to test for the actual screen sizes. Use screen->w/h instead! */
++#ifndef RES320X240
+ #define SCREEN_W 640
+ #define SCREEN_H 480
++#else
++#define SCREEN_W 320
++#define SCREEN_H 240
++#endif
++
++#ifdef GP2X
++#define DATA_PREFIX "data/"
++#endif
+
+ /* Local function prototypes: */
+
+@@ -308,10 +317,14 @@
+ char str[1024];
+ /* Get home directory (from $HOME variable)... if we can't determine it,
+ use the current directory ("."): */
++#ifndef GP2X
+ if (getenv("HOME") != NULL)
+ home = getenv("HOME");
+ else
+ home = ".";
++#else
++ home = ".";
++#endif
+
+ st_dir = (char *) malloc(sizeof(char) * (strlen(home) +
+ strlen("/.supertux") + 1));
+@@ -340,9 +353,10 @@
+ // User has not that a datadir, so we try some magic
+ if (datadir.empty())
+ {
+-#ifndef WIN32
+ // Detect datadir
+ char exe_file[PATH_MAX];
++
++#ifndef WIN32
+ if (readlink("/proc/self/exe", exe_file, PATH_MAX) < 0)
+ {
+ puts("Couldn't read /proc/self/exe, using default path: " DATA_PREFIX);
+@@ -358,7 +372,12 @@
+ datadir = exedir + "../share/supertux"; // SuperTux run from PATH
+ if (access(datadir.c_str(), F_OK) != 0)
+ { // If all fails, fall back to compiled path
+- datadir = DATA_PREFIX;
++ datadir = exedir + "./data"; // SuperTux run with data in same path as executable
++ if (access(datadir.c_str(), F_OK) != 0)
++ {
++ // If all fails, fall back to compiled path
++ datadir = DATA_PREFIX;
++ }
+ }
+ }
+ }
+@@ -375,7 +394,8 @@
+ main_menu = new Menu();
+ options_menu = new Menu();
+ options_keys_menu = new Menu();
+- options_joystick_menu = new Menu();
++ options_joystick_axis_menu = new Menu();
++ options_joystick_button_menu = new Menu();
+ load_game_menu = new Menu();
+ save_game_menu = new Menu();
+ game_menu = new Menu();
+@@ -384,22 +404,27 @@
+ contrib_subset_menu = new Menu();
+ worldmap_menu = new Menu();
+
+- main_menu->set_pos(screen->w/2, 335);
++ main_menu->set_pos(screen->w/2, (int)(335)+20);
+ main_menu->additem(MN_GOTO, "Start Game",0,load_game_menu, MNID_STARTGAME);
+ main_menu->additem(MN_GOTO, "Bonus Levels",0,contrib_menu, MNID_CONTRIB);
+ main_menu->additem(MN_GOTO, "Options",0,options_menu, MNID_OPTIONMENU);
++
++#ifndef GP2X
+ main_menu->additem(MN_ACTION,"Level Editor",0,0, MNID_LEVELEDITOR);
++#endif
+ main_menu->additem(MN_ACTION,"Credits",0,0, MNID_CREDITS);
+ main_menu->additem(MN_ACTION,"Quit",0,0, MNID_QUITMAINMENU);
+
+ options_menu->additem(MN_LABEL,"Options",0,0);
+ options_menu->additem(MN_HL,"",0,0);
++#ifndef GP2X
+ #ifndef NOOPENGL
+ options_menu->additem(MN_TOGGLE,"OpenGL",use_gl,0, MNID_OPENGL);
+ #else
+ options_menu->additem(MN_DEACTIVE,"OpenGL (not supported)",use_gl, 0, MNID_OPENGL);
+ #endif
+ options_menu->additem(MN_TOGGLE,"Fullscreen",use_fullscreen,0, MNID_FULLSCREEN);
++#endif
+ if(audio_device)
+ {
+ options_menu->additem(MN_TOGGLE,"Sound ", use_sound,0, MNID_SOUND);
+@@ -411,10 +436,15 @@
+ options_menu->additem(MN_DEACTIVE,"Music ", false,0, MNID_MUSIC);
+ }
+ options_menu->additem(MN_TOGGLE,"Show FPS ",show_fps,0, MNID_SHOWFPS);
++#ifndef GP2X
+ options_menu->additem(MN_GOTO,"Keyboard Setup",0,options_keys_menu);
++#endif
+
+ //if(use_joystick)
+- // options_menu->additem(MN_GOTO,"Joystick Setup",0,options_joystick_menu);
++#ifdef GP2X
++ options_menu->additem(MN_GOTO,"Joystick Move Setup",0,options_joystick_axis_menu);
++ options_menu->additem(MN_GOTO,"Joystick Action Setup",0,options_joystick_button_menu);
++#endif
+
+ options_menu->additem(MN_HL,"",0,0);
+ options_menu->additem(MN_BACK,"Back",0,0);
+@@ -429,6 +459,7 @@
+ options_keys_menu->additem(MN_HL,"",0,0);
+ options_keys_menu->additem(MN_BACK,"Back",0,0);
+
++#ifndef GP2X
+ if(use_joystick)
+ {
+ options_joystick_menu->additem(MN_LABEL,"Joystick Setup",0,0);
+@@ -442,6 +473,20 @@
+ options_joystick_menu->additem(MN_HL,"",0,0);
+ options_joystick_menu->additem(MN_BACK,"Back",0,0);
+ }
++#else
++ options_joystick_axis_menu->additem(MN_LABEL,"Joystick Move Setup",0,0);
++ options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Up", 0,0, 11,&joystick_keymap.up_button);
++ options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Down", 0,0, 12,&joystick_keymap.down_button);
++ options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Left", 0,0, 13,&joystick_keymap.left_button);
++ options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Right", 0,0, 14,&joystick_keymap.right_button);
++ options_joystick_axis_menu->additem(MN_BACK,"Back",0,0);
++
++ options_joystick_button_menu->additem(MN_LABEL,"Joystick Action Setup",0,0);
++ options_joystick_button_menu->additem(MN_CONTROLFIELD,"Jump", 0,0, 15,&joystick_keymap.a_button);
++ options_joystick_button_menu->additem(MN_CONTROLFIELD,"Shoot/Run", 0,0, 16,&joystick_keymap.b_button);
++ options_joystick_button_menu->additem(MN_BACK,"Back",0,0);
++#endif
++
+
+ load_game_menu->additem(MN_LABEL,"Start Game",0,0);
+ load_game_menu->additem(MN_HL,"",0,0);
+@@ -576,9 +621,10 @@
+
+ srand(SDL_GetTicks());
+
++#ifndef GP2X
+ /* Set icon image: */
+-
+ seticon();
++#endif
+
+ /* Unicode needed for input handling: */
+
+@@ -586,13 +632,32 @@
+
+ /* Load global images: */
+
++#ifndef RES320X240
++ white_text = new Text(datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18);
++#else
++ white_text = new Text(datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9);
++ fadeout();
++#endif
++
++
++#ifndef RES320X240
+ black_text = new Text(datadir + "/images/status/letters-black.png", TEXT_TEXT, 16,18);
++#else
++ black_text = new Text(datadir + "/images/status/letters-black.png", TEXT_TEXT, 8,9);
++#endif
++#ifndef RES320X240
+ gold_text = new Text(datadir + "/images/status/letters-gold.png", TEXT_TEXT, 16,18);
++#else
++ gold_text = new Text(datadir + "/images/status/letters-gold.png", TEXT_TEXT, 8,9);
++#endif
+ silver_text = new Text(datadir + "/images/status/letters-silver.png", TEXT_TEXT, 16,18);
++#ifndef RES320X240
+ blue_text = new Text(datadir + "/images/status/letters-blue.png", TEXT_TEXT, 16,18);
++#else
++ blue_text = new Text(datadir + "/images/status/letters-blue.png", TEXT_TEXT, 8,9);
++#endif
+ red_text = new Text(datadir + "/images/status/letters-red.png", TEXT_TEXT, 16,18);
+ green_text = new Text(datadir + "/images/status/letters-green.png", TEXT_TEXT, 16,18);
+- white_text = new Text(datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18);
+ white_small_text = new Text(datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9);
+ white_big_text = new Text(datadir + "/images/status/letters-white-big.png", TEXT_TEXT, 20,22);
+ yellow_nums = new Text(datadir + "/images/status/numbers.png", TEXT_NUM, 32,32);
+@@ -665,14 +736,22 @@
+ Surface::reload_all();
+
+ /* Set window manager stuff: */
++#ifndef GP2X_VERSION
+ SDL_WM_SetCaption("SuperTux " VERSION, "SuperTux");
++#endif
+ }
+
+ void st_video_setup_sdl(void)
+ {
+ if (use_fullscreen)
+ {
++#ifndef GP2X
+ screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 0, SDL_FULLSCREEN ) ; /* | SDL_HWSURFACE); */
++#else
++// screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_HWSURFACE | SDL_DOUBLEBUF ) ; /* GP2X */
++ printf("screen width: %d, height: %d\n",SCREEN_W, SCREEN_H);
++ screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE ) ; /* GP2X */
++#endif
+ if (screen == NULL)
+ {
+ fprintf(stderr,
+@@ -685,14 +764,22 @@
+ }
+ else
+ {
++#ifndef GP2X
+ screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 0, SDL_HWSURFACE | SDL_DOUBLEBUF );
+-
++#else
++// screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_HWSURFACE | SDL_DOUBLEBUF ) ; /* GP2X */
++ screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE ) ; /* GP2X */
++#endif
+ if (screen == NULL)
+ {
+ fprintf(stderr,
+ "\nError: I could not set up video for 640x480 mode.\n"
+ "The Simple DirectMedia error that occured was:\n"
+ "%s\n\n", SDL_GetError());
++#ifdef GP2X_VERSION
++ chdir("/usr/gp2x");
++ execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
++#endif
+ exit(1);
+ }
+ }
+@@ -790,6 +877,7 @@
+
+ use_joystick = false;
+ }
++#ifndef GP2X
+ else
+ {
+ if (SDL_JoystickNumAxes(js) < 2)
+@@ -811,6 +899,7 @@
+ }
+ }
+ }
++#endif
+ }
+ }
+ }
+@@ -844,12 +933,17 @@
+ }
+ }
+
+-
++ audio_device = true;
++
+ /* Open sound silently regarless the value of "use_sound": */
+
+ if (audio_device)
+ {
++#ifndef GP2X
+ if (open_audio(44100, AUDIO_S16, 2, 2048) < 0)
++#else
++ if (open_audio(44100, AUDIO_S16, 1, 1024) < 0)
++#endif
+ {
+ /* only print out message if sound or music
+ was not disabled at command-line
+@@ -878,6 +972,12 @@
+ close_audio();
+ SDL_Quit();
+ saveconfig();
++
++#ifdef GP2X
++ chdir("/usr/gp2x");
++ execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
++#endif
++
+ }
+
+ /* --- ABORT! --- */
+@@ -893,6 +993,7 @@
+
+ void seticon(void)
+ {
++#ifndef GP2X
+ // int masklen;
+ // Uint8 * mask;
+ SDL_Surface * icon;
+@@ -927,6 +1028,7 @@
+
+ // free(mask);
+ SDL_FreeSurface(icon);
++#endif
+ }
+
+
+@@ -956,6 +1058,7 @@
+ }
+ else if (strcmp(argv[i], "--joymap") == 0)
+ {
++#ifndef GP2X
+ assert(i+1 < argc);
+ if (sscanf(argv[++i],
+ "%d:%d:%d:%d:%d",
+@@ -976,6 +1079,7 @@
+ << " B-Button: " << joystick_keymap.b_button << "\n"
+ << " Start-Button: " << joystick_keymap.start_button << std::endl;
+ }
++#endif
+ }
+ else if (strcmp(argv[i], "--leveleditor") == 0)
+ {
+diff -ur supertux-0.1.3/src/sound.cpp supertux-0.1.3-gp2x/src/sound.cpp
+--- supertux-0.1.3/src/sound.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/sound.cpp 2006-04-22 02:07:57.000000000 +0300
+@@ -22,6 +22,9 @@
+ #include "globals.h"
+ #include "sound.h"
+ #include "setup.h"
++#ifdef GP2X
++#include <string.h>
++#endif
+
+ /*global variable*/
+ bool use_sound = true; /* handle sound on/off menu and command-line option */
+@@ -54,12 +57,21 @@
+
+ #include <SDL_mixer.h>
+
++#ifndef GP2X
+ Mix_Chunk * sounds[NUM_SOUNDS];
++#else
+
+-/* --- OPEN THE AUDIO DEVICE --- */
++#include <mikmod.h>
++static MODULE *music=NULL;
++static SAMPLE *chunk[NUM_SOUNDS];
++static int chunkFlag[NUM_SOUNDS];
++#endif
+
++/* --- OPEN THE AUDIO DEVICE --- */
+ int open_audio (int frequency, Uint16 format, int channels, int chunksize)
+ {
++// close_audio();
++#ifndef GP2X
+ if (Mix_OpenAudio( frequency, format, channels, chunksize ) < 0)
+ return -1;
+
+@@ -74,20 +86,93 @@
+ /* prepare the spanning effects */
+ Mix_SetPanning( SOUND_LEFT_SPEAKER, 230, 24 );
+ Mix_SetPanning( SOUND_RIGHT_SPEAKER, 24, 230 );
++#else
++ if (drv_oss.Name) // Valid OSS driver
++ {
++ if (drv_oss.CommandLine) // Valid Commandline
++ {
++ drv_oss.CommandLine("buffer=14,count=2");
++ }
++ MikMod_RegisterDriver(&drv_oss);
++ }
++ if (drv_alsa.Name) // Valid ALSA driver
++ {
++ if (drv_alsa.CommandLine) // Valid Commandline
++ {
++ drv_alsa.CommandLine("buffer=14");
++ }
++ MikMod_RegisterDriver(&drv_alsa);
++ }
++ MikMod_RegisterDriver(&drv_nos);
++
++ // register standard tracker
++ MikMod_RegisterAllLoaders();
++
++ // Note, the md_mode flags are already set by default
++ md_mode |= DMODE_SOFT_SNDFX | DMODE_SOFT_MUSIC;
++
++ if (MikMod_Init("")) // Command paramenters are ignored as all drivers are registered
++ {
++ printf("mikmod init war frn arsch\n");
++ return 1;
++ }
++
++ load_sounds();
++
++ // get ready to play
++ MikMod_EnableOutput();
++ md_volume =64;
++ md_sndfxvolume = 64;
++ //md_musicvolume = md_sndfxvolume = 64;
++
++ use_sound = true;
++ audio_device=true;
++
++#endif
+ return 0;
+-}
+
++}
+
+ /* --- CLOSE THE AUDIO DEVICE --- */
+
+ void close_audio( void )
+ {
++#ifndef GP2X
+ if (audio_device) {
+ Mix_UnregisterAllEffects( SOUND_LEFT_SPEAKER );
+ Mix_UnregisterAllEffects( SOUND_RIGHT_SPEAKER );
+ Mix_CloseAudio();
+ }
++#else
++ int i;
++ if (! audio_device) return;
++
++ MikMod_DisableOutput();
++ Player_Stop();
++ MikMod_Update();
++
++ if (music) {
++ Player_Free(music);
++ music = NULL;
++ }
++
++ for ( i=0 ; i<NUM_SOUNDS ; i++ ) {
++ if ( chunk[i] ) {
++ Sample_Free(chunk[i]);
++ }
++ }
++
++ MikMod_Update();
++ MikMod_Exit();
++#endif
++}
++
++#ifdef GP2X
++void updateSound ( void ) {
++ if (! audio_device) return;
++ MikMod_Update();
+ }
++#endif
+
+
+ /* --- LOAD A SOUND --- */
+@@ -105,6 +190,30 @@
+ return(snd);
+ }
+
++#ifdef GP2X
++static void load_sounds() {
++ int i;
++ std::string name;
++ char file[100];
++
++ for ( i=0 ; i<NUM_SOUNDS ; i++ ) {
++ name = datadir + soundfilenames[i];
++ printf("loading: %s\n",name.c_str());
++ snprintf(file,sizeof(file),"%s",name.c_str());
++ if ( NULL == (chunk[i] = Sample_Load(file)) ) {
++ fprintf(stderr, "Couldn't load: %s\n", file);
++ use_sound = 0;
++ return;
++ }
++ chunkFlag[i] = 0;
++ }
++
++ // reserve voices for sound effects
++ MikMod_SetNumVoices(-1, 4);
++}
++#endif
++
++
+ /* --- PLAY A SOUND ON LEFT OR RIGHT OR CENTER SPEAKER --- */
+
+ void play_sound(Mix_Chunk * snd, enum Sound_Speaker whichSpeaker)
+@@ -130,8 +239,45 @@
+ }
+ }
+
++
++#ifdef GP2X
++void play_chunk(int idx)
++{
++ int cid;
++// if (use_sound) return;
++ cid = Sample_Play (chunk[idx], 0, 0);
++ Voice_SetPanning(cid, PAN_CENTER);
++ Voice_SetVolume(cid, 1000);
++}
++#endif
++
++
+ void free_chunk(Mix_Chunk *chunk)
+ {
+ Mix_FreeChunk( chunk );
+ }
+
++void sound_volume ( int vol )
++{
++#ifndef GP2X
++ static int volume = 10;
++
++ if ( vol == 1 ) volume-=5;
++ else if ( vol == 2 ) volume+=5;
++ Mix_Volume(-1,volume);
++#endif
++}
++
++#ifdef GP2X
++void increaseSoundVolume(void)
++{
++ if (md_volume > (256 - 13)) md_volume = 256;
++ else md_volume += 13;
++}
++
++void decreaseSoundVolume(void)
++{
++ if (md_volume < 13) md_volume = 0;
++ else md_volume -= 13;
++}
++#endif
+diff -ur supertux-0.1.3/src/sound.h supertux-0.1.3-gp2x/src/sound.h
+--- supertux-0.1.3/src/sound.h 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/sound.h 2006-04-21 00:17:09.000000000 +0300
+@@ -75,14 +75,27 @@
+ #include <SDL_mixer.h>
+
+ /* variables for stocking the sound and music */
++#ifndef GP2X
+ extern Mix_Chunk* sounds[NUM_SOUNDS];
++#endif
+
+ /* functions handling the sound and music */
+ int open_audio(int frequency, Uint16 format, int channels, int chunksize);
+ void close_audio( void );
+
++#ifndef GP2X
+ Mix_Chunk * load_sound(const std::string& file);
++#endif
+ void free_chunk(Mix_Chunk*chunk);
+ void play_sound(Mix_Chunk * snd, enum Sound_Speaker whichSpeaker);
++void sound_volume ( int vol );
+
+ #endif /*SUPERTUX_SOUND_H*/
++
++#ifdef GP2X
++void play_chunk(int idx);
++static void load_sounds();
++void updateSound ( void );
++void increaseSoundVolume(void);
++void decreaseSoundVolume(void);
++#endif
+diff -ur supertux-0.1.3/src/special.cpp supertux-0.1.3-gp2x/src/special.cpp
+--- supertux-0.1.3/src/special.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/special.cpp 2006-04-20 21:39:41.000000000 +0300
+@@ -105,12 +105,21 @@
+
+ base.ym = base.ym + 0.5 * frame_ratio;
+
++#ifndef RES320X240
+ if (base.x < scroll_x ||
+ base.x > scroll_x + screen->w ||
+ base.y > screen->h ||
+ issolid(base.x + 4, base.y + 2) ||
+ issolid(base.x, base.y + 2) ||
+ life_count <= 0)
++#else
++ if (base.x < scroll_x ||
++ base.x > scroll_x + 640 ||
++ base.y > 480 ||
++ issolid(base.x + 4, base.y + 2) ||
++ issolid(base.x, base.y + 2) ||
++ life_count <= 0)
++#endif
+ {
+ remove_me();
+ }
+@@ -120,8 +129,13 @@
+ void
+ Bullet::draw()
+ {
++#ifndef RES320X240
+ if (base.x >= scroll_x - base.width &&
+ base.x <= scroll_x + screen->w)
++#else
++ if (base.x >= scroll_x - base.width &&
++ base.x <= scroll_x + 640)
++#endif
+ {
+ img_bullet->draw(base.x - scroll_x, base.y);
+ }
+@@ -140,7 +154,7 @@
+ {
+ kind = kind_;
+ dir = dir_;
+-
++
+ base.width = 32;
+ base.height = 0;
+ base.x = x_;
+@@ -197,7 +211,11 @@
+ remove_me();
+ return;
+ }
++#ifndef RES320X240
+ if(base.y > screen->h) {
++#else
++ if(base.y > 640) {
++#endif
+ remove_me();
+ return;
+ }
+@@ -252,7 +270,12 @@
+ {
+ /* Rising up... */
+
++
++#ifndef RES320X240
+ dest.x = (int)(base.x - scroll_x);
++#else
++ dest.x = (int)(base.x - scroll_x)/2;
++#endif
+ dest.y = (int)(base.y + 32 - base.height);
+ dest.w = 32;
+ dest.h = (int)base.height;
+@@ -297,7 +320,11 @@
+ if(kind != UPGRADE_GROWUP)
+ return;
+
++#ifndef GP2X
+ play_sound(sounds[SND_BUMP_UPGRADE], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_BUMP_UPGRADE);
++#endif
+
+ // do a little jump and change direction
+ physic.set_velocity(-physic.get_velocity_x(), 3);
+@@ -329,18 +356,30 @@
+
+ if (kind == UPGRADE_GROWUP)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_EXCELLENT], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_EXCELLENT);
++#endif
+ pplayer->grow();
+ }
+ else if (kind == UPGRADE_ICEFLOWER)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_COFFEE);
++#endif
+ pplayer->grow();
+ pplayer->got_coffee = true;
+ }
+ else if (kind == UPGRADE_HERRING)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_HERRING], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_HERRING);
++#endif
+ pplayer->invincible_timer.start(TUX_INVINCIBLE_TIME);
+ World::current()->play_music(HERRING_MUSIC);
+ }
+@@ -348,7 +387,11 @@
+ {
+ if(player_status.lives < MAX_LIVES) {
+ player_status.lives++;
++#ifndef GP2X
+ play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_LIFEUP);
++#endif
+ }
+ }
+
+diff -ur supertux-0.1.3/src/text.cpp supertux-0.1.3-gp2x/src/text.cpp
+--- supertux-0.1.3/src/text.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/text.cpp 2006-04-22 01:59:36.000000000 +0300
+@@ -24,6 +24,7 @@
+ #include "defines.h"
+ #include "screen.h"
+ #include "text.h"
++#include "sound.h"
+
+ Text::Text(const std::string& file, int kind_, int w_, int h_)
+ {
+@@ -79,6 +80,7 @@
+ void
+ Text::draw(const char* text, int x, int y, int shadowsize, int update)
+ {
++
+ if(text != NULL)
+ {
+ if(shadowsize != 0)
+@@ -116,6 +118,9 @@
+ else if ( text[i] == '\n')
+ {
+ y += h + 2;
++#ifdef RES320X240
++ y+=6;
++#endif
+ j = 0;
+ }
+ }
+@@ -129,6 +134,9 @@
+ else if ( text[i] == '\n')
+ {
+ y += h + 2;
++#ifdef RES320X240
++ y+=6;
++#endif
+ j = 0;
+ }
+ }
+@@ -306,6 +314,24 @@
+ break;
+ }
+ break;
++
++#ifdef GP2X
++ case SDL_JOYBUTTONDOWN:
++ if ( event.jbutton.button == joystick_keymap.down_button ) {
++ speed += SPEED_INC;
++ }
++ if ( event.jbutton.button == joystick_keymap.up_button ) {
++ speed -= SPEED_INC;
++ }
++ if ( event.jbutton.button == joystick_keymap.b_button ) {
++ done = 1;
++ }
++ if ( event.jbutton.button == joystick_keymap.a_button ) {
++ scroll += SCROLL;
++ }
++ break;
++#endif
++
+ case SDL_QUIT:
+ done = 1;
+ break;
+@@ -330,21 +356,36 @@
+ white_small_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
+ A_HMIDDLE, A_TOP, 1);
+ y += white_small_text->h+ITEMS_SPACE;
++#ifdef RES320X240
++ y += 6;
++#endif
+ break;
+ case ' ':
+ white_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
+ A_HMIDDLE, A_TOP, 1);
+ y += white_text->h+ITEMS_SPACE;
++#ifdef RES320X240
++ y += 6;
++#endif
+ break;
+ case '-':
+- white_big_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
+- A_HMIDDLE, A_TOP, 3);
++#ifdef RES320X240
++ white_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll), A_HMIDDLE, A_TOP, 3);
++#else
++ white_big_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll), A_HMIDDLE, A_TOP, 3);
++#endif
+ y += white_big_text->h+ITEMS_SPACE;
++#ifdef RES320X240
++ y += 6;
++#endif
+ break;
+ default:
+ blue_text->drawf(names.item[i], 0, screen->h+y-int(scroll),
+ A_HMIDDLE, A_TOP, 1);
+ y += blue_text->h+ITEMS_SPACE;
++#ifdef RES320X240
++ y += 6;
++#endif
+ break;
+ }
+ }
+@@ -360,7 +401,13 @@
+ if(scroll < 0)
+ scroll = 0;
+
+- SDL_Delay(10);
++#ifndef GP2X
++ SDL_Delay(10);
++#else
++ SDL_Delay(2);
++ updateSound();
++#endif
++
+ }
+ string_list_free(&names);
+
+diff -ur supertux-0.1.3/src/texture.cpp supertux-0.1.3-gp2x/src/texture.cpp
+--- supertux-0.1.3/src/texture.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/texture.cpp 2006-04-10 14:29:03.000000000 +0300
+@@ -211,7 +211,8 @@
+ {
+ if (impl)
+ {
+- if (impl->draw(x, y, alpha, update) == -2)
++// if (impl->draw(x, y, alpha, update) == -2)
++ if (impl->draw(x/2, y/2, alpha, update) == -2)
+ reload();
+ }
+ }
+@@ -231,7 +232,8 @@
+ {
+ if (impl)
+ {
+- if (impl->draw_part(sx, sy, x, y, w, h, alpha, update) == -2)
++// if (impl->draw_part(sx, sy, x, y, w, h, alpha, update) == -2)
++ if (impl->draw_part(sx, sy, x, y/2, w, h, alpha, update) == -2)
+ reload();
+ }
+ }
+@@ -241,7 +243,8 @@
+ {
+ if (impl)
+ {
+- if (impl->draw_stretched(x, y, w, h, alpha, update) == -2)
++// if (impl->draw_stretched(x, y, w, h, alpha, update) == -2)
++ if (impl->draw_stretched(x/2, y/2, w, h, alpha, update) == -2)
+ reload();
+ }
+ }
+diff -ur supertux-0.1.3/src/title.cpp supertux-0.1.3-gp2x/src/title.cpp
+--- supertux-0.1.3/src/title.cpp 2005-07-08 15:19:17.000000000 +0300
++++ supertux-0.1.3-gp2x/src/title.cpp 2006-04-22 01:29:08.000000000 +0300
+@@ -51,6 +51,7 @@
+ #include "tile.h"
+ #include "resources.h"
+ #include "worldmap.h"
++#include "sound.h"
+
+ static Surface* bkg_title;
+ static Surface* logo;
+@@ -80,6 +81,10 @@
+
+ void generate_contrib_menu()
+ {
++#ifdef RES320X240
++ fadeout();
++#endif
++
+ string_list_type level_subsets = dsubdirs("/levels", "info");
+
+ free_contrib_menu();
+@@ -208,7 +213,7 @@
+ }
+
+ // Wrap around at the end of the level back to the beginnig
+- if(plevel->width * 32 - 320 < tux->base.x)
++ if((plevel->width * 32) - 320 < tux->base.x)
+ {
+ tux->level_begin();
+ scroll_x = 0;
+@@ -226,7 +231,6 @@
+ {
+ walking = false;
+ }
+-
+ world->draw();
+ }
+
+@@ -301,13 +305,26 @@
+
+ if (Menu::current() == main_menu)
+ logo->draw( 160, 30);
+-
++
++#ifndef RES320X240
+ white_small_text->draw(" SuperTux " VERSION "\n"
+ "Copyright (c) 2003 SuperTux Devel Team\n"
+ "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
+ "are welcome to redistribute it under certain conditions; see the file COPYING\n"
+ "for details.\n",
+ 0, 420, 0);
++#else
++ white_small_text->draw(" SuperTux " VERSION "\n"
++ "Copyright (c) 2003 SuperTux Devel Team\n"
++ "This game comes with ABSOLUTELY NO \n"
++ "WARRANTY. This is free software, and\n"
++ "you are welcome to redistribute it\n"
++ "under certain conditions; see the file\n"
++ "COPYING for details.\n",
++ 0, 360, 0);
++#endif
++
++ //updateSound();
+
+ /* Don't draw menu, if quit is true */
+ Menu* menu = Menu::current();
+@@ -337,10 +354,10 @@
+ break;
+ case MNID_CREDITS:
+ music_manager = new MusicManager();
+- menu_song = music_manager->load_music(datadir + "/music/credits.ogg");
++ menu_song = music_manager->load_music(datadir + "/music/credits.mod");
+ music_manager->halt_music();
+ music_manager->play_music(menu_song,0);
+- display_text_file("CREDITS", bkg_title, SCROLL_SPEED_CREDITS);
++ display_text_file("CREDITS", bkg_title, SCROLL_SPEED_CREDITS);
+ music_manager->halt_music();
+ menu_song = music_manager->load_music(datadir + "/music/theme.mod");
+ music_manager->play_music(menu_song);
+diff -ur supertux-0.1.3/src/world.cpp supertux-0.1.3-gp2x/src/world.cpp
+--- supertux-0.1.3/src/world.cpp 2005-06-22 00:16:07.000000000 +0300
++++ supertux-0.1.3-gp2x/src/world.cpp 2006-05-05 23:16:47.000000000 +0300
+@@ -206,6 +206,7 @@
+ }
+ }
+
++
+ /* Draw interactive tiles: */
+ for (y = 0; y < 15; ++y)
+ {
+@@ -255,6 +256,8 @@
+ {
+ (*p)->draw(scroll_x, 0, 1);
+ }
++
++ //updateSound();
+ }
+
+ void
+@@ -312,7 +315,12 @@
+
+ // the space that it takes for the screen to start scrolling, regarding
+ // screen bounds (in pixels)
++#ifndef RES320X240
+ #define X_SPACE (400-16)
++#else
++#define X_SPACE (80-16)
++#endif
++
+ // the time it takes to move the camera (in ms)
+ #define CHANGE_DIR_SCROLL_SPEED 2000
+
+@@ -388,8 +396,13 @@
+ // this code prevent the screen to scroll before the start or after the level's end
+ if(scroll_x < 0)
+ scroll_x = 0;
++#ifndef RES320X240
+ if(scroll_x > level->width * 32 - screen->w)
+ scroll_x = level->width * 32 - screen->w;
++#else
++ if(scroll_x > level->width * 32 - 640)
++ scroll_x = level->width * 32 - 640;
++#endif
+ }
+
+ void
+@@ -481,6 +494,10 @@
+ void
+ World::add_score(float x, float y, int s)
+ {
++#ifdef RES320X240
++ x=x/2;
++#endif
++
+ player_status.score += s;
+
+ FloatingScore* new_floating_score = new FloatingScore();
+@@ -547,8 +564,11 @@
+ Bullet new_bullet;
+ new_bullet.init(x,y,xm,dir);
+ bullets.push_back(new_bullet);
+-
++#ifndef GP2X
+ play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_SHOOT);
++#endif
+ }
+
+ void
+@@ -608,8 +628,11 @@
+ counting_distros = false;
+ plevel->change(x, y, TM_IA, tile->next_tile);
+ }
+-
++#ifndef GP2X
+ play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_DISTRO);
++#endif
+ player_status.score = player_status.score + SCORE_DISTRO;
+ player_status.distros++;
+ }
+@@ -622,9 +645,13 @@
+ add_broken_brick(tile,
+ ((int)(x + 1) / 32) * 32,
+ (int)(y / 32) * 32);
+-
++
+ /* Get some score: */
++#ifndef GP2X
+ play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_BRICK);
++#endif
+ player_status.score = player_status.score + SCORE_BRICK;
+ }
+ }
+@@ -652,7 +679,11 @@
+ {
+ case 1: // Box with a distro!
+ add_bouncy_distro(posx, posy);
++#ifndef GP2X
+ play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_DISTRO);
++#endif
+ player_status.score = player_status.score + SCORE_DISTRO;
+ player_status.distros++;
+ break;
+@@ -662,7 +693,11 @@
+ add_upgrade(posx, posy, col_side, UPGRADE_GROWUP);
+ else /* Tux is big, add an iceflower: */
+ add_upgrade(posx, posy, col_side, UPGRADE_ICEFLOWER);
++#ifndef GP2X
+ play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_UPGRADE);
++#endif
+ break;
+
+ case 3: // Add a golden herring
+@@ -688,7 +723,11 @@
+ if (tile && tile->distro)
+ {
+ level->change(x, y, TM_IA, tile->next_tile);
++#ifndef GP2X
+ play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_DISTRO);
++#endif
+
+ if (bounciness == BOUNCE)
+ {
+diff -ur supertux-0.1.3/src/worldmap.cpp supertux-0.1.3-gp2x/src/worldmap.cpp
+--- supertux-0.1.3/src/worldmap.cpp 2005-07-08 15:19:17.000000000 +0300
++++ supertux-0.1.3-gp2x/src/worldmap.cpp 2006-05-05 22:54:04.000000000 +0300
+@@ -376,11 +376,11 @@
+ {
+ tile_manager = new TileManager();
+
+- width = 20;
+- height = 15;
++ width = (int)(20);
++ height = (int)(15);
+
+- start_x = 4;
+- start_y = 5;
++ start_x = int(4);
++ start_y = int(5);
+
+ passive_message_timer.init(true);
+
+@@ -395,7 +395,7 @@
+ enter_level = false;
+
+ name = "<no file>";
+- music = "SALCON.MOD";
++ music = "salcon.mod";
+ }
+
+ WorldMap::~WorldMap()
+@@ -589,7 +589,8 @@
+ break;
+ }
+ break;
+-
++
++#ifndef GP2X
+ case SDL_JOYAXISMOTION:
+ if (event.jaxis.axis == joystick_keymap.x_axis)
+ {
+@@ -617,13 +618,29 @@
+ if (event.jhat.value == SDL_HAT_RIGHT)
+ input_direction = D_EAST;
+ break;
+-
++#endif
+ case SDL_JOYBUTTONDOWN:
++#ifndef GP2X
+ if (event.jbutton.button == joystick_keymap.b_button)
+ enter_level = true;
+ else if (event.jbutton.button == joystick_keymap.start_button)
+ on_escape_press();
+ break;
++#else
++ if (event.jbutton.button == joystick_keymap.a_button)
++ enter_level = true;
++ else if (event.jbutton.button == joystick_keymap.start_button)
++ on_escape_press();
++ else if (event.jbutton.button == joystick_keymap.up_button)
++ input_direction = D_NORTH;
++ else if (event.jbutton.button == joystick_keymap.down_button)
++ input_direction = D_SOUTH;
++ else if (event.jbutton.button == joystick_keymap.right_button)
++ input_direction = D_EAST;
++ else if (event.jbutton.button == joystick_keymap.left_button)
++ input_direction = D_WEST;
++ break;
++#endif
+
+ default:
+ break;
+@@ -769,13 +786,13 @@
+ {
+ MusicRef theme =
+ music_manager->load_music(datadir + "/music/theme.mod");
+- MusicRef credits = music_manager->load_music(datadir + "/music/credits.ogg");
++ MusicRef credits = music_manager->load_music(datadir + "/music/credits.xm");
+ music_manager->play_music(theme);
+ // Display final credits and go back to the main menu
+ display_text_file(level->extro_filename,
+ "/images/background/extro.jpg", SCROLL_SPEED_MESSAGE);
+ music_manager->play_music(credits,0);
+- display_text_file("CREDITS",
++ display_text_file("CREDITS",
+ "/images/background/oiltux.jpg", SCROLL_SPEED_CREDITS);
+ music_manager->play_music(theme);
+ quit = true;
+@@ -812,7 +829,12 @@
+ if (level->x == tux->get_tile_pos().x &&
+ level->y == tux->get_tile_pos().y)
+ {
++#ifndef GP2X
+ play_sound(sounds[SND_TELEPORT], SOUND_CENTER_SPEAKER);
++#else
++ play_chunk(SND_TELEPORT);
++ updateSound();
++#endif
+ tux->back_direction = D_NONE;
+ tux->set_tile_pos(Point(level->teleport_dest_x, level->teleport_dest_y));
+ SDL_Delay(1000);
+@@ -914,26 +936,39 @@
+ void
+ WorldMap::draw_status()
+ {
++ int xdiv;
++
++#ifdef RES320X240
++ xdiv=2;
++#else
++ xdiv=1;
++#endif
++
+ char str[80];
+ sprintf(str, "%d", player_status.score);
+ white_text->draw("SCORE", 0, 0);
+- gold_text->draw(str, 96, 0);
++ gold_text->draw(str, (int)(96)/xdiv, 0);
+
+ sprintf(str, "%d", player_status.distros);
+- white_text->draw_align("COINS", 320-64, 0, A_LEFT, A_TOP);
+- gold_text->draw_align(str, 320+64, 0, A_RIGHT, A_TOP);
++ white_text->draw_align("COINS", (int)(320-64)/xdiv, 0, A_LEFT, A_TOP);
++ gold_text->draw_align(str, (int)(320+64)/xdiv, 0, A_RIGHT, A_TOP);
+
+- white_text->draw("LIVES", 480, 0);
++ white_text->draw("LIVES", (int)(480)/xdiv, 0);
+ if (player_status.lives >= 5)
+ {
+ sprintf(str, "%dx", player_status.lives);
+- gold_text->draw_align(str, 617, 0, A_RIGHT, A_TOP);
+- tux_life->draw(565+(18*3), 0);
++#ifdef RES320X240
++ gold_text->draw_align(str, (int)(617)/xdiv-5, 0, A_RIGHT, A_TOP);
++ tux_life->draw((int)((565-12+(18*3))), 0);
++#else
++ gold_text->draw_align(str, (int)(617), 0, A_RIGHT, A_TOP);
++ tux_life->draw((int)((565+(18*3))), 0);
++#endif
+ }
+ else
+ {
+ for(int i= 0; i < player_status.lives; ++i)
+- tux_life->draw(565+(18*i),0);
++ tux_life->draw((565+(18/xdiv*i)),0);
+ }
+
+ if (!tux->is_moving())
+@@ -945,7 +980,11 @@
+ {
+ if(!i->name.empty())
+ {
++#ifndef RES320X240
+ white_text->draw_align(i->title.c_str(), screen->w/2, screen->h, A_HMIDDLE, A_BOTTOM);
++#else
++ white_text->draw_align(i->title.c_str(), screen->w/2, 470, A_HMIDDLE, A_BOTTOM);
++#endif
+ }
+ else if (i->teleport_dest_x != -1) {
+ if(!i->teleport_message.empty())
+@@ -955,7 +994,7 @@
+ /* Display a message in the map, if any as been selected */
+ if(!i->display_map_message.empty() && !i->passive_message)
+ gold_text->draw_align(i->display_map_message.c_str(),
+- screen->w/2, screen->h - 30,A_HMIDDLE, A_BOTTOM);
++ screen->w/2, screen->h - (int)(30),A_HMIDDLE, A_BOTTOM);
+ break;
+ }
+ }
+@@ -964,7 +1003,7 @@
+ /* Display a passive message in the map, if needed */
+ if(passive_message_timer.check())
+ gold_text->draw_align(passive_message.c_str(),
+- screen->w/2, screen->h - 30,A_HMIDDLE, A_BOTTOM);
++ screen->w/2, screen->h - (int)(30),A_HMIDDLE, A_BOTTOM);
+ }
+
+ void
+@@ -997,6 +1036,7 @@
+ Point tux_pos = tux->get_pos();
+ if (1)
+ {
++#ifndef GP2X
+ offset.x = -tux_pos.x + screen->w/2;
+ offset.y = -tux_pos.y + screen->h/2;
+
+@@ -1005,6 +1045,16 @@
+
+ if (offset.x < screen->w - width*32) offset.x = screen->w - width*32;
+ if (offset.y < screen->h - height*32) offset.y = screen->h - height*32;
++#else
++ offset.x = -tux_pos.x + 640/2;
++ offset.y = -tux_pos.y + 480/2;
++
++ if (offset.x > 0) offset.x = 0;
++ if (offset.y > 0) offset.y = 0;
++
++ if (offset.x < 640 - width*32) offset.x = 640 - width*32;
++ if (offset.y < 480 - height*32) offset.y = 480 - height*32;
++#endif
+ }
+
+ draw(offset);
diff --git a/recipes/supertux/files/img-resize.sh b/recipes/supertux/files/img-resize.sh
new file mode 100644
index 0000000000..0197964193
--- /dev/null
+++ b/recipes/supertux/files/img-resize.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+conv() {
+
+if [ ! -d org ]; then
+ mkdir org
+ mv *.jpg *.png org/
+fi
+
+for i in org/*; do
+ b=`basename $i`
+ ext=`expr "x$b" : 'x.*\.\(.*\)'`
+ if [ "$ext" == "png" ]; then
+ if [ $b == "tux-life.png" ]; then
+ cp $i _.png
+ else
+ convert $i -resize 50% -colors 64 _.png
+ fi
+ pngcrush -q _.png $b
+ elif [ "$ext" == "jpg" ]; then
+ convert $i -resize 50% -quality 60 $b
+ fi
+done
+rm _.png
+
+}
+
+conv
diff --git a/recipes/supertux/files/supertux-smallsize-data.tar.bz2 b/recipes/supertux/files/supertux-smallsize-data.tar.bz2
new file mode 100644
index 0000000000..740e4f4473
--- /dev/null
+++ b/recipes/supertux/files/supertux-smallsize-data.tar.bz2
Binary files differ
diff --git a/recipes/supertux/files/supertux.desktop b/recipes/supertux/files/supertux.desktop
new file mode 100644
index 0000000000..8677a71301
--- /dev/null
+++ b/recipes/supertux/files/supertux.desktop
@@ -0,0 +1,20 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=SuperTux
+Name[en]=SuperTux
+Name[de]=SuperTux
+Name[cs]=SuperTux
+GenericName=A Platform Game
+GenericName[en]=A Platform Game
+GenericName[de]=Ein Jump&Run Spiel
+GenericName[cs]=Plošinová hra
+Comment=A Super Mario inspired penguin platform game
+Comment[en]=A Super Mario inspired penguin platform game
+Comment[de]=Ein von Super Mario inspiriertes Pinguin Jump&Run Spiel
+Comment[cs]=Plošinovka inspirovaná SuperMariem s tučňákem Tuxem v hlavní roli
+Icon=supertux
+Exec=supertux
+Terminal=false
+StartupNotify=false
+Categories=Application;Game;ArcadeGame;
diff --git a/recipes/supertux/files/supertux.png b/recipes/supertux/files/supertux.png
new file mode 100644
index 0000000000..82ac69642c
--- /dev/null
+++ b/recipes/supertux/files/supertux.png
Binary files differ
diff --git a/recipes/supertux/supertux-qvga_0.1.3.bb b/recipes/supertux/supertux-qvga_0.1.3.bb
new file mode 100644
index 0000000000..a38b8efbec
--- /dev/null
+++ b/recipes/supertux/supertux-qvga_0.1.3.bb
@@ -0,0 +1,57 @@
+DESCRIPTION = "SuperTux is a classic 2D jump'n'run sidescroller game \
+in a style similar to the original SuperMario games (QVGA, size-optimized version)"
+SECTION = "games"
+PRIORITY = "optional"
+LICENSE = "GPL"
+DEPENDS = "libsdl-gfx imagemagick-native pngcrush-native"
+PR = "r0.20"
+
+APPIMAGE = "${WORKDIR}/supertux.png"
+APPDESKTOP = "${WORKDIR}/supertux.desktop"
+
+PACKAGES_prepend = " ${PN}-levels-bonus1 ${PN}-levels-bonus2 "
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/super-tux/supertux-${PV}.tar.bz2 \
+# file://supertux-qvga-gfx.tar.bz2 \
+ file://supertux-smallsize-data.tar.bz2 \
+ file://gp2x.patch;patch=1 \
+ file://img-resize.sh \
+ file://supertux.png \
+ file://supertux.desktop \
+# file://letters-black.png \
+# file://letters-blue.png \
+# file://letters-gold.png \
+# file://mousecursor.png \
+# file://credits.mod \
+ "
+S = "${WORKDIR}/supertux-${PV}"
+
+export SDL_CONFIG = "${STAGING_BINDIR_CROSS}/sdl-config"
+EXTRA_OECONF = "--enable-320x240 --disable-opengl"
+
+inherit autotools sdl
+
+do_compile_prepend() {
+# for f in letters-black.png letters-blue.png letters-gold.png mousecursor.png; do
+# cp ${WORKDIR}/$f ${S}/data/images/status/
+# done
+ for d in background shared tilesets title worldmap; do
+ cd ${S}/data/images/$d
+ sh ${WORKDIR}/img-resize.sh
+ done
+}
+
+do_install_prepend() {
+ # *-fast.* music plays when time for a level is running out
+ # byte-wise, it's the same file with few bytes changes (for .mod's).
+ # Well, seller feature, what to say, but we won't waste megabytes on
+ # that. Folks should learn to control tempo in there player lib.
+ rm -f ${S}/data/music/*-fast.*
+ # ogg is too heavy for embedded systems
+ rm -f ${S}/data/music/*.ogg
+# cp ${WORKDIR}/*.mod ${S}/data/music/
+}
+
+FILES_${PN}-levels-bonus1 = "${datadir}/supertux/levels/bonus1 ${datadir}/supertux/levels/worldmaps/bonusisland1.stwm"
+FILES_${PN}-levels-bonus2 = "${datadir}/supertux/levels/bonus2 ${datadir}/supertux/levels/worldmaps/bonusisland2.stwm"
+FILES_${PN} += "${datadir}/supertux"
diff --git a/recipes/supertux/supertux_0.1.2.bb b/recipes/supertux/supertux_0.1.2.bb
new file mode 100644
index 0000000000..3afa425f1a
--- /dev/null
+++ b/recipes/supertux/supertux_0.1.2.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "SuperTux is a classic 2D jump'n'run sidescroller game \
+in a style similar to the original SuperMario games."
+SECTION = "games"
+PRIORITY = "optional"
+LICENSE = "GPL"
+PR = "r4"
+
+APPIMAGE = "${WORKDIR}/supertux.png"
+APPDESKTOP = "${WORKDIR}/supertux.desktop"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/super-tux/supertux-${PV}.tar.bz2 \
+ http://ssel.vub.ac.be/Members/DennisWagelaar/download/zaurus/supertux-0.1.2-fp.patch.gz;patch=1 \
+ file://supertux.png"
+
+export SDL_CONFIG = "${STAGING_BINDIR_CROSS}/sdl-config"
+EXTRA_OECONF = "--disable-opengl"
+
+inherit autotools sdl
diff --git a/recipes/supertux/supertux_0.1.3.bb b/recipes/supertux/supertux_0.1.3.bb
new file mode 100644
index 0000000000..f90670738a
--- /dev/null
+++ b/recipes/supertux/supertux_0.1.3.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "SuperTux is a classic 2D jump'n'run sidescroller game \
+in a style similar to the original SuperMario games."
+SECTION = "games"
+PRIORITY = "optional"
+LICENSE = "GPL"
+PR = "r1"
+
+APPIMAGE = "${WORKDIR}/supertux.png"
+APPDESKTOP = "${WORKDIR}/supertux.desktop"
+
+SRC_URI = "${SOURCEFORGE_MIRROR}/super-tux/supertux-${PV}.tar.bz2 \
+# http://ssel.vub.ac.be/Members/DennisWagelaar/download/zaurus/supertux-0.1.2-fp.patch.gz;patch=1 \
+ file://supertux.png \
+ file://supertux.desktop \
+ "
+
+export SDL_CONFIG = "${STAGING_BINDIR_CROSS}/sdl-config"
+EXTRA_OECONF = "--disable-opengl"
+
+inherit autotools sdl
+
+DEFAULT_PREFERENCE = "-1"