alex4 (1.1-3) debian-dir only changes

Summary

 debian/alex4-data.install                   |    1 
 debian/alex4.6                              |  182 ++++++
 debian/alex4.desktop                        |    9 
 debian/alex4.install                        |    3 
 debian/alex4.xpm                            |   45 +
 debian/changelog                            |   36 +
 debian/compat                               |    1 
 debian/control                              |   27 
 debian/copyright                            |   40 +
 debian/docs                                 |    1 
 debian/menu                                 |    3 
 debian/patches/allegro-4.2.patch            |  295 ++++++++++
 debian/patches/dot-files-endian-clean.patch |  102 +++
 debian/patches/fsf-address.patch            |   17 
 debian/patches/save-some-cpu-cycles.patch   |  253 +++++++++
 debian/patches/series                       |    5 
 debian/patches/unix-port.patch              |  775 ++++++++++++++++++++++++++++
 debian/rules                                |   86 +++
 debian/watch                                |    5 
 19 files changed, 1886 insertions(+)

    
download this patch

Patch contents

--- alex4-1.1.orig/debian/copyright
+++ alex4-1.1/debian/copyright
@@ -0,0 +1,40 @@
+This package was debianized by Peter De Wachter <pdewacht@gmail.com> on
+Sat, 19 Jan 2008 19:26:51 +0100.
+
+It was downloaded from: http://allegator.sourceforge.net/
+
+Upstream Authors:
+
+    Johan Peitz (design, source code and graphics)
+    Anders Svensson (music and sound effects)
+    Contact address: info@freelunchdesign.com
+
+Copyright:
+
+    Copyright © 2003 Johan Peitz, Free Lunch Design
+
+License:
+
+    This source code is free; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This source code is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied
+    warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+    PURPOSE. See the GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+    02110-1301, USA.
+
+
+On Debian systems the complete text of version 2 of the GNU General
+Public License can be found in the file `/usr/share/common-licenses/GPL-2'.
+
+
+The Debian packaging is Copyright 2008 Peter De Wachter
+<pdewacht@gmail.com> and is licensed under the same license as the
+program, see above.
--- alex4-1.1.orig/debian/rules
+++ alex4-1.1/debian/rules
@@ -0,0 +1,86 @@
+#!/usr/bin/make -f
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+CFLAGS = -Wall -g $(if $(findstring noopt,$(DEB_BUILD_OPTIONS)), -O0, -O2)
+
+
+patch: patch-stamp
+patch-stamp:
+	dh_testdir
+	$(MAKE) -f /usr/share/quilt/quilt.make patch
+	touch $@
+
+
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp: patch-stamp
+	$(MAKE) -C src CFLAGS="$(CFLAGS)" \
+		PREFIX=/usr DATADIR=/usr/share/games/alex4
+	touch $@
+
+build-indep:
+# nothing to do here
+
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-arch-stamp build-indep-stamp patch-stamp
+	[ ! -f src/Makefile ] || $(MAKE) -C src clean
+	$(MAKE) -f /usr/share/quilt/quilt.make unpatch
+	dh_clean
+
+
+install: install-indep install-arch
+
+install-indep: build-indep
+	dh_testdir
+	dh_testroot
+	dh_clean -k -i
+	dh_installdirs -i
+	dh_install -i
+
+install-arch: build-arch
+	dh_testdir
+	dh_testroot
+	dh_clean -k -a
+	dh_installdirs -a
+	dh_install -a
+
+
+binary: binary-arch binary-indep
+
+binary-indep: build-indep install-indep
+	dh_testdir -i
+	dh_testroot -i
+	dh_installchangelogs -i
+	dh_installdocs -i
+	dh_compress -i
+	dh_fixperms -i
+	dh_installdeb -i
+	dh_gencontrol -i
+	dh_md5sums -i
+	dh_builddeb -i
+
+binary-arch: build-arch install-arch
+	dh_testdir -a
+	dh_testroot -a
+	dh_installchangelogs -a
+	dh_installdocs -a
+	dh_installmenu -a
+	dh_installman -a debian/alex4.6
+	dh_strip -a
+	dh_compress -a
+	dh_fixperms -a
+	dh_installdeb -a
+	dh_shlibdeps -a
+	dh_gencontrol -a
+	dh_md5sums -a
+	dh_builddeb -a
+
+
+.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch patch
--- alex4-1.1.orig/debian/alex4-data.install
+++ alex4-1.1/debian/alex4-data.install
@@ -0,0 +1 @@
+data/*.dat usr/share/games/alex4/
--- alex4-1.1.orig/debian/compat
+++ alex4-1.1/debian/compat
@@ -0,0 +1 @@
+5
--- alex4-1.1.orig/debian/alex4.xpm
+++ alex4-1.1/debian/alex4.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *alex4[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c gray3",
+". c #181818",
+"X c #486128",
+"o c #597934",
+"O c #A5C67D",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@  @@@  @@@@@@@@@@",
+"@@@@@@@@@@@@@@ ++ @ ++ @@@@@@@@@",
+"@@@@@@@@@@@@@  +    +  @@@@   @@",
+"@@@@@@@@@@@@ Xo  ooX       ooX @",
+"@@@@@@@@@@@ Xo ooooooooooooooo @",
+"@@@@@@@@@@@ ooo                @",
+"@@@@@@@@@@ XoooooooooooooooooX @",
+"@@@@@@@@@@ oooooO             @@",
+"@@@@@@@@@@ ooooO @@@@@@@@@@@@@@@",
+"@@@@@@@@@@ ooooO @@@@@@@@@@@@@@@",
+"@@@@@@@@@@ Xoo oO @@@@@@@@@@@@@@",
+"@@@@@@@@@@@ Xoo    @@@@@@@@@@@@@",
+"@@@@@@@@@@@ X ooooo @@@@@@@@@@@@",
+"@@@@@@@@@@@ oX    o @@@@@@@@@@@@",
+"@@@@@@@@@@@ oooOO  @@@@@@@@@@@@@",
+"@@@@@ @@@@@ oooOO @@@@@@@@@@@@@@",
+"@@@@ X @@@@ oooOO @@@@@@@@@@@@@@",
+"@@@@ X @@@ Xooo O @@@@@@@@@@@@@@",
+"@@@@ Xo @@  ooX O @@@@@@@@@@@@@@",
+"@@@@ OXo  X oo O @@@@@@@@@@@@@@@",
+"@@@@@ OX XoooX   @@@@@@@@@@@@@@@",
+"@@@@@@ O oo    XX @  @@@@@@@@@@@",
+"@@@@@@@  Xoo  @ XX XX @@@@@@@@@@",
+"@@@@@@@@  Xoo  XXXXX @@@@@@@@@@@",
+"@@@@@@@@@     @     @@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
--- alex4-1.1.orig/debian/control
+++ alex4-1.1/debian/control
@@ -0,0 +1,27 @@
+Source: alex4
+Section: games
+Priority: optional
+Maintainer: Debian Games Team <pkg-games-devel@lists.alioth.debian.org>
+Uploaders: Peter De Wachter <pdewacht@gmail.com>
+Build-Depends: debhelper (>= 5), quilt, liballegro4.2-dev (>= 2:4.2.2-2), libdumb1-dev, libaldmb1-dev
+Standards-Version: 3.8.1
+Homepage: http://allegator.sourceforge.net/
+Vcs-Svn: svn://svn.debian.org/svn/pkg-games/packages/trunk/alex4/
+Vcs-Browser: http://svn.debian.org/viewsvn/pkg-games/packages/trunk/alex4/
+
+Package: alex4
+Architecture: any
+Depends: alex4-data (= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}
+Description: Alex the Allegator 4 - a retro platform game
+ Guide Alex the Allegator through the jungle in order to save his
+ girlfriend Lola from evil humans who want to make a pair of shoes out
+ of her. Plenty of classic platforming in four nice colors guaranteed!
+ .
+ The game includes a built-in editor so you can design and share your
+ own maps.
+
+Package: alex4-data
+Architecture: all
+Description: Alex the Allegator 4 - game data
+ This package contains data files required by the game Alex the Allegator 4.
+ 
--- alex4-1.1.orig/debian/alex4.desktop
+++ alex4-1.1/debian/alex4.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Name=Alex the Allegator 4
+Comment=Retro platform game
+Icon=alex4
+Exec=alex4
+Terminal=false
+Categories=Game;ActionGame;
+StartupNotify=false
--- alex4-1.1.orig/debian/docs
+++ alex4-1.1/debian/docs
@@ -0,0 +1 @@
+readme.txt
--- alex4-1.1.orig/debian/alex4.6
+++ alex4-1.1/debian/alex4.6
@@ -0,0 +1,182 @@
+.\" Copyright 2008 Peter De Wachter <pdewacht@gmail.com>
+.\"
+.\" This is free documentation; you can redistribute it and/or
+.\" modify it under the terms of the GNU General Public License
+.\" version 2 as published by the Free Software Foundation.
+.\"
+.\" The GNU General Public License's references to "object code"
+.\" and "executables" are to be interpreted as the output of any
+.\" document formatting or typesetting system, including
+.\" intermediate and printed output.
+.\"
+.\" This manual is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public
+.\" License along with this manual; if not, write to the Free
+.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+.\" MA 02110-1301, USA.
+.
+.\" URL macro recipe from Branden Robinson's presentation
+.de URL
+\\$2 \(laURL: \\$1 \(ra\\$3
+..
+.if \n[.g] .mso www.tmac
+.\" End of recipe.
+.
+.TH alex4 6 "2008-02-07"
+.\" Please adjust this date whenever revising the manpage.
+.
+.SH "NAME"
+.
+alex4 \- Alex the Allegator 4, a retro platform game
+.
+.SH "SYNOPSIS"
+.
+.B alex4
+.RI [ "gamefile" ]
+.
+.SH "DESCRIPTION"
+.
+Guide Alex the Allegator through the jungle in order to save his
+girlfriend Lola from evil humans who want to make a pair of shoes out
+of her.
+.PP
+Alex the Allegator 4 is a platform game in the style of old Gameboy
+games.
+You can play the game with a keyboard or a joystick.
+On the keyboard the following keys are used:
+.IP "Arrow keys" 13
+Movement
+.IP "Alt"
+Jump
+.IP "Control"
+Shoot (only when you've found eggs to fire!)
+.
+.PP
+When you're on the menu screen, you can choose the window size with
+the following keys:
+.IP "1" 5
+160x120 window
+.IP "2"
+320x240 window
+.IP "3"
+640x480 window
+.IP "4"
+full-screen
+.
+.SH "CUSTOM MAPS"
+.
+The Alex the Allegator homepage links to many user-contributed maps.
+Each set should contain several ".map" files and a text file
+describing the collection.
+To play the maps, simply start alex4 with the name of the text file
+as argument.
+.PP
+If you want to create your own maps, you can use the built-in map 
+editor (described below),
+but you'll need to create the description file yourself.
+This is a plain text file that needs to list the file names of your maps
+between "#start#" and "#end#" markers (these markers are not optional).
+You can include a description of the maps outside these markers.
+For example, for a collection of three maps:
+.RS
+.PP
+In this game, Alex must rescue the Yellow Tetris Piece from the
+pirates of Ching Shih.
+.br
+#start#
+.br
+journey.map
+.br
+sea-of-despair.map
+.br
+endgame.map
+.br
+#end#
+.RE
+.
+.SH "USING THE MAP EDITOR"
+.
+Use the map editor to create your own maps.
+You can enter the map editor from the menu screen or by pressing F1
+while playing a custom map.
+The basic editor commands are:
+.IP "Shift+L" 20
+load an existing map
+.IP "Shift+S"
+save the map
+.IP "Insert+Left/Right"
+widen the map
+.IP "Delete+Left/Right"
+shorten the map
+.IP "F1"
+change the map's properties, e.g. its name.
+.PP
+Maps are composed of tiles.
+Tiles can contain scenery, enemies, items and other game objects.
+The mouse cursor shows the currently selected tile.
+To draw tiles, use the left mouse button.
+You can cycle through the available tiles by using the z and x keys,
+choose a tile from a palette using the p key,
+or pick a tile from the screen using the right mouse button.
+.PP
+Tiles can be given special behavior using the following commands:
+.IP "q" 10
+instant death
+.IP "w"
+map exit
+.IP "e"
+roll activator
+.IP "r"
+breakable block
+.IP "t"
+submerged in water
+.IP "y"
+on the water surface
+.IP "a"
+Alex' start location (facing left)
+.IP "Shift+A"
+Alex' start location (facing right)
+.
+.PP
+Use the following command to place items and enemies:
+.IP "1" 10
+extra life
+.IP "2"
+star bonus
+.IP "3"
+cherry bonus
+.IP "4"
+egg
+.IP "5"
+extra heart
+.IP "Shift+Q"
+grunt
+.IP "Shift+W"
+spear grunt
+.IP "Shift+E"
+crusher
+.IP "Shift+R"
+spike fish
+.IP "Shift+T"
+jellyfish
+.IP "Shift+Y"
+cannon
+.IP "Shift+U"
+spike truck boss
+.IP "Shift+I"
+ground pounder boss
+.
+.SH "SEE ALSO"
+.
+.URL "http://allegator.sourceforge.net/" "The Alex the Allegator series homepage" ""
+.
+.SH "AUTHOR"
+.
+Alex the Allegator 4 was written by Johan Peitz, Free Lunch Design.
+.PP
+This manual page was written by Peter De Wachter <pdewacht@gmail.com>,
+for the Debian project (but may be used by others).
--- alex4-1.1.orig/debian/changelog
+++ alex4-1.1/debian/changelog
@@ -0,0 +1,36 @@
+alex4 (1.1-3) unstable; urgency=low
+
+  [ Paul Wise ]
+  * Add a watch file explaining the upstream status
+
+  [ Peter De Wachter ]
+  * Honor the HOME environment variable. (Closes: #507950) 
+  * Applied a patch to bring down the game's CPU usage to a more reasonable
+    level. This limits the frame rate to 50Hz (the speed of the game logic).
+    This also fixes a bug that made the level selection screen unresponsive
+    on some systems.
+  * Bump Standards-Version to 3.8.1:
+     - Renamed 'configure' target to 'patch'.
+  * Rename from-fedora.patch to unix-port.patch
+  * Refresh debian/copyright
+  * rules: clean up
+
+  [ Gonéri Le Bouder ]
+  * Complet Peter changelog part 
+
+ -- Gonéri Le Bouder <goneri@rulezlan.org>  Sun, 07 Jun 2009 16:43:48 +0200
+
+alex4 (1.1-2) unstable; urgency=low
+
+  * Build-Depend on liballegro4.2-dev >= 4.2.2-2
+     - which has a versioned shlibs file (Closes: #467526)
+     - allegro-config no longer tells us to link against unneeded libraries.
+
+ -- Peter De Wachter <pdewacht@gmail.com>  Wed, 19 Mar 2008 00:03:46 +0100
+
+alex4 (1.1-1) unstable; urgency=low
+
+  * Initial release (Closes: #463033)
+
+ -- Peter De Wachter <pdewacht@gmail.com>  Sat, 19 Jan 2008 19:26:51 +0100
+
--- alex4-1.1.orig/debian/watch
+++ alex4-1.1/debian/watch
@@ -0,0 +1,5 @@
+# Upstream doesn't use versioned tarballs and hasn't released alex4 twice:
+# http://downloads.sourceforge.net/allegator/alex4src_data.zip
+#
+# Upstream has been requested to use versioned tarballs: 
+# http://sf.net/support/tracker.php?aid=2551938
--- alex4-1.1.orig/debian/menu
+++ alex4-1.1/debian/menu
@@ -0,0 +1,3 @@
+?package(alex4):needs="X11" section="Games/Action" \
+  title="Alex the Allegator 4" command="/usr/games/alex4" \
+  icon="/usr/share/pixmaps/alex4.xpm"
--- alex4-1.1.orig/debian/alex4.install
+++ alex4-1.1/debian/alex4.install
@@ -0,0 +1,3 @@
+src/alex4 usr/games/
+debian/*.xpm /usr/share/pixmaps/
+debian/*.desktop /usr/share/applications/
--- alex4-1.1.orig/debian/patches/unix-port.patch
+++ alex4-1.1/debian/patches/unix-port.patch
@@ -0,0 +1,775 @@
+Based on Hans de Goede's patch for Fedora. 
+
+--- a/src/main.c
++++ b/src/main.c
+@@ -38,6 +38,7 @@
+ #include "main.h"
+ #include "edit.h"
+ #include "shooter.h"
++#include "unix.h"
+ 
+ #include "../data/data.h"
+ 
+@@ -66,7 +67,6 @@
+ Tscroller hscroll;
+ Thisc *hisc_table;
+ Thisc *hisc_table_space;
+-char working_directory[1024];
+ 
+ // the map
+ Tmap *map = NULL;
+@@ -126,6 +126,7 @@
+ int playing_original_game = 1;
+ int init_ok = 0;
+ 
++static FILE* log_fp = NULL;
+ 
+ 
+ // // // // // // // // // // // // // // // // // // // // // 
+@@ -154,20 +155,18 @@
+ // loggs the text to the text file
+ void log2file(char *format, ...) {
+ 	va_list ptr; /* get an arg pointer */
+- 	FILE *fp;
+ 	
+-	fp = fopen("log.txt", "at");
+-	if (fp) {
++	if (log_fp) {
+ 		/* initialize ptr to point to the first argument after the format string */
+ 		va_start(ptr, format);
+  
+ 		/* Write to logfile. */
+-		vfprintf(fp, format, ptr); // Write passed text.
+-		fprintf(fp, "\n"); // New line..
++		vfprintf(log_fp, format, ptr); // Write passed text.
++		fprintf(log_fp, "\n"); // New line..
+  
+ 		va_end(ptr);
+  
+-		fclose(fp);
++		fflush(log_fp);
+ 	}
+ 
+ }
+@@ -618,6 +617,10 @@
+ 	BITMAP *bmp;
+ 	int i;
+ 	int w, h;
++#ifdef __unix__   
++	char filename[512];
++	char *homedir = get_homedir();
++#endif 	
+ 
+ 	log2file("\nInit routines:");
+ 
+@@ -625,7 +628,13 @@
+ 	log2file(" initializing allegro");
+ 	text_mode(-1);
+ 	garble_string(init_string, 53);
++#ifdef __unix__
++	snprintf(filename, sizeof(filename), "%s/.alex4/alex4.ini",
++		homedir? homedir:".");
++	override_config_file(filename);
++#else
+ 	set_config_file("alex4.ini");
++#endif
+ 	set_window_close_button(FALSE);
+ 	
+ 	// install timers
+@@ -695,6 +704,7 @@
+ 	textout_centre(swap_screen, font, "loading...", 320, 200, 1);
+ 	blit_to_screen(swap_screen);
+ 
++#ifndef __unix__
+ 	// set switch modes and callbacks
+ 	if (set_display_switch_mode(SWITCH_PAUSE) < 0)
+ 		log2file("  * display switch mode failed");
+@@ -702,6 +712,7 @@
+ 		log2file("  * display switch in failed");
+ 	if (set_display_switch_callback(SWITCH_OUT, display_switch_out) < 0)
+ 		log2file("  * display switch out failed");
++#endif
+ 
+ 
+ 	// set win title (no! really???)
+@@ -718,7 +729,7 @@
+ 	// load data
+ 	log2file(" loading data");
+ 	packfile_password(init_string);
+-	data = load_datafile("data/data.dat");
++	data = load_datafile(DATADIR "data.dat");
+ 	packfile_password(NULL);
+ 	if (data == NULL) {
+     	log2file("  *** failed");
+@@ -728,7 +739,13 @@
+ 
+ 	// load options
+ 	log2file(" loading options");
++#ifdef __unix__
++	snprintf(filename, sizeof(filename), "%s/.alex4/alex4.sav",
++		homedir? homedir:".");
++	pf = pack_fopen(filename, "rp");
++#else
+ 	pf = pack_fopen("alex4.sav", "rp");
++#endif
+ 	if (pf) {
+ 		load_options(&options, pf);
+ 		pack_fclose(pf);
+@@ -740,7 +757,13 @@
+ 
+ 	// loading highscores
+ 	log2file(" loading hiscores");
++#ifdef __unix__
++	snprintf(filename, sizeof(filename), "%s/.alex4/alex4.hi",
++		homedir? homedir:".");
++	pf = pack_fopen(filename, "rp");
++#else
+ 	pf = pack_fopen("alex4.hi", "rp");
++#endif
+ 	if (pf) {
+ 		load_hisc_table(hisc_table, pf);
+ 		load_hisc_table(hisc_table_space, pf);
+@@ -776,7 +799,7 @@
+ 		log2file(" loading original maps");
+ 		packfile_password(init_string);
+ 		num_levels = -1;  // skip end object when counting
+-		maps = load_datafile_callback("data/maps.dat", count_maps_callback);
++		maps = load_datafile_callback(DATADIR "maps.dat", count_maps_callback);
+ 		packfile_password(NULL);
+ 		if (maps == NULL) {
+ 	    	log2file("  *** failed");
+@@ -835,11 +858,12 @@
+ 	// install sound
+ 	log2file(" installing sound");
+    	set_volume_per_voice(0);
+-	switch(get_config_int("sound", "sound_device", 0)) {
++	switch(get_config_int("sound", "sound_device", 1)) {
+ 		case 1:
+ 			i = DIGI_AUTODETECT;
+ 			log2file("  DIGI_AUTODETECT selected (%d)", i);
+ 			break;
++#ifdef ALLEGRO_WINDOWS
+ 		case 2:
+ 			i = DIGI_DIRECTX(0);
+ 			log2file("  DIGI_DIRECTX(0) selected (%d)", i);
+@@ -848,6 +872,20 @@
+ 			i = DIGI_DIRECTAMX(0);
+ 			log2file("  DIGI_DIRECTAMX(0) selected (%d)", i);
+ 			break;
++#elif defined ALLEGRO_UNIX
++#ifdef DIGI_OSS
++		case 2:
++			i = DIGI_OSS;
++			log2file("  DIGI_OSS selected (%d)", i);
++			break;
++#endif
++#ifdef DIGI_ALSA
++		case 3:
++			i = DIGI_ALSA;
++			log2file("  DIGI_ALSA selected (%d)", i);
++			break;
++#endif
++#endif
+ 		default:
+ 			i = -770405;	// dummy number
+ 			got_sound = 0;
+@@ -870,9 +908,9 @@
+ 		if (get_config_int("sound", "use_sound_datafile", 1)) {
+ 			log2file(" loading sound datafile");
+ 			packfile_password(init_string);
+-			sfx_data = load_datafile("data/sfx_44.dat");
++			sfx_data = load_datafile(DATADIR "sfx_44.dat");
+ 			if (sfx_data == NULL) {
+-				sfx_data = load_datafile("data/sfx_22.dat");
++				sfx_data = load_datafile(DATADIR "sfx_22.dat");
+ 				log2file("  sfx_44.dat not found");
+ 				s = 0;
+ 			}
+@@ -971,6 +1009,10 @@
+ void uninit_game() {
+ 	int i;
+ 	PACKFILE *pf;
++#ifdef __unix__   
++	char filename[512];
++	char *homedir = get_homedir();
++#endif 	
+ 
+ 	log2file("\nExit routines:");
+ 
+@@ -989,14 +1031,26 @@
+ 	// only save if everything was inited ok!
+ 	if (init_ok) {
+ 		log2file(" saving options");
++#ifdef __unix__
++		snprintf(filename, sizeof(filename), "%s/.alex4/alex4.sav",
++			homedir? homedir:".");
++		pf = pack_fopen(filename, "wp");
++#else
+ 		pf = pack_fopen("alex4.sav", "wp");
++#endif
+ 		if (pf) {
+ 			save_options(&options, pf);
+ 			pack_fclose(pf);
+ 		}
+ 		
+ 		log2file(" saving highscores");
++#ifdef __unix__
++		snprintf(filename, sizeof(filename), "%s/.alex4/alex4.hi",
++			homedir? homedir:".");
++		pf = pack_fopen(filename, "wp");
++#else
+ 		pf = pack_fopen("alex4.hi", "wp");
++#endif
+ 		if (pf) {
+ 			save_hisc_table(hisc_table, pf);
+ 			save_hisc_table(hisc_table_space, pf);
+@@ -1289,7 +1343,7 @@
+ 			// poll music machine
+ 			if (got_sound) al_poll_duh(dp);
+ 
+-			if (mode == 1 && (keypressed() || is_fire(&ctrl) || is_jump(&ctrl) ) || my_counter > 200) {
++			if (((mode == 1) && (keypressed() || is_fire(&ctrl) || is_jump(&ctrl))) || (my_counter > 200)) {
+ 				mode = 2;
+ 			}
+ 			
+@@ -1343,7 +1397,7 @@
+ 	if (space) {
+ 		// get space bg
+ 		packfile_password(init_string);
+-		df = load_datafile_object("data/a45.dat", "BG1");
++		df = load_datafile_object(DATADIR "a45.dat", "BG1");
+ 		packfile_password(NULL);
+ 		if (df != NULL)	{
+ 			bg = df->dat;
+@@ -2149,7 +2203,7 @@
+ 
+ // calculates camera pos for map m considering player p
+ void calculate_camera_pos(Tplayer *p, Tmap *m) {
+-	static camera_type = 1;
++	static int camera_type = 1;
+ 
+ 	if (p->actor->status == AC_BALL) {
+ 		camera_type = 2;
+@@ -2841,6 +2895,10 @@
+ 			}
+ 			else {
+ 				PACKFILE *pf;
++#ifdef __unix__   
++				char filename[512];
++				char *homedir = get_homedir();
++#endif 	
+ 				log2file(" level complete");
+ 				if (got_sound) stop_music();
+ 				if (level < MAX_LEVELS && playing_original_game) {
+@@ -2875,7 +2933,14 @@
+ 
+ 				// save options
+ 				log2file(" saving options");
++#ifdef __unix__
++				snprintf(filename, sizeof(filename),
++					"%s/.alex4/alex4.sav",
++					homedir? homedir:".");
++				pf = pack_fopen(filename, "wp");
++#else
+ 				pf = pack_fopen("alex4.sav", "wp");
++#endif
+ 				if (pf) {
+ 					save_options(&options, pf);
+ 					pack_fclose(pf);
+@@ -2969,24 +3034,36 @@
+ 
+ // main
+ int main(int argc, char **argv) {   
+-	FILE *fp;
+ 	int i;
+ 	char full_path[1024];
++#ifndef __unix__   
++	char working_directory[1024];
++#else
++	char *homedir = get_homedir();
++#endif
+ 
+ 	// init allegro
+ 	allegro_init();
+ 
++#ifdef __unix__
++	// start logfile
++	snprintf(full_path, sizeof(full_path), "%s/.alex4",
++		homedir? homedir:".");
++	check_and_create_dir(full_path);
++	snprintf(full_path, sizeof(full_path), "%s/.alex4/log.txt",
++		homedir? homedir:".");
++	log_fp = fopen(full_path, "wt");
++#else
+ 	// get working directory
+ 	get_executable_name(full_path, 1024);
+ 	replace_filename(working_directory, full_path, "", 1024);
+ 	chdir(working_directory);
+ 
+-
+ 	// start logfile
+-	fp = fopen("log.txt", "wt");
+-	if (fp) {
+-		fprintf(fp, "Alex 4 (%s) - log file\n-------------------\n", GAME_VERSION_STR);
+-		fclose(fp);
++	log_fp = fopen("log.txt", "wt");
++#endif
++	if (log_fp) {
++		fprintf(log_fp, "Alex 4 (%s) - log file\n-------------------\n", GAME_VERSION_STR);
+ 	}
+ 
+ 	// log program arguments
+@@ -2994,7 +3071,9 @@
+ 	for(i = 0; i < argc; i ++) {
+ 		log2file("   %s", argv[i]);
+ 	}
++#ifndef __unix__
+ 	log2file("Working directory is:\n   %s", working_directory);
++#endif
+ 
+ 	// test wether to play real game
+ 	// or custom levels
+@@ -3022,6 +3101,8 @@
+ 	uninit_game();
+ 	allegro_exit();
+ 	log2file("\nDone...\n");
++	if (log_fp)
++		fclose(log_fp);
+ 
+ 	return 0;
+ } END_OF_MAIN(); 
+--- a/src/player.h
++++ b/src/player.h
+@@ -60,4 +60,4 @@
+ void wound_player(Tplayer *p);
+ void kill_player(Tplayer *p);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/map.h
++++ b/src/map.h
+@@ -111,4 +111,4 @@
+ 
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- /dev/null
++++ b/src/unix.c
+@@ -0,0 +1,87 @@
++#ifdef __unix__
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <pwd.h>
++#include <errno.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#if defined(__DECC) && defined(VMS)
++#include <unixlib.h>
++static char *vms_to_unix_buffer = NULL;
++static int convert_vms_to_unix(char *vms_dir_name)
++{
++	vms_to_unix_buffer = vms_dir_name;
++}
++#endif
++
++char *get_homedir(void)
++{
++	struct passwd *pw;
++	char *home;
++
++	home = getenv("HOME");
++	if (home)
++		return home;
++
++	if (!(pw = getpwuid(getuid())))
++	{
++		fprintf(stderr, "Who are you? Not found in passwd database!!\n");
++		return NULL;
++	}
++
++#if defined(__DECC) && defined(VMS)
++	/* Convert The OpenVMS Formatted "$HOME" Directory Path Into Unix
++	   Format. */
++	decc$from_vms(pw->pw_dir, convert_vms_to_unix, 1);
++	return vms_to_unix_buffer;
++#else
++	return pw->pw_dir;
++#endif
++}
++//-----------------------------------------------------------------------------
++int check_and_create_dir(const char *name)
++{
++	struct stat stat_buffer;
++
++	if (stat(name, &stat_buffer))
++	{
++		/* error check if it doesn't exist or something else is wrong */
++		if (errno == ENOENT)
++		{
++			/* doesn't exist letts create it ;) */
++#ifdef BSD43
++			if (mkdir(name, 0775))
++#else
++				if (mkdir(name, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH))
++#endif
++				{
++					fprintf(stderr, "Error creating dir %s", name);
++					perror(" ");
++					return -1;
++				}
++		}
++		else
++		{
++			/* something else went wrong yell about it */
++			fprintf(stderr, "Error opening %s", name);
++			perror(" ");
++			return -1;
++		}
++	}
++	else
++	{
++		/* file exists check it's a dir otherwise yell about it */
++#ifdef BSD43
++		if (!(S_IFDIR & stat_buffer.st_mode))
++#else
++			if (!S_ISDIR(stat_buffer.st_mode))
++#endif
++			{
++				fprintf(stderr,"Error %s exists but isn't a dir\n", name);
++				return -1;
++			}
++	}
++	return 0;
++}
++#endif
+--- /dev/null
++++ b/src/Makefile
+@@ -0,0 +1,24 @@
++PREFIX  = /usr/local
++DATADIR = $(PREFIX)/share/$(TARGET)
++CFLAGS  = -g -Wall -Wno-deprecated-declarations -O2
++LDFLAGS = `allegro-config --libs` -laldmb -ldumb
++DEFINES = -DDATADIR=\"$(DATADIR)/\"
++OBJS    =  actor.o    edit.o  map.o       player.o    shooter.o unix.o \
++           bullet.o   hisc.o  options.o   script.o    timer.o          \
++           control.o  main.o  particle.o  scroller.o  token.o
++TARGET  = alex4
++
++$(TARGET): $(OBJS)
++	$(CC) $(LDFLAGS) -o $@ $^
++
++%.o: %.c
++	$(CC) $(CFLAGS) $(DEFINES) -o $@ -c $<
++
++install: $(TARGET)
++	mkdir -p $(PREFIX)/bin
++	mkdir -p $(DATADIR)
++	install -p -m 755 $(TARGET) $(PREFIX)/bin
++	install -p -m 644 ../data/*.dat $(DATADIR)
++
++clean:
++	rm -f $(OBJS) $(TARGET) *~
+--- a/src/token.h
++++ b/src/token.h
+@@ -41,4 +41,4 @@
+ Ttoken *tokenize(char *str);
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/shooter.c
++++ b/src/shooter.c
+@@ -1372,7 +1372,7 @@
+ 	// load data
+ 	log2file(" loading shooter data");
+ 	packfile_password(get_init_string());
+-	s_data = load_datafile("data/a45.dat");
++	s_data = load_datafile(DATADIR "a45.dat");
+ 	if (!s_data) {
+ 		log2file(" *** failed");
+ 		return -1;
+--- a/src/particle.h
++++ b/src/particle.h
+@@ -54,4 +54,4 @@
+ void update_particle_with_map(Tparticle *p, Tmap *m);
+ void create_burst(Tparticle *ps, int x, int y, int spread, int num, int life, int bmp);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- /dev/null
++++ b/src/unix.h
+@@ -0,0 +1,6 @@
++#ifdef __unix__
++
++char *get_homedir();
++int check_and_create_dir(const char *name);
++
++#endif
+--- a/src/scroller.h
++++ b/src/scroller.h
+@@ -51,4 +51,4 @@
+ 
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/map.c
++++ b/src/map.c
+@@ -24,6 +24,7 @@
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <string.h>
++#include <endian.h>
+ #include "allegro.h"
+ #include "map.h"
+ #include "timer.h"
+@@ -64,7 +65,41 @@
+ 
+ 	return m;
+ }
+-	
++
++static void mem_to_int(int *dest, unsigned char *mem)
++{
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++	memcpy(dest, mem, 4);
++#else
++	*dest = mem[0] | (((int)mem[1]) << 8) | (((int)mem[2]) << 16) |
++		(((int)mem[3]) << 24);
++#endif
++}
++
++static void fread_int(int *dest, FILE *fp)
++{
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++	fread(dest, 4, 1, fp);
++#else
++	unsigned char buf[4];
++	fread(buf, 1, 4, fp);
++	mem_to_int(dest, buf);
++#endif
++}
++
++static void fwrite_int(const int *src, FILE *fp)
++{
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++	fwrite(src, 4, 1, fp);
++#else
++	unsigned char buf[4];
++	buf[0] = *src;
++	buf[1] = *src >> 8;
++	buf[2] = *src >> 16;
++	buf[3] = *src >> 24;
++	fwrite(buf, 1, 4, fp);
++#endif
++}
+ 
+ // loads one splendind map from disk
+ Tmap *load_map(char *fname) {
+@@ -93,7 +128,19 @@
+ 	}
+ 	
+ 	// read datastruct
+-	fread(m, sizeof(Tmap), 1, fp);
++	// a mapfile contain a raw dump of the Tmap struct made on an i386
++	// the code below reads these struct dumps in an arch neutral manner
++	// Note this dumps contains pointers, these are not used because these
++	// ofcourse point to some no longer valid address.
++	fread(m, 64, 1, fp);             // first 64 bytes data
++	fread_int(&(m->width), fp);
++	fread_int(&(m->height), fp);
++	fread(header, 4, 1, fp);         // skip the first pointer
++	fread_int(&(m->offset_x), fp);
++	fread_int(&(m->offset_y), fp);
++	fread(header, 4, 1, fp);         // skip the second pointer
++	fread_int(&(m->start_x), fp);
++	fread_int(&(m->start_y), fp);
+ 
+ 	// read map data
+ 	m->dat = malloc(m->width * m->height * sizeof(Tmappos));
+@@ -116,8 +163,8 @@
+ // loads one splendind map from memory
+ Tmap *load_map_from_memory(void *mem) {
+ 	Tmap *m;
+-	char header[6];
+-    char *c = (char *)mem;
++	unsigned char header[6];
++	unsigned char *c = (unsigned char *)mem;
+ 
+ 	
+ 	// does the header match?
+@@ -137,9 +184,19 @@
+ 	}
+ 	
+ 	// read datastruct
+-	// fread(m, sizeof(Tmap), 1, fp);
+-	memcpy(m, c, sizeof(Tmap));
+-    c += sizeof(Tmap);
++	// a mapfile contain a raw dump of the Tmap struct made on an i386
++	// the code below reads these struct dumps in an arch neutral manner
++	// Note this dumps contains pointers, these are not used because these
++	// ofcourse point to some no longer valid address.
++	memcpy(m, c, 64); c += 64;             // first 64 bytes data
++	mem_to_int(&(m->width), c);  c += 4;
++	mem_to_int(&(m->height), c); c += 4;
++	c += 4;	                               // skip the first pointer
++	mem_to_int(&(m->offset_x), c); c += 4;
++	mem_to_int(&(m->offset_y), c); c += 4;
++	c += 4;                                // skip the second pointer
++	mem_to_int(&(m->start_x), c); c+= 4;
++	mem_to_int(&(m->start_y), c); c+= 4;
+ 
+ 	// read map data
+ 	m->dat = malloc(m->width * m->height * sizeof(Tmappos));
+@@ -174,7 +231,18 @@
+ 	fwrite(header, 6, 1, fp);
+ 
+ 	// write datastruct
+-	fwrite(m, sizeof(Tmap), 1, fp);
++	// a mapfile should contain a raw dump of the Tmap struct as made on an
++	// i386 the code below writes a struct dump as an i386 in an arch
++	// neutral manner
++	fwrite(m, 64, 1, fp);             // first 64 bytes data
++	fwrite_int(&(m->width), fp);
++	fwrite_int(&(m->height), fp);
++	fwrite(header, 4, 1, fp);         // skip the first pointer
++	fwrite_int(&(m->offset_x), fp);
++	fwrite_int(&(m->offset_y), fp);
++	fwrite(header, 4, 1, fp);         // skip the second pointer
++	fwrite_int(&(m->start_x), fp);
++	fwrite_int(&(m->start_y), fp);
+ 
+ 	// write map data
+ 	fwrite(m->dat, sizeof(Tmappos), m->width * m->height, fp);
+@@ -409,7 +477,7 @@
+ 	}
+ 
+ 	if (mask == 5 && oy > 31 - ox) return mask; // 45 degree slope / 
+-	if (mask == 6 && oy > ox) return mask;		// 45 degree slope \
++	if (mask == 6 && oy > ox) return mask;		// 45 degree slope \ .
+ 
+ 	// the not so simple ones
+ 	if (mask == 3 && oy > 31 - ox / 2) return mask;	// 22 degree slope / (low)
+--- a/src/shooter.h
++++ b/src/shooter.h
+@@ -83,8 +83,8 @@
+ 	int difficulty;
+ 
+ 	// player related
+-	long unsigned int score;
+-	long unsigned int show_score;
++	unsigned int score;
++	unsigned int show_score;
+ 	int lives;
+ 	int power_gauge;
+ 	int power_level;
+@@ -118,4 +118,4 @@
+ int start_shooter(Tcontrol *c, int with_sound);
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/timer.h
++++ b/src/timer.h
+@@ -37,4 +37,4 @@
+ void fps_counter(void);
+ void cycle_counter(void);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/main.h
++++ b/src/main.h
+@@ -93,5 +93,8 @@
+ #define check_bb_collision(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \
+                                                         ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) ))
+ 
++#ifndef DATADIR
++#define DATADIR "data/"
++#endif
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/script.h
++++ b/src/script.h
+@@ -51,4 +51,4 @@
+ 
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/edit.h
++++ b/src/edit.h
+@@ -37,4 +37,4 @@
+ void draw_edit_mode(BITMAP *bmp, Tmap *map, int mx, int my);
+ void update_edit_mode(Tmap *map, BITMAP *bmp, int mx, int my, int mb);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/token.c
++++ b/src/token.c
+@@ -67,7 +67,7 @@
+ 
+ // tokenizes the string str
+ Ttoken *tokenize(char *str) {
+-    Ttoken *tok_list, *tok_tmp;
++    Ttoken *tok_list, *tok_tmp = NULL;
+     char word[256];
+     int a, b, c;
+     int i = 0;
+--- a/src/hisc.h
++++ b/src/hisc.h
+@@ -48,4 +48,4 @@
+ void draw_hisc_post(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level);
+ void draw_hisc_table(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/options.h
++++ b/src/options.h
+@@ -43,4 +43,4 @@
+ void load_options(Toptions *o, PACKFILE *fp);
+ void reset_options(Toptions *o);
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/timer.c
++++ b/src/timer.c
+@@ -60,4 +60,4 @@
+ 	game_count ++;
+ 
+ 	return TRUE;
+-}
+\ No newline at end of file
++}
+--- a/src/actor.h
++++ b/src/actor.h
+@@ -91,4 +91,4 @@
+ void kill_actor(Tactor *a);
+ 
+ 
+-#endif
+\ No newline at end of file
++#endif
+--- a/src/bullet.h
++++ b/src/bullet.h
+@@ -52,4 +52,4 @@
+ void update_bullet(Tbullet *b);
+ void update_bullet_with_map(Tbullet *b, Tmap *m);
+ 
+-#endif
+\ No newline at end of file
++#endif
--- alex4-1.1.orig/debian/patches/series
+++ alex4-1.1/debian/patches/series
@@ -0,0 +1,5 @@
+unix-port.patch
+dot-files-endian-clean.patch
+save-some-cpu-cycles.patch
+allegro-4.2.patch
+fsf-address.patch
--- alex4-1.1.orig/debian/patches/allegro-4.2.patch
+++ alex4-1.1/debian/patches/allegro-4.2.patch
@@ -0,0 +1,295 @@
+Get rid of deprecated Allegro functions.
+
+--- a/src/edit.c
++++ b/src/edit.c
+@@ -69,8 +69,8 @@
+ 		}
+ 	
+ 		// show stuff
+-		textprintf(bmp, data[THE_FONT].dat, 1, 1, 0, "TILE: %d,%d", tx, ty);
+-		textprintf(bmp, data[THE_FONT].dat, 1, 11, 0, "SIZE: %d,%d", map->width, map->height);
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, 1, 0, -1, "TILE: %d,%d", tx, ty);
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, 11, 0, -1, "SIZE: %d,%d", map->width, map->height);
+ 
+ 		// show start pos
+ 		x = (ABS(map->start_x) << 4) - map->offset_x;
+@@ -80,7 +80,7 @@
+ 	
+ 		// draw status bar
+ 		rectfill(bmp, 0, 110, 159, 119, 1);
+-		textprintf(bmp, data[THE_FONT].dat, 1, 111, 4, "EDITING: %s", get_filename(edit_path_and_file));
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, 111, 4, -1, "EDITING: %s", get_filename(edit_path_and_file));
+ 	}
+ 	else if (edit_mode == EDIT_MODE_SELECT) {	// draw tile palette
+ 		// calculate offset depending on mouse pointer
+@@ -104,16 +104,16 @@
+ 	else if (edit_mode == EDIT_MODE_STATS) {	// draw map properties
+ 		int ty = 16;
+ 		clear_to_color(bmp, 3);
+-		textprintf(bmp, data[THE_FONT].dat, 1, 1, 1, "%s (props)", get_filename(edit_path_and_file));	
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, 1, 1, -1, "%s (props)", get_filename(edit_path_and_file));	
+ 		line(bmp, 0, 10, 159, 10, 1);
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "Win by:");
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "  1) reach exit (%s)", (map->win_conditions & MAP_WIN_EXIT ? "X" : " "));
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "  2) kill boss  (%s)", (map->win_conditions & MAP_WIN_KILL_GUARDIAN ? "X" : " "));
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "  3) kill all   (%s)", (map->win_conditions & MAP_WIN_KILL_ALL ? "X" : " "));
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "4) Boss level:  (%s)", (map->boss_level ? "X" : " "));
+-		textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "5) Name: %s", map->name);
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "Win by:");
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "  1) reach exit (%s)", (map->win_conditions & MAP_WIN_EXIT ? "X" : " "));
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "  2) kill boss  (%s)", (map->win_conditions & MAP_WIN_KILL_GUARDIAN ? "X" : " "));
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "  3) kill all   (%s)", (map->win_conditions & MAP_WIN_KILL_ALL ? "X" : " "));
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "4) Boss level:  (%s)", (map->boss_level ? "X" : " "));
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, ty+=10, 1, -1, "5) Name: %s", map->name);
+ 
+-		textprintf(bmp, data[THE_FONT].dat, 1, 110, 1, "F1: back to editor");
++		textprintf_ex(bmp, data[THE_FONT].dat, 1, 110, 1, -1, "F1: back to editor");
+ 	}
+ 
+ 	if (edit_mode != EDIT_MODE_STATS) {
+--- a/src/hisc.c
++++ b/src/hisc.c
+@@ -153,9 +153,9 @@
+ 
+ // draws a single hisc post
+ void draw_hisc_post(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level) {
+-	textprintf(bmp, fnt, x, y, color, "%s", table->name);
+-	if (show_level) textprintf_right(bmp, fnt, x+80, y, color, "%2d", table->level);
+-	textprintf_right(bmp, fnt, x+140, y, color, "%d", table->score);
++	textprintf_ex(bmp, fnt, x, y, color, -1, "%s", table->name);
++	if (show_level) textprintf_right_ex(bmp, fnt, x+80, y, color, -1, "%2d", table->level);
++	textprintf_right_ex(bmp, fnt, x+140, y, color, -1, "%d", table->score);
+ }
+ 
+ // draws the entire table
+--- a/src/main.c
++++ b/src/main.c
+@@ -496,15 +496,15 @@
+ 
+ 	rectfill(bmp, 0, y, 159, y+9, 1);
+ 	draw_sprite_h_flip(bmp, data[HERO_NORM].dat, 0, y+1); 
+-	textprintf(bmp, data[THE_FONT].dat, 9, y+1, 4, " :%d", player.lives);
++	textprintf_ex(bmp, data[THE_FONT].dat, 9, y+1, 4, -1, " :%d", player.lives);
+ 
+ 	for(i = 0; i < player.health; i ++)
+ 		draw_sprite(bmp, data[HEART2].dat, 40 + 10 * i, y-3);
+ 
+ 	draw_sprite(bmp, data[EGG].dat, 80, y-5); 
+-	textprintf(bmp, data[THE_FONT].dat, 85, y+1, 4, " :%d", player.ammo);
++	textprintf_ex(bmp, data[THE_FONT].dat, 85, y+1, 4, -1, " :%d", player.ammo);
+ 
+-	textprintf_right(bmp, data[THE_FONT].dat, 158, y+1, 4, "%d", player.score);
++	textprintf_right_ex(bmp, data[THE_FONT].dat, 158, y+1, 4, -1, "%d", player.score);
+ }
+ 
+ 
+@@ -626,7 +626,6 @@
+ 
+ 	// various allegro things
+ 	log2file(" initializing allegro");
+-	text_mode(-1);
+ 	garble_string(init_string, 53);
+ #ifdef __unix__
+ 	snprintf(filename, sizeof(filename), "%s/.alex4/alex4.ini",
+@@ -635,7 +634,6 @@
+ #else
+ 	set_config_file("alex4.ini");
+ #endif
+-	set_window_close_button(FALSE);
+ 	
+ 	// install timers
+ 	log2file(" installing timers");
+@@ -701,7 +699,7 @@
+ 
+ 	// show initial loading screen
+ 	clear(swap_screen);
+-	textout_centre(swap_screen, font, "loading...", 320, 200, 1);
++	textout_centre_ex(swap_screen, font, "loading...", 320, 200, 1, -1);
+ 	blit_to_screen(swap_screen);
+ 
+ #ifndef __unix__
+@@ -788,8 +786,8 @@
+ 	clear_to_color(swap_screen, 3);
+ 
+ 	bmp = data[FLD_LOGO].dat;
+-	draw_character(swap_screen, bmp, 80 - bmp->w / 2 + 0, 50 + 1, 1);
+-	draw_character(swap_screen, bmp, 80 - bmp->w / 2, 50, 4);
++	draw_character_ex(swap_screen, bmp, 80 - bmp->w / 2 + 0, 50 + 1, 1, -1);
++	draw_character_ex(swap_screen, bmp, 80 - bmp->w / 2, 50, 4, -1);
+ 	
+ 	blit_to_screen(swap_screen);
+ 
+@@ -1100,11 +1098,11 @@
+ 
+ // draws text with an outline
+ void textout_outline(BITMAP *bmp, const char *txt, int x, int y) {
+-	textout(bmp, data[THE_FONT].dat, txt, x+1, y, 1);
+-	textout(bmp, data[THE_FONT].dat, txt, x-1, y, 1);
+-	textout(bmp, data[THE_FONT].dat, txt, x, y+1, 1);
+-	textout(bmp, data[THE_FONT].dat, txt, x, y-1, 1);
+-	textout(bmp, data[THE_FONT].dat, txt, x, y, 4);
++	textout_ex(bmp, data[THE_FONT].dat, txt, x+1, y, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, txt, x-1, y, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, txt, x, y+1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, txt, x, y-1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, txt, x, y, 4, -1);
+ }
+ 
+ 
+@@ -1451,12 +1449,12 @@
+ 
+ 	sprintf(buf, "%s %d %s", (level > min ? "<" : " "), level, (level < max ? ">" : " "));
+ 	clear_bitmap(stuff);
+-	textout_centre(stuff, data[THE_FONT].dat, buf, stuff->w/2 + 1, 1, 2);
+-	textout_centre(stuff, data[THE_FONT].dat, buf, stuff->w/2, 0, 1);
++	textout_centre_ex(stuff, data[THE_FONT].dat, buf, stuff->w/2 + 1, 1, 2, -1);
++	textout_centre_ex(stuff, data[THE_FONT].dat, buf, stuff->w/2, 0, 1, -1);
+ 	stretch_sprite(bmp, stuff, 80 - 4*stuff->w/2, 30, 4*stuff->w, 4*stuff->h);
+ 
+-	textout_centre(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 80, 90, 1);
+-	textout_centre(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 79, 89, 4);
++	textout_centre_ex(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 80, 90, 1, -1);
++	textout_centre_ex(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 79, 89, 4, -1);
+ 
+ 	if (options.one_hundred) {
+ 		if (game_count & 32 || game_count & 16) draw_sprite(bmp, data[SHIP100].dat, xpos, 2);
+@@ -2532,20 +2530,20 @@
+ 
+ 	y = 60;
+ 	x = 50;
+-	textout(bmp, data[THE_FONT].dat, start_string, x+1, y+1, 1);
+-	textout(bmp, data[THE_FONT].dat, start_string, x, y, 4);
++	textout_ex(bmp, data[THE_FONT].dat, start_string, x+1, y+1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, start_string, x, y, 4, -1);
+ 
+ 	y += step;
+-	textout(bmp, data[THE_FONT].dat, "HIGH SCORES", x+1, y+1, 1);
+-	textout(bmp, data[THE_FONT].dat, "HIGH SCORES", x, y, 4);
++	textout_ex(bmp, data[THE_FONT].dat, "HIGH SCORES", x+1, y+1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, "HIGH SCORES", x, y, 4, -1);
+ 
+ 	y += step;
+-	textout(bmp, data[THE_FONT].dat, "EDITOR", x+1, y+1, 1);
+-	textout(bmp, data[THE_FONT].dat, "EDITOR", x, y, 4);
++	textout_ex(bmp, data[THE_FONT].dat, "EDITOR", x+1, y+1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, "EDITOR", x, y, 4, -1);
+ 
+ 	y += step;
+-	textout(bmp, data[THE_FONT].dat, "QUIT", x+1, y+1, 1);
+-	textout(bmp, data[THE_FONT].dat, "QUIT", x, y, 4);
++	textout_ex(bmp, data[THE_FONT].dat, "QUIT", x+1, y+1, 1, -1);
++	textout_ex(bmp, data[THE_FONT].dat, "QUIT", x, y, 4, -1);
+ 
+ 	draw_sprite(bmp, data[POINTER].dat, x - 25 + fixtoi(3 * fcos(itofix(tick << 2))), 44 + menu_choice * step);
+ }
+@@ -2597,7 +2595,7 @@
+         string[i] = letters[current_letter];
+ 		string[i + 1] = '\0';
+         blit(block, bmp, 0, 0, pos_x - 1, pos_y - 1, block->w, block->h);
+-        textout(bmp, f, string, pos_x, pos_y, colour);
++        textout_ex(bmp, f, string, pos_x, pos_y, colour, -1);
+ 		blit_to_screen(bmp);
+ 
+ 		if (pad != NULL) {
+--- a/src/map.c
++++ b/src/map.c
+@@ -280,7 +280,7 @@
+ 	
+ 	if (sm == NULL) return;
+ 	
+-	set_clip(bmp, dx, dy, dx+w-1, dy+h-1);
++	set_clip_rect(bmp, dx, dy, dx+w-1, dy+h-1);
+ 	
+ 	for(y=0;y<7;y++) {
+ 		for(x=0;x<11;x++) {
+@@ -330,13 +330,13 @@
+ 
+ 				if (edit) {
+ 					if (sm->dat[pos].type == MAP_DEAD) {
+-						textout(bmp, font, "D", dx + x*16 + ax, dy + y*16 + ay, 0);
++						textout_ex(bmp, font, "D", dx + x*16 + ax, dy + y*16 + ay, 0, -1);
+ 					}
+ 					if (sm->dat[pos].type == MAP_EXIT) {
+-						textout(bmp, font, "XT", dx + x*16 + ax, dy + y*16 + ay, 255);
++						textout_ex(bmp, font, "XT", dx + x*16 + ax, dy + y*16 + ay, 255, -1);
+ 					}
+ 					if (sm->dat[pos].type == MAP_BRK) {
+-						textout(bmp, font, "GL", dx + x*16 + ax, dy + y*16 + ay, 255);
++						textout_ex(bmp, font, "GL", dx + x*16 + ax, dy + y*16 + ay, 255, -1);
+ 					}
+ 					if (sm->dat[pos].type == MAP_ENEMY1) {
+ 						draw_sprite(bmp, sm->data[ENEMY1_01 + ((ABS(game_count) >> 3) % 4)].dat, dx + x*16 + ax, dy + y*16 + ay);
+@@ -367,7 +367,7 @@
+ 		}
+ 	}
+ 
+-	set_clip(bmp, 0, 0, SCREEN_W - 1, SCREEN_H - 1);
++	set_clip_rect(bmp, 0, 0, SCREEN_W - 1, SCREEN_H - 1);
+ 	
+ }
+ 
+--- a/src/script.c
++++ b/src/script.c
+@@ -89,7 +89,7 @@
+ 
+ 	// draw text
+ 	for(i = 0; i < lines; i ++) {
+-		textout(bmp, d[THE_FONT].dat, rows[i], x1 + 4, y1 + 5 + i * 9, 1);
++		textout_ex(bmp, d[THE_FONT].dat, rows[i], x1 + 4, y1 + 5 + i * 9, 1, -1);
+ 	}
+ }
+ 
+--- a/src/scroller.c
++++ b/src/scroller.c
+@@ -65,22 +65,22 @@
+ 	if (sc->horizontal) {
+ 		if (sc->offset < -sc->length) return;
+ 		if (sc->offset > sc->width) return;
+-		set_clip(bmp, x, y, x + sc->width, y + sc->height);
+-		textout(bmp, sc->fnt, sc->text, x + sc->offset + 1, y + 1, 1);
+-		textout(bmp, sc->fnt, sc->text, x + sc->offset, y, 3);
+-		set_clip(bmp, 0, 0, bmp->w-1, bmp->h-1);
++		set_clip_rect(bmp, x, y, x + sc->width, y + sc->height);
++		textout_ex(bmp, sc->fnt, sc->text, x + sc->offset + 1, y + 1, 1, -1);
++		textout_ex(bmp, sc->fnt, sc->text, x + sc->offset, y, 3, -1);
++		set_clip_rect(bmp, 0, 0, bmp->w-1, bmp->h-1);
+ 	}
+ 	else {
+ 		int i;
+ 		if (sc->offset < -sc->rows * sc->font_height) return;
+ 		if (sc->offset > sc->height) return;
+-		set_clip(bmp, x, y, x + sc->width, y + sc->height);
++		set_clip_rect(bmp, x, y, x + sc->width, y + sc->height);
+ 		for(i=0;i<sc->rows;i++) {
+ 			if (i * sc->font_height + sc->offset <= sc->height) 
+ 				if ((i+1) * sc->font_height + sc->offset >= 0)
+-					textout_centre(bmp, sc->fnt, sc->lines[i], x+(sc->width>>1) , i * sc->font_height + y + sc->offset, -1);
++					textout_centre_ex(bmp, sc->fnt, sc->lines[i], x+(sc->width>>1) , i * sc->font_height + y + sc->offset, -1, -1);
+ 		}
+-		set_clip(bmp, 0, 0, bmp->w-1, bmp->h-1);
++		set_clip_rect(bmp, 0, 0, bmp->w-1, bmp->h-1);
+ 	}
+ }
+ 
+--- a/src/shooter.c
++++ b/src/shooter.c
+@@ -341,7 +341,7 @@
+ 		if (!o->hit || o->type == SO_PLAYER_BULLET)
+ 			draw_sprite(bmp, s_data[o->image].dat, (int)o->x, (int)o->y);
+ 		else
+-			draw_character(bmp, s_data[o->image].dat, (int)o->x, (int)o->y, 4);
++			draw_character_ex(bmp, s_data[o->image].dat, (int)o->x, (int)o->y, 4, -1);
+ 	}
+ 	else {
+ 		int c = (o->energy + 8) >> 3;
+@@ -379,8 +379,8 @@
+ 		padding_str[i] = '0';
+ 	padding_str[i] = '\0';
+ 	strcat(padding_str, score_str);
+-	textprintf_right(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 3, "%s", padding_str);
+-	if (s_var.score) textprintf_right(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 4, "%s", score_str);
++	textprintf_right_ex(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 3, -1, "%s", padding_str);
++	if (s_var.score) textprintf_right_ex(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 4, -1, "%s", score_str);
+ }
+ 
+ 
--- alex4-1.1.orig/debian/patches/fsf-address.patch
+++ alex4-1.1/debian/patches/fsf-address.patch
@@ -0,0 +1,17 @@
+Correct the FSF's address.
+
+Index: alex4-1.1/readme.txt
+===================================================================
+--- alex4-1.1.orig/readme.txt	2008-01-22 00:10:21.000000000 +0100
++++ alex4-1.1/readme.txt	2008-01-22 00:10:51.000000000 +0100
+@@ -49,8 +49,8 @@
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License along with 
+-this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
+-Place, Suite 330, Boston, MA 02111-1307 USA
++this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
++St, Fifth Floor, Boston, MA 02110-1301, USA.
+ 
+ 
+ COMPILING
--- alex4-1.1.orig/debian/patches/save-some-cpu-cycles.patch
+++ alex4-1.1/debian/patches/save-some-cpu-cycles.patch
@@ -0,0 +1,253 @@
+Fix the 100% CPU usage of alex4. We can't do this properly (the game
+is written with a DOS mindset), but we can do two things easily:
+ - Put a rest() in every busy loop.
+ - Limit the frame rate to 50Hz (the speed of the game logic).
+
+For future reference, the counters used by the game:
+game_count  = increments at 50Hz
+cycle_count = increments at 50Hz, but is reset whenever the game feels like it
+frame_count = number of frames rendered, reset every second
+logic_count = number of game loops processed, reset every second
+
+--- a/src/main.c
++++ b/src/main.c
+@@ -280,7 +280,7 @@
+ 		if (keypressed()) kp = 1;
+ 		if (is_fire(&ctrl) || is_jump(&ctrl)) kp = 1;
+ 		if (got_sound && dp != NULL) al_poll_duh(dp);
+-		while(!cycle_count);
++                rest(20);
+ 	}
+ }
+ 
+@@ -322,7 +322,7 @@
+ 		cycle_count = 0;
+ 		if (got_sound && duh_player != NULL) al_poll_duh(duh_player);
+ 		i ++;
+-		while(!cycle_count)	yield_timeslice();
++		while(!cycle_count)	rest(1);
+ 	}
+ }
+ 
+@@ -1127,6 +1127,10 @@
+ 
+ 	cycle_count = 0;
+ 	while(mode != 3) {
++		// Let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		// do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -1152,9 +1156,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw stuff
+ 		draw_frame(swap_screen, 1);
+ 		draw_sprite(swap_screen, go, x, 35);
+@@ -1174,6 +1175,10 @@
+ 
+ 	cycle_count = 0;
+ 	while(mode != 3) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		// do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -1194,9 +1199,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw stuff
+ 		draw_frame(swap_screen, 1);
+ 		draw_sprite(swap_screen, go, x, 35);
+@@ -1237,6 +1239,10 @@
+ 
+ 	cycle_count = 0;
+ 	while(!done) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		// do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -1256,9 +1262,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw stuff
+ 		draw_custom_ending(swap_screen);
+ 		blit_to_screen(swap_screen);
+@@ -1334,6 +1337,10 @@
+ 	clear_keybuf();
+ 	cycle_count = 0;
+ 	while(mode != 3) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		// do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -1372,9 +1379,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw stuff
+ 		blit(swap2, swap_screen, 0, 0, 0, 0, 160, 120);
+ 		draw_status_bar(swap_screen, 110);
+@@ -1488,6 +1492,10 @@
+ 
+ 	cycle_count = 0;
+ 	while(!done) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		// do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -2343,7 +2351,7 @@
+ 		if (is_fire(&ctrl) || is_jump(&ctrl)) done = 1;
+ 		if (keypressed()) done = 1;
+ 		if (key[KEY_ESC]) done = -1;
+-		yield_timeslice();
++		rest(20);
+ 	}
+ 
+ 	if (done == -1) {
+@@ -2369,6 +2377,9 @@
+ 	game_status = GS_OK;
+ 	cycle_count = 0;
+ 	while(game_status == GS_OK) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
+ 
+ 		//  do logic
+ 		while(cycle_count > 0) {
+@@ -2492,9 +2503,6 @@
+ 			cycle_count --;
+ 		}
+ 		
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw 
+ 		frame_count ++;
+ 		draw_frame(swap_screen, 1);
+@@ -2658,7 +2666,7 @@
+ 
+ 		}
+ 
+-		while(!cycle_count);
++		while(!cycle_count) rest(1);
+ 
+     }
+ }
+@@ -2693,6 +2701,9 @@
+ 	clear_keybuf();
+ 	cycle_count = 0;
+ 	while(status == GS_OK) {
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
+ 
+ 		//  do logic
+ 		while(cycle_count > 0) {
+@@ -2774,9 +2785,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// draw 
+ 		frame_count ++;
+ 		draw_title(swap_screen, tick);
+@@ -3021,7 +3029,8 @@
+ 		blit_to_screen(swap_screen);
+ 		fade_in_pal(100);
+ 		cycle_count = 0;
+-		while(!key[KEY_ESC] && cycle_count < 200);
++		while(!key[KEY_ESC] && cycle_count < 200)
++			rest(50);
+ 		fade_out_pal(100);
+ 		clear(screen);
+ 	}
+--- a/src/script.c
++++ b/src/script.c
+@@ -102,8 +102,8 @@
+ 		cycle_count = 0;
+ 		poll_music();
+ 		count ++;
+-		while(!cycle_count);
+-		yield_timeslice();
++		while(!cycle_count)
++			rest(20);
+ 	}
+     if (key[KEY_ESC]) script_done = -1;
+ }
+@@ -498,6 +498,10 @@
+ 	cycle_count = 0;
+ 	while(loops && !script_done) {
+ 
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		while(cycle_count > 0 && loops && !script_done) {
+ 			logic_count ++;
+ 
+@@ -520,9 +524,6 @@
+ 			cycle_count --;
+ 		}
+ 
+-		// let other processes play
+-		yield_timeslice();
+-
+ 		// blit buffer to swap buffer
+ 		blit(buffer, swap_buffer, 0, 0, 0, 0, 160, 120);
+ 		
+--- a/src/shooter.c
++++ b/src/shooter.c
+@@ -1131,7 +1131,10 @@
+ 	game_count = 0;
+ 	s_activate_sign(0, -1);
+ 	while(playing || s_sign.alive) {
+-		
++		// let other processes play
++		while(cycle_count == 0)
++			rest(1);
++
+ 		//  do logic
+ 		while(cycle_count > 0) {
+ 			logic_count ++;
+@@ -1266,10 +1269,6 @@
+ 			cycle_count --;
+ 		}
+ 		
+-		
+-		// let other processes play
+-		yield_timeslice();
+-		
+ 		// draw 
+ 		frame_count ++;
+ 		s_draw_frame(s_buffer);
--- alex4-1.1.orig/debian/patches/dot-files-endian-clean.patch
+++ alex4-1.1/debian/patches/dot-files-endian-clean.patch
@@ -0,0 +1,102 @@
+Save the game's dotfiles in an endian-independent way.
+
+Index: alex4src/src/control.c
+===================================================================
+--- alex4src.orig/src/control.c	2008-01-17 00:20:33.000000000 +0100
++++ alex4src/src/control.c	2008-01-17 00:29:35.000000000 +0100
+@@ -93,10 +93,24 @@
+ 
+ // saves the control config to disk using FP
+ void save_control(Tcontrol *c, PACKFILE *fp) {
+-	pack_fwrite(c, sizeof(Tcontrol), fp);
++	pack_iputl(c->use_joy, fp);
++	pack_iputl(c->key_left, fp);
++	pack_iputl(c->key_right, fp);
++	pack_iputl(c->key_up, fp);
++	pack_iputl(c->key_down, fp);
++	pack_iputl(c->key_fire, fp);
++	pack_iputl(c->key_jump, fp);
++	pack_putc(c->flags, fp);
+ }
+ 
+ // loads the control config from disk using FP
+ void load_control(Tcontrol *c, PACKFILE *fp) {
+-	pack_fread(c, sizeof(Tcontrol), fp);
++	c->use_joy = pack_igetl(fp);
++	c->key_left = pack_igetl(fp);
++	c->key_right = pack_igetl(fp);
++	c->key_up = pack_igetl(fp);
++	c->key_down = pack_igetl(fp);
++	c->key_fire = pack_igetl(fp);
++	c->key_jump = pack_igetl(fp);
++	c->flags = pack_getc(fp);
+ }
+Index: alex4src/src/hisc.c
+===================================================================
+--- alex4src.orig/src/hisc.c	2008-01-17 00:29:45.000000000 +0100
++++ alex4src/src/hisc.c	2008-01-17 00:42:13.000000000 +0100
+@@ -117,9 +117,12 @@
+ 	for(i=0; i<MAX_SCORES; i++) {
+ 		int c_disk, c_real;
+ 		// load entry
+-		pack_fread(&table[i], sizeof(Thisc), fp);
++                pack_fread(&table[i].name, sizeof(table[i].name), fp);
++                pack_getc(fp); pack_getc(fp); // 2 bytes padding
++                table[i].score = pack_igetl(fp);
++                table[i].level = pack_igetl(fp);
+ 		// load checksum
+-		pack_fread(&c_disk, sizeof(int), fp);
++                c_disk = pack_igetl(fp);
+ 		// generate check sum
+ 		c_real = generate_checksum(&table[i]);
+ 		// compare checksums
+@@ -137,11 +140,14 @@
+ 	for(i=0; i<MAX_SCORES; i++) {
+ 		int checksum;
+ 		// save entry
+-		pack_fwrite(&table[i], sizeof(Thisc), fp);
++		pack_fwrite(&table[i].name, sizeof(table[i].name), fp);
++                pack_putc(0, fp); pack_putc(0, fp); // 2 bytes padding
++                pack_iputl(table[i].score, fp);
++                pack_iputl(table[i].level, fp);
+ 		// generate check sum
+ 		checksum = generate_checksum(&table[i]);
+ 		// save checksum
+-		pack_fwrite(&checksum, sizeof(int), fp);
++                pack_iputl(checksum, fp);
+ 	}
+ }
+ 
+Index: alex4src/src/options.c
+===================================================================
+--- alex4src.orig/src/options.c	2008-01-17 00:24:31.000000000 +0100
++++ alex4src/src/options.c	2008-01-17 00:36:56.000000000 +0100
+@@ -26,12 +26,26 @@
+ 
+ // saves the data structure to disk
+ void save_options(Toptions *o, PACKFILE *fp) {
+-	pack_fwrite(o, sizeof(Toptions), fp);
++        int i;
++        pack_iputl(o->max_levels, fp);
++        for (i = 0; i < MAX_LEVELS; ++i)
++                pack_iputl(o->cherries[i], fp);
++        for (i = 0; i < MAX_LEVELS; ++i)
++                pack_iputl(o->stars[i], fp);
++        pack_iputl(o->use_vsync, fp);
++        pack_iputl(o->one_hundred, fp);
+ }
+ 
+ // loads the data structure from disk
+ void load_options(Toptions *o, PACKFILE *fp) {
+-	pack_fread(o, sizeof(Toptions), fp);
++        int i;
++        o->max_levels = pack_igetl(fp);
++        for (i = 0; i < MAX_LEVELS; ++i)
++                o->cherries[i] = pack_igetl(fp);
++        for (i = 0; i < MAX_LEVELS; ++i)
++                o->stars[i] = pack_igetl(fp);
++        o->use_vsync = pack_igetl(fp);
++        o->one_hundred = pack_igetl(fp);
+ }
+ 
+ // resets all data