ref: 0c85bfc2070aefbf917853120e5ac23160a25b92
parent: 59e2ab3e7f70b6ac26f93f656977bafdff107233
author: Fabien Sanglard <fabien.sanglard@gmail.com>
date: Sat Dec 15 23:49:53 EST 2012
MacOS X build fully functional: Can search for .GRP file in current directory.
--- a/Game/src/game.c
+++ b/Game/src/game.c
@@ -7951,114 +7951,11 @@
gameexit("Please put Duke Nukem 3D Atomic Edition CD in drive.");
}
-void writestring(int32_t a1,int32_t a2,int32_t a3,short a4,int32_t vx,int32_t vy,int32_t vz)
-{
- FILE *fp;
-
- fp = (FILE *)fopen("debug.txt","rt+");
-
- fprintf(fp,"%ld %ld %ld %ld %ld %ld %ld\n",a1,a2,a3,a4,vx,vy,vz);
-
- fclose(fp);
-
-}
-
-
-uint8_t testcd( uint8_t *fn )
-{
-#if PLATFORM_DOS
- short drive_count, drive;
- int32_t dalen = 0;
- struct find_t dafilet;
- int fil;
-
- union _REGS ir;
- union _REGS or;
- struct _SREGS sr;
-
- if( IDFSIZE != 9961476 )
- {
- drive = toupper(*fn)-'A';
-
- ir.w.ax = 0x1500;
- ir.w.bx = 0; /* check that MSCDEX is installed */
- int386(0x2f, &ir, &or);
- drive_count = or.w.bx;
-
- if( drive_count == 0 )
- return 1;
-
- ir.w.ax = 0x150b;
- ir.w.bx = 0;
- ir.w.cx = drive;
- int386(0x2f, &ir, &or);
-
- if (or.w.ax == 0 || or.w.bx != 0xadad)
- return 1;
-
- ir.w.ax = 0x1502;
- ir.w.bx = FP_OFF(buf);
- sr.es = FP_SEG(buf);
- ir.w.cx = drive;
- int386x(0x2f, &ir, &or, &sr);
-
- if( or.h.al == 0 || or.h.al == 30)
- return 1;
-
- }
-
- fil = open(fn,O_RDONLY,S_IREAD);
-
- if ( fil < 0 ) return 1;
-
- // ( DO A SEE/Byte check here.) (Not coded in this version)
-
-
- dalen = filelength(fil);
-
- close(fil);
-
- return( dalen != IDFSIZE );
-
-#else
- STUBBED("CD detection.");
- return 0;
-#endif
-}
-
-
-void copyprotect(void)
-{
- FILE *fp;
- char idfile[256];
-
- return;
-
- cp = 0;
-
- fp = (FILE *)fopen("cdrom.ini","rt");
- if(fp == (FILE *) NULL)
- {
- cp = 1;
- return;
- }
-
- fscanf(fp,"%s",idfile);
- fclose(fp);
-
- strcat(idfile,IDFILENAME);
-
- if( testcd(idfile) )
- {
- cp = 1;
- return;
- }
-}
-
+const char* const baseDir="duke3d*.grp";
#ifdef _WIN32
-void findGRPToUse(uint8_t * game_dir,uint8_t * baseDir,uint8_t * groupfilefullpath)
+void findGRPToUse(uint8_t * groupfilefullpath)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
@@ -8115,14 +8012,52 @@
#else
-void findGRPToUse(uint8_t * game_dir,uint8_t * baseDir,uint8_t * groupfilefullpath){
+int dukeGRP_Match(char* filename,int length)
+{
+ char* cursor = filename+length-4;
- //uint8_t *grpName="DUKE3D.GRP";
- //sprintf(groupfilefullpath, "%s\\%s", game_dir, grpName);
- sprintf(groupfilefullpath, "%s","/Users/fabiensanglard/Desktop/DUKE3D.GRP");
- printf("The ONLY GRP location for this port is '%s'.\n",groupfilefullpath);
+ if (strncasecmp(cursor,".grp",4))
+ return 0;
+
+ return !strncasecmp(filename,"duke3d",6);
}
+
+#include <dirent.h>
+void findGRPToUse(char * groupfilefullpath){
+
+ char directoryToScan[512];
+ struct dirent* dirEntry ;
+
+ directoryToScan[0] = '\0';
+
+ if (game_dir[0] != '\0')
+ {
+ strcat(directoryToScan,game_dir);
+ if (directoryToScan[strlen(directoryToScan)-1] != '/')
+ strcat(directoryToScan,"/");
+ }
+ else{
+ strcat(directoryToScan, "./");
+ }
+
+ printf("Scanning directory '%s' for a GRP file like '%s'.\n",directoryToScan,baseDir);
+
+ DIR* dir = opendir(directoryToScan);
+
+ while ((dirEntry = readdir(dir)) != NULL)
+ {
+
+
+ if (dukeGRP_Match(dirEntry->d_name,dirEntry->d_namlen))
+ {
+ sprintf(groupfilefullpath,"%s",dirEntry->d_name);
+ return;
+ }
+
+ }
+}
+
#endif
static int load_duke3d_groupfile(void)
@@ -8129,12 +8064,13 @@
{
// FIX_00032: Added multi base GRP manager. Use duke3d*.grp to handle multiple grp.
- uint8_t groupfilefullpath[512];
-
- uint8_t *baseDir="duke3d*.grp";
- //uint8_t *baseDir="DUKE3D.GRP";
+ char groupfilefullpath[512];
+ groupfilefullpath[0] = '\0';
- findGRPToUse(game_dir,baseDir,groupfilefullpath);
+ findGRPToUse(groupfilefullpath);
+
+ if (groupfilefullpath[0] == '\0')
+ return false;
FixFilePath(groupfilefullpath);
@@ -8282,11 +8218,6 @@
checkcommandline(argc,argv);
-
- copyprotect();
-
- //setvmode(0x03);
-
_platform_init(argc, argv, "Duke Nukem 3D", "Duke3D");
--- a/Game/src/player.c
+++ b/Game/src/player.c
@@ -379,8 +379,6 @@
}
}
-// writestring(sx,sy,sz,sect,sintable[(sa+512)&2047],sintable[sa&2047],zvel<<6);
-
hitscan(sx,sy,sz,sect,
sintable[(sa+512)&2047],
sintable[sa&2047],zvel<<6,