|
|
@@ -0,0 +1,564 @@ |
|
|
From 7dfcf7f586396890934385b993d7ab108689bfcc Mon Sep 17 00:00:00 2001 |
|
|
From: Jaycie Ewald <jaycie.ewald@outlook.com> |
|
|
Date: Sat, 24 Jun 2023 10:49:03 -0500 |
|
|
Subject: [PATCH] Add Haiku Support |
|
|
|
|
|
--- |
|
|
init.c | 16 +++--- |
|
|
lab3d.c | 28 ++++++++-- |
|
|
lab3d.h | 12 ++++- |
|
|
oldlab3d.c | 14 ++--- |
|
|
opengl.c | 6 +-- |
|
|
setup.c | 4 +- |
|
|
software.c | 4 +- |
|
|
subs.c | 152 ++++++++++++++++++++++++++++++++++++++++++----------- |
|
|
8 files changed, 177 insertions(+), 59 deletions(-) |
|
|
|
|
|
diff --git a/init.c b/init.c |
|
|
index 99065c9..01d0316 100644 |
|
|
--- a/init.c |
|
|
+++ b/init.c |
|
|
@@ -102,8 +102,8 @@ void initialize() |
|
|
|
|
|
if (speechstatus >= 2) |
|
|
{ |
|
|
- if (((i = open("sounds.kzp",O_BINARY|O_RDONLY,0)) != -1)|| |
|
|
- ((i = open("SOUNDS.KZP",O_BINARY|O_RDONLY,0)) != -1)) { |
|
|
+ if (((i = open2("sounds.kzp",O_BINARY|O_RDONLY,0)) != -1)|| |
|
|
+ ((i = open2("SOUNDS.KZP",O_BINARY|O_RDONLY,0)) != -1)) { |
|
|
fstat(i, &fstats); |
|
|
sndsize = (int)(fstats.st_size); |
|
|
fprintf(stderr, "Detected %ld byte sounds.\n", sndsize); |
|
|
@@ -120,9 +120,9 @@ void initialize() |
|
|
exit(-1); |
|
|
} |
|
|
|
|
|
- file=fopen("sounds.kzp","rb"); |
|
|
+ file=fopen2("sounds.kzp","rb"); |
|
|
if (file==NULL) { |
|
|
- file=fopen("SOUNDS.KZP","rb"); |
|
|
+ file=fopen2("SOUNDS.KZP","rb"); |
|
|
} |
|
|
if (file==NULL) { |
|
|
fprintf(stderr,"Can not find sounds.kzp.\n"); |
|
|
@@ -207,8 +207,8 @@ void initialize() |
|
|
/* Shareware/registered check... */ |
|
|
|
|
|
if (lab3dversion) { |
|
|
- if (((i = open("boards.dat",O_BINARY|O_RDONLY,0)) != -1)|| |
|
|
- ((i = open("BOARDS.DAT",O_BINARY|O_RDONLY,0)) != -1)) { |
|
|
+ if (((i = open2("boards.dat",O_BINARY|O_RDONLY,0)) != -1)|| |
|
|
+ ((i = open2("BOARDS.DAT",O_BINARY|O_RDONLY,0)) != -1)) { |
|
|
fstat(i, &fstats); |
|
|
numboards = (int)(fstats.st_size>>13); |
|
|
fprintf(stderr, "Detected %d boards.\n", numboards); |
|
|
@@ -219,8 +219,8 @@ void initialize() |
|
|
exit(1); |
|
|
} |
|
|
} else { |
|
|
- if (((i = open("boards.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((i = open("BOARDS.KZP",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
+ if (((i = open2("boards.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((i = open2("BOARDS.KZP",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
readLE16(i,&boleng[0],30*4); |
|
|
numboards = 30; |
|
|
if ((boleng[40]|boleng[41]) == 0) |
|
|
diff --git a/lab3d.c b/lab3d.c |
|
|
index 52a6fd1..0079a7a 100644 |
|
|
--- a/lab3d.c |
|
|
+++ b/lab3d.c |
|
|
@@ -3,6 +3,8 @@ |
|
|
#include "adlibemu.h" |
|
|
#include "math.h" |
|
|
|
|
|
+#include <libgen.h> |
|
|
+ |
|
|
unsigned char slotable[3][16] = |
|
|
{ |
|
|
{5,2,4,5,3,0,4,1,2,4,5,3,5,4,1,3}, |
|
|
@@ -24,6 +26,24 @@ int main(int argc,char **argv) |
|
|
|
|
|
clockspd=0; |
|
|
|
|
|
+ // erysdren: get absolute base path |
|
|
+ if (realpath(argv[0], __argv0) == NULL) |
|
|
+ { |
|
|
+ fprintf(stderr, "Failed to determine application directory\n"); |
|
|
+ SDL_Quit(); |
|
|
+ exit(-1); |
|
|
+ } |
|
|
+ else |
|
|
+ { |
|
|
+ char *temp; |
|
|
+ temp = strdup(__argv0); |
|
|
+ strlcpy(__argv0, dirname(temp), PATH_MAX); |
|
|
+ free(temp); |
|
|
+ } |
|
|
+ |
|
|
+ // erysdren: create user dir |
|
|
+ create_user_dir(); |
|
|
+ |
|
|
/* Initialisation... */ |
|
|
|
|
|
/* Initialise SDL; uncomment the NOPARACHUTE bit if the parachute |
|
|
@@ -33,14 +53,14 @@ int main(int argc,char **argv) |
|
|
SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE| |
|
|
SDL_INIT_JOYSTICK); |
|
|
|
|
|
- if (((fil = open("end.txt",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("END.TXT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
+ if (((fil = open2("end.txt",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("END.TXT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
close(fil); |
|
|
lab3dversion=2; /* Version 1.0 detected. */ |
|
|
rnumwalls=192; |
|
|
fprintf(stderr, "Ken's Labyrinth version 1.0 detected.\n"); |
|
|
- } else if (((fil = open("boards.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("BOARDS.DAT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
+ } else if (((fil = open2("boards.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("BOARDS.DAT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
close(fil); |
|
|
lab3dversion=1; /* Version 1.1 detected. */ |
|
|
rnumwalls=0xe0; |
|
|
diff --git a/lab3d.h b/lab3d.h |
|
|
index 43fe0e9..e1277e1 100644 |
|
|
--- a/lab3d.h |
|
|
+++ b/lab3d.h |
|
|
@@ -536,7 +536,7 @@ void updatebullets(K_UINT16 posxs, K_UINT16 posys, K_INT16 poszs); |
|
|
void checkforvisiblestuff(K_UINT16 posxs, K_UINT16 posys, K_INT16 poszs, K_INT16 angs); |
|
|
double angcan(double angle); |
|
|
|
|
|
-SDL_mutex *soundmutex,*timermutex; |
|
|
+EXTERN SDL_mutex *soundmutex,*timermutex; |
|
|
EXTERN int newkeydefs[numkeys],newkeystatus[SDLKEYS]; |
|
|
EXTERN int musicvolume,soundvolume; |
|
|
EXTERN int channels; |
|
|
@@ -681,3 +681,13 @@ void openGLFlatsprite(K_UINT16 x, K_UINT16 y,K_INT16 ang,K_INT16 playerang, |
|
|
void openGLDoordraw(K_UINT16 x,K_UINT16 y,K_INT16 walnume,K_UINT16 posxs, |
|
|
K_UINT16 posys); |
|
|
EXTERN int paletterenderer; |
|
|
+ |
|
|
+// erysdren |
|
|
+int open2(const char *path, int openMode, ...); |
|
|
+int open3(const char *path, int openMode, ...); |
|
|
+FILE *fopen2(char *name, char *mode); |
|
|
+FILE *fopen3(char *name, char *mode); |
|
|
+void create_user_dir(void); |
|
|
+SDL_Surface *LoadBMP(char *path); |
|
|
+extern char __argv0[PATH_MAX]; |
|
|
+extern char __userdir[PATH_MAX]; |
|
|
diff --git a/oldlab3d.c b/oldlab3d.c |
|
|
index 3b47ab6..3a1c44e 100644 |
|
|
--- a/oldlab3d.c |
|
|
+++ b/oldlab3d.c |
|
|
@@ -2227,14 +2227,14 @@ K_INT16 oldloadgame(K_INT16 gamenum) |
|
|
filename[6] = 'E', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'D', filename[10] = 'A'; |
|
|
filename[11] = 'T', filename[12] = 0; |
|
|
- if((fil=open(filename,O_BINARY|O_RDONLY, |
|
|
+ if((fil=open2(filename,O_BINARY|O_RDONLY, |
|
|
S_IWRITE|S_IREAD|S_IRGRP|S_IROTH))==-1) { |
|
|
filename[0] = 's', filename[1] = 'a', filename[2] = 'v'; |
|
|
filename[3] = 'g', filename[4] = 'a', filename[5] = 'm'; |
|
|
filename[6] = 'e', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'd', filename[10] = 'a'; |
|
|
filename[11] = 't', filename[12] = 0; |
|
|
- if((fil=open(filename,O_BINARY|O_RDONLY, |
|
|
+ if((fil=open2(filename,O_BINARY|O_RDONLY, |
|
|
S_IWRITE|S_IREAD|S_IRGRP|S_IROTH))==-1) |
|
|
return(-1); |
|
|
} |
|
|
@@ -2382,7 +2382,7 @@ K_INT16 oldsavegame(K_INT16 gamenum) |
|
|
filename[6] = 'E', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'D', filename[10] = 'A'; |
|
|
filename[11] = 'T', filename[12] = 0; |
|
|
- if((fil=open(filename,O_BINARY|O_CREAT|O_WRONLY, |
|
|
+ if((fil=open2(filename,O_BINARY|O_CREAT|O_WRONLY, |
|
|
S_IWRITE|S_IREAD|S_IRGRP|S_IROTH))==-1) |
|
|
return(-1); |
|
|
writeLE16(fil,&board[0][0],8192); |
|
|
@@ -2621,14 +2621,14 @@ K_INT16 oldintroduction(void) |
|
|
if (oldloadgame(i) != -1) |
|
|
{ |
|
|
if (numboards == 0) |
|
|
- if ((fil = open("boards.dat",O_BINARY|O_RDONLY, |
|
|
+ if ((fil = open2("boards.dat",O_BINARY|O_RDONLY, |
|
|
S_IREAD)) != -1) |
|
|
{ |
|
|
numboards = 27; |
|
|
close(fil); |
|
|
} |
|
|
if (numboards == 0) |
|
|
- if ((fil = open("BOARDS.DAT",O_BINARY|O_RDONLY, |
|
|
+ if ((fil = open2("BOARDS.DAT",O_BINARY|O_RDONLY, |
|
|
S_IREAD)) != -1) |
|
|
{ |
|
|
numboards = 27; |
|
|
@@ -2932,8 +2932,8 @@ K_INT16 oldloadstory() |
|
|
int fil, i, k, textbufcnt, textypos; |
|
|
|
|
|
ototclock = totalclock; |
|
|
- if ((fil = open("story.kzp",O_BINARY|O_RDONLY,S_IREAD)) == -1) |
|
|
- if ((fil = open("STORY.KZP",O_BINARY|O_RDONLY,S_IREAD)) == -1) |
|
|
+ if ((fil = open2("story.kzp",O_BINARY|O_RDONLY,S_IREAD)) == -1) |
|
|
+ if ((fil = open2("STORY.KZP",O_BINARY|O_RDONLY,S_IREAD)) == -1) |
|
|
return(-1); |
|
|
read(fil,&storyoffs[0],256); |
|
|
lseek(fil,(long)(storyoffs[boardnum+1]),SEEK_SET); |
|
|
diff --git a/opengl.c b/opengl.c |
|
|
index ff89c51..4304a05 100644 |
|
|
--- a/opengl.c |
|
|
+++ b/opengl.c |
|
|
@@ -84,7 +84,7 @@ void openGLInit() { |
|
|
|
|
|
fprintf(stderr,"Activating video (OpenGL)...\n"); |
|
|
|
|
|
- icon=SDL_LoadBMP("ken.bmp"); |
|
|
+ icon=LoadBMP("ken.bmp"); |
|
|
if (icon==NULL) { |
|
|
fprintf(stderr,"Warning: ken.bmp (icon file) not found.\n"); |
|
|
} |
|
|
@@ -1088,7 +1088,7 @@ void openGLScreencapture() |
|
|
glReadPixels(0,0,screenwidth,screenheight,GL_BGR,GL_UNSIGNED_BYTE, |
|
|
screen); |
|
|
unlink(filename); |
|
|
- file=open(filename,O_CREAT|O_WRONLY|O_BINARY, |
|
|
+ file=open2(filename,O_CREAT|O_WRONLY|O_BINARY, |
|
|
S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); |
|
|
if (file!=-1) { |
|
|
if (write(file,BMPHeader,54)==54) { |
|
|
@@ -1673,7 +1673,7 @@ void openGLInitFailsafe(void) { |
|
|
|
|
|
screenwidth=360; screenheight=240; |
|
|
|
|
|
- icon=SDL_LoadBMP("ken.bmp"); |
|
|
+ icon=LoadBMP("ken.bmp"); |
|
|
if (icon==NULL) { |
|
|
fprintf(stderr,"Warning: ken.bmp (icon file) not found.\n"); |
|
|
} |
|
|
diff --git a/setup.c b/setup.c |
|
|
index 50a1c54..3c8da3e 100644 |
|
|
--- a/setup.c |
|
|
+++ b/setup.c |
|
|
@@ -856,7 +856,7 @@ void configure(void) { |
|
|
} |
|
|
|
|
|
void loadsettings(void) { |
|
|
- FILE *file=fopen("settings.ini","r"); |
|
|
+ FILE *file=fopen3("settings.ini","r"); |
|
|
int i; |
|
|
SDL_Rect **modes; |
|
|
|
|
|
@@ -911,7 +911,7 @@ void loadsettings(void) { |
|
|
} |
|
|
|
|
|
void savesettings(void) { |
|
|
- FILE *file=fopen("settings.ini","w"); |
|
|
+ FILE *file=fopen3("settings.ini","w"); |
|
|
int i; |
|
|
|
|
|
if (file==NULL) return; |
|
|
diff --git a/software.c b/software.c |
|
|
index 8de8128..3ffa2e6 100644 |
|
|
--- a/software.c |
|
|
+++ b/software.c |
|
|
@@ -29,7 +29,7 @@ void softwareInit() { |
|
|
exit(-1); |
|
|
} |
|
|
|
|
|
- icon=SDL_LoadBMP("ken.bmp"); |
|
|
+ icon=LoadBMP("ken.bmp"); |
|
|
if (icon==NULL) { |
|
|
fprintf(stderr,"Warning: ken.bmp (icon file) not found.\n"); |
|
|
} |
|
|
@@ -979,7 +979,7 @@ void softwareInitFailsafe(void) { |
|
|
|
|
|
screenwidth=360; screenheight=240; |
|
|
|
|
|
- icon=SDL_LoadBMP("ken.bmp"); |
|
|
+ icon=LoadBMP("ken.bmp"); |
|
|
if (icon==NULL) { |
|
|
fprintf(stderr,"Warning: ken.bmp (icon file) not found.\n"); |
|
|
} |
|
|
diff --git a/subs.c b/subs.c |
|
|
index 759f418..5f768a8 100644 |
|
|
--- a/subs.c |
|
|
+++ b/subs.c |
|
|
@@ -128,8 +128,8 @@ void loadboard() |
|
|
#endif |
|
|
|
|
|
if (lab3dversion) { |
|
|
- if (((fil = open("boards.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("BOARDS.DAT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
+ if (((fil = open2("boards.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("BOARDS.DAT",O_RDONLY|O_BINARY,0)) != -1)) { |
|
|
lseek(fil,((long)boardnum)<<13,SEEK_SET); |
|
|
read(fil,&board[0],8192); |
|
|
close(fil); |
|
|
@@ -141,8 +141,8 @@ void loadboard() |
|
|
exit(1); |
|
|
} |
|
|
} else { |
|
|
- if (((fil = open("boards.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("BOARDS.KZP",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
+ if (((fil = open2("boards.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("BOARDS.KZP",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
{ |
|
|
prepdie = 0; |
|
|
numwarps = 0; |
|
|
@@ -420,8 +420,8 @@ void loadtables() |
|
|
{ |
|
|
K_INT16 fil; |
|
|
|
|
|
- if (((fil = open("tables.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("TABLES.DAT",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
+ if (((fil = open2("tables.dat",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("TABLES.DAT",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
{ |
|
|
readLE32(fil,&sintable[0],8192); |
|
|
readLE32(fil,&tantable[0],4096); |
|
|
@@ -781,8 +781,8 @@ void loadwalls() |
|
|
K_UINT16 stack[LZW_STACK_SIZE]; |
|
|
K_UINT16 stackp=0; |
|
|
|
|
|
- if (((fil = open("walls.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
- ((fil = open("WALLS.KZP",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
+ if (((fil = open2("walls.kzp",O_RDONLY|O_BINARY,0)) != -1)|| |
|
|
+ ((fil = open2("WALLS.KZP",O_RDONLY|O_BINARY,0)) != -1)) |
|
|
{ |
|
|
bmpkind[0] = 0; |
|
|
wallheader[0] = 8; |
|
|
@@ -1081,14 +1081,14 @@ K_INT16 loadgame(K_INT16 gamenum) |
|
|
filename[6] = 'E', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'D', filename[10] = 'A'; |
|
|
filename[11] = 'T', filename[12] = 0; |
|
|
- if((fil=open(filename,O_RDONLY|O_BINARY,0))==-1) { |
|
|
+ if((fil=open3(filename,O_RDONLY|O_BINARY,0))==-1) { |
|
|
filename[0] = 's', filename[1] = 'a', filename[2] = 'v'; |
|
|
filename[3] = 'g', filename[4] = 'a', filename[5] = 'm'; |
|
|
filename[6] = 'e', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'd', filename[10] = 'a'; |
|
|
filename[11] = 't', filename[12] = 0; |
|
|
|
|
|
- if((fil=open(filename,O_RDONLY|O_BINARY,0))==-1) |
|
|
+ if((fil=open3(filename,O_RDONLY|O_BINARY,0))==-1) |
|
|
return -1; |
|
|
} |
|
|
musicoff(); |
|
|
@@ -1267,7 +1267,7 @@ K_INT16 savegame(K_INT16 gamenum) |
|
|
filename[6] = 'E', filename[7] = gamenum+48; |
|
|
filename[8] = '.', filename[9] = 'D', filename[10] = 'A'; |
|
|
filename[11] = 'T', filename[12] = 0; |
|
|
- if((fil=open(filename,O_CREAT|O_WRONLY|O_BINARY, |
|
|
+ if((fil=open3(filename,O_CREAT|O_WRONLY|O_BINARY, |
|
|
S_IWRITE|S_IREAD|S_IRGRP|S_IROTH))==-1) { |
|
|
return(-1); |
|
|
} |
|
|
@@ -1870,7 +1870,7 @@ K_INT16 loadmusic(char *filename) |
|
|
{ |
|
|
/* Open KSM->MIDI instrument translation table... */ |
|
|
|
|
|
- file=fopen("ksmmidi.txt","rt"); |
|
|
+ file=fopen2("ksmmidi.txt","rt"); |
|
|
if (file==NULL) { |
|
|
fprintf(stderr,"ksmmidi.txt not found; music disabled.\n"); |
|
|
musicsource=-1; |
|
|
@@ -1882,8 +1882,8 @@ K_INT16 loadmusic(char *filename) |
|
|
} |
|
|
if (musicsource == 2) |
|
|
{ |
|
|
- if(((infile=open("insts.dat",O_RDONLY|O_BINARY,0))==-1)&& |
|
|
- ((infile=open("INSTS.DAT",O_RDONLY|O_BINARY,0))==-1)) |
|
|
+ if(((infile=open2("insts.dat",O_RDONLY|O_BINARY,0))==-1)&& |
|
|
+ ((infile=open2("INSTS.DAT",O_RDONLY|O_BINARY,0))==-1)) |
|
|
return(-1); |
|
|
for(i=0;i<256;i++) |
|
|
{ |
|
|
@@ -1901,8 +1901,8 @@ K_INT16 loadmusic(char *filename) |
|
|
firstime = 0; |
|
|
} |
|
|
} |
|
|
- if (((infile=open("songs.kzp",O_RDONLY|O_BINARY,0))==-1)&& |
|
|
- ((infile=open("SONGS.KZP",O_RDONLY|O_BINARY,0))==-1)) |
|
|
+ if (((infile=open2("songs.kzp",O_RDONLY|O_BINARY,0))==-1)&& |
|
|
+ ((infile=open2("SONGS.KZP",O_RDONLY|O_BINARY,0))==-1)) |
|
|
return(-1); |
|
|
readLE16(infile,&numfiles,2); |
|
|
i = 0; |
|
|
@@ -2834,31 +2834,31 @@ K_INT16 kgif(K_INT16 filenum) |
|
|
if (filenum<0) { |
|
|
switch(filenum) { |
|
|
case -1: |
|
|
- if (((fil = open("lab3d.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("LAB3D.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("lab3d.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("LAB3D.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
break; |
|
|
case -2: |
|
|
- if (((fil = open("end1.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("END1.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("end1.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("END1.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
break; |
|
|
case -3: |
|
|
- if (((fil = open("end2.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("END2.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("end2.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("END2.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
break; |
|
|
case -4: |
|
|
- if (((fil = open("end3.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("END3.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("end3.gif",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("END3.GIF",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
break; |
|
|
default: |
|
|
return(-1); |
|
|
} |
|
|
} else { |
|
|
- if (((fil = open("lab3d.kzp",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("LAB3D.KZP",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("lab3d.kzp",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("LAB3D.KZP",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
@@ -3115,8 +3115,8 @@ K_INT16 loadstory(K_INT16 boardnume) |
|
|
K_INT16 fil, i, textbufcnt, textypos; |
|
|
|
|
|
ototclock = totalclock; |
|
|
- if (((fil = open("story.kzp",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("STORY.KZP",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("story.kzp",O_RDONLY|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("STORY.KZP",O_RDONLY|O_BINARY,0)) == -1)) |
|
|
return(-1); |
|
|
readLE16(fil,&storyoffs[0],256); |
|
|
lseek(fil,(long)(storyoffs[boardnume+34]),SEEK_SET); |
|
|
@@ -3388,8 +3388,8 @@ void hiscorecheck() |
|
|
K_INT16 i, j, k, m, inse, namexist, fil; |
|
|
K_INT32 hiscore[8], scorexist, templong; |
|
|
|
|
|
- if (((fil = open("hiscore.dat",O_RDWR|O_BINARY,0)) == -1)&& |
|
|
- ((fil = open("HISCORE.DAT",O_RDWR|O_BINARY,0)) == -1)) |
|
|
+ if (((fil = open2("hiscore.dat",O_RDWR|O_BINARY,0)) == -1)&& |
|
|
+ ((fil = open2("HISCORE.DAT",O_RDWR|O_BINARY,0)) == -1)) |
|
|
return; |
|
|
gfxDrawFront(); |
|
|
wipeoverlay(0,0,361,statusbaryoffset); |
|
|
@@ -4508,7 +4508,7 @@ K_INT16 loadsavegamemenu(K_INT16 whichmenu) |
|
|
filename[8] = '.', filename[9] = 'D', filename[10] = 'A'; |
|
|
filename[11] = 'T', filename[12] = 0; |
|
|
|
|
|
- if((fil=open(filename,O_RDONLY|O_BINARY,0))!=-1) |
|
|
+ if((fil=open2(filename,O_RDONLY|O_BINARY,0))!=-1) |
|
|
{ |
|
|
gamexist[j] = 1; |
|
|
read(fil,&gamehead[j][0],27); |
|
|
@@ -4520,7 +4520,7 @@ K_INT16 loadsavegamemenu(K_INT16 whichmenu) |
|
|
filename[6] = 'e', filename[7] = j+48; |
|
|
filename[8] = '.', filename[9] = 'd', filename[10] = 'a'; |
|
|
filename[11] = 't', filename[12] = 0; |
|
|
- if((fil=open(filename,O_RDONLY|O_BINARY,0))!=-1) |
|
|
+ if((fil=open2(filename,O_RDONLY|O_BINARY,0))!=-1) |
|
|
{ |
|
|
gamexist[j] = 1; |
|
|
read(fil,&gamehead[j][0],27); |
|
|
@@ -5570,3 +5570,91 @@ double angcan(double angle) { |
|
|
while(angle>=M_PI*2) angle-=M_PI*2; |
|
|
return angle; |
|
|
} |
|
|
+ |
|
|
+// |
|
|
+// open2 |
|
|
+// |
|
|
+// erysdren: fix the path for haiku |
|
|
+// |
|
|
+ |
|
|
+#include <FindDirectory.h> |
|
|
+#include <fs_info.h> |
|
|
+ |
|
|
+// https://github.com/haiku/haiku/blob/master/src/system/libroot/posix/fcntl.cpp#L30-L45 |
|
|
+ |
|
|
+int __gUmask = 022; |
|
|
+char __argv0[PATH_MAX]; |
|
|
+char __userdir[PATH_MAX]; |
|
|
+ |
|
|
+int open2(const char *path, int openMode, ...) |
|
|
+{ |
|
|
+ char newpath[PATH_MAX]; |
|
|
+ int perms = 0; |
|
|
+ |
|
|
+ if (openMode & O_CREAT) |
|
|
+ { |
|
|
+ va_list args; |
|
|
+ va_start(args, openMode); |
|
|
+ perms = va_arg(args, int) & ~__gUmask; |
|
|
+ va_end(args); |
|
|
+ } |
|
|
+ |
|
|
+ snprintf(newpath, PATH_MAX, "%s/%s", __argv0, path); |
|
|
+ |
|
|
+ return open(newpath, openMode, perms); |
|
|
+} |
|
|
+ |
|
|
+int open3(const char *path, int openMode, ...) |
|
|
+{ |
|
|
+ char newpath[PATH_MAX]; |
|
|
+ int perms = 0; |
|
|
+ |
|
|
+ if (openMode & O_CREAT) |
|
|
+ { |
|
|
+ va_list args; |
|
|
+ va_start(args, openMode); |
|
|
+ perms = va_arg(args, int) & ~__gUmask; |
|
|
+ va_end(args); |
|
|
+ } |
|
|
+ |
|
|
+ snprintf(newpath, PATH_MAX, "%s/%s", __userdir, path); |
|
|
+ |
|
|
+ return open(newpath, openMode, perms); |
|
|
+} |
|
|
+ |
|
|
+FILE *fopen2(char *name, char *mode) |
|
|
+{ |
|
|
+ char newname[PATH_MAX]; |
|
|
+ snprintf(newname, PATH_MAX, "%s/%s", __argv0, name); |
|
|
+ return fopen(newname, mode); |
|
|
+} |
|
|
+ |
|
|
+FILE *fopen3(char *name, char *mode) |
|
|
+{ |
|
|
+ char newname[PATH_MAX]; |
|
|
+ snprintf(newname, PATH_MAX, "%s/%s", __userdir, name); |
|
|
+ return fopen(newname, mode); |
|
|
+} |
|
|
+ |
|
|
+void create_user_dir(void) |
|
|
+{ |
|
|
+ dev_t volume = dev_for_path("/boot"); |
|
|
+ char buffer[PATH_MAX]; |
|
|
+ status_t result; |
|
|
+ |
|
|
+ // find dir |
|
|
+ result = find_directory(B_USER_SETTINGS_DIRECTORY, volume, false, buffer, PATH_MAX); |
|
|
+ |
|
|
+ // copy |
|
|
+ snprintf(__userdir, PATH_MAX, "%s/KensLabyrinth", buffer); |
|
|
+ |
|
|
+ // make path |
|
|
+ mkdir(__userdir, S_IWRITE|S_IREAD|S_IRGRP|S_IROTH); |
|
|
+} |
|
|
+ |
|
|
+SDL_Surface *LoadBMP(char *path) |
|
|
+{ |
|
|
+ char newpath[PATH_MAX]; |
|
|
+ snprintf(newpath, PATH_MAX, "%s/%s", __argv0, path); |
|
|
+ return SDL_LoadBMP(newpath); |
|
|
+} |
|
|
-- |
|
|
2.41.0 |
|
|
|