From 8be517484d807f9652483b680b3252940111a398 Mon Sep 17 00:00:00 2001 From: kyak Date: Sun, 13 Feb 2011 22:08:08 +0300 Subject: [PATCH] supertux: initial port Credits go to OE recipy! --- supertux/Makefile | 71 + supertux/files/img-resize.sh | 28 + .../files/supertux-smallsize-data.tar.bz2 | Bin 0 -> 41782 bytes supertux/patches/001-gp2x.patch | 2614 +++++++++++++++++ supertux/patches/002-compilation-fixes.patch | 85 + .../patches/003-install-no-overwrite.patch | 13 + .../patches/004-extra-qualification.patch | 11 + 7 files changed, 2822 insertions(+) create mode 100644 supertux/Makefile create mode 100644 supertux/files/img-resize.sh create mode 100644 supertux/files/supertux-smallsize-data.tar.bz2 create mode 100644 supertux/patches/001-gp2x.patch create mode 100644 supertux/patches/002-compilation-fixes.patch create mode 100644 supertux/patches/003-install-no-overwrite.patch create mode 100644 supertux/patches/004-extra-qualification.patch diff --git a/supertux/Makefile b/supertux/Makefile new file mode 100644 index 0000000..2806a9b --- /dev/null +++ b/supertux/Makefile @@ -0,0 +1,71 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=supertux +PKG_VERSION:=0.1.3 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=http://download.berlios.de/$(PKG_NAME)/ +PKG_MD5SUM:=f2fc288459f33d5cd8f645fbca737a63 + +include $(INCLUDE_DIR)/package.mk + +define Package/supertux + TITLE:=supertux + SECTION:=games + CATEGORY:=Games + URL:=http://supertux.lethargik.org + DEPENDS:=+libsdl +libsdl-image +libmikmod +endef + +define Package/supertux/description + SuperTux is a classic 2D jump'n run sidescroller game in a style similar to the original Super Mario games covered under the GPL. +endef + +CONFIGURE_ARGS+=--disable-opengl \ + --disable-sdltest \ + --with-sdl-prefix=$(STAGING_DIR)/usr \ + --enable-320x240 + +TARGET_LDFLAGS+=-Wl,-rpath-link=$(STAGING_DIR)/usr/lib + +define Build/Configure + ( cd $(PKG_BUILD_DIR) ; ./autogen.sh ) + $(call Build/Configure/Default) +endef + +define Build/Prepare + $(call Build/Prepare/Default) + (\ +bzip2 -dc $(FILES_DIR)/supertux-smallsize-data.tar.bz2 | $(TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xf -; \ +$(CP) $(FILES_DIR)/img-resize.sh $(PKG_BUILD_DIR); \ +cd $(PKG_BUILD_DIR); \ +for i in background shared tilesets title worldmap; do \ + echo "Converting images in ${PKG_BUILD_DIR}/data/images/$$$$i..."; \ + cd ${PKG_BUILD_DIR}/data/images/$$$$i; \ + sh ${PKG_BUILD_DIR}/img-resize.sh; \ +done; \ +) +endef + +define Package/supertux/install + $(INSTALL_DIR) \ + $(1)/usr/bin/ \ + $(1)/usr/share/supertux/{images,levels,music,sounds} \ + + $(INSTALL_BIN) \ + $(PKG_BUILD_DIR)/src/supertux \ + $(1)/usr/bin/ + + $(CP) \ + $(PKG_BUILD_DIR)/data/{images,levels,music,sounds,supertux.strf,*.txt} \ + $(1)/usr/share/supertux +endef + +$(eval $(call RequireCommand,pngcrush,Please install pngcrush.)) +$(eval $(call RequireCommand,convert,Please install imagemagick.)) +$(eval $(call BuildPackage,supertux)) diff --git a/supertux/files/img-resize.sh b/supertux/files/img-resize.sh new file mode 100644 index 0000000..523a4df --- /dev/null +++ b/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% _.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/supertux/files/supertux-smallsize-data.tar.bz2 b/supertux/files/supertux-smallsize-data.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..740e4f4473dca5ad98b0ab8ec8aee5700b4a36fb GIT binary patch literal 41782 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 literal 0 HcmV?d00001 diff --git a/supertux/patches/001-gp2x.patch b/supertux/patches/001-gp2x.patch new file mode 100644 index 0000000..9d5d9a6 --- /dev/null +++ b/supertux/patches/001-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;irefcount++; + + 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 + #include + #include +@@ -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; ix = 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 ++#endif + + /*global variable*/ + bool use_sound = true; /* handle sound on/off menu and command-line option */ +@@ -54,12 +57,21 @@ + + #include + ++#ifndef GP2X + Mix_Chunk * sounds[NUM_SOUNDS]; ++#else + +-/* --- OPEN THE AUDIO DEVICE --- */ ++#include ++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 fürn 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 (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 + + /* 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 = ""; +- 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/supertux/patches/002-compilation-fixes.patch b/supertux/patches/002-compilation-fixes.patch new file mode 100644 index 0000000..495c735 --- /dev/null +++ b/supertux/patches/002-compilation-fixes.patch @@ -0,0 +1,85 @@ +Index: supertux-0.1.3/src/badguy.cpp +=================================================================== +--- supertux-0.1.3.orig/src/badguy.cpp ++++ supertux-0.1.3/src/badguy.cpp +@@ -21,6 +21,7 @@ + // 02111-1307, USA. + + #include ++#include + #include + + #include "globals.h" +Index: supertux-0.1.3/src/configfile.cpp +=================================================================== +--- supertux-0.1.3.orig/src/configfile.cpp ++++ supertux-0.1.3/src/configfile.cpp +@@ -18,7 +18,7 @@ + // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + #include +-#include ++#include + #include "configfile.h" + #include "setup.h" + #include "globals.h" +Index: supertux-0.1.3/src/gameobjs.cpp +=================================================================== +--- supertux-0.1.3.orig/src/gameobjs.cpp ++++ supertux-0.1.3/src/gameobjs.cpp +@@ -19,6 +19,7 @@ + // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + // 02111-1307, USA. + #include ++#include + #include "world.h" + #include "tile.h" + #include "gameloop.h" +Index: supertux-0.1.3/src/particlesystem.cpp +=================================================================== +--- supertux-0.1.3.orig/src/particlesystem.cpp ++++ supertux-0.1.3/src/particlesystem.cpp +@@ -20,6 +20,7 @@ + #include "particlesystem.h" + + #include ++#include + #include + #include "globals.h" + #include "world.h" +Index: supertux-0.1.3/src/sprite_manager.cpp +=================================================================== +--- supertux-0.1.3.orig/src/sprite_manager.cpp ++++ supertux-0.1.3/src/sprite_manager.cpp +@@ -18,6 +18,7 @@ + // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + #include ++#include + #include "lispreader.h" + #include "sprite_manager.h" + +Index: supertux-0.1.3/src/tile.cpp +=================================================================== +--- supertux-0.1.3.orig/src/tile.cpp ++++ supertux-0.1.3/src/tile.cpp +@@ -21,6 +21,7 @@ + #include "tile.h" + #include "scene.h" + #include "assert.h" ++#include + + TileManager* TileManager::instance_ = 0; + std::set* TileManager::tilegroups_ = 0; +Index: supertux-0.1.3/src/worldmap.cpp +=================================================================== +--- supertux-0.1.3.orig/src/worldmap.cpp ++++ supertux-0.1.3/src/worldmap.cpp +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include "globals.h" diff --git a/supertux/patches/003-install-no-overwrite.patch b/supertux/patches/003-install-no-overwrite.patch new file mode 100644 index 0000000..41e4486 --- /dev/null +++ b/supertux/patches/003-install-no-overwrite.patch @@ -0,0 +1,13 @@ +Index: supertux-0.1.3/data/Makefile.am +=================================================================== +--- supertux-0.1.3.orig/data/Makefile.am 2010-07-04 22:53:15.209949507 +0200 ++++ supertux-0.1.3/data/Makefile.am 2010-07-04 22:53:51.490637559 +0200 +@@ -2,8 +2,6 @@ + supertux.strf \ + $(wildcard *.txt) \ + CREDITS \ +- $(wildcard sounds/*.wav) \ +- images/icon.xpm \ + $(wildcard images/*.png) \ + $(wildcard images/*.xpm) \ + $(wildcard images/background/*.png) \ diff --git a/supertux/patches/004-extra-qualification.patch b/supertux/patches/004-extra-qualification.patch new file mode 100644 index 0000000..c4ad20f --- /dev/null +++ b/supertux/patches/004-extra-qualification.patch @@ -0,0 +1,11 @@ +--- supertux-0.1.3/src/menu.h 2011-02-13 21:26:19.427185060 +0300 ++++ supertux-0.1.3_320/src/menu.h 2011-02-13 21:30:06.936066603 +0300 +@@ -207,7 +207,7 @@ + + bool isToggled(int id); + +- void Menu::get_controlfield_key_into_input(MenuItem *item); ++ void get_controlfield_key_into_input(MenuItem *item); + + void draw (); + void draw_item(int index, int menu_width, int menu_height);