diff -Naur keen.orig/src/Makefile.lnx keen/src/Makefile.lnx --- keen.orig/src/Makefile.lnx 2005-11-09 22:27:50.000000000 -0500 +++ keen/src/Makefile.lnx 2010-03-26 03:06:24.000000000 -0400 @@ -31,6 +31,7 @@ sdl/keydrv.o sdl/snddrv.o sdl/timedrv.o sdl/viddrv.o \ scale2x/scalebit.o scale2x/scale2x.o scale2x/scale3x.o \ scale2x/pixel.o \ + unix_fopen_wrapper.o \ keen.h keenext.h sounds.h funcdefs.h latch.h game.h gcc -g3 -o keen \ main.o fileio.o \ @@ -51,6 +52,7 @@ sdl/keydrv.o sdl/snddrv.o sdl/timedrv.o sdl/viddrv.o \ scale2x/scalebit.o scale2x/scale2x.o scale2x/scale3x.o \ scale2x/pixel.o \ + unix_fopen_wrapper.o \ `sdl-config --libs` diff -Naur keen.orig/src/keen.h keen/src/keen.h --- keen.orig/src/keen.h 2005-11-07 16:39:12.000000000 -0500 +++ keen/src/keen.h 2010-03-26 03:06:24.000000000 -0400 @@ -14,6 +14,10 @@ #include #endif +#ifdef TARGET_LNX + #include "unix_fopen_wrapper.h" +#endif + #include "sounds.h" #include "funcdefs.h" #include "latch.h" diff -Naur keen.orig/src/main.c keen/src/main.c --- keen.orig/src/main.c 2005-11-09 23:35:10.000000000 -0500 +++ keen/src/main.c 2010-03-26 03:11:56.000000000 -0400 @@ -75,7 +75,7 @@ char loadinggame, loadslot; -FILE *log=NULL; +/* FILE *log=NULL; */ stFade fade; stMap map; @@ -161,7 +161,7 @@ SetDefaultOptions(); setoption(OPT_FULLSCREEN, "SDL Fullscreen Mode", 0); setoption(OPT_ZOOM, "Image Zoom", 1); - setoption(OPT_FRAMESKIP, "Frameskip", 2); + setoption(OPT_FRAMESKIP, "Frameskip", 1); /* process command line options */ VidDrv_printf("Processing command-line options.\n"); @@ -180,6 +180,7 @@ { numplayers = 2; } + /* else if (strcmp(tempbuf, "-3player")==0) { numplayers = 3; @@ -188,6 +189,7 @@ { numplayers = 4; } + */ else if (strcmp(tempbuf, "-single")==0) { numplayers = 1; @@ -240,6 +242,7 @@ { showfps = 1; } + /* else if (strcmp(tempbuf, "-host")==0) // start network server { is_server = 1; @@ -250,6 +253,7 @@ is_client = 1; localmp = 0; } + */ else if (i!=1 || atoi(argv[i])==0) { VidDrv_printf("Wait a minute...what the hell does '%s' mean?\n",tempbuf); diff -Naur keen.orig/src/misc.c keen/src/misc.c --- keen.orig/src/misc.c 2005-11-16 20:04:28.000000000 -0500 +++ keen/src/misc.c 2010-03-26 03:15:46.000000000 -0400 @@ -1103,7 +1103,7 @@ { VidDrv_printf("Usage: keen [lvlnum] [-*player] [-nopk] [-ep*] [-dtm] [-nocheat] [-rec] -[eseq]\n\n"); VidDrv_printf("lvlnum specify a level number (such as 2) to go directly to that level\n"); - VidDrv_printf("-*player select number of players (1-4); defaults to 1\n"); + VidDrv_printf("-*player select number of players (1-2); defaults to 1\n"); VidDrv_printf("-nopk do not allow players to kill each other in multiplayer games\n"); VidDrv_printf("-ep* select episode 1, 2, or 3; defaults to 1\n"); VidDrv_printf("-dtm go directly to the world map, bypassing intro and title screen\n"); diff -Naur keen.orig/src/sdl/viddrv.c keen/src/sdl/viddrv.c --- keen.orig/src/sdl/viddrv.c 2005-11-16 20:08:30.000000000 -0500 +++ keen/src/sdl/viddrv.c 2010-03-26 03:06:24.000000000 -0400 @@ -29,8 +29,10 @@ SDL_Rect dstrect; +#ifndef TARGET_LNX extern FILE *log; #define CKLOGFILENAME "ck.log" +#endif #define MAX_CONSOLE_MESSAGES 3 #define CONSOLE_MESSAGE_X 3 @@ -222,11 +224,11 @@ // applies all changes to the palette made with pal_set void pal_apply(void) { - SDL_SetColors(screen, &MyPalette, 0, 256); - SDL_SetColors(ScrollSurface, &MyPalette, 0, 256); + SDL_SetColors(screen, MyPalette, 0, 256); + SDL_SetColors(ScrollSurface, MyPalette, 0, 256); if (blitsurface_alloc) { - SDL_SetColors(BlitSurface, &MyPalette, 0, 256); + SDL_SetColors(BlitSurface, MyPalette, 0, 256); } } @@ -338,9 +340,9 @@ // shuts down the video driver void VidDrv_Stop(void) { - if(screen) { SDL_FreeSurface(screen); VidDrv_printf("freed screen\n"); } - if(ScrollSurface) { SDL_FreeSurface(ScrollSurface); VidDrv_printf("freed scrollsurface\n"); } - if(blitsurface_alloc) { blitsurface_alloc = 0; SDL_FreeSurface(BlitSurface); VidDrv_printf("freed blitsurface\n"); } + if(screen) { SDL_FreeSurface(screen); screen = NULL; VidDrv_printf("freed screen\n"); } + if(ScrollSurface) { SDL_FreeSurface(ScrollSurface); ScrollSurface = NULL; VidDrv_printf("freed scrollsurface\n"); } + if(blitsurface_alloc) { blitsurface_alloc = 0; SDL_FreeSurface(BlitSurface); BlitSurface = NULL; VidDrv_printf("freed blitsurface\n"); } } // resets graphics to allow changing of resolution or zoom settings @@ -365,10 +367,12 @@ // SDL-specific, not win32-specific) void VidDrv_InitConsole(void) { +#ifndef TARGET_LNX FILE *fp; // erase contents of log file fp = fopen(CKLOGFILENAME, "wb"); fclose(fp); +#endif } void VidDrv_printf(const char *str, ...) diff -Naur keen.orig/src/unix_fopen_wrapper.c keen/src/unix_fopen_wrapper.c --- keen.orig/src/unix_fopen_wrapper.c 1969-12-31 19:00:00.000000000 -0500 +++ keen/src/unix_fopen_wrapper.c 2010-03-26 03:06:24.000000000 -0400 @@ -0,0 +1,123 @@ + +/* semi-case-insensitive fopen() replacement. + +Usage: + +#include "unix_fopen_wrapper.h" +FILE *foo = fopen("bar.baz", "rb"); + +fopen() gets redefined to unix_fopen() in the header file. +unix_fopen() attempts to call the real fopen() on: + +bar.baz +BAR.baz +Bar.baz +bar.BAZ +BAR.BAZ +Bar.BAZ +bar.Baz +BAR.Baz +Bar.Baz + +It'll still miss e.g. baR.baz or bAr.baz + +If there's no . in the filename (e.g. "bar"), just check +for bar, BAR, Bar +*/ + +#include +#include +#include +#include + +void lcase_all(char *c) { + if(!c || !*c) return; + while(*c && *c != '.') { + *c = tolower(*c); + c++; + } +} + +void ucase_all(char *c) { + if(!c || !*c) return; + while(*c && *c != '.') { + *c = toupper(*c); + c++; + } +} + +void ucase_first(char *c) { + if(!c || !*c) return; + lcase_all(c); + c[0] = toupper(c[0]); +} + +FILE *unix_fopen(const char *path, const char *mode) { + FILE *result; + char realpath[PATH_MAX], *name, *ext; + +/* #define DEBUG_FOPEN */ + +#ifdef DEBUG_FOPEN +#define TRY_FOPEN(p, m) { \ + result = fopen(p, m); \ + fprintf(stderr, "-- %s:%d: (%s,%s): %s\n", \ + __FILE__, __LINE__, p, m, (result ? "OK" : "fail")); \ + if(result) return result; \ +} +#else +#define TRY_FOPEN(p, m) { if( (result = fopen(p, m)) ) return result; } +#endif + + /* try it as-is first */ + TRY_FOPEN(path, mode); + + /* parse into name and (possible) extension */ + strcpy(realpath, path); + ext = strrchr(realpath, '.'); + if(ext) { + ++ext; + if(!ext[0]) ext = NULL; + } + + /* skip any directory component(s) */ + name = strrchr(realpath, '/'); + if(!name) name = realpath; + + /* permutations... */ + lcase_all(ext); + lcase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_first(name); + TRY_FOPEN(realpath, mode); + + ucase_all(ext); + lcase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_first(name); + TRY_FOPEN(realpath, mode); + + ucase_first(ext); + lcase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_all(name); + TRY_FOPEN(realpath, mode); + + ucase_first(name); + TRY_FOPEN(realpath, mode); + +#ifdef DEBUG_FOPEN + fprintf(stderr, "%s:%s: TRY_FOPEN(%s,%s): Giving up", + __FILE__, __LINE__, path, mode); +#endif + return NULL; +} diff -Naur keen.orig/src/unix_fopen_wrapper.h keen/src/unix_fopen_wrapper.h --- keen.orig/src/unix_fopen_wrapper.h 1969-12-31 19:00:00.000000000 -0500 +++ keen/src/unix_fopen_wrapper.h 2010-03-26 03:06:24.000000000 -0400 @@ -0,0 +1,2 @@ +FILE *unix_fopen(const char *path, const char *mode); +#define fopen(x,y) unix_fopen(x,y)