aboutsummaryrefslogtreecommitdiffstats
path: root/games
diff options
context:
space:
mode:
authormatthew <matthew@FreeBSD.org>2016-06-18 22:49:52 +0800
committermatthew <matthew@FreeBSD.org>2016-06-18 22:49:52 +0800
commit617121657ae93a94c3a2a8d89b1d2ca14fe41e94 (patch)
treeb424dc7bb293a3f752f747fde54b81838b4c2855 /games
parent5aca89e8e2a735426c091d37ba0dca5c84df3f49 (diff)
downloadfreebsd-ports-gnome-617121657ae93a94c3a2a8d89b1d2ca14fe41e94.tar.gz
freebsd-ports-gnome-617121657ae93a94c3a2a8d89b1d2ca14fe41e94.tar.zst
freebsd-ports-gnome-617121657ae93a94c3a2a8d89b1d2ca14fe41e94.zip
In the latest installment of the series Alex travels through the jungle
in search of his kidnapped girlfriend. Plenty of classic platforming in four nice colors guaranteed! WWW: http://allegator.sourceforge.net/ PR: 208664 Submitted by: Nikolai Lifanov <lifanov@mail.lifanov.com>
Diffstat (limited to 'games')
-rw-r--r--games/Makefile1
-rw-r--r--games/alex4/Makefile41
-rw-r--r--games/alex4/distinfo4
-rw-r--r--games/alex4/files/patch-Makefile26
-rw-r--r--games/alex4/files/patch-main.c338
-rw-r--r--games/alex4/files/patch-main.h11
-rw-r--r--games/alex4/files/patch-map.c137
-rw-r--r--games/alex4/files/patch-shooter.c11
-rw-r--r--games/alex4/files/patch-shooter.h20
-rw-r--r--games/alex4/files/patch-token.c11
-rw-r--r--games/alex4/files/patch-unix.c90
-rw-r--r--games/alex4/files/patch-unix.h9
-rw-r--r--games/alex4/pkg-descr5
-rw-r--r--games/alex4/pkg-plist6
14 files changed, 710 insertions, 0 deletions
diff --git a/games/Makefile b/games/Makefile
index a1b935e2c290..e0173cd2acd6 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -32,6 +32,7 @@
SUBDIR += alephone
SUBDIR += alephone-data
SUBDIR += alephone-scenarios
+ SUBDIR += alex4
SUBDIR += alienblaster
SUBDIR += alienwave
SUBDIR += allacrost
diff --git a/games/alex4/Makefile b/games/alex4/Makefile
new file mode 100644
index 000000000000..31974f718190
--- /dev/null
+++ b/games/alex4/Makefile
@@ -0,0 +1,41 @@
+# Created by: Nikolai Lifanov <lifanov@mail.lifanov.com>
+# $FreeBSD$
+
+PORTNAME= alex4
+PORTVERSION= 1.1
+CATEGORIES= games
+MASTER_SITES= SF/allegator/Alex4/source%20and%20data/ \
+ SF/lifanov-ports-distfiles/games/${PORTNAME}/:icons
+DISTFILES= alex4src_data.zip ${PORTNAME}.png:icons
+EXTRACT_ONLY= alex4src_data.zip
+
+MAINTAINER= lifanov@mail.lifanov.com
+COMMENT= Classic platformer with Alex the Allegator
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/license.txt
+
+BUILD_DEPENDS= ${LOCALBASE}/lib/libaldmb.a:audio/dumb-allegro
+LIB_DEPENDS= liballeg.so:devel/allegro
+
+DESKTOP_ENTRIES="Alex the Allegator 4" "" "${PORTNAME}" \
+ "${PORTNAME}" "Game;ActionGame;" ""
+
+WRKSRC= ${WRKDIR}/alex4src/src
+
+MAKE_JOBS_UNSAFE=yes
+
+USES= dos2unix gmake zip
+
+post-patch:
+ @${REINPLACE_CMD} \
+ -e 's,%%STAGEDIR%%,${STAGEDIR},g' \
+ -e 's,%%DATADIR%%,${DATADIR},g' \
+ ${WRKSRC}/Makefile
+
+pre-install:
+ ${STRIP_CMD} ${WRKSRC}/alex4
+ ${INSTALL_DATA} ${_DISTDIR}${PORTNAME}.png \
+ ${STAGEDIR}${PREFIX}/share/pixmaps
+
+.include <bsd.port.mk>
diff --git a/games/alex4/distinfo b/games/alex4/distinfo
new file mode 100644
index 000000000000..29cff2ad8a43
--- /dev/null
+++ b/games/alex4/distinfo
@@ -0,0 +1,4 @@
+SHA256 (alex4src_data.zip) = d266d7fba64fbfedf13240d3d0eb21b8bacbedeaa5f22b26a27d472c8d23f103
+SIZE (alex4src_data.zip) = 664561
+SHA256 (alex4.png) = 236a8d163ee8aa94073aa1ec969a85e887b3c70fefbcd03b1f41b93b09fa32c6
+SIZE (alex4.png) = 283
diff --git a/games/alex4/files/patch-Makefile b/games/alex4/files/patch-Makefile
new file mode 100644
index 000000000000..88640cee539c
--- /dev/null
+++ b/games/alex4/files/patch-Makefile
@@ -0,0 +1,26 @@
+--- Makefile.orig 2016-06-14 16:25:53 UTC
++++ Makefile
+@@ -0,0 +1,23 @@
++CFLAGS += `allegro-config --cflags`
++LIBS = -laldmb -ldumb `allegro-config --libs` -lm
++DEFINES = -DDATADIR=\"/usr/local/share/alex4/\"
++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
++
++all: alex4
++
++alex4: $(OBJS)
++ $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -o $@ -c $<
++
++install: alex4
++ mkdir -p %%STAGEDIR%%$(LOCALBASE)/bin
++ mkdir -p %%STAGEDIR%%%%DATADIR%%
++ install -p -m 755 alex4 %%STAGEDIR%%$(LOCALBASE)/bin
++ install -p -m 644 ../data/*.dat %%STAGEDIR%%%%DATADIR%%
++
++clean:
++ rm -f $(OBJS) $(TARGET) *~
diff --git a/games/alex4/files/patch-main.c b/games/alex4/files/patch-main.c
new file mode 100644
index 000000000000..3c19befb5ea7
--- /dev/null
+++ b/games/alex4/files/patch-main.c
@@ -0,0 +1,338 @@
+--- main.c.orig 2016-06-14 16:25:53 UTC
++++ 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 @@ PALETTE org_pal;
+ Tscroller hscroll;
+ Thisc *hisc_table;
+ Thisc *hisc_table_space;
+-char working_directory[1024];
+
+ // the map
+ Tmap *map = NULL;
+@@ -126,6 +126,7 @@ int menu_choice = 1;
+ int playing_original_game = 1;
+ int init_ok = 0;
+
++static FILE* log_fp = NULL;
+
+
+ // // // // // // // // // // // // // // // // // // // // //
+@@ -154,20 +155,18 @@ char *get_init_string() {
+ // 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 @@ int init_game(const char *map_file) {
+ BITMAP *bmp;
+ int i;
+ int w, h;
++#ifdef __unix__
++ char filename[512];
++ char *homedir = get_homedir();
++#endif
+
+ log2file("\nInit routines:");
+
+@@ -625,7 +628,13 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ // 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 @@ int init_game(const char *map_file) {
+
+ // 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 @@ int init_game(const char *map_file) {
+
+ // 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 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ // 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 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ 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 @@ int init_game(const char *map_file) {
+ void uninit_game() {
+ int i;
+ PACKFILE *pf;
++#ifdef __unix__
++ char filename[512];
++ char *homedir = get_homedir();
++#endif
+
+ log2file("\nExit routines:");
+
+@@ -989,14 +1031,26 @@ void uninit_game() {
+ // 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 @@ void show_cutscene(int level) {
+ // 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 @@ void show_scores(int space, Thisc *table
+ 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 @@ void check_alex_with_enemies() {
+
+ // 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 @@ int do_main_menu() {
+ }
+ 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 @@ int do_main_menu() {
+
+ // 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 @@ int do_main_menu() {
+
+ // 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 @@ int main(int argc, char **argv) {
+ 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 @@ int main(int argc, char **argv) {
+ uninit_game();
+ allegro_exit();
+ log2file("\nDone...\n");
++ if (log_fp)
++ fclose(log_fp);
+
+ return 0;
+ } END_OF_MAIN();
diff --git a/games/alex4/files/patch-main.h b/games/alex4/files/patch-main.h
new file mode 100644
index 000000000000..bd5f508952ec
--- /dev/null
+++ b/games/alex4/files/patch-main.h
@@ -0,0 +1,11 @@
+--- main.h.orig 2016-06-14 13:49:42.882747000 -0400
++++ 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
diff --git a/games/alex4/files/patch-map.c b/games/alex4/files/patch-map.c
new file mode 100644
index 000000000000..bc65cabb6cad
--- /dev/null
+++ b/games/alex4/files/patch-map.c
@@ -0,0 +1,137 @@
+--- map.c.orig 2016-06-14 16:25:53 UTC
++++ map.c
+@@ -24,6 +24,7 @@
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <string.h>
++#include <machine/endian.h>
+ #include "allegro.h"
+ #include "map.h"
+ #include "timer.h"
+@@ -64,7 +65,41 @@ Tmap *create_map(int w, int h) {
+
+ 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 @@ Tmap *load_map(char *fname) {
+ }
+
+ // 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 @@ Tmap *load_map(char *fname) {
+ // 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 @@ Tmap *load_map_from_memory(void *mem) {
+ }
+
+ // 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 @@ int save_map(Tmap *m, char *fname) {
+ 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 @@ int is_ground(Tmap *sm , int x, int y) {
+ }
+
+ 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)
diff --git a/games/alex4/files/patch-shooter.c b/games/alex4/files/patch-shooter.c
new file mode 100644
index 000000000000..d2ab8de98528
--- /dev/null
+++ b/games/alex4/files/patch-shooter.c
@@ -0,0 +1,11 @@
+--- shooter.c.orig 2016-06-14 16:25:53 UTC
++++ shooter.c
+@@ -1372,7 +1372,7 @@ int s_init_shooter() {
+ // 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;
diff --git a/games/alex4/files/patch-shooter.h b/games/alex4/files/patch-shooter.h
new file mode 100644
index 000000000000..49cf73f8b9aa
--- /dev/null
+++ b/games/alex4/files/patch-shooter.h
@@ -0,0 +1,20 @@
+--- shooter.h.orig 2016-06-14 16:25:53 UTC
++++ shooter.h
+@@ -83,8 +83,8 @@ typedef struct {
+ 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 @@ typedef struct {
+ int start_shooter(Tcontrol *c, int with_sound);
+
+
+-#endif
+\ No newline at end of file
++#endif
diff --git a/games/alex4/files/patch-token.c b/games/alex4/files/patch-token.c
new file mode 100644
index 000000000000..e685c01265b2
--- /dev/null
+++ b/games/alex4/files/patch-token.c
@@ -0,0 +1,11 @@
+--- token.c.orig 2016-06-14 16:25:53 UTC
++++ token.c
+@@ -67,7 +67,7 @@ void insert_token(Ttoken *list, Ttoken *
+
+ // 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;
diff --git a/games/alex4/files/patch-unix.c b/games/alex4/files/patch-unix.c
new file mode 100644
index 000000000000..19552f66db47
--- /dev/null
+++ b/games/alex4/files/patch-unix.c
@@ -0,0 +1,90 @@
+--- unix.c.orig 2016-06-14 16:25:53 UTC
++++ 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
diff --git a/games/alex4/files/patch-unix.h b/games/alex4/files/patch-unix.h
new file mode 100644
index 000000000000..f691ed2419af
--- /dev/null
+++ b/games/alex4/files/patch-unix.h
@@ -0,0 +1,9 @@
+--- unix.h.orig 2016-06-14 16:25:53 UTC
++++ unix.h
+@@ -0,0 +1,6 @@
++#ifdef __unix__
++
++char *get_homedir();
++int check_and_create_dir(const char *name);
++
++#endif
diff --git a/games/alex4/pkg-descr b/games/alex4/pkg-descr
new file mode 100644
index 000000000000..38e29b9283eb
--- /dev/null
+++ b/games/alex4/pkg-descr
@@ -0,0 +1,5 @@
+In the latest installment of the series Alex travels through the jungle
+in search of his kidnapped girlfriend. Plenty of classic platforming
+in four nice colors guaranteed!
+
+WWW: http://allegator.sourceforge.net/
diff --git a/games/alex4/pkg-plist b/games/alex4/pkg-plist
new file mode 100644
index 000000000000..c84ebd218738
--- /dev/null
+++ b/games/alex4/pkg-plist
@@ -0,0 +1,6 @@
+bin/alex4
+share/pixmaps/alex4.png
+%%DATADIR%%/a45.dat
+%%DATADIR%%/data.dat
+%%DATADIR%%/maps.dat
+%%DATADIR%%/sfx_22.dat