summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-12-18 05:08:52 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:22:37 +0200
commit080430b3bda2bec05362119447d51b6c37f1cfc1 (patch)
treea4d2354ed94acb903f7f79a83e198398cb6eb757
parent95b8b49b7602e4e2d3cd9e38273fa94451bec780 (diff)
Redid the most of the file loading/saving. Now uses $HOME/.avp/ and
$AVP_DIR to look for files.
-rw-r--r--Makefile2
-rw-r--r--README39
-rw-r--r--src/avp/cdtrackselection.cpp15
-rw-r--r--src/avp/psnd.c23
-rw-r--r--src/avp/psndproj.c12
-rw-r--r--src/avp/savegame.c52
-rw-r--r--src/avp/scream.cpp106
-rw-r--r--src/avp/support/consbind.cpp21
-rw-r--r--src/avp/support/consbtch.cpp2
-rw-r--r--src/avp/win95/ffread.cpp30
-rw-r--r--src/avp/win95/ffstdio.cpp12
-rw-r--r--src/avp/win95/frontend/avp_envinfo.c47
-rw-r--r--src/avp/win95/frontend/avp_menus.c95
-rw-r--r--src/avp/win95/frontend/avp_mp_config.cpp237
-rw-r--r--src/avp/win95/frontend/avp_userprofile.cpp100
-rw-r--r--src/avp/win95/frontend/avp_userprofile.h2
-rw-r--r--src/avp/win95/objsetup.cpp7
-rw-r--r--src/avp/win95/platsup.c4
-rw-r--r--src/avp/win95/projload.cpp31
-rw-r--r--src/avp/win95/scrshot.cpp12
-rw-r--r--src/avp/win95/system.c10
-rw-r--r--src/avp/win95/usr_io.c4
-rw-r--r--src/avp/win95/win_proj.cpp682
-rw-r--r--src/files.c575
-rw-r--r--src/files.h34
-rw-r--r--src/fixer.h2
-rw-r--r--src/main.c150
-rw-r--r--src/openal.c289
-rw-r--r--src/stubs.c54
-rw-r--r--src/win95/awtexld.cpp40
-rw-r--r--src/win95/awtexld.hpp4
-rw-r--r--src/win95/bmpnames.cpp10
-rw-r--r--src/win95/chnkload.cpp36
-rw-r--r--src/win95/chnktexi.cpp11
-rw-r--r--src/win95/db.c11
-rw-r--r--src/win95/iff_ilbm.cpp20
-rw-r--r--src/win95/media.hpp9
-rw-r--r--src/win95/mishchnk.cpp97
-rw-r--r--src/win95/sprchunk.cpp43
-rw-r--r--src/winapi.c45
40 files changed, 1398 insertions, 1577 deletions
diff --git a/Makefile b/Makefile
index 8cfd397..6da59e0 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ LDLIBS = -L/usr/X11R6/lib -lX11 -lXext -lGL `sdl-config --libs` -lopenal
AFLAGS = -g -w+macro-params -w+orphan-labels -w+number-overflow
-ROOT = main.c mathline.c math.asm opengl.c net.c menus.c openal.c cdplayer.c winapi.c stubs.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c object.c shpanim.c sphere.c tables.c vdb.c version.c
+ROOT = main.c files.c winapi.c stubs.c version.c mathline.c math.asm opengl.c openal.c cdplayer.c menus.c net.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c object.c shpanim.c sphere.c tables.c vdb.c
AVP = ai_sight.c avpview.c bh_agun.c bh_ais.c bh_alien.c bh_binsw.c bh_cable.c bh_corpse.c bh_deathvol.c bh_debri.c bh_dummy.c bh_fan.c bh_far.c bh_fhug.c bh_gener.c bh_ldoor.c bh_lift.c bh_light.c bh_lnksw.c bh_ltfx.c bh_marin.c bh_mission.c bh_near.c bh_pargen.c bh_plachier.c bh_plift.c bh_pred.c bh_queen.c bh_rubberduck.c bh_selfdest.c bh_snds.c bh_spcl.c bh_swdor.c bh_track.c bh_types.c bh_videoscreen.c bh_waypt.c bh_weap.c bh_xeno.c bonusabilities.c cconvars.cpp cdtrackselection.cpp cheatmodes.c comp_map.c comp_shp.c consolelog.cpp davehook.cpp deaths.c decal.c detaillevels.c dynamics.c dynblock.c equipmnt.c equiputl.cpp extents.c game.c game_statistics.c gamecmds.cpp gamevars.cpp hmodel.c hud.c inventry.c language.c lighting.c load_shp.c los.c maps.c mempool.c messagehistory.c missions.cpp movement.c paintball.c particle.c pfarlocs.c pheromon.c player.c pmove.c psnd.c psndproj.c pvisible.c savegame.c scream.cpp secstats.c sfx.c stratdef.c targeting.c track.c triggers.c weapons.c
SHAPES = cube.c
SUPPORT = consbind.cpp consbtch.cpp coordstr.cpp daemon.cpp indexfnt.cpp r2base.cpp r2pos666.cpp reflist.cpp refobj.cpp rentrntq.cpp scstring.cpp strtab.cpp strutil.c trig666.cpp wrapstr.cpp
diff --git a/README b/README
index 4a8eb64..fa07a66 100644
--- a/README
+++ b/README
@@ -11,8 +11,7 @@ end users." Hopefully this status will change in the not-so-distant future.
-
-
+(Please see note below regarding installation/running.)
Obviously this README is totally incomplete, and will probably remain so for
@@ -42,12 +41,29 @@ If you are wanting to run the Alien demo (the installer is an .exe but you
can just use unzip to extract the files from the .exe), add -DALIEN_DEMO to
the CFLAGS line (the one that's uncommented) in the Makefile. Rename all game
files lowercase. Be sure to install SDL 1.2 (http://www.libsdl.org) with
-OpenGL support, nasm 0.98, PhysicsFS 0.1.4 (http://icculus.org/physfs/),
-and the latest OpenAL CVS (http://www.openal.org). AvP requires a 3D card
-with OpenGL support.
+OpenGL support, nasm 0.98, and the latest OpenAL CVS (http://www.openal.org).
+AvP requires a 3D card with OpenGL support.
+
+***
+IMPORTANT:
+AvP now uses $HOME/.avp/ to load/store configs, logs, etc.
+NOTE: Windows profiles probably do not work in Linux and vice versa.
+
+AvP will no longer use the current working directory to look for files. You
+must either copy or symlink the AvP binary to the game data directory and run
+that, or set AVP_DATA to the data directory.
+
+Currently:
+If you want to install the mappacks from
+http://www.avpnews.com/files/avpfiles.html, install them with the rest of
+the game data, not in ~/.avp/. Make sure everything is lowercase (although,
+the maps in avp_rifs/Custom do not have to be totally lowercase, just the .rif
+extension). Maybe in the future users will be able to install the files in
+~/.avp/ also.
-Create the MPConfig and User_Profiles directories if they do not exist.
-(Note: Windows profiles probably do not work in Linux and vice versa)
+Hopefully all the necessary file loading changes were made. Please let me
+know if something goes wrong.
+***
If you have the regular edition, add -DREGULAR_EDITION to CFLAGS.
@@ -64,14 +80,11 @@ have to uncomment a LDLIBS line in the Makefile.
relnev:~/avp/AvP Demo 3 - Alien$ ls
-aenglish.txt alienavp_huds/ alienfastfile/ avp_rifs/ MPConfig/
-User_Profiles/
+aenglish.txt alienavp_huds/ alienfastfile/ avp_rifs/
relnev:~/avp/Gold Edition$ ls
-avp_huds/ avp_rifs/ cd tracks.txt default.cfg fastfile/ language.txt
-MPConfig/ User_Profiles/
+avp_huds/ avp_rifs/ cd tracks.txt fastfile/ language.txt
-Support for the demo is not quite complete (some sounds are missing and some
-text is incorrect/missing).
+Support for the demo is not quite complete (some sounds are missing).
Linux Port-specific commands:
diff --git a/src/avp/cdtrackselection.cpp b/src/avp/cdtrackselection.cpp
index 99ef3c6..5440bbd 100644
--- a/src/avp/cdtrackselection.cpp
+++ b/src/avp/cdtrackselection.cpp
@@ -112,8 +112,9 @@ void LoadCDTrackList()
//clear out the old list first
EmptyCDTrackList();
- HANDLE file=CreateFile(CDTrackFileName,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
- if(file==INVALID_HANDLE_VALUE)
+ FILE *file = OpenGameFile(CDTrackFileName, FILEMODE_READONLY, FILETYPE_OPTIONAL);
+
+ if(file==NULL)
{
LOGDXFMT(("Failed to open %s",CDTrackFileName));
return;
@@ -121,13 +122,15 @@ void LoadCDTrackList()
char* buffer;
int file_size;
- unsigned long bytes_read;
+ fseek(file, 0, SEEK_END);
+ file_size = ftell(file);
+ rewind(file);
+
//copy the file contents into a buffer
- file_size= GetFileSize(file,0);
buffer=new char[file_size+1];
- ReadFile(file,buffer,file_size,&bytes_read,0);
- CloseHandle(file);
+ fread(buffer, 1, file_size, file);
+ fclose(file);
char* bufferptr=buffer;
diff --git a/src/avp/psnd.c b/src/avp/psnd.c
index bf96c74..2553744 100644
--- a/src/avp/psnd.c
+++ b/src/avp/psnd.c
@@ -511,10 +511,10 @@ void Sound_Play(SOUNDINDEX soundNumber, char *format, ...)
if(loop) ActiveSounds[newIndex].loop = 1;
else ActiveSounds[newIndex].loop = 0;
-/*
-printf("Play: new = %d. num = %d, p = %d, v = %d, pi = %d, l = %d, mi = %d, rev = %d\n", newIndex, soundNumber, priority, volume, pitch, loop, marine_ignore, reverb_off);
-printf("Play: %d %d %s l:%d\n", newIndex, soundNumber, GameSounds[soundNumber].wavName, loop);
-*/
+#if 0
+fprintf(stderr, "PSND: Play: new = %d. num = %d, p = %d, v = %d, pi = %d, l = %d, mi = %d, rev = %d\n", newIndex, soundNumber, priority, volume, pitch, loop, marine_ignore, reverb_off);
+fprintf(stderr, "PSND: Play: %d %d %s l:%d\n", newIndex, soundNumber, GameSounds[soundNumber].wavName, loop);
+#endif
if(worldPosn)
{
@@ -562,8 +562,10 @@ printf("Play: %d %d %s l:%d\n", newIndex, soundNumber, GameSounds[soundNumber].w
// //sound starts part of the way in
// IDirectSoundBuffer_SetCurrentPosition(ActiveSounds[newIndex].dsBufferP,soundStartPosition);
// }
+#if 0 /* TODO */
if (soundStartPosition)
fprintf(stderr, "Sound_Play: sound starts part of the way in (%d)\n", soundStartPosition);
+#endif
}
void Sound_Stop(int activeSoundNumber)
@@ -590,9 +592,11 @@ void Sound_Stop(int activeSoundNumber)
/* stop the sound: it may have already stopped, of course, but never mind */
PlatStopSound(activeSoundNumber);
-/*
-printf("Stop: %d %d %s\n", activeSoundNumber, soundNo, GameSounds[soundNo].wavName);
-*/
+
+#if 0
+fprintf(stderr, "PSND: Stop: %d %d %s\n", activeSoundNumber, soundNo, GameSounds[soundNo].wavName);
+#endif
+
/* release the active sound slot */
buf = ActiveSounds[activeSoundNumber].ds3DBufferP;
ActiveSounds[activeSoundNumber] = BlankActiveSound;
@@ -853,8 +857,9 @@ void Save_SoundState(int* soundHandle)
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
// else
block->position = 0;
+#if 0 /* TODO */
fprintf(stderr, "Save_SoundState: GetCurrentPosition!\n");
-
+#endif
strcpy((char*)(block+1),name);
}
@@ -944,7 +949,9 @@ void Save_SoundsWithNoReference()
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
// else
block->position = 0;
+#if 0 /* TODO */
fprintf(stderr, "Save_SoundsWithNoReference: GetCurrentPosition!\n");
+#endif
strcpy((char*)(block+1),name);
}
diff --git a/src/avp/psndproj.c b/src/avp/psndproj.c
index 9ee8da7..eb78145 100644
--- a/src/avp/psndproj.c
+++ b/src/avp/psndproj.c
@@ -867,16 +867,14 @@ int FindAndLoadWavFile(int soundNum,char* wavFileName)
{
//check to see if file exists locally first
- FILE* wavFile=fopen(sound_name,"rb");
-
+ FILE* wavFile = OpenGameFile(sound_name, FILEMODE_READONLY, FILETYPE_PERM);
if(!wavFile && SecondSoundDir)
{
//look for sound over network
sprintf (sound_name, "%s%s", SecondSoundDir,wavFileName);
-
- wavFile=fopen(sound_name,"rb");
- if(!wavFile)
- {
+
+ wavFile = OpenGameFile(sound_name, FILEMODE_READONLY, FILETYPE_PERM);
+ if(!wavFile) {
LOGDXFMT(("Failed to find %s\n",wavFileName));
return 0;
}
@@ -905,7 +903,7 @@ void *LoadRebSndFile(char *filename)
void *bufferPtr;
long int save_pos, size_of_file;
FILE *fp;
- fp = fopen(filename,"rb");
+ fp = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
if (!fp) goto error;
diff --git a/src/avp/savegame.c b/src/avp/savegame.c
index dd88808..0585e0f 100644
--- a/src/avp/savegame.c
+++ b/src/avp/savegame.c
@@ -397,8 +397,7 @@ static BOOL SaveGameAllowed()
void SaveGame()
{
char filename[100];
- HANDLE file;
- DWORD bytes_written;
+ FILE *file;
int headerLength;
HuffmanPackage *packagePtr;
@@ -456,34 +455,27 @@ void SaveGame()
SaveGameRequest = SAVELOAD_REQUEST_NONE;
//write the file
- file = CreateFile(filename,GENERIC_WRITE, 0, 0, CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS, 0);
+ file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
- if (file == INVALID_HANDLE_VALUE)
+ if (file == NULL)
{
GLOBALASSERT("Error saving file"==0);
return;
}
- WriteFile(file,SaveInfo.BufferStart,headerLength,&bytes_written,0);
+ fwrite(SaveInfo.BufferStart, headerLength, 1, file);
packagePtr = HuffmanCompression(SaveInfo.BufferStart+headerLength,SaveInfo.BufferSpaceUsed-headerLength);
- WriteFile(file,packagePtr,packagePtr->CompressedDataSize+sizeof(HuffmanPackage),&bytes_written,0);
-
- CloseHandle(file);
-
+ fwrite(packagePtr, packagePtr->CompressedDataSize+sizeof(HuffmanPackage), 1, file);
+
+ fclose(file);
NewOnScreenMessage(GetTextString(TEXTSTRING_SAVEGAME_GAMESAVED));
DisplaySavesLeft();
-
}
-
-
-
-
-
static void EndLoadGame()
{
@@ -495,7 +487,6 @@ static void EndLoadGame()
LoadInfo.BufferPos = NULL;
LoadInfo.BufferSize = 0;
LoadInfo.BufferSpaceLeft = 0;
-
}
extern SAVE_SLOT_HEADER SaveGameSlot[];
@@ -535,9 +526,8 @@ void LoadSavedGame()
{
SAVE_SLOT_HEADER* save_slot;
char filename[100];
- HANDLE file;
+ FILE *file;
BOOL terminal_error = FALSE;
- unsigned int bytes_read;
if(LoadGameRequest == SAVELOAD_REQUEST_NONE) return;
@@ -576,31 +566,32 @@ void LoadSavedGame()
LoadGameRequest = SAVELOAD_REQUEST_NONE;
//load the file
- file = CreateFile(filename,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
+ file = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
-
- if(file==INVALID_HANDLE_VALUE)
+ if(file==NULL)
{
//failed to load
EndLoadGame();
return;
}
- LoadInfo.BufferSize = GetFileSize(file,0);
+ fseek(file, 0, SEEK_END);
+ LoadInfo.BufferSize = ftell(file);
+ rewind(file);
+
if(!LoadInfo.BufferSize)
{
- CloseHandle(file);
+ fclose(file);
EndLoadGame();
return;
}
//allocate buffer , and read file into memory
LoadInfo.BufferStart = (char*) AllocateMem(LoadInfo.BufferSize);
- ReadFile(file,LoadInfo.BufferStart,LoadInfo.BufferSize,(LPDWORD)&bytes_read,0);
- CloseHandle(file);
+ fread(LoadInfo.BufferStart, LoadInfo.BufferSize, 1, file);
+ fclose(file);
-
LoadInfo.BufferPos = LoadInfo.BufferStart;
LoadInfo.BufferSpaceLeft = LoadInfo.BufferSize;
@@ -1340,10 +1331,6 @@ static void SaveMiscGlobalStuff()
GetFMVInformation(&block->FMV_MessageNumber,&block->FMV_FrameNumber);
}
-
-
-
-
extern void DisplaySavesLeft()
{
char text [100];
@@ -1353,9 +1340,6 @@ extern void DisplaySavesLeft()
NewOnScreenMessage(text);
}
-
-
-
extern void ResetNumberOfSaves()
{
switch(AvP.Difficulty)
@@ -1370,7 +1354,7 @@ extern void ResetNumberOfSaves()
case I_Impossible :
NumberOfSavesLeft = NUM_SAVES_FOR_HARD_MODE;
break;
-
default:
+ break;
}
}
diff --git a/src/avp/scream.cpp b/src/avp/scream.cpp
index 90a1247..46ea5e6 100644
--- a/src/avp/scream.cpp
+++ b/src/avp/scream.cpp
@@ -56,7 +56,6 @@ static CharacterSoundEffects QueenSounds={0,0,0,SID_NOSOUND};
//static SOUNDINDEX global_last_sound;
-/* TODO: dir separator */
#if ALIEN_DEMO
#define ScreamFilePath "alienfastfile/"
#elif LOAD_SCREAMS_FROM_FASTFILES
@@ -65,95 +64,6 @@ static CharacterSoundEffects QueenSounds={0,0,0,SID_NOSOUND};
#define ScreamFilePath "sound/"
#endif
-#if 0
-void LoadScreamSounds()
-{
- if(voice_types) return;
-
- HANDLE file=CreateFile(ScreamFileName,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
- if(file==INVALID_HANDLE_VALUE)
- {
- LOGDXFMT(("Failed to open %s",ScreamFileName));
- return;
- }
-
- char* buffer;
- int file_size;
- unsigned long bytes_read;
-
- file_size= GetFileSize(file,0);
- buffer=new char[file_size+1];
- ReadFile(file,buffer,file_size,&bytes_read,0);
- CloseHandle(file);
-
- if(strncmp("MARSOUND",buffer,8))
- {
- return;
- }
-
- char* bufpos=buffer+8;
-
- num_voice_types=*(int*)bufpos;
- bufpos+=4;
- num_voice_cats=*(int*)bufpos;
- bufpos+=4;
-
- voice_types=(ScreamVoiceType*) PoolAllocateMem(num_voice_types * sizeof(ScreamVoiceType));
-
- /* TODO: dir separator */
- char wavpath[200]="npc/marinevoice/";
- char* wavname=&wavpath[strlen(wavpath)];
- for(int i=0;i<num_voice_types;i++)
- {
- voice_types[i].category=(ScreamSoundCategory*) PoolAllocateMem( num_voice_cats * sizeof(ScreamSoundCategory));
- for(int j=0;j<num_voice_cats;j++)
- {
- ScreamSoundCategory* cat=&voice_types[i].category[j];
- cat->last_sound=SID_NOSOUND;
- cat->num_sounds=*(int*)bufpos;
- bufpos+=4;
-
- if(cat->num_sounds)
- {
- cat->sounds=(ScreamSound*) PoolAllocateMem(cat->num_sounds * sizeof(ScreamSound));
- }
- else
- {
- cat->sounds=0;
- }
-
- for(int k=0;k<cat->num_sounds;)
- {
- ScreamSound * sound=&cat->sounds[k];
-
- strcpy(wavname,bufpos);
- bufpos+=strlen(bufpos)+1;
-
- sound->pitch=*(int*)bufpos;
- bufpos+=4;
- sound->volume=*(int*)bufpos;
- bufpos+=4;
-
- sound->sound_loaded=GetSound(wavpath);
- if(sound->sound_loaded)
- {
- k++;
- }
- else
- {
- cat->num_sounds--;
- }
-
- }
-
- }
- }
-
- delete [] buffer;
-
-}
-#endif
-
void CharacterSoundEffects::LoadSounds(const char* filename,const char* directory)
{
@@ -162,8 +72,8 @@ void CharacterSoundEffects::LoadSounds(const char* filename,const char* director
char path[100]=ScreamFilePath;
strcat(path,filename);
- HANDLE file=CreateFile(path,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
- if(file==INVALID_HANDLE_VALUE)
+ FILE *file = OpenGameFile(path, FILEMODE_READONLY, FILETYPE_PERM);
+ if(file==NULL)
{
LOGDXFMT(("Failed to open %s",path));
return;
@@ -171,12 +81,15 @@ void CharacterSoundEffects::LoadSounds(const char* filename,const char* director
char* buffer;
int file_size;
- unsigned long bytes_read;
- file_size= GetFileSize(file,0);
+ fseek(file, 0, SEEK_END);
+ file_size = ftell(file);
+ rewind(file);
+
buffer=new char[file_size+1];
- ReadFile(file,buffer,file_size,&bytes_read,0);
- CloseHandle(file);
+
+ fread(buffer, file_size, 1, file);
+ fclose(file);
if(strncmp("MARSOUND",buffer,8))
{
@@ -347,7 +260,6 @@ void UnloadScreamSounds()
}
-/* TODO: dir separator */
void LoadMarineScreamSounds()
{
MarineSounds.LoadSounds("marsound.dat","npc\\marinevoice\\");
diff --git a/src/avp/support/consbind.cpp b/src/avp/support/consbind.cpp
index 62c3fcc..f0438da 100644
--- a/src/avp/support/consbind.cpp
+++ b/src/avp/support/consbind.cpp
@@ -53,19 +53,7 @@
#endif
extern unsigned char KeyboardInput[];
extern unsigned char DebouncedKeyboardInput[];
-
- #if 0
- extern OurBool DaveDebugOn;
- extern FDIEXTENSIONTAG FDIET_Dummy;
- extern IFEXTENSIONTAG IFET_Dummy;
- extern FDIQUAD FDIQuad_WholeScreen;
- extern FDIPOS FDIPos_Origin;
- extern FDIPOS FDIPos_ScreenCentre;
- extern IFOBJECTLOCATION IFObjLoc_Origin;
- extern UncompressedGlobalPlotAtomID UGPAID_StandardNull;
- extern IFCOLOUR IFColour_Dummy;
- extern IFVECTOR IFVec_Zero;
- #endif
+
#ifdef __cplusplus
};
#endif
@@ -111,7 +99,8 @@ KeyBinding :: ParseBindCommand
SCString* pSCString_ToBind = new SCString(pProjCh_FollowingTheKey);
// Create the KeyBinding object:
- KeyBinding* pNewBinding = new KeyBinding
+ KeyBinding* pNewBinding;
+ pNewBinding = new KeyBinding
(
theKey,
pSCString_ToBind
@@ -185,7 +174,7 @@ KeyBinding :: ParseUnbindCommand
{
OurBool bGotMatch = No;
unsigned int LongestMatch = 0;
- BindableKey theKey_ToUnbind;
+ BindableKey theKey_ToUnbind = (BindableKey)0;
for (int i=0;i<MAX_VALUE_BINDABLE_KEY; i++)
{
@@ -384,7 +373,7 @@ void KeyBinding :: WriteToConfigFile(char* Filename)
GLOBALASSERT(Filename);
- FILE* pFile = fopen(Filename,"w");
+ FILE* pFile = OpenGameFile(Filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
if (!pFile)
{
diff --git a/src/avp/support/consbtch.cpp b/src/avp/support/consbtch.cpp
index 859220c..5440b38 100644
--- a/src/avp/support/consbtch.cpp
+++ b/src/avp/support/consbtch.cpp
@@ -83,7 +83,7 @@ BatchFileProcessing :: Run(char* Filename)
RefList<SCString> PendingList;
{
- FILE* pFile = fopen(Filename,"r");
+ FILE* pFile = OpenGameFile(Filename, FILEMODE_READONLY, FILETYPE_CONFIG);
if (NULL==pFile)
{
diff --git a/src/avp/win95/ffread.cpp b/src/avp/win95/ffread.cpp
index a66f713..4d125df 100644
--- a/src/avp/win95/ffread.cpp
+++ b/src/avp/win95/ffread.cpp
@@ -69,7 +69,7 @@ void ReportError(char const * mesg1, char const * mesg2)
/***************/
#define READ_FILE(fname,post_proc,on_return,h,data,n_bytes,n_bytes_read,p5) \
- if (!ReadFile(h,data,n_bytes,&n_bytes_read,p5)) \
+ if ((n_bytes_read = fread(data, 1, n_bytes, h)) == 0) \
{ \
ReportError(fname); \
post_proc; \
@@ -181,8 +181,6 @@ FFHeaderI::FFHeaderI(char const *_filename,BOOL _should_be_kept)
{
filename = new char [strlen(_filename) + 1];
strcpy(filename,_filename);
-
- FixFilename(filename);
Read();
}
@@ -280,9 +278,9 @@ FFError FFHeaderI::Read(char const *_filename)
strcpy(filename,_filename);
}
- HANDLE h = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ FILE *h = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
- if (INVALID_HANDLE_VALUE==h)
+ if (h == NULL)
{
ReportError(filename);
return FF_COULDNOTOPENFILE;
@@ -298,40 +296,40 @@ FFError FFHeaderI::Read(char const *_filename)
DWORD bytes_read;
- READ_FILE(filename,(void)0,CloseHandle(h),h,magic,4,bytes_read,0)
- READ_FILE(filename,(void)0,CloseHandle(h),h,&rffl_version,4,bytes_read,0)
- READ_FILE(filename,(void)0,CloseHandle(h),h,&num_files,4,bytes_read,0)
- READ_FILE(filename,(void)0,CloseHandle(h),h,&total_headsize,4,bytes_read,0)
- READ_FILE(filename,(void)0,CloseHandle(h),h,&length,4,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,magic,4,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,&rffl_version,4,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,&num_files,4,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,&total_headsize,4,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,&length,4,bytes_read,0)
if (strncmp(magic,"RFFL",4))
{
ReportError(filename,"Incorrect file type");
- CloseHandle(h);
+ fclose(h);
return FF_COULDNOTREADFILE;
}
if (rffl_version>0)
{
ReportError(filename,"Version not supported");
- CloseHandle(h);
+ fclose(h);
return FF_COULDNOTREADFILE;
}
void * header = malloc(total_headsize);
- READ_FILE(filename,(void)0,CloseHandle(h),h,header,total_headsize,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,header,total_headsize,bytes_read,0)
data = malloc(length);
- READ_FILE(filename,(void)0,CloseHandle(h),h,data,length,bytes_read,0)
+ READ_FILE(filename,(void)0,fclose(h),h,data,length,bytes_read,0)
- CloseHandle(h);
+ fclose(h);
// now parse the header
void * headerP = header;
- for (int i=0; i<num_files; ++i)
+ for (unsigned int i=0; i<num_files; ++i)
{
char const * fnameP = (char *)((size_t)headerP + 8);
size_t leng = *(size_t *)((size_t)headerP + 4);
diff --git a/src/avp/win95/ffstdio.cpp b/src/avp/win95/ffstdio.cpp
index 0262568..4f2c57b 100644
--- a/src/avp/win95/ffstdio.cpp
+++ b/src/avp/win95/ffstdio.cpp
@@ -54,7 +54,7 @@ FFileDesc::FFileDesc(char const * infoline, char const * path)
do
{
c2 = c1 = *infoline++;
- if (';'==c1||'\n'==c1)
+ if (';'==c1||'\n'==c1||'\r'==c1)
c1 = 0;
*dbufP++ = (char)c1;
}
@@ -65,7 +65,7 @@ FFileDesc::FFileDesc(char const * infoline, char const * path)
do
{
c1 = *infoline++;
- if ('\n'==c1)
+ if ('\n'==c1||'\r'==c1)
c1 = 0;
*fbufP++ = (char)c1;
}
@@ -158,7 +158,7 @@ static List<FFILE *> openlist;
int ffInit(char const * infofilename, char const * ffpath)
{
- FILE * fp = fopen(infofilename,"r");
+ FILE * fp = OpenGameFile(infofilename, FILEMODE_READONLY, FILETYPE_PERM);
if (!fp) return 0;
while (fdesclist.size())
@@ -370,7 +370,9 @@ FFILE * ffopen(char const * filename, char const * mode)
#if debug && 0 // dont do this, caller should handle this situation
LOGDXFMT(("%s not in any fastfile",filename));
- FILE * sfp = fopen(filename,mode);
+ /* mode is always "rb" */
+ FILE *sfp = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
+
if (!sfp) return 0;
fseek(sfp,0,SEEK_END);
@@ -442,7 +444,7 @@ int ffseek(FFILE * fp, long offset, int whence)
switch (whence)
{
case SEEK_SET:
- if (offset > fp->length || offset < 0)
+ if ((unsigned long)offset > fp->length || offset < 0)
{
fp->flag |= FFF_ERR;
errno = EDOM;
diff --git a/src/avp/win95/frontend/avp_envinfo.c b/src/avp/win95/frontend/avp_envinfo.c
index e22709f..142370b 100644
--- a/src/avp/win95/frontend/avp_envinfo.c
+++ b/src/avp/win95/frontend/avp_envinfo.c
@@ -182,26 +182,25 @@ static char *RifNamesForEnvironments[] =
"Not a Level",//AVP_ENVIRONMENT_END_OF_LIST
//multipack multiplayer levels
- "Leadworks",//AVP_ENVIRONMENT_LEADWORKS_MP,
- "HadleysHope",//AVP_ENVIRONMENT_HADLEYSHOPE_MP,
- "Meat_Factory",//AVP_ENVIRONMENT_MEATFACTORY_MP,
- "Nostromo",//AVP_ENVIRONMENT_NOSTROMO_MP,
- "Subway",//AVP_ENVIRONMENT_SUBWAY_MP,
- "Elevator",//AVP_ENVIRONMENT_ELEVATOR_MP,
- "Lab14",//AVP_ENVIRONMENT_LAB14_MP,
- "Compound",//AVP_ENVIRONMENT_COMPOUND_MP,
- "Office",//AVP_ENVIRONMENT_OFFICE_MP,
+ "leadworks",//AVP_ENVIRONMENT_LEADWORKS_MP,
+ "hadleyshope",//AVP_ENVIRONMENT_HADLEYSHOPE_MP,
+ "meat_factory",//AVP_ENVIRONMENT_MEATFACTORY_MP,
+ "nostromo",//AVP_ENVIRONMENT_NOSTROMO_MP,
+ "subway",//AVP_ENVIRONMENT_SUBWAY_MP,
+ "elevator",//AVP_ENVIRONMENT_ELEVATOR_MP,
+ "lab14",//AVP_ENVIRONMENT_LAB14_MP,
+ "compound",//AVP_ENVIRONMENT_COMPOUND_MP,
+ "office",//AVP_ENVIRONMENT_OFFICE_MP,
//multipack multiplayer cooperative levels
- "Leadworks_coop",//AVP_ENVIRONMENT_LEADWORKS_COOP,
+ "leadworks_coop",//AVP_ENVIRONMENT_LEADWORKS_COOP,
"hadleyshope_coop",//AVP_ENVIRONMENT_HADLEYSHOPE_COOP,
- "Co-op_Meat_Factory",//AVP_ENVIRONMENT_MEATFACTORY_COOP,
- "Nostromo_Coop",//AVP_ENVIRONMENT_NOSTROMO_COOP,
- "SubwayCoop",//AVP_ENVIRONMENT_SUBWAY_COOP,
- "Elevator_co-op",//AVP_ENVIRONMENT_ELEVATOR_COOP,
- "Lab14coop",//AVP_ENVIRONMENT_LAB14_COOP,
- "CompoundCoop",//AVP_ENVIRONMENT_COMPOUND_COOP,
-
+ "co-op_meat_factory",//AVP_ENVIRONMENT_MEATFACTORY_COOP,
+ "nostromo_coop",//AVP_ENVIRONMENT_NOSTROMO_COOP,
+ "subwaycoop",//AVP_ENVIRONMENT_SUBWAY_COOP,
+ "elevator_co-op",//AVP_ENVIRONMENT_ELEVATOR_COOP,
+ "lab14coop",//AVP_ENVIRONMENT_LAB14_COOP,
+ "compoundcoop",//AVP_ENVIRONMENT_COMPOUND_COOP,
};
extern char LevelName[];
@@ -5142,7 +5141,7 @@ void SetLevelToLoadForMultiplayer(int episode)
{
//it certainly is
//(the game type sent passed to the function doesn't really matter , as long as it isn't NGT_COOP)
- sprintf(LevelName,"Custom\\%s",GetCustomMultiplayerLevelName(episode,NGT_Individual));
+ sprintf(LevelName,"Custom/%s",GetCustomMultiplayerLevelName(episode,NGT_Individual));
}
else
{
@@ -5155,7 +5154,7 @@ void SetLevelToLoadForCooperative(int episode)
if(episode>=MAX_NO_OF_COOPERATIVE_EPISODES)
{
//it certainly is
- sprintf(LevelName,"Custom\\%s",GetCustomMultiplayerLevelName(episode,NGT_Coop));
+ sprintf(LevelName,"Custom/%s",GetCustomMultiplayerLevelName(episode,NGT_Coop));
}
else
{
@@ -5200,14 +5199,14 @@ int NumberForCurrentLevel(void) {
static BOOL DoesNamedLevelExist(const char* level_name)
{
- HANDLE file_handle;
+ FILE *file_handle;
char filename[200];
- sprintf(filename,"avp_rifs\\%s.rif",level_name);
+ sprintf(filename, "avp_rifs/%s.rif", level_name);
- file_handle = CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
- if(file_handle == INVALID_HANDLE_VALUE) return FALSE;
- CloseHandle(file_handle);
+ file_handle = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
+ if(file_handle == NULL) return FALSE;
+ fclose(file_handle);
return TRUE;
}
diff --git a/src/avp/win95/frontend/avp_menus.c b/src/avp/win95/frontend/avp_menus.c
index 20919c6..488134b 100644
--- a/src/avp/win95/frontend/avp_menus.c
+++ b/src/avp/win95/frontend/avp_menus.c
@@ -110,7 +110,6 @@ static void KeyboardEntryQueue_Clear(void);
static void KeyboardEntryQueue_StartProcessing(void);
void ScanSaveSlots(void);
extern void GetFilenameForSaveSlot(int i, unsigned char *filenamePtr);
-static void GetHeaderInfoForSaveSlot(SAVE_SLOT_HEADER* save_slot,const char* filename);
static void PasteFromClipboard(char* Text,int MaxTextLength);
/* KJL 11:23:03 23/06/98 - Requirements
@@ -4451,7 +4450,7 @@ void DisplayVideoModeUnavailableScreen(void)
void CheckForCredits(void)
{
#if 0
- FILE *fp = fopen("credits.txt","rb");
+ FILE *fp = OpenGameFile("credits.txt", FILEMODE_READONLY, FILETYPE_PERM);
if (!fp)
{
@@ -5437,28 +5436,6 @@ static char KeyboardEntryQueue_ProcessCharacter(void)
-
-void ScanSaveSlots(void)
-{
- unsigned char filename[100];
- int i;
- SAVE_SLOT_HEADER *slotPtr = SaveGameSlot;
-
- for (i=0; i<NUMBER_OF_SAVE_SLOTS; i++, slotPtr++)
- {
- GetFilenameForSaveSlot(i,filename);
-
- GetHeaderInfoForSaveSlot(slotPtr,filename);
- }
-}
-
-extern void GetFilenameForSaveSlot(int i, unsigned char *filenamePtr)
-{
- sprintf(filenamePtr,"%s%s_%d.sav",USER_PROFILES_PATH,UserProfilePtr->Name,i+1);
-}
-
-
-
/*------------------------------------**
** Loading and saving main level info **
**------------------------------------*/
@@ -5502,7 +5479,6 @@ void SaveLevelHeader()
block->Difficulty = AvP.Difficulty;
block->NumberOfSavesLeft = (unsigned char) NumberOfSavesLeft;
-
}
void LoadLevelHeader(SAVE_BLOCK_HEADER* header)
@@ -5514,48 +5490,43 @@ void LoadLevelHeader(SAVE_BLOCK_HEADER* header)
AvP.ElapsedHours = block->ElapsedTime_Hours;
AvP.ElapsedMinutes = block->ElapsedTime_Minutes;
AvP.ElapsedSeconds = block->ElapsedTime_Seconds;
-
}
-static void GetHeaderInfoForSaveSlot(SAVE_SLOT_HEADER* save_slot,const char* filename)
+static void GetHeaderInfoForSaveSlot(SAVE_SLOT_HEADER* save_slot, const GameDirectoryFile *gdf)
{
LEVEL_SAVE_BLOCK block;
unsigned int file_size;
- unsigned int bytes_read;
- HANDLE file;
+ unsigned char filename[100];
+ FILE *file;
save_slot->SlotUsed = 0;
- file = CreateFile(filename,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
+ sprintf(filename, "%s%s", USER_PROFILES_PATH, gdf->filename);
+ file = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
- if(file==INVALID_HANDLE_VALUE)
+ if (file==NULL)
{
//failed to load (probably doesn't exist)
return;
}
-
-
- file_size = GetFileSize(file,0);
-
+
+ fseek(file, 0, SEEK_END);
+ file_size = ftell(file);
+ rewind(file);
+
if(file_size < sizeof(LEVEL_SAVE_BLOCK))
{
//obviously not much of a save file then...
- CloseHandle(file);
+ fclose(file);
return;
}
-{
- struct stat buf;
-
- if (stat(filename, &buf) != -1) {
- save_slot->TimeStamp = buf.st_mtime;
- }
-}
+ save_slot->TimeStamp = gdf->timestamp;
//load the level header
- ReadFile(file,&block,sizeof(block),(LPDWORD)&bytes_read,0);
- CloseHandle(file);
+ fread(&block, sizeof(block), 1, file);
+ fclose(file);
//a few checks
if(block.header.type != SaveBlock_MainHeader ||
@@ -5580,6 +5551,40 @@ static void GetHeaderInfoForSaveSlot(SAVE_SLOT_HEADER* save_slot,const char* fil
save_slot->SavesLeft = block.NumberOfSavesLeft;
}
+void ScanSaveSlots(void)
+{
+ unsigned char pattern[100], *ptr;
+ int i;
+ void *gd;
+ GameDirectoryFile *gdf;
+
+ sprintf(pattern, "%s_?.sav", UserProfilePtr->Name);
+ gd = OpenGameDirectory(USER_PROFILES_PATH, pattern, FILETYPE_CONFIG);
+ if (gd == NULL)
+ return;
+
+ while ((gdf = ScanGameDirectory(gd)) != NULL) {
+ if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
+ continue;
+ if ((gdf->attr & FILEATTR_READABLE) == 0)
+ continue;
+
+ ptr = strrchr(gdf->filename, '.');
+ if (ptr == NULL)
+ continue;
+ ptr--;
+
+ i = *ptr - '1';
+ if (i >= 0 && (i < NUMBER_OF_SAVE_SLOTS)) {
+ GetHeaderInfoForSaveSlot(&SaveGameSlot[i], gdf);
+ }
+ }
+}
+
+extern void GetFilenameForSaveSlot(int i, unsigned char *filenamePtr)
+{
+ sprintf(filenamePtr,"%s%s_%d.sav",USER_PROFILES_PATH,UserProfilePtr->Name,i+1);
+}
static void CheckForLoadGame()
{
diff --git a/src/avp/win95/frontend/avp_mp_config.cpp b/src/avp/win95/frontend/avp_mp_config.cpp
index 73ca5b8..f9c6f77 100644
--- a/src/avp/win95/frontend/avp_mp_config.cpp
+++ b/src/avp/win95/frontend/avp_mp_config.cpp
@@ -15,22 +15,16 @@
#define UseLocalAssert Yes
#include "ourasert.h"
-#include <glob.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-
extern "C"
{
extern void SetDefaultMultiplayerConfig();
extern char MP_SessionName[];
extern char MP_Config_Description[];
-#define MP_CONFIG_DIR "MPConfig"
-#define MP_CONFIG_WILDCARD "MPConfig/*.cfg"
+#define MP_CONFIG_DIR "MPConfig/"
+#define MP_CONFIG_WILDCARD "*.cfg"
-#define SKIRMISH_CONFIG_WILDCARD "MPConfig/*.skirmish_cfg"
+#define SKIRMISH_CONFIG_WILDCARD "*.skirmish_cfg"
static List<char*> ConfigurationFilenameList;
static List<char*> ConfigurationLocalisedFilenameList;
@@ -63,68 +57,48 @@ BOOL BuildLoadMPConfigMenu()
load_name=SKIRMISH_CONFIG_WILDCARD;
}
- glob_t globbuf;
- if (glob(load_name, 0, NULL, &globbuf))
- return FALSE;
+ void *gd;
+ GameDirectoryFile *gdf;
- // get any path in the load_name
- int nPathLen = 0;
- char * pColon = strrchr(load_name,':');
- if (pColon) nPathLen = pColon - load_name + 1;
- char * pBackSlash = strrchr(load_name,'\\');
- if (pBackSlash)
- {
- int nLen = pBackSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
- }
- char * pSlash = strrchr(load_name,'/');
- if (pSlash)
- {
- int nLen = pSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
+ gd = OpenGameDirectory(MP_CONFIG_DIR, load_name, FILETYPE_CONFIG);
+ if (gd == NULL) {
+ CreateGameDirectory(MP_CONFIG_DIR); /* maybe it didn't exist.. */
+ return FALSE;
}
- for (unsigned int i = 0; i < globbuf.gl_pathc; i++) {
- struct stat buf;
-
- if (stat(globbuf.gl_pathv[i], &buf) == -1)
+ while ((gdf = ScanGameDirectory(gd)) != NULL) {
+ if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
+ continue;
+ if ((gdf->attr & FILEATTR_READABLE) == 0)
continue;
-
- if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0)) {
- char *filename = strrchr(globbuf.gl_pathv[i], '/');
- if (filename)
- filename++;
- else
- filename = globbuf.gl_pathv[i];
- char* name=new char[strlen(filename)+1];
- strcpy(name,filename);
- char* dotpos=strrchr(name,'.');
- if(dotpos) *dotpos=0;
-
- ConfigurationFilenameList.add_entry(name);
+ char* name=new char[strlen(gdf->filename)+1];
+ strcpy(name,gdf->filename);
+ char* dotpos=strrchr(name,'.');
+ if(dotpos) *dotpos=0;
+
+ ConfigurationFilenameList.add_entry(name);
- BOOL localisedFilename=FALSE;
+ BOOL localisedFilename=FALSE;
- //seeif this is one of the default language localised configurations
- if(!strncmp(name,"Config",6))
- {
- if(name[6]>='1' && name[6]<='7' && name[7]=='\0')
- {
- TEXTSTRING_ID string_index=(TEXTSTRING_ID)(TEXTSTRING_MPCONFIG1_FILENAME+(name[6]-'1'));
- ConfigurationLocalisedFilenameList.add_entry(GetTextString(string_index));
- localisedFilename=TRUE;
- }
- }
- if(!localisedFilename)
+ //seeif this is one of the default language localised configurations
+ if(!strncmp(name,"Config",6))
+ {
+ if(name[6]>='1' && name[6]<='7' && name[7]=='\0')
{
- ConfigurationLocalisedFilenameList.add_entry(name);
+ TEXTSTRING_ID string_index=(TEXTSTRING_ID)(TEXTSTRING_MPCONFIG1_FILENAME+(name[6]-'1'));
+ ConfigurationLocalisedFilenameList.add_entry(GetTextString(string_index));
+ localisedFilename=TRUE;
}
}
+ if(!localisedFilename)
+ {
+ ConfigurationLocalisedFilenameList.add_entry(name);
+ }
}
- globfree(&globbuf);
-
+ CloseGameDirectory(gd);
+
//delete the old menu
if(AvPMenu_Multiplayer_LoadConfig) delete AvPMenu_Multiplayer_LoadConfig;
@@ -195,7 +169,7 @@ const char* GetMultiplayerConfigDescription(int index)
else
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
- file=fopen(filename,"rb");
+ file= OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
if(!file)
{
return 0;
@@ -233,7 +207,7 @@ void LoadMultiplayerConfiguration(const char* name)
else
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
- file=fopen(filename,"rb");
+ file= OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
if(!file) return;
@@ -330,7 +304,6 @@ void LoadMultiplayerConfiguration(const char* name)
netGameData.customLevelName[0] = 0;
}
}
-
}
void SaveMultiplayerConfiguration(const char* name)
@@ -342,10 +315,15 @@ void SaveMultiplayerConfiguration(const char* name)
else
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
- CreateDirectory(MP_CONFIG_DIR,0);
- file=fopen(filename,"wb");
- if(!file) return;
-
+
+ file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
+ if (file == NULL) {
+ CreateGameDirectory(MP_CONFIG_DIR); /* try again */
+ file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
+ if (file == NULL)
+ return;
+ }
+
fwrite(&netGameData.gameType,sizeof(int),1,file);
fwrite(&netGameData.levelNumber,sizeof(int),1,file);
fwrite(&netGameData.scoreLimit,sizeof(int),1,file);
@@ -427,7 +405,6 @@ void SaveMultiplayerConfiguration(const char* name)
delete [] LastDescriptionText;
LastDescriptionFile=0;
LastDescriptionText=0;
-
}
@@ -441,12 +418,12 @@ void DeleteMultiplayerConfigurationByIndex(int index)
else
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,ConfigurationFilenameList[index]);
- DeleteFile(filename);
+ DeleteGameFile(filename);
}
-#define IP_ADDRESS_DIR "IP_Address"
-#define IP_ADDRESS_WILDCARD "IP_Address/*.IP Address"
+#define IP_ADDRESS_DIR "IP_Address/"
+#define IP_ADDRESS_WILDCARD "*.IP Address"
static List<char*> IPAddFilenameList;
@@ -465,52 +442,29 @@ BOOL BuildLoadIPAddressMenu()
//do a search for all the addresses in the address directory
- glob_t globbuf;
- const char* load_name=IP_ADDRESS_WILDCARD;
-
- if (glob(load_name, 0, NULL, &globbuf))
+ void *gd;
+ GameDirectoryFile *gdf;
+ gd = OpenGameDirectory(IP_ADDRESS_DIR, IP_ADDRESS_WILDCARD, FILETYPE_CONFIG);
+ if (gd == NULL) {
+ CreateGameDirectory(IP_ADDRESS_DIR); /* maybe it didn't exist.. */
return FALSE;
-
- // get any path in the load_name
- int nPathLen = 0;
- char * pColon = strrchr(load_name,':');
- if (pColon) nPathLen = pColon - load_name + 1;
- char * pBackSlash = strrchr(load_name,'\\');
- if (pBackSlash)
- {
- int nLen = pBackSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
- }
- char * pSlash = strrchr(load_name,'/');
- if (pSlash)
- {
- int nLen = pSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
}
-
- for (unsigned int i = 0; i < globbuf.gl_pathc; i++) {
- struct stat buf;
-
- if (stat(globbuf.gl_pathv[i], &buf) == -1)
+
+ while ((gdf = ScanGameDirectory(gd)) != NULL) {
+ if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
+ continue;
+ if ((gdf->attr & FILEATTR_READABLE) == 0)
continue;
- if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0)) {
- char *filename = strrchr(globbuf.gl_pathv[i], '/');
- if (filename)
- filename++;
- else
- filename = globbuf.gl_pathv[i];
-
- char* name=new char[strlen(filename)+1];
- strcpy(name,filename);
- char* dotpos=strchr(name,'.');
- if(dotpos) *dotpos=0;
- IPAddFilenameList.add_entry(name);
- }
+ char* name=new char[strlen(gdf->filename)+1];
+ strcpy(name,gdf->filename);
+ char* dotpos=strchr(name,'.');
+ if(dotpos) *dotpos=0;
+ IPAddFilenameList.add_entry(name);
}
- globfree(&globbuf);
-
+ CloseGameDirectory(gd);
+
//delete the old menu
if(AvPMenu_Multiplayer_LoadIPAddress) delete [] AvPMenu_Multiplayer_LoadIPAddress;
@@ -544,9 +498,13 @@ void SaveIPAddress(const char* name,const char* address)
char filename[200];
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
- CreateDirectory(IP_ADDRESS_DIR,0);
- file=fopen(filename,"wb");
- if(!file) return;
+ file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
+ if (file == NULL) {
+ CreateGameDirectory(IP_ADDRESS_DIR); /* try again */
+ file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
+ if (file == NULL)
+ return;
+ }
fwrite(address,1,strlen(address)+1,file);
@@ -556,15 +514,14 @@ void SaveIPAddress(const char* name,const char* address)
void LoadIPAddress(const char* name)
{
extern char IPAddressString[];
-
-
+
if(!name) return;
FILE* file;
char filename[200];
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
- file=fopen(filename,"rb");
+ file=OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
if(!file) return;
fread(IPAddressString,1,16,file);
@@ -598,41 +555,33 @@ void BuildMultiplayerLevelNameArray()
//first do a search for custom level rifs
// allow a wildcard search
-
- const char* load_name="avp_rifs/custom/*.rif";
-
- glob_t globbuf;
+ void *gd;
+ GameDirectoryFile *gdf;
- if (glob(load_name, 0, NULL, &globbuf) == 0) {
+ /* TODO: Have to use PERM until the load_rif code can handle CONFIG */
+ if ((gd = OpenGameDirectory("avp_rifs/Custom/", "*.rif", FILETYPE_PERM)) != NULL) {
char* custom_string = GetTextString(TEXTSTRING_CUSTOM_LEVEL);
int cs_len = strlen(custom_string);
- for (unsigned int i = 0; i < globbuf.gl_pathc; i++) {
- struct stat buf;
-
- if (stat(globbuf.gl_pathv[i], &buf) == -1)
+ while ((gdf = ScanGameDirectory(gd)) != NULL) {
+ if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
continue;
-
- if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0)) {
- char *filename = strrchr(globbuf.gl_pathv[i], '/');
- if (filename)
- filename++;
- else
- filename = globbuf.gl_pathv[i];
-
- char* name=new char[strlen(filename)+cs_len+3+1];
+ if ((gdf->attr & FILEATTR_READABLE) == 0)
+ continue;
+
+ char* name=new char[strlen(gdf->filename)+cs_len+3+1];
- strcpy(name, filename);
- char* dotpos=strrchr(name,'.');
- if(dotpos) *dotpos=0;
- strcat(name," (");
- strcat(name,custom_string);
- strcat(name,")");
-
- CustomLevelNameList.add_entry(name);
- }
+ strcpy(name, gdf->filename);
+ char* dotpos=strrchr(name,'.');
+ if(dotpos) *dotpos=0;
+ strcat(name," (");
+ strcat(name,custom_string);
+ strcat(name,")");
+ CustomLevelNameList.add_entry(name);
}
- globfree(&globbuf);
+ CloseGameDirectory(gd);
+ } else {
+ CreateGameDirectory("Custom/"); /* maybe it didn't exist.. */
}
NumCustomLevels = CustomLevelNameList.size();
diff --git a/src/avp/win95/frontend/avp_userprofile.cpp b/src/avp/win95/frontend/avp_userprofile.cpp
index 80434da..29a1aaa 100644
--- a/src/avp/win95/frontend/avp_userprofile.cpp
+++ b/src/avp/win95/frontend/avp_userprofile.cpp
@@ -20,11 +20,6 @@ extern "C"
#include "pldnet.h"
#include <time.h>
-#include <glob.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
static int LoadUserProfiles(void);
static void EmptyUserProfilesList(void);
@@ -112,9 +107,9 @@ extern int SaveUserProfile(AVP_USER_PROFILE *profilePtr)
strcat(filename,profilePtr->Name);
strcat(filename,USER_PROFILES_SUFFIX);
- FILE* file=fopen(filename,"wb");
+ FILE* file=OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
delete [] filename;
- if(!file) return 0;
+ if (!file) return 0;
SaveSettingsToUserProfile(profilePtr);
@@ -135,7 +130,7 @@ extern void DeleteUserProfile(int number)
strcat(filename,profilePtr->Name);
strcat(filename,USER_PROFILES_SUFFIX);
- DeleteFile(filename);
+ DeleteGameFile(filename);
delete [] filename;
{
@@ -145,7 +140,7 @@ extern void DeleteUserProfile(int number)
for (i=0; i<NUMBER_OF_SAVE_SLOTS; i++)
{
sprintf(filename,"%s%s_%d.sav",USER_PROFILES_PATH,profilePtr->Name,i+1);
- DeleteFile(filename);
+ DeleteGameFile(filename);
}
delete [] filename;
}
@@ -180,71 +175,54 @@ static int ProfileIsMoreRecent(AVP_USER_PROFILE *profilePtr, AVP_USER_PROFILE *p
static int LoadUserProfiles(void)
{
- glob_t globbuf;
- const char* load_name=USER_PROFILES_WILDCARD_NAME;
+ void *gd;
+ GameDirectoryFile *gdf;
- if (glob(load_name, 0, NULL, &globbuf))
+ gd = OpenGameDirectory(USER_PROFILES_PATH, USER_PROFILES_WILDCARD_NAME, FILETYPE_CONFIG);
+ if (gd == NULL) {
+ CreateGameDirectory(USER_PROFILES_PATH); /* maybe it didn't exist.. */
return 0;
-
- // get any path in the load_name
- int nPathLen = 0;
- char * pColon = strrchr(load_name,':');
- if (pColon) nPathLen = pColon - load_name + 1;
- char * pBackSlash = strrchr(load_name,'\\');
- if (pBackSlash)
- {
- int nLen = pBackSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
- }
- char * pSlash = strrchr(load_name,'/');
- if (pSlash)
- {
- int nLen = pSlash - load_name + 1;
- if (nLen > nPathLen) nPathLen = nLen;
}
- for (unsigned int i = 0; i < globbuf.gl_pathc; i++) {
- struct stat buf;
-
- if (stat(globbuf.gl_pathv[i], &buf) == -1)
+ int nPathLen = strlen(USER_PROFILES_PATH);
+
+ while ((gdf = ScanGameDirectory(gd)) != NULL) {
+ if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
+ continue;
+ if ((gdf->attr & FILEATTR_READABLE) == 0)
continue;
- if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0))
- {
- char * pszFullPath = new char [nPathLen+strlen(globbuf.gl_pathv[i])+1];
- // strncpy(pszFullPath,load_name,nPathLen);
- strcpy(pszFullPath /* +nPathLen */, globbuf.gl_pathv[i]);
-
- HANDLE rif_file;
- rif_file = CreateFile (pszFullPath, GENERIC_READ, 0, 0, OPEN_EXISTING,
- FILE_FLAG_RANDOM_ACCESS, 0);
- if(rif_file==INVALID_HANDLE_VALUE)
- {
- delete[] pszFullPath;
- continue;
- }
-
- AVP_USER_PROFILE *profilePtr = new AVP_USER_PROFILE;
- unsigned long bytes_read;
+ char * pszFullPath = new char [nPathLen+strlen(gdf->filename)+1];
+ strcpy(pszFullPath, USER_PROFILES_PATH);
+ strcat(pszFullPath, gdf->filename);
- if (!ReadFile(rif_file, profilePtr, sizeof(AVP_USER_PROFILE), &bytes_read, 0))
- {
- CloseHandle (rif_file);
- delete[] pszFullPath;
- delete profilePtr;
- continue;
- }
+ FILE *rif_file;
+ rif_file = OpenGameFile(pszFullPath, FILEMODE_READONLY, FILETYPE_CONFIG);
+ if(rif_file==NULL)
+ {
+ delete[] pszFullPath;
+ continue;
+ }
- profilePtr->FileTime = buf.st_mtime;
+ AVP_USER_PROFILE *profilePtr = new AVP_USER_PROFILE;
- InsertProfileIntoList(profilePtr);
- CloseHandle (rif_file);
+ if (fread(profilePtr, 1, sizeof(AVP_USER_PROFILE), rif_file) != sizeof(AVP_USER_PROFILE))
+ {
+ fclose(rif_file);
delete[] pszFullPath;
+ delete profilePtr;
+ continue;
}
+
+ profilePtr->FileTime = gdf->timestamp;
+
+ InsertProfileIntoList(profilePtr);
+ fclose(rif_file);
+ delete[] pszFullPath;
}
- globfree(&globbuf);
-
+ CloseGameDirectory(gd);
+
return 1;
}
diff --git a/src/avp/win95/frontend/avp_userprofile.h b/src/avp/win95/frontend/avp_userprofile.h
index 7355d09..46de91b 100644
--- a/src/avp/win95/frontend/avp_userprofile.h
+++ b/src/avp/win95/frontend/avp_userprofile.h
@@ -145,7 +145,7 @@ typedef struct
#define USER_PROFILES_PATH "User_Profiles/"
-#define USER_PROFILES_WILDCARD_NAME "User_Profiles/*.prf"
+#define USER_PROFILES_WILDCARD_NAME "*.prf"
#define USER_PROFILES_SUFFIX ".prf"
diff --git a/src/avp/win95/objsetup.cpp b/src/avp/win95/objsetup.cpp
index 6e8c577..0db896a 100644
--- a/src/avp/win95/objsetup.cpp
+++ b/src/avp/win95/objsetup.cpp
@@ -3719,6 +3719,9 @@ void setup_sounds (Environment_Data_Chunk * envd)
stt->outer_range = snd->outer_range * local_scale;
stt->max_volume = snd->max_volume;
stt->pitch = snd->pitch;
+
+ stt->playing = 0;
+ stt->loop = 0;
if(snd->flags & SoundObjectFlag_NotPlayingAtStart)
stt->playing=0;
@@ -3729,13 +3732,11 @@ void setup_sounds (Environment_Data_Chunk * envd)
stt->loop=0;
else
stt->loop=1;
-
stt->sound_name =(char*) PoolAllocateMem(strlen (snd->wav_name) + 1);
strcpy(stt->sound_name,snd->wav_name);
stt->sound_loaded=GetSoundForMainRif(snd->wav_name);
-
-
+
AddToBehaviourList(snd->snd_name,snd->CalculateID(), I_BehaviourPlacedSound, (void *) stt);
}
}
diff --git a/src/avp/win95/platsup.c b/src/avp/win95/platsup.c
index edf58bf..0498328 100644
--- a/src/avp/win95/platsup.c
+++ b/src/avp/win95/platsup.c
@@ -52,7 +52,7 @@ void catpathandextension(char* dst, char* src)
if ((len > 0 && (dst[len-1] != '\\' && dst[len-1] != '/')) && *src != '.')
{
- lstrcat(dst,"\\");
+ lstrcat(dst,"/");
}
lstrcat(dst,src);
@@ -367,7 +367,7 @@ char *LoadTextFile(char *filename)
char *bufferPtr;
long int save_pos, size_of_file;
FILE *fp;
- fp = fopen(filename,"rb");
+ fp = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
if (!fp) goto error;
diff --git a/src/avp/win95/projload.cpp b/src/avp/win95/projload.cpp
index e5bd32c..40c81af 100644
--- a/src/avp/win95/projload.cpp
+++ b/src/avp/win95/projload.cpp
@@ -84,12 +84,6 @@ const char * SubShps_Directory = "SubShps\\All\\";
// const char * GenTex_Directory = 0;
const char * FixTex_Directory = "\\\\Kate\\Kate Share\\avp\\Fix-Tex\\";
const char * GameTex_Directory = "\\\\Kate\\Kate Share\\avp\\game-tex\\";
-// these link with pcmenus.cpp
-const char * GenTex4bit_Directory = "\\\\Kate\\Kate Share\\avp\\G4bitTex\\";
-const char * GenTex8bit_Directory = "\\\\Kate\\Kate Share\\avp\\GenG-Tex\\";
-const char * GenTex75pc_Directory = "\\\\Kate\\Kate Share\\avp\\Gen34Tex\\";
-const char * GenTex50pc_Directory = "\\\\Kate\\Kate Share\\avp\\Gen12Tex\\";
-
// new directories for new-style graphics - to be determined properly
char const * FirstTex_Directory = "Graphics"; // currently relative to cwd
char const * SecondTex_Directory = 0; // will be the src safe shadow for development builds
@@ -357,9 +351,9 @@ struct LoadedPlacedHierarchy
#define NumPlacedHierarchy 3
LoadedPlacedHierarchy PlacedHierarchyArray[NumPlacedHierarchy]=
{
- "dropship","dropship",INVALID_RIFFHANDLE,
- "pred ship fury","pred ship fury",INVALID_RIFFHANDLE,
- "pred ship ob","pred ship ob",INVALID_RIFFHANDLE,
+ { "dropship","dropship",INVALID_RIFFHANDLE },
+ { "pred ship fury","pred ship fury",INVALID_RIFFHANDLE },
+ { "pred ship ob","pred ship ob",INVALID_RIFFHANDLE },
};
@@ -368,7 +362,6 @@ void LoadedPlacedHierarchy::load_rif()
if(placed_rif!=INVALID_RIFFHANDLE) return;
char file_path[100];
-/* TODO: dir seperator */
sprintf(file_path,"avp_huds/%s.rif",file_name);
placed_rif=avp_load_rif_non_env(file_path);
@@ -505,7 +498,6 @@ Global_Hierarchy_Store::Global_Hierarchy_Store (RIFFHANDLE h)
sound_array[index].volume=isc->max_volume;
if(dir_chunk)
{
- /* TODO: dir separator */
sprintf(wavname,"%s\\%s",dir_chunk->directory,isc->wav_name);
sound_array[index].sound_loaded=GetSound(wavname);
}
@@ -516,14 +508,9 @@ Global_Hierarchy_Store::Global_Hierarchy_Store (RIFFHANDLE h)
if(sound_array[index].sound_loaded)
{
sound_array[index].sound_index=(SOUNDINDEX)sound_array[index].sound_loaded->sound_num;
- }
-
-
+ }
}
}
-
-
-
}
@@ -1989,7 +1976,6 @@ BOOL copy_rif_data (RIFFHANDLE h, int flags,int progress_start,int progress_inte
int start_shape_no = rt_temp.start_list_pos;
int list_pos = rt_temp.main_list_pos;
db_logf3(("Shape copied to %d",list_pos));
- MORPHCTRL * mc = rt_temp.mc;
#else
int list_pos = copy_to_mainshapelist(h,shplif(),flags,&ob->object_data);
int start_shape_no = list_pos;
@@ -3010,10 +2996,9 @@ void DeallocateLoadedShapeheader(SHAPEHEADER * shp)
void DeallocateModules()
{
-
- MODULE ** m_arrayPtr = MainScene.sm_marray;
-
#if !USE_LEVEL_MEMORY_POOL
+ MODULE ** m_arrayPtr = MainScene.sm_marray;
+
while (*m_arrayPtr)
{
List<Light_Chunk *> lights_for_this_module;
@@ -3092,7 +3077,7 @@ void avp_undo_rif_load(RIFFHANDLE h)
RIFFHANDLE avp_load_rif (const char * fname)
{
//see if there is a local copy of the rif file
- FILE* rifFile = fopen(fname,"rb");
+ FILE* rifFile = OpenGameFile(fname, FILEMODE_READONLY, FILETYPE_PERM);
/* TODO: Let's find a better method */
if (!rifFile && AvpCDPath)
@@ -3111,7 +3096,7 @@ RIFFHANDLE avp_load_rif (const char * fname)
RIFFHANDLE avp_load_rif_non_env (const char * fname)
{
//see if there is a local copy of the rif file
- FILE* rifFile = fopen(fname, "rb");
+ FILE* rifFile = OpenGameFile(fname, FILEMODE_READONLY, FILETYPE_PERM);
/* TODO: Let's find a better method */
if (!rifFile && AvpCDPath)
diff --git a/src/avp/win95/scrshot.cpp b/src/avp/win95/scrshot.cpp
index 0299fa4..23ccd76 100644
--- a/src/avp/win95/scrshot.cpp
+++ b/src/avp/win95/scrshot.cpp
@@ -27,10 +27,13 @@ extern void LoadModuleData();
void LogCameraPosForModuleLinking()
{
+ fprintf(stderr, "STUB: LogCameraPosForModuleLinking()\n");
+
+#if 0 /* TODO: commented out because I want to know if its actually used */
if(!playerPherModule) return;
if(!playerPherModule->name) return;
- char Filename[100]={"avp_rifs\\"};
+ char Filename[100]={"avp_rifs/"};
strcat(Filename,Env_List[AvP.CurrentEnv]->main);
strcat(Filename,".mlf");
@@ -59,6 +62,7 @@ void LogCameraPosForModuleLinking()
fwrite(&output_buffer[0],4,length/4,file);
fclose(file);
textprint("Saving camera for module links");
+#endif
}
int SaveCameraPosKeyPressed=0;
static BOOL ModuleLinkAssist=FALSE;
@@ -115,7 +119,7 @@ void ScreenShot()
{
Name[length]=i/10+'0';
Name[length+1]=(i%10)+'0';
- FILE* tempfp=fopen(Name,"r");
+ FILE* tempfp = OpenGameFile(Name, FILEMODE_READONLY, FILETYPE_CONFIG);
if(!tempfp)break;
else
{
@@ -124,7 +128,7 @@ void ScreenShot()
}
if(i==100) return;
- FILE * fp = fopen(Name,"wb");
+ FILE *fp = OpenGameFile(Name, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
if (!fp)
{
return;
@@ -190,7 +194,7 @@ void ScreenShot()
unsigned char *BufferPtr = &buf[0];
for (i=h.WinInfo.Height-1; i>=0; --i)
{
- int j;
+ unsigned int j;
for (j=0; j<h.WinInfo.Width; ++j)
{
PutByte((BYTE)BufferPtr[j*3+2],fp); //b
diff --git a/src/avp/win95/system.c b/src/avp/win95/system.c
index df5bbe3..2be52f1 100644
--- a/src/avp/win95/system.c
+++ b/src/avp/win95/system.c
@@ -734,8 +734,8 @@ void IntegrateNewEnvironment()
}
-const char GameDataDirName[20] = {"AVP_RIFS"};
-const char FileNameExtension[5] = {".RIF"};
+const char GameDataDirName[20] = {"avp_rifs"};
+const char FileNameExtension[5] = {".rif"};
void LoadRifFile()
{
@@ -760,8 +760,6 @@ void LoadRifFile()
catpathandextension(&file_and_path[0], Env_List[AvP.CurrentEnv]->main); /* root of the file name,smae as dir*/
catpathandextension(&file_and_path[0], (char *)&FileNameExtension[0]); /* extension*/
- FixFilename(file_and_path);
-
env_rif = avp_load_rif((const char*)&file_and_path[0]);
Set_Progress_Bar_Position(PBAR_LEVEL_START+PBAR_LEVEL_INTERVAL*.4);
@@ -772,10 +770,6 @@ void LoadRifFile()
};
-// #ifdef __WATCOMC__
-// #pragma message("Note: use copy_chunks_from_envronment(CCF_ENVIRONMENT) iff a character rif is loaded")
-// #endif
-
#if MaxImageGroups>1
SetCurrentImageGroup(2); // FOR ENV
#endif
diff --git a/src/avp/win95/usr_io.c b/src/avp/win95/usr_io.c
index 49099af..2bf75cf 100644
--- a/src/avp/win95/usr_io.c
+++ b/src/avp/win95/usr_io.c
@@ -1718,7 +1718,7 @@ void SaveAKeyConfiguration(char* Filename)
void SaveDefaultPrimaryConfigs(void)
{
- FILE* file=fopen("default.cfg","wb");
+ FILE *file = OpenGameFile("default.cfg", FILEMODE_WRITEONLY, FILETYPE_CONFIG);
if(!file) return;
fwrite(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
@@ -1729,7 +1729,7 @@ void SaveDefaultPrimaryConfigs(void)
}
void LoadDefaultPrimaryConfigs(void)
{
- FILE* file=fopen("default.cfg","rb");
+ FILE *file = OpenGameFile("default.cfg", FILEMODE_READONLY, FILETYPE_CONFIG);
if(!file) return;
fread(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
diff --git a/src/avp/win95/win_proj.cpp b/src/avp/win95/win_proj.cpp
deleted file mode 100644
index afc76ed..0000000
--- a/src/avp/win95/win_proj.cpp
+++ /dev/null
@@ -1,682 +0,0 @@
-/****
-
-Project specific (or potentially
-project specific) windows functionality
-
-****/
-
-// To link code to main C functions
-
-extern "C" {
-
-#include "3dc.h"
-#include "inline.h"
-#include "cd_player.h"
-#include "psndplat.h"
-
-#include "rentrntq.h"
- // Added 21/11/97 by DHM: support for a queue of Windows
- // messages to avoid problems with re-entrancy due to WinProc()
-
-#include "alt_tab.h"
-
-#include "dxlog.h"
-#include "zmouse.h"
-
-void MakeToAsciiTable(void);
-
-// mousewheel msg id
-UINT const RWM_MOUSEWHEEL = RegisterWindowMessage(MSH_MOUSEWHEEL);
-signed int MouseWheelStatus;
-
-extern LPDIRECTDRAWSURFACE lpDDSBack;
-extern LPDIRECTDRAWSURFACE lpDDSPrimary;
-extern LPDIRECTDRAWSURFACE lpZBuffer;
-extern LPDIRECTDRAWSURFACE lpDDBackdrop;
-
-unsigned char ksarray[256];
-unsigned char ToAsciiTable[256][256];
-
-// Dubious
-#define grabmousecapture No
-
-/*
- Name of project window etc for Win95 interface
- Project specific (fairly obviously...).
- Determines the default menu in which the application
- appears (altho' other code will undoubtedly be needed
- as well...), so that a NULL here should ensure no menu.
-*/
-
-#define NAME "AvP"
-#define TITLE "AvP"
-
-// Necessary globals
-
-HWND hWndMain;
-BOOL bActive = TRUE; // is application active?
-
-// Parameters for main (assumed full screen) window
-int WinLeftX, WinRightX, WinTopY, WinBotY;
-int WinWidth, WinHeight;
-
-// Externs
-
-
-
-extern int VideoMode;
-extern int WindowMode;
-extern WINSCALEXY TopLeftSubWindow;
-extern WINSCALEXY ExtentXYSubWindow;
-
-// Window procedure (to run continuously while WinMain is active).
-// Only necessary functions are handling keyboard input (for the moment
-// at least - cf. DirectInput) and dealing with important system
-// messages, e.g. WM_PAINT.
-
-// Remember to support all the keys you need for your project
-// for both KEYUP and KEYDOWN messages!!!
-
-// IMPORTANT!!! The WindowProc is project specific
-// by default, since various nifty hacks can always
-// be implemented directly via the windows procedure
-
-#define RESTORE_SURFACE(lpDDS) { \
- if (lpDDS) { \
- if (DDERR_SURFACELOST == (lpDDS)->IsLost()) { \
- HRESULT hResult = (lpDDS)->Restore(); \
- LOGDXFMT(("%s surface was restored", #lpDDS )); \
- LOGDXERR(hResult); \
- } else { \
- LOGDXFMT(("%s surface wasn't lost", #lpDDS )); \
- } \
- } \
- else { \
- LOGDXFMT(("?&@#! no %s surface", #lpDDS )); \
- } \
-}
-
-extern void KeyboardEntryQueue_Add(char c);
-extern IngameKeyboardInput_KeyDown(unsigned char key);
-extern IngameKeyboardInput_KeyUp(unsigned char key);
-extern IngameKeyboardInput_ClearBuffer(void);
-
-
-long FAR PASCAL WindowProc(HWND hWnd, UINT message,
- WPARAM wParam, LPARAM lParam)
-{
- PAINTSTRUCT ps;
- HDC hdc;
- RECT NewWindCoord;
-
- if (message==RWM_MOUSEWHEEL)
- {
- message = WM_MOUSEWHEEL;
- wParam <<= 16;
- }
-
-
- switch(message)
- {
-
- case WM_MOUSEWHEEL:
- {
- MouseWheelStatus = wParam;
- MouseWheelStatus>>=16;
- return 0;
- }
-
- // 21/11/97 DHM: Added porcessing of WM_CHAR messages:
- case WM_CHAR:
- RE_ENTRANT_QUEUE_WinProc_AddMessage_WM_CHAR
- (
- (char) wParam
- );
- KeyboardEntryQueue_Add((char)wParam);
- return 0;
- case WM_KEYDOWN:
- RE_ENTRANT_QUEUE_WinProc_AddMessage_WM_KEYDOWN
- (
- wParam
- );
- // it's intentional for this case to fall through to WM_SYSKEYDOWN
- case WM_SYSKEYDOWN:
- {
- int scancode = (lParam>>16)&255;
- unsigned char vkcode = (wParam&255);
-
- // ignore the status of caps lock
- //ksarray[VK_CAPITAL] = 0;
- //ksarray[VK_CAPITAL] = GetKeyState(VK_CAPITAL);
- if (vkcode!=VK_CAPITAL && vkcode!=VK_SCROLL)
- {
- #if 0
- WORD output;
- if (ToAscii(vkcode,scancode,&ksarray[0],&output,0))
- {
- IngameKeyboardInput_KeyDown((unsigned char)(output));
- }
- #else
- if (ToAsciiTable[vkcode][scancode])
- {
- IngameKeyboardInput_KeyDown(ToAsciiTable[vkcode][scancode]);
- }
- #endif
- }
- // reset caps lock status
- //ksarray[VK_CAPITAL] = GetKeyState(VK_CAPITAL);
- //ToAscii(wParam&255,scancode,&ksarray[0],&output,0);
- }
- return 0;
-
- case WM_SYSKEYUP:
- case WM_KEYUP:
- {
- int scancode = (lParam>>16)&255;
- unsigned char vkcode = (wParam&255);
-
-
- // ignore the status of caps lock
- //ksarray[VK_CAPITAL] = 0;
-//MakeToAsciiTable();
- //ksarray[VK_CAPITAL] = GetKeyState(VK_CAPITAL);
- if (vkcode!=VK_CAPITAL && vkcode!=VK_SCROLL)
- {
- #if 0
- WORD output;
- unsigned char z = ToAscii(vkcode,scancode,&ksarray[0],&output,0);
- unsigned char a = (unsigned char)output;
- unsigned char b = ToAsciiTable[vkcode][scancode];
- #endif
- #if 0
- WORD output;
- if (ToAscii(vkcode,scancode,&ksarray[0],&output,0))
- {
- IngameKeyboardInput_KeyUp((unsigned char)(output));
- }
- #else
- if (ToAsciiTable[vkcode][scancode])
- {
- IngameKeyboardInput_KeyUp(ToAsciiTable[vkcode][scancode]);
- }
- #endif
- }
- // reset caps lock status
- //ksarray[VK_CAPITAL] = GetKeyState(VK_CAPITAL);
- //ToAscii(wParam&255,scancode,&ksarray[0],&output,0);
- }
- return 0;
-
- // This, in combination with code in win_func,
- // will hopefully disable Alt-Tabbing...
- case WM_ACTIVATEAPP:
- bActive = (BOOL) wParam;
-
- LOGDXFMT(("WM_ACTIVATEAPP msg: bActive = %d",(int)bActive));
-
- if (bActive)
- {
- // need to restore all surfaces - do the special ones first
- RESTORE_SURFACE(lpDDSPrimary)
- RESTORE_SURFACE(lpDDSBack)
- RESTORE_SURFACE(lpZBuffer)
- // dodgy, this is meant to be graphic, so it'll really need to be reloaded
- RESTORE_SURFACE(lpDDBackdrop)
- // now do all the graphics surfaces and textures, etc.
- ATOnAppReactivate();
- }
- IngameKeyboardInput_ClearBuffer();
-
- return 0;
-
- // Three below are for safety, to turn off
- // as much as possible of the more annoying
- // functionality of the default Windows
- // procedure handler
-
- case WM_ACTIVATE:
- return 0;
-#if 0
- case WM_SYSKEYUP:
- return 0;
-
- case WM_SYSKEYDOWN:
- return 0;
-#endif
- case WM_CREATE:
- break;
-
- case WM_MOVE:
- // Necessary to stop it crashing in 640x480
- // FullScreen modes on window initialisation
- if (WindowMode == WindowModeSubWindow)
- {
- GetWindowRect(hWndMain, &NewWindCoord);
- WinLeftX = NewWindCoord.left;
- WinTopY = NewWindCoord.top;
- WinRightX = NewWindCoord.right;
- WinBotY = NewWindCoord.bottom;
- }
- break;
-
- case WM_SIZE:
- // Necessary to stop it crashing in 640x480
- // FullScreen modes on window initialisation
- if (WindowMode == WindowModeSubWindow)
-
- {
- GetWindowRect(hWndMain, &NewWindCoord);
- WinLeftX = NewWindCoord.left;
- WinTopY = NewWindCoord.top;
- WinRightX = NewWindCoord.right;
- WinBotY = NewWindCoord.bottom;
- }
- break;
-
- case WM_SETCURSOR:
- SetCursor(NULL);
- return TRUE;
-
- case WM_ERASEBKGND:
- return TRUE;
-
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- EndPaint(hWnd, &ps);
- return TRUE;
-
- /* Patrick 11/6/97: this to detects the end of a cdda track */
- case MM_MCINOTIFY:
- PlatCDDAManagementCallBack(wParam, lParam);
- break;
-
- case WM_DESTROY:
- // Calls ReleaseDirect3D DIRECTLY,
- // so as to avoid calling ExitSystem and exiting the
- // Windows system inside the windows procedure
- // IMPORTANT!!! For this to work, release functions
- // must be re-entrant. Since this may be causing
- // problems under obscure cirumstances, I am removing
- // this now (25/7/96).
- // And putting it back... (20/9/96)
- ReleaseDirect3D();
- /* patrick 9/6/97: hmmmmm.... */
- PlatEndSoundSys();
-
- PostQuitMessage(0);
- break;
- }
-
- return DefWindowProc(hWnd, message, wParam, lParam);
-}
-
-/*
- Persuade Win95 to give us the window we want and, like,
- TOTAL CONTROL, and then shut up, stop whinging and
- go away.
- Or at least as much control as we can get.. safely...
- elegantly... ummm...
-*/
-
-// IMPORTANT!!! Windows initialisation is project specific,
-// because of the project name and title if nothing else
-
-// This function now takes a mode which is
-// set to full or change. Full should be
-// run ONLY when the system is starting.
-// Change is used to change the window
-// characteristics during a run, e.g. to
-// change from SubWindow to FullScreen
-// mode, and will not attempt to register
-// the windows class.
-
-BOOL InitialiseWindowsSystem(HANDLE hInstance, int nCmdShow,
- int WinInitMode)
-{
- WNDCLASS wc;
- BOOL rc;
-
- MakeToAsciiTable();
-/*
- Set up the width and height we want from
- the VideoMode, taking account of WindowMode.
-*/
-
-// This has now been modified to just set the
-// size to the current system metrics, which
-// may or may not be ideal. Surprisingly, it
-// seems not to make much difference.
-
- if (WindowMode == WindowModeSubWindow)
- {
-
- //force window to be 640x480 to avoid stretch blits.
- WinWidth=640;
- WinHeight=480;
-
- WinLeftX = (int) (TopLeftSubWindow.x *
- (float) GetSystemMetrics(SM_CXSCREEN));
- WinTopY = (int) (TopLeftSubWindow.y *
- (float) GetSystemMetrics(SM_CYSCREEN));
- WinRightX = (WinLeftX + WinWidth);
- WinBotY = (WinTopY + WinHeight);
- }
- else if (WindowMode == WindowModeFullScreen)
- {
- #if 1
- WinWidth = GetSystemMetrics(SM_CXSCREEN);
- WinHeight = GetSystemMetrics(SM_CYSCREEN);
- #else
- // This version of the code MUST be
- // kept up to date with new video modes!!!
- if ((VideoMode == VideoMode_DX_320x200x8) ||
- (VideoMode == VideoMode_DX_320x200x8T))
- {
- WinWidth = 320;
- WinHeight = 200;
- }
- else if (VideoMode == VideoMode_DX_320x240x8)
- {
- WinWidth = 320;
- WinHeight = 240;
- }
- else // Default to 640x480
- {
- WinWidth = 640;
- WinHeight = 480;
- }
- #endif
-
- // Set up globals for window corners
- WinLeftX = 0;
- WinTopY = 0;
- WinRightX = WinWidth;
- WinBotY = WinHeight;
- }
- else
- return FALSE;
-
-// We only want to register the class in
-// WinInitFull mode!!!
-
- if (WinInitMode == WinInitFull)
- {
-
-/*
- Set up and register window class
-*/
-// get double click messages from mouse if user double-clicks it
- wc.style = CS_DBLCLKS;
-// Name of window procedure (see above)
- wc.lpfnWndProc = WindowProc;
-/*
- Extra bytes for obscure purposes bearing a sordid relationship to
- dialog box conventions. Zero for us.
-*/
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
-// Instance which window is within
- wc.hInstance = (HINSTANCE) hInstance;
-/*
- System icon resource. This one is generic. For an actual
- game this icon will be project specific.
-*/
- #if 1
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- #else
- wc.hIcon = NULL;
- #endif
-// System cursor resource. This one is generic.
- #if 1
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- #else
- wc.hCursor = NULL;
- #endif
-/*
- NULL background forces application to redraw
- the background ITSELF when it receives a WM_ERASEBKGND
- message, leaving graphical control with the engine
-*/
- wc.hbrBackground = NULL;
-// Project name and class for windows menus etc.
- wc.lpszMenuName = NAME;
- wc.lpszClassName = NAME;
-/*
- Register the class we have constructed as a valid window that
- can then be created. Return code indicates success or
- failure.
-*/
- rc = RegisterClass(&wc);
-
- if (!rc)
- return FALSE;
- }
-
-/*
- Create a window (extended function call) and return
- handle. Before returning, WM_CREATE, WM_GETMINMAXINFO
- and WM_NCCREATE messages will be sent to the window
- procedure.
-
- NOTE!!! AT present even with debug on we get a
- topmost full screen window.
-*/
-
-#if debug
- if (WindowMode == WindowModeSubWindow)
- {
- hWndMain = CreateWindowEx(
- 0, // WS_EX_TOPMOST
- NAME, // Name of class (registered by RegisterClass call above)
- TITLE, // Name of window
- WS_OVERLAPPED |
- WS_CAPTION |
- WS_THICKFRAME,
-/*
- Initial horizontal and vertical position. For a pop-up window,
- these are the coordinates of the upper left corner.
-*/
- WinLeftX,
- WinTopY,
-/*
- Width and height of window. These are set to the current full
- screen widths as determined by a Win32 GetSystemMetrics call
- (GetSystemMetrics(SM_CXSCREEN) and
- GetSystemMetrics(SM_CYSCREEN)).
-*/
- WinWidth,
- WinHeight,
-// Parent window (could possibly be set in tools system?)
- NULL,
-// Child/menu window (could possibly be set in tools system?)
- NULL,
-// Handle for module associated with window
- (HINSTANCE)hInstance,
-// Parameter for associated structure (null in this case)
- NULL);
- }
- else if (WindowMode == WindowModeFullScreen)
- {
- hWndMain = CreateWindowEx(
-/*
- WS_EX_TOPMOST forces this window to be topmost except
- for other topmost windows, even when deactivated.
-*/
- WS_EX_TOPMOST,
- NAME, // Name of class (registered by RegisterClass call above)
- TITLE, // Name of window
- WS_VISIBLE | // kills Alt-Space and strews its entrails over fifteen miles. Heh heh heh.
- WS_POPUP, // i.e. specify window is style pop up, i.e. non-application
-/*
- Initial horizontal and vertical position. For a pop-up window,
- these are the coordinates of the upper left corner.
-*/
- WinLeftX,
- WinTopY,
-/*
- Width and height of window. These are set to the current full
- screen widths as determined by a Win32 GetSystemMetrics call
- (GetSystemMetrics(SM_CXSCREEN) and
- GetSystemMetrics(SM_CYSCREEN)).
-*/
- WinWidth,
- WinHeight,
-// Parent window (null for a full screen game)
- NULL,
-// Child/menu window (null for a full screen game)
- NULL,
-// Handle for module associated with window
- (HINSTANCE)hInstance,
-// Parameter for associated structure (null in this case)
- NULL);
- }
- else
- return FALSE;
-
-#else
- if (WindowMode == WindowModeSubWindow)
- {
- hWndMain = CreateWindowEx(
- 0, // WS_EX_TOPMOST
- NAME, // Name of class (registered by RegisterClass call above)
- TITLE, // Name of window
- WS_OVERLAPPED |
- WS_CAPTION |
- WS_THICKFRAME,
-/*
- Initial horizontal and vertical position. For a pop-up window,
- these are the coordinates of the upper left corner.
-*/
- WinLeftX,
- WinTopY,
-/*
- Width and height of window. These are set to the current full
- screen widths as determined by a Win32 GetSystemMetrics call
- (GetSystemMetrics(SM_CXSCREEN) and
- GetSystemMetrics(SM_CYSCREEN)).
-*/
- WinWidth,
- WinHeight,
-// Parent window (could be set in tools system?)
- NULL,
-// Child/menu window (could be set in tools system?)
- NULL,
-// Handle for module associated with window
- hInstance,
-// Parameter for associated structure (null in this case)
- NULL);
- }
- else if (WindowMode == WindowModeFullScreen)
- {
- hWndMain = CreateWindowEx(
-/*
- WS_EX_TOPMOST forces this window to be topmost except
- for other topmost windows, even when deactivated.
-*/
- WS_EX_TOPMOST,
- NAME, // Name of class (registered by RegisterClass call above)
- TITLE, // Name of window
- WS_VISIBLE | // kills Alt-Space and strews its entrails for fifteen miles. Heh heh heh.
- WS_POPUP, // Specify window is style pop up, i.e. non-application
-/*
- Initial horizontal and vertical position. For a pop-up window,
- these are the coordinates of the upper left corner.
-*/
- WinLeftX,
- WinTopY,
-/*
- Width and height of window. These are set to the current full
- screen widths as determined by a Win32 GetSystemMetrics call
- (GetSystemMetrics(SM_CXSCREEN) and
- GetSystemMetrics(SM_CYSCREEN)).
-*/
- WinWidth,
- WinHeight,
-// Parent window (null for a full screen game)
- NULL,
-// Child/menu window (null for a full screen game)
- NULL,
-// Handle for module associated with window
- hInstance,
-// Parameter for associated structure (null in this case)
- NULL);
- }
- else
- return FALSE;
-
-#endif
-
- if (!hWndMain)
- return FALSE;
-
-// Experiment only!!!!
-
-// Set the window up to be displayed
- ShowWindow(hWndMain, nCmdShow);
-// Update once (i.e. send WM_PAINT message to the window procedure)
- UpdateWindow(hWndMain);
-
-// Grab ALL mouse messages for our window.
-// Note this will only work if the window is
-// foreground (as it is... ). This ensures that
-// we will still get MOUSEMOVE etc messages even
-// if the mouse is out of the defined window area.
-
- #if grabmousecapture
- SetCapture(hWndMain);
-// Load null cursor shape
- SetCursor(NULL);
- #endif
- MakeToAsciiTable();
-
- return TRUE;
-
-}
-
-// Project specific to go with the initialiser
-
-BOOL ExitWindowsSystem(void)
-
-{
- BOOL rc = TRUE;
-
- // Release dedicated mouse capture
- #if grabmousecapture
- ReleaseCapture();
- #endif
-
- rc = DestroyWindow(hWndMain);
-
- return rc;
-}
-
-void MakeToAsciiTable(void)
-{
- WORD output;
- for (int k=0; k<=255; k++)
- {
- ksarray[k]=0;
- }
-
- for (int i=0; i<=255; i++)
- {
- for (int s=0; s<=255; s++)
- {
- if(ToAscii(i,s,&ksarray[0],&output,0)!=0)
- {
- ToAsciiTable[i][s] = (unsigned char)output;
- }
- else
- {
- ToAsciiTable[i][s] = 0;
- }
- }
- }
-}
-// End of extern C declaration
-
-};
-
-
-
-
diff --git a/src/files.c b/src/files.c
new file mode 100644
index 0000000..042441b
--- /dev/null
+++ b/src/files.c
@@ -0,0 +1,575 @@
+#define _BSD_SOURCE
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <fnmatch.h>
+
+#include "files.h"
+
+static char *local_dir;
+static char *global_dir;
+
+/*
+Sets the local and global directories used by the other functions.
+Local = ~/.dir, where config and user-installed files are kept.
+Global = installdir, where installed data is stored.
+*/
+int SetGameDirectories(const char *local, const char *global)
+{
+ struct stat buf;
+
+ local_dir = strdup(local);
+ global_dir = strdup(global);
+
+ if (stat(local_dir, &buf) == -1) {
+ printf("Creating local directory %s...\n", local_dir);
+
+ mkdir(local_dir, S_IRWXU);
+ }
+
+ return 0;
+}
+
+#define DIR_SEPARATOR "/"
+
+static char *FixFilename(const char *filename, const char *prefix, int force)
+{
+ char *f, *ptr;
+ int flen;
+
+ flen = strlen(filename) + strlen(prefix) + 2;
+
+ f = (char *)malloc(flen);
+ strcpy(f, prefix);
+ strcat(f, DIR_SEPARATOR);
+ strcat(f, filename);
+
+ ptr = f;
+ while (*ptr) {
+ if ((*ptr == '/') || (*ptr == '\\') || (*ptr == ':')) {
+ *ptr = DIR_SEPARATOR[0];
+ } else if (*ptr == '\r' || *ptr == '\n') {
+ *ptr = 0;
+ break;
+ } else {
+ if (force)
+ *ptr = tolower(*ptr);
+ }
+ ptr++;
+ }
+
+ return f;
+}
+
+/*
+Open a file of type type, with mode mode.
+
+Mode can be:
+#define FILEMODE_READONLY 0x01
+#define FILEMODE_WRITEONLY 0x02
+#define FILEMODE_READWRITE 0x04
+#define FILEMODE_APPEND 0x08
+Type is (mode = ReadOnly):
+#define FILETYPE_PERM 0x08 // try the global dir only
+#define FILETYPE_OPTIONAL 0x10 // try the global dir first, then try the local dir
+#define FILETYPE_CONFIG 0x20 // try the local dir only
+
+Type is (mode = WriteOnly or ReadWrite):
+FILETYPE_PERM: error
+FILETYPE_OPTIONAL: error
+FILETYPE_CONFIG: try the local dir only
+*/
+FILE *OpenGameFile(const char *filename, int mode, int type)
+{
+ char *rfilename;
+ char *openmode;
+ FILE *fp;
+
+ if ((type != FILETYPE_CONFIG) && (mode != FILEMODE_READONLY))
+ return NULL;
+
+ switch(mode) {
+ case FILEMODE_READONLY:
+ openmode = "rb";
+ break;
+ case FILEMODE_WRITEONLY:
+ openmode = "wb";
+ break;
+ case FILEMODE_READWRITE:
+ openmode = "w+";
+ break;
+ case FILEMODE_APPEND:
+ openmode = "ab";
+ break;
+ default:
+ return NULL;
+ }
+
+ if (type != FILETYPE_CONFIG) {
+ rfilename = FixFilename(filename, global_dir, 0);
+
+ fp = fopen(rfilename, openmode);
+
+ free(rfilename);
+
+ if (fp != NULL) {
+ return fp;
+ }
+
+ rfilename = FixFilename(filename, global_dir, 1);
+
+ fp = fopen(rfilename, openmode);
+
+ free(rfilename);
+
+ if (fp != NULL) {
+ return fp;
+ }
+ }
+
+ if (type != FILETYPE_PERM) {
+ rfilename = FixFilename(filename, local_dir, 0);
+
+ fp = fopen(rfilename, openmode);
+
+ free(rfilename);
+
+ if (fp != NULL) {
+ return fp;
+ }
+
+ rfilename = FixFilename(filename, local_dir, 1);
+
+ fp = fopen(rfilename, openmode);
+
+ free(rfilename);
+
+ return fp;
+ }
+
+ return NULL;
+}
+
+/*
+Close a fd returned from OpenGameFile
+
+Currently this just uses stdio, so CloseGameFile is redundant.
+*/
+int CloseGameFile(FILE *pfd)
+{
+ return fclose(pfd);
+}
+
+
+/*
+Get the filesystem attributes of a file
+
+#define FILEATTR_DIRECTORY 0x0100
+#define FILEATTR_READABLE 0x0200
+#define FILEATTR_WRITABLE 0x0400
+
+Error or can't access it: return value of 0 (What is the game going to do about it anyway?)
+*/
+static int GetFA(const char *filename)
+{
+ struct stat buf;
+ int attr;
+
+ attr = 0;
+ if (stat(filename, &buf) == 0) {
+ if (S_ISDIR(buf.st_mode)) {
+ attr |= FILEATTR_DIRECTORY;
+ }
+
+ if (access(filename, R_OK) == 0) {
+ attr |= FILEATTR_READABLE;
+ }
+
+ if (access(filename, W_OK) == 0) {
+ attr |= FILEATTR_WRITABLE;
+ }
+ }
+
+ return attr;
+}
+
+static time_t GetTS(const char *filename)
+{
+ struct stat buf;
+
+ if (stat(filename, &buf) == 0) {
+ return buf.st_mtime;
+ }
+
+ return 0;
+}
+
+int GetGameFileAttributes(const char *filename, int type)
+{
+ struct stat buf;
+ char *rfilename;
+ int attr;
+
+ attr = 0;
+ if (type != FILETYPE_CONFIG) {
+ rfilename = FixFilename(filename, global_dir, 0);
+
+ if (stat(rfilename, &buf) == 0) {
+ if (S_ISDIR(buf.st_mode)) {
+ attr |= FILEATTR_DIRECTORY;
+ }
+
+ if (access(rfilename, R_OK) == 0) {
+ attr |= FILEATTR_READABLE;
+ }
+
+ if (access(rfilename, W_OK) == 0) {
+ attr |= FILEATTR_WRITABLE;
+ }
+
+ free(rfilename);
+
+ return attr;
+ }
+
+ free(rfilename);
+
+ rfilename = FixFilename(filename, global_dir, 1);
+
+ if (stat(rfilename, &buf) == 0) {
+ if (S_ISDIR(buf.st_mode)) {
+ attr |= FILEATTR_DIRECTORY;
+ }
+
+ if (access(rfilename, R_OK) == 0) {
+ attr |= FILEATTR_READABLE;
+ }
+
+ if (access(rfilename, W_OK) == 0) {
+ attr |= FILEATTR_WRITABLE;
+ }
+
+ free(rfilename);
+
+ return attr;
+ }
+
+ free(rfilename);
+ }
+
+ if (type != FILETYPE_PERM) {
+ rfilename = FixFilename(filename, local_dir, 0);
+
+ if (stat(rfilename, &buf) == 0) {
+ if (S_ISDIR(buf.st_mode)) {
+ attr |= FILEATTR_DIRECTORY;
+ }
+
+ if (access(rfilename, R_OK) == 0) {
+ attr |= FILEATTR_READABLE;
+ }
+
+ if (access(rfilename, W_OK) == 0) {
+ attr |= FILEATTR_WRITABLE;
+ }
+
+ free(rfilename);
+
+ return attr;
+ }
+
+ free(rfilename);
+
+ rfilename = FixFilename(filename, local_dir, 1);
+
+ if (stat(rfilename, &buf) == 0) {
+ if (S_ISDIR(buf.st_mode)) {
+ attr |= FILEATTR_DIRECTORY;
+ }
+
+ if (access(rfilename, R_OK) == 0) {
+ attr |= FILEATTR_READABLE;
+ }
+
+ if (access(rfilename, W_OK) == 0) {
+ attr |= FILEATTR_WRITABLE;
+ }
+
+ free(rfilename);
+
+ return attr;
+ }
+
+ free(rfilename);
+
+ }
+
+ return 0;
+}
+
+/*
+Delete a file: local dir only
+*/
+int DeleteGameFile(const char *filename)
+{
+ char *rfilename;
+ int ret;
+
+ rfilename = FixFilename(filename, local_dir, 0);
+ ret = unlink(rfilename);
+ free(rfilename);
+
+ if (ret == -1) {
+ rfilename = FixFilename(filename, local_dir, 1);
+ ret = unlink(rfilename);
+ free(rfilename);
+ }
+
+ return ret;
+}
+
+/*
+Create a directory: local dir only
+
+TODO: maybe also mkdir parent directories, if they do not exist?
+*/
+int CreateGameDirectory(const char *dirname)
+{
+ char *rfilename;
+ int ret;
+
+ rfilename = FixFilename(dirname, local_dir, 0);
+ ret = mkdir(rfilename, S_IRWXU);
+ free(rfilename);
+
+ if (ret == -1) {
+ rfilename = FixFilename(dirname, local_dir, 1);
+ ret = mkdir(rfilename, S_IRWXU);
+ free(rfilename);
+ }
+
+ return ret;
+}
+
+/* This struct is private. */
+typedef struct GameDirectory
+{
+ DIR *localdir; /* directory opened with opendir */
+ DIR *globaldir;
+
+ char *localdirname;
+ char *globaldirname;
+
+ char *pat; /* pattern to match */
+
+ GameDirectoryFile tmp; /* Temp space */
+} GameDirectory;
+
+/*
+"Open" a directory dirname, with type type
+Returns a pointer to a directory datatype
+
+Pattern is the pattern to match
+*/
+void *OpenGameDirectory(const char *dirname, const char *pattern, int type)
+{
+ char *localdirname, *globaldirname;
+ DIR *localdir, *globaldir;
+ GameDirectory *gd;
+
+ globaldir = NULL;
+ globaldirname = NULL;
+ if (type != FILETYPE_CONFIG) {
+ globaldirname = FixFilename(dirname, global_dir, 0);
+
+ globaldir = opendir(globaldirname);
+
+ if (globaldir == NULL) {
+ free(globaldirname);
+
+ globaldirname = FixFilename(dirname, global_dir, 1);
+
+ globaldir = opendir(globaldirname);
+
+ if (globaldir == NULL)
+ free(globaldirname);
+ }
+ }
+
+ localdir = NULL;
+ localdirname = NULL;
+ if (type != FILETYPE_PERM) {
+ localdirname = FixFilename(dirname, local_dir, 0);
+
+ localdir = opendir(localdirname);
+
+ if (localdir == NULL) {
+ free(localdirname);
+
+ localdirname = FixFilename(dirname, local_dir, 1);
+
+ localdir = opendir(localdirname);
+
+ if (localdir == NULL)
+ free(localdirname);
+ }
+ }
+
+ if (localdir == NULL && globaldir == NULL)
+ return NULL;
+
+ gd = (GameDirectory *)malloc(sizeof(GameDirectory));
+
+ gd->localdir = localdir;
+ gd->globaldir = globaldir;
+
+ gd->localdirname = localdirname;
+ gd->globaldirname = globaldirname;
+
+ gd->pat = strdup(pattern);
+
+ return gd;
+}
+
+/*
+This struct is public.
+
+typedef struct GameDirectoryFile
+{
+ char *filename;
+ int attr;
+} GameDirectoryFile;
+*/
+
+/*
+Returns the next match of pattern with the contents of dir
+
+f is the current file
+*/
+GameDirectoryFile *ScanGameDirectory(void *dir)
+{
+ char *ptr;
+ struct dirent *file;
+ GameDirectory *directory;
+
+ directory = (GameDirectory *)dir;
+
+ if (directory->globaldir) {
+ while ((file = readdir(directory->globaldir)) != NULL) {
+ if (fnmatch(directory->pat, file->d_name, FNM_PATHNAME) == 0) {
+ ptr = FixFilename(file->d_name, directory->globaldirname, 0);
+ directory->tmp.attr = GetFA(ptr);
+ free(ptr);
+
+ directory->tmp.filename = file->d_name;
+
+ return &directory->tmp;
+ }
+ }
+ closedir(directory->globaldir);
+ free(directory->globaldirname);
+
+ directory->globaldir = NULL;
+ directory->globaldirname = NULL;
+ }
+
+ if (directory->localdir) {
+ while ((file = readdir(directory->localdir)) != NULL) {
+ if (fnmatch(directory->pat, file->d_name, FNM_PATHNAME) == 0) {
+ ptr = FixFilename(file->d_name, directory->localdirname, 0);
+ directory->tmp.attr = GetFA(ptr);
+ directory->tmp.timestamp = GetTS(ptr);
+ free(ptr);
+
+ directory->tmp.filename = file->d_name;
+
+ return &directory->tmp;
+ }
+ }
+ closedir(directory->localdir);
+ free(directory->localdirname);
+
+ directory->localdir = NULL;
+ directory->localdirname = NULL;
+ }
+
+ return NULL;
+}
+
+/*
+Close directory
+*/
+int CloseGameDirectory(void *dir)
+{
+ GameDirectory *directory = (GameDirectory *)dir;
+
+ if (directory) {
+ free(directory->pat);
+
+ if (directory->localdirname)
+ free(directory->localdirname);
+ if (directory->globaldirname)
+ free(directory->globaldirname);
+ if (directory->localdir)
+ closedir(directory->localdir);
+ if (directory->globaldir)
+ closedir(directory->globaldir);
+
+ return 0;
+ }
+ return -1;
+}
+
+#ifdef FILES_DRIVER
+int main(int argc, char *argv[])
+{
+ FILE *fp;
+ char buf[64];
+ void *dir;
+
+ SetGameDirectories("tmp1", "tmp2");
+
+ fp = OpenGameFile("tester", FILEMODE_WRITEONLY, FILETYPE_CONFIG);
+
+ fputs("test\n", fp);
+
+ CloseGameFile(fp);
+
+ CreateGameDirectory("yaya");
+ CreateGameDirectory("tester2");
+ CreateGameDirectory("tester2/blah");
+
+ fp = OpenGameFile("tester", FILEMODE_READONLY, FILETYPE_OPTIONAL);
+ printf("Read: %s", fgets(buf, 60, fp));
+ CloseGameFile(fp);
+
+ fp = OpenGameFile("tester", FILEMODE_READONLY, FILETYPE_CONFIG);
+ printf("Read: %s", fgets(buf, 60, fp));
+ CloseGameFile(fp);
+
+ dir = OpenGameDirectory(".", "*", FILETYPE_OPTIONAL);
+ if (dir != NULL) {
+ GameDirectoryFile *gd;
+
+ while ((gd = ScanGameDirectory(dir)) != NULL) {
+ printf("Name: %s, Attr: %08X\n", gd->filename, gd->attr);
+ }
+
+ CloseGameDirectory(dir);
+ } else {
+ printf("Could not open the directory...\n");
+ }
+
+ DeleteGameFile("tester");
+
+ return 0;
+}
+#endif
diff --git a/src/files.h b/src/files.h
new file mode 100644
index 0000000..5e4aa6a
--- /dev/null
+++ b/src/files.h
@@ -0,0 +1,34 @@
+#ifndef __FILES_H__
+#define __FILES_H__
+
+#define FILEMODE_READONLY 0x01
+#define FILEMODE_WRITEONLY 0x02
+#define FILEMODE_READWRITE 0x04
+#define FILEMODE_APPEND 0x08
+
+#define FILETYPE_PERM 0x10
+#define FILETYPE_OPTIONAL 0x20
+#define FILETYPE_CONFIG 0x40
+
+#define FILEATTR_DIRECTORY 0x0100
+#define FILEATTR_READABLE 0x0200
+#define FILEATTR_WRITABLE 0x0400
+
+typedef struct GameDirectoryFile
+{
+ char *filename;
+ int attr;
+ time_t timestamp;
+} GameDirectoryFile;
+
+int SetGameDirectories(const char *local, const char *global);
+FILE *OpenGameFile(const char *filename, int mode, int type);
+int CloseGameFile(FILE *pfd);
+int GetGameFileAttributes(const char *filename, int type);
+int DeleteGameFile(const char *filename);
+int CreateGameDirectory(const char *dirname);
+void *OpenGameDirectory(const char *dirname, const char *pattern, int type);
+GameDirectoryFile *ScanGameDirectory(void *dir);
+int CloseGameDirectory(void *dir);
+
+#endif
diff --git a/src/fixer.h b/src/fixer.h
index d0259f3..c15e37e 100644
--- a/src/fixer.h
+++ b/src/fixer.h
@@ -11,7 +11,7 @@ extern "C" {
#include <limits.h>
#include <inttypes.h> /* int64_t */
-void FixFilename(char *str);
+#include "files.h"
#define PACKED __attribute__((packed))
diff --git a/src/main.c b/src/main.c
index c30e194..e4e2fa4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -48,17 +48,20 @@ int JoystickEnabled;
int MouseVelX;
int MouseVelY;
-extern int ScanDrawMode; /* to fix image loading */
+extern int ScanDrawMode;
extern SCREENDESCRIPTORBLOCK ScreenDescriptorBlock;
extern unsigned char KeyboardInput[MAX_NUMBER_OF_INPUT_KEYS];
extern unsigned char GotAnyKey;
extern int NormalFrameTime;
SDL_Surface *surface;
+/* SDL_Joystick *joy; */
+/* defaults */
static int WantFullscreen = 1;
-static int WantSound = 1;
+int WantSound = 1;
static int WantCDRom = 1;
+static int WantJoystick = 1;
#if GL_EXT_secondary_color
PFNGLSECONDARYCOLORPOINTEREXTPROC pglSecondaryColorPointerEXT;
@@ -195,13 +198,10 @@ const int TotalVideoModes = sizeof(VideoModeList) / sizeof(VideoModeList[0]);
void LoadDeviceAndVideoModePreferences()
{
-/*
- fprintf(stderr, "LoadDeviceAndVideoModePreferences()\n");
-*/
FILE *fp;
int mode;
- fp = fopen("AvP_TempVideo.cfg", "r");
+ fp = OpenGameFile("AvP_TempVideo.cfg", FILEMODE_READONLY, FILETYPE_CONFIG);
if (fp != NULL) {
if (fscanf(fp, "%d", &mode) == 1) {
@@ -235,12 +235,9 @@ void LoadDeviceAndVideoModePreferences()
void SaveDeviceAndVideoModePreferences()
{
-/*
- fprintf(stderr, "SaveDeviceAndVideoModePreferences()\n");
-*/
FILE *fp;
- fp = fopen("AvP_TempVideo.cfg", "w");
+ fp = OpenGameFile("AvP_TempVideo.cfg", FILEMODE_WRITEONLY, FILETYPE_CONFIG);
if (fp != NULL) {
fprintf(fp, "%d\n", CurrentVideoMode);
fclose(fp);
@@ -249,9 +246,6 @@ void SaveDeviceAndVideoModePreferences()
void PreviousVideoMode2()
{
-/*
- fprintf(stderr, "PreviousVideoMode2()\n");
-*/
int cur = CurrentVideoMode;
do {
@@ -267,9 +261,6 @@ void PreviousVideoMode2()
void NextVideoMode2()
{
-/*
- fprintf(stderr, "NextVideoMode2()\n");
-*/
int cur = CurrentVideoMode;
do {
@@ -286,17 +277,11 @@ void NextVideoMode2()
char *GetVideoModeDescription2()
{
-/*
- fprintf(stderr, "GetVideoModeDescription2()\n");
-*/
return "SDL";
}
char *GetVideoModeDescription3()
{
-/*
- fprintf(stderr, "GetVideoModeDescription3()\n");
-*/
static char buf[64];
snprintf(buf, 64, "%dx%d", VideoModeList[CurrentVideoMode].w, VideoModeList[CurrentVideoMode].h);
@@ -357,6 +342,19 @@ int InitSDL()
}
LoadDeviceAndVideoModePreferences();
+
+#if 0
+ if (WantJoystick) {
+ SDL_Init(SDL_INIT_JOYSTICK);
+
+ if (SDL_NumJoysticks() > 0) {
+ joy = SDL_JoystickOpen(0);
+ if (joy) {
+ GotJoystick = 1;
+ }
+ }
+ }
+#endif
surface = NULL;
@@ -539,6 +537,18 @@ int InitialiseWindowsSystem(HANDLE hInstance, int nCmdShow, int WinInitMode)
return 0;
}
+int ExitWindowsSystem()
+{
+#if 0
+ if (joy) {
+ SDL_JoystickClose(joy);
+ }
+#endif
+ SDL_Quit();
+
+ return 0;
+}
+
static int GotPrintScn, HavePrintScn;
static int KeySymToKey(int keysym)
@@ -848,6 +858,7 @@ static void handle_buttonpress(int button, int press)
DebouncedKeyboardInput[key] = 1;
}
+ GotAnyKey = 1;
KeyboardInput[key] = press;
}
@@ -924,7 +935,34 @@ void CheckForWindowsMessages()
MouseVelX = 0;
MouseVelY = 0;
}
-
+
+/*
+This is half of the necessary joystick code, the rest of the changes
+involve avp/win95/usr_io.c. I don't own a joystick so I have no idea
+how things should be implemented.
+*/
+#if 0
+ if (GotJoystick) {
+ int numbuttons;
+
+ SDL_JoystickUpdate();
+
+ numbuttons = SDL_JoystickNumButtons(joy);
+ if (numbuttons > 16) numbuttons = 16;
+
+ for (x = 0; x < numbuttons; x++) {
+ if (SDL_JoystickGetButton(joy, x)) {
+ GotAnyKey = 1;
+ if (!KeyboardInput[KEY_JOYSTICK_BUTTON_1+x]) {
+ KeyboardInput[KEY_JOYSTICK_BUTTON_1+x] = 1;
+ DebouncedKeyboardInput[KEY_JOYSTICK_BUTTON_1+x] = 1;
+ }
+ } else {
+ KeyboardInput[KEY_JOYSTICK_BUTTON_1+x] = 0;
+ }
+ }
+ }
+#endif
if ((KeyboardInput[KEY_LEFTALT]||KeyboardInput[KEY_RIGHTALT]) && DebouncedKeyboardInput[KEY_CR]) {
SDL_GrabMode gm;
@@ -967,11 +1005,53 @@ void FlipBuffers()
SDL_Flip(surface);
}
-int ExitWindowsSystem()
-{
- SDL_Quit();
+char *AvpCDPath = 0;
- return 0;
+void InitGameDirectories(char *argv0)
+{
+ extern char *SecondTex_Directory;
+ extern char *SecondSoundDir;
+ char *homedir, *gamedir, *localdir, *tmp;
+
+ SecondTex_Directory = "graphics/";
+ SecondSoundDir = "sound/";
+/*
+ printf("argv[0] = %s\n", argv0);
+ printf("$HOME = %s\n", getenv("HOME"));
+ printf("$AVP_DATA = %s\n", getenv("AVP_DATA"));
+*/
+ homedir = getenv("HOME");
+ if (homedir == NULL)
+ homedir = ".";
+ localdir = (char *)malloc(strlen(homedir)+10);
+ strcpy(localdir, homedir);
+ strcat(localdir, "/");
+ strcat(localdir, ".avp");
+
+ tmp = NULL;
+
+ /* TODO: for each step, check existance of avp_rifs directory? */
+ gamedir = getenv("AVP_DATA");
+ if (gamedir == NULL) {
+ tmp = strdup(argv0);
+
+ gamedir = strrchr(tmp, '/');
+ if (gamedir == NULL) {
+ gamedir = ".";
+ } else {
+ *gamedir = 0;
+ gamedir = tmp;
+ }
+ }
+
+ SetGameDirectories(localdir, gamedir);
+
+ free(localdir);
+ if (tmp)
+ free(tmp);
+
+ /* delete some log files */
+ DeleteGameFile("dx_error.log");
}
static struct option getopt_long_options[] = {
@@ -981,9 +1061,10 @@ static struct option getopt_long_options[] = {
{ "windowed", 0, NULL, 'w' },
{ "nosound", 0, NULL, 's' },
{ "nocdrom", 0, NULL, 'c' },
+/* { "nojoy", 0, NULL, 'j' }, */
{ "debug", 0, NULL, 'd' },
/*
-{ "loadrifs", 0, NULL, 'l' },
+{ "loadrifs", 1, NULL, 'l' },
{ "server", 0, someval, 1 },
{ "client", 1, someval, 2 },
*/
@@ -999,6 +1080,7 @@ static const char *usage_string =
" [-w | --windowed] Run the game in a window\n"
" [-s | --nosound] Do not access the soundcard\n"
" [-c | --nocdrom] Do not access the CD-ROM\n"
+/* " [-j | --nojoy] Do not access the joystick\n" */
;
int main(int argc, char *argv[])
@@ -1026,6 +1108,11 @@ int main(int argc, char *argv[])
case 'c':
WantCDRom = 0;
break;
+ /*
+ case 'j':
+ WantJoystick = 0;
+ break;
+ */
case 'd': {
extern int DebuggingCommandsActive;
DebuggingCommandsActive = 1;
@@ -1037,6 +1124,8 @@ int main(int argc, char *argv[])
}
}
+ InitGameDirectories(argv[0]);
+
if (InitSDL() == -1) {
fprintf(stderr, "Could not find a sutable resolution!\n");
fprintf(stderr, "At least 512x384 is needed. Does OpenGL work?\n");
@@ -1047,9 +1136,6 @@ int main(int argc, char *argv[])
SetFastRandom();
- /* WeWantAnIntro(); */
- GetPathFromRegistry();
-
#if MARINE_DEMO
ffInit("fastfile/mffinfo.txt","fastfile/");
#elif ALIEN_DEMO
@@ -1071,7 +1157,7 @@ int main(int argc, char *argv[])
LoadKeyConfiguration();
- if (WantSound) SoundSys_Start();
+ SoundSys_Start();
if (WantCDRom) CDDA_Start();
InitTextStrings();
diff --git a/src/openal.c b/src/openal.c
index e39ba66..ba0163c 100644
--- a/src/openal.c
+++ b/src/openal.c
@@ -31,12 +31,15 @@ ALCdevice *AvpSoundDevice;
ALvoid *AvpSoundContext;
int AvpFrequency = 44100;
+extern int WantSound;
+
static int SoundActivated = 0;
/*
openal.c TODO:
1. AL_PITCH code does not work.
- OpenAL alf_tpitch is currently broken.
+ OpenAL alf_tpitch is currently broken. (Doesn't work with LOOPING, etc.)
+ Maps like Last Stand use it for (some rather odd) ambient sounds.
2. Panning somewhat works now. Need someone to verify.
3. There is no EAX/Reverb. But there's probably not much I can do...
4. Restarting sound system may or may not work.
@@ -58,14 +61,16 @@ int PlatStartSoundSys()
0
};
+ SoundActivated = 0;
+ if (WantSound == 0)
+ return 0;
+
attrlist[0] = ALC_FREQUENCY;
attrlist[1] = AvpFrequency;
attrlist[2] = ALC_SYNC;
attrlist[3] = AL_FALSE;
attrlist[4] = 0;
- SoundActivated = 0;
-
snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
AvpSoundDevice = alcOpenDevice(buf);
@@ -128,7 +133,7 @@ int PlatStartSoundSys()
void PlatEndSoundSys()
{
/* TODO - free everything */
- printf("PlatEndSoundSys()\n");
+ fprintf(stderr, "OPENAL: PlatEndSoundSys()\n");
}
// this table plots the frequency change for
@@ -391,7 +396,11 @@ int PlatPlaySound(int activeIndex)
if (!PlatSoundHasStopped(activeIndex))
PlatStopSound (activeIndex);
-
+
+ /* TODO: hack until pitching works right */
+ if (GameSounds[si].pitch < -500)
+ return 0;
+
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_BUFFER,
GameSounds[si].dsBufferP);
@@ -427,18 +436,16 @@ int PlatPlaySound(int activeIndex)
if (!ActiveSounds[activeIndex].paused) {
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
-
+
+#ifdef OPENAL_DEBUG
if (ActiveSounds[activeIndex].loop) {
-/*
- printf("Playing sound %i %s looping in slot %i\n",
+ fprintf(stderr, "OPENAL: Playing sound %i %s looping in slot %i\n",
si, GameSounds[si].wavName, activeIndex);
-*/
} else {
-/*
- printf("Playing sound %i %s once in slot %i\n",
- si, GameSounds[si].wavName, activeIndex);
-*/
+ fprintf(stderr, "OPENAL: Playing sound %i %s once in slot %i\n",
+ si, GameSounds[si].wavName, activeIndex);
}
+#endif
}
return 1;
@@ -446,8 +453,9 @@ int PlatPlaySound(int activeIndex)
void PlatStopSound(int activeIndex)
{
-/* printf("PlatStopSound(%d)\n", activeIndex); */
-
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: PlatStopSound(%d)\n", activeIndex);
+#endif
if (!SoundActivated)
return;
@@ -521,19 +529,25 @@ int PlatChangeSoundPitch(int activeIndex, int pitch)
GameSounds[gsi].pitch, pitch);
}
+ if (pitch < -500) { /* currently can't play it anyway... */
+ alSourceStop(ActiveSounds[activeIndex].ds3DBufferP);
+ return 0;
+ }
ActiveSounds[activeIndex].pitch = pitch;
-/*
- printf("NEWFREQ PlatChangeSoundPitch(%d, %d) = %f\n", activeIndex, pitch, (double)frequency / (double)GameSounds[ActiveSounds[activeIndex].soundIndex].dsFrequency);
-*/
+
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: PlatChangeSoundPitch(%d, %d) = %f\n", activeIndex, pitch, (double)frequency / (double)GameSounds[ActiveSounds[activeIndex].soundIndex].dsFrequency);
+#endif
return 1;
}
int PlatSoundHasStopped(int activeIndex)
{
ALint val;
-/*
- printf("PlatSoundHasStopped(%d)\n", activeIndex);
-*/
+
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "PlatSoundHasStopped(%d)\n", activeIndex);
+#endif
if (!SoundActivated)
return 0;
@@ -574,12 +588,12 @@ int PlatDo3dSound(int activeIndex)
if (ActiveSounds[activeIndex].paused) {
if (distance < (ActiveSounds[activeIndex].threedeedata.outer_range + SOUND_DEACTIVATERANGE)) {
PlatStopSound (activeIndex);
-#if 1 /* PLEASE REMOVE IFDEF! */
+
if (ActiveSounds[activeIndex].loop)
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_TRUE);
else
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_FALSE);
-#endif
+
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
newVolume = 0;
ActiveSounds[activeIndex].paused = 0;
@@ -616,9 +630,11 @@ int PlatDo3dSound(int activeIndex)
newVolume = VOLUME_MAX;
if (newVolume < VOLUME_MIN)
newVolume = VOLUME_MIN;
-/*
- printf("PlatDo3dSound: idx = %d, volume = %d, distance = %d\n", activeIndex, newVolume, distance);
-*/
+
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: PlatDo3dSound: idx = %d, volume = %d, distance = %d\n", activeIndex, newVolume, distance);
+#endif
+
if (PlatChangeSoundVolume (activeIndex, newVolume) == SOUND_PLATFORMERROR) {
return SOUND_PLATFORMERROR;
}
@@ -634,9 +650,9 @@ int PlatDo3dSound(int activeIndex)
ActiveSounds[activeIndex].PropSetP_pos[2] = (ALfloat)relativePosn.vz / (ALfloat)distance;
alSourcefv (ActiveSounds[activeIndex].ds3DBufferP, AL_POSITION, ActiveSounds[activeIndex].PropSetP_pos);
-/*
-printf("Sound : (%f, %f, %f) [%d] [%d,%d]\n", ActiveSounds[activeIndex].PropSetP_pos[0], ActiveSounds[activeIndex].PropSetP_pos[1], ActiveSounds[activeIndex].PropSetP_pos[2], activeIndex, ActiveSounds[activeIndex].threedeedata.inner_range, ActiveSounds[activeIndex].threedeedata.outer_range);
-*/
+#ifdef OPENAL_DEBUG
+fprintf(stderr, "OPENAL: Sound : (%f, %f, %f) [%d] [%d,%d]\n", ActiveSounds[activeIndex].PropSetP_pos[0], ActiveSounds[activeIndex].PropSetP_pos[1], ActiveSounds[activeIndex].PropSetP_pos[2], activeIndex, ActiveSounds[activeIndex].threedeedata.inner_range, ActiveSounds[activeIndex].threedeedata.outer_range);
+#endif
ActiveSounds[activeIndex].PropSetP_vel[0] =
ActiveSounds[activeIndex].threedeedata.velocity.vx;
ActiveSounds[activeIndex].PropSetP_vel[1] =
@@ -695,9 +711,9 @@ void PlatUpdatePlayer()
pos[1] = Global_VDB_Ptr->VDB_World.vy; // 10000.0;
pos[2] = Global_VDB_Ptr->VDB_World.vz; // 10000.0;
-/*
- printf("Player: (%f, %f, %f) (%f, %f, %f %f, %f, %f)\n", pos[0], pos[1], pos[2], or[0], or[1], or[2], or[3], or[4], or[5]);
-*/
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: Player: (%f, %f, %f) (%f, %f, %f %f, %f, %f)\n", pos[0], pos[1], pos[2], or[0], or[1], or[2], or[3], or[4], or[5]);
+#endif
// fixme: add reverb check
alListenerfv (AL_ORIENTATION, or);
// alListenerfv (AL_VELOCITY, vel);
@@ -709,6 +725,14 @@ void PlatEndGameSound(SOUNDINDEX index)
{
int i;
+ GameSounds[index].loaded = 0;
+ GameSounds[index].dsFrequency = 0;
+
+ if (GameSounds[index].wavName) {
+ DeallocateMem(GameSounds[index].wavName);
+ GameSounds[index].wavName = NULL;
+ }
+
if (!SoundActivated)
return;
@@ -726,32 +750,23 @@ void PlatEndGameSound(SOUNDINDEX index)
alDeleteBuffers(1, &(GameSounds[index].dsBufferP));
GameSounds[index].dsBufferP = 0;
}
-
- GameSounds[index].loaded = 0;
- GameSounds[index].dsFrequency = 0;
-
- if (GameSounds[index].wavName) {
- DeallocateMem(GameSounds[index].wavName);
- GameSounds[index].wavName = NULL;
- }
}
unsigned int PlatMaxHWSounds()
{
-/*
- printf("PlatMaxHWSounds()\n");
-*/
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: PlatMaxHWSounds()\n");
+#endif
return 32;
}
void InitialiseBaseFrequency(SOUNDINDEX soundNum)
{
-/* just set the pitch everytime. */
-#if 0
int frequency;
-
- printf("FREQ InitialiseBaseFrequency(%d) [%d]\n", soundNum, GameSounds[soundNum].pitch==PITCH_DEFAULTPLAT);
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: InitialiseBaseFrequency(%d) [%d] pitch = %d\n", soundNum, GameSounds[soundNum].pitch==PITCH_DEFAULTPLAT, GameSounds[soundNum].pitch);
+#endif
if(GameSounds[soundNum].pitch>PITCH_MAXPLAT) GameSounds[soundNum].pitch=PITCH_MAXPLAT;
if(GameSounds[soundNum].pitch<PITCH_MINPLAT) GameSounds[soundNum].pitch=PITCH_MINPLAT;
@@ -761,28 +776,29 @@ void InitialiseBaseFrequency(SOUNDINDEX soundNum)
PITCH_DEFAULTPLAT, GameSounds[soundNum].pitch);
GameSounds[soundNum].dsFrequency = frequency;
-#endif
}
void PlatSetEnviroment(unsigned int env_index, float reverb_mix)
{
-/*
- printf("PlatSetEnvironment(%d, %f)\n", env_index, reverb_mix);
-*/
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: PlatSetEnvironment(%d, %f)\n", env_index, reverb_mix);
+#endif
}
void UpdateSoundFrequencies()
{
extern int SoundSwitchedOn;
-/* extern int TimeScale; */
+ extern int TimeScale;
int i;
-
-/* printf("FREQ UpdateSoundFreqncies()\n"); */
+
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: UpdateSoundFreqncies()\n");
+#endif
if (!SoundActivated)
return;
- if (!SoundSwitchedOn) /* TODO: maybe I should have used this var.. */
+ if (!SoundSwitchedOn)
return;
for (i = 0; i < SOUND_MAXACTIVE; i++) {
@@ -790,11 +806,13 @@ void UpdateSoundFrequencies()
if (gameIndex == SID_NOSOUND)
continue;
-/*
- if (TimeScale != ONE_FIXED)
- printf("NEWFREQ UpdateSoundFreqncies %d, f = %d\n", i, MUL_FIXED(GameSounds[gameIndex].dsFrequency,TimeScale));
-*/
- /* TODO: huh? */
+
+ if (TimeScale != ONE_FIXED) {
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: UpdateSoundFreqncies %d, f = %d\n", i, MUL_FIXED(GameSounds[gameIndex].dsFrequency,TimeScale));
+#endif
+ }
+
if (ActiveSounds[i].pitch != GameSounds[gameIndex].pitch)
PlatChangeSoundPitch(i,ActiveSounds[i].pitch);
}
@@ -805,27 +823,6 @@ void UpdateSoundFrequencies()
extern void *acLoadWAV (void *data, ALuint *size, void **udata,
ALushort *fmt, ALushort *chan, ALushort *freq);
-int LoadWavFile(int soundNum, char * wavFileName)
-{
- ALsizei size, freq, bits;
- ALenum format;
- ALvoid *data;
-/*
- printf("LoadWavFile(%d, %s) - sound\n", soundNum, wavFileName);
-*/
-
- if (!SoundActivated)
- return 0;
-
- alutLoadWAV (wavFileName, &data, &format, &size, &bits, &freq);
- alGenBuffers (1, &(GameSounds[soundNum].dsBufferP));
- alBufferData (GameSounds[soundNum].dsBufferP, format, data, size, freq);
-
- GameSounds[soundNum].loaded = 1;
-
- free (data);
- return 0;
-}
static unsigned char *Force8to16 (unsigned char *buf, int *len)
{
@@ -843,44 +840,137 @@ static unsigned char *Force8to16 (unsigned char *buf, int *len)
*len *= 2;
return nbuf;
}
+
+int LoadWavFile(int soundNum, char * wavFileName)
+{
+ ALuint size;
+ ALushort freq, chan, format;
+ ALvoid *data, *bufferPtr;
+ int len, seclen;
+ FILE *fp;
+
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "LoadWavFile(%d, %s) - sound\n", soundNum, wavFileName);
+#endif
+
+ if (!SoundActivated)
+ return 0;
+
+ /* TODO: Perm for now, until custom rifs can be loaded in ~/.avp */
+ fp = OpenGameFile(wavFileName, FILEMODE_READONLY, FILETYPE_PERM);
+ if (fp == NULL)
+ return 0;
+
+ fseek(fp, 0, SEEK_END);
+ len = ftell(fp);
+ rewind(fp);
+
+ data = malloc(len);
+ fread(data, 1, len, fp);
+ fclose(fp);
+
+ if (acLoadWAV (data, &size, &bufferPtr, &format,
+ &chan, &freq) == NULL) {
+ fprintf(stderr, "LoadWavFile: Unable to convert data\n");
+ free(data);
+ return 0;
+ }
+
+ free(data);
+
+ data = bufferPtr;
+
+ len = size;
+
+ /* openal conv. 8->16 is not good at all */
+ if (format == AUDIO_U8) {
+ unsigned char *nb = Force8to16 (data, &len);
+ format = AUDIO_S16LSB;
+
+ free (data);
+ data = nb;
+ }
+
+ if ((format == AUDIO_S16LSB) || (format == AUDIO_S16MSB)) {
+ int bps;
+
+ if (chan == 2) {
+ format = AL_FORMAT_STEREO16;
+ bps = freq * 2 * 2;
+ } /* else if (rchan == 1) */ {
+ format = AL_FORMAT_MONO16;
+ bps = freq * 2 * 1;
+ }
+
+ seclen = DIV_FIXED(len, bps);
+ } else {
+ free(data);
+ return 0;
+ }
+
+ alGenBuffers (1, &(GameSounds[soundNum].dsBufferP));
+ alBufferData (GameSounds[soundNum].dsBufferP, format, data, len, freq);
+
+{
+ char * wavname = strrchr (wavFileName, '\\');
+ if (wavname)
+ wavname++;
+ else
+ wavname = wavFileName;
+ GameSounds[soundNum].wavName = (char *)AllocateMem (strlen (wavname) + 1);
+ strcpy (GameSounds[soundNum].wavName, wavname);
+}
+ GameSounds[soundNum].flags = SAMPLE_IN_HW;
+ GameSounds[soundNum].length = (seclen != 0) ? seclen : 1;
+ GameSounds[soundNum].dsFrequency = freq;
+
+ free (data);
+
+ return 1;
+}
unsigned char *ExtractWavFile(int soundIndex, unsigned char *bufferPtr)
{
ALint len, seclen = 0;
- unsigned char *nb;
void *udata;
ALushort rfmt, rchan, rfreq;
ALuint rsize;
int slen;
-
-/* printf("ExtractWavFile(%d, %p)\n", soundIndex, bufferPtr); */
- if (!SoundActivated)
- return 0;
+
+#ifdef OPENAL_DEBUG
+fprintf(stderr, "OPENAL: ExtractWavFile(%d, %p)\n", soundIndex, bufferPtr);
+#endif
slen = strlen (bufferPtr) + 1;
GameSounds[soundIndex].wavName = (char *)AllocateMem (slen);
strcpy (GameSounds[soundIndex].wavName, bufferPtr);
+
+ if (!SoundActivated)
+ return 0;
+
bufferPtr += slen;
-/*
-printf("Loaded %s\n", GameSounds[soundIndex].wavName);
-*/
+
+#ifdef OPENAL_DEBUG
+fprintf(stderr, "OPENAL: Loaded %s\n", GameSounds[soundIndex].wavName);
+#endif
+
#if 1 /* TODO: replace with own routine later */
if (acLoadWAV (bufferPtr, &rsize, &udata, &rfmt,
&rchan, &rfreq) == NULL) {
- printf("Unable to convert data\n");
- return (unsigned char *)0;
+ fprintf(stderr, "ExtractWavFile: Unable to convert data\n");
+ return NULL;
}
len = rsize;
/* openal conv. 8->16 is not good at all */
- if ((rfmt == AUDIO_U8)) {
- nb = Force8to16 (udata, &len);
+ if (rfmt == AUDIO_U8) {
+ unsigned char *nb = Force8to16 (udata, &len);
rfmt = AUDIO_S16LSB;
free (udata);
udata = nb;
- }
+ }
if ((rfmt == AUDIO_S16LSB) || (rfmt == AUDIO_S16MSB)) {
int bps;
@@ -902,11 +992,11 @@ printf("Loaded %s\n", GameSounds[soundIndex].wavName);
alBufferData (GameSounds[soundIndex].dsBufferP,
rfmt, udata, len, rfreq);
- GameSounds[soundIndex].loaded = 1;
+/* GameSounds[soundIndex].loaded = 1; */
GameSounds[soundIndex].flags = SAMPLE_IN_HW;
GameSounds[soundIndex].length = (seclen != 0) ? seclen : 1;
GameSounds[soundIndex].dsFrequency = rfreq;
- GameSounds[soundIndex].pitch = PITCH_DEFAULTPLAT;
+/* GameSounds[soundIndex].pitch = PITCH_DEFAULTPLAT; */
#if 1 /* TODO: see above */
free (udata);
@@ -923,11 +1013,10 @@ int LoadWavFromFastFile(int soundNum, char * wavFileName)
FFILE *fp;
unsigned char *buf;
unsigned int len = 0;
-
-/* printf("LoadWavFromFastFile(%d, %s)\n", soundNum, wavFileName); */
- if (!SoundActivated)
- return 0;
+#ifdef OPENAL_DEBUG
+ fprintf(stderr, "OPENAL: LoadWavFromFastFile(%d, %s)\n", soundNum, wavFileName);
+#endif
if ((fp = ffopen (wavFileName, "rb")) != NULL) {
ffseek (fp, 0, SEEK_END);
diff --git a/src/stubs.c b/src/stubs.c
index d6c1f6b..3515889 100644
--- a/src/stubs.c
+++ b/src/stubs.c
@@ -121,21 +121,6 @@ void ATRemoveTexture(void * pTexture)
}
-/* avpreg.cpp */
-char *AvpCDPath = 0;
-
-void GetPathFromRegistry()
-{
-extern char * SecondTex_Directory;
-extern char * SecondSoundDir;
-
- fprintf(stderr, "GetPathFromRegistry()\n");
-
- SecondTex_Directory = "./graphics";
- SecondSoundDir = "./sounds";
-}
-
-
/* d3_func.cpp */
int GetTextureHandle(IMAGEHEADER *imageHeaderPtr)
{
@@ -191,32 +176,6 @@ void CheckWireFrameMode(int shouldBeOn)
fprintf(stderr, "CheckWireFrameMode(%d)\n", shouldBeOn);
}
-void WriteEndCodeToExecuteBuffer()
-{
- fprintf(stderr, "WriteEndCodeToExecuteBuffer()\n");
-}
-
-BOOL UnlockExecuteBufferAndPrepareForUse()
-{
- fprintf(stderr, "UnlockExecuteBufferAndPrepareForUse()\n");
-
- return FALSE;
-}
-
-BOOL ExecuteBuffer()
-{
- fprintf(stderr, "ExecuteBuffer()\n");
-
- return FALSE;
-}
-
-BOOL EndD3DScene()
-{
- fprintf(stderr, "EndD3DScene()\n");
-
- return FALSE;
-}
-
/* ddplat.cpp */
void MinimizeAllDDGraphics()
@@ -304,17 +263,12 @@ void GenerateDirectDrawSurface()
}
-/* dx_proj.cpp */
-int use_mmx_math = 0;
-
-
-
/* dxlog.c */
void dx_str_log(char const * str, int line, char const * file)
{
FILE *fp;
-
- fp = fopen("dx_error.log", "a");
+
+ fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
if (fp == NULL)
fp = stderr;
@@ -328,7 +282,7 @@ void dx_strf_log(char const * fmt, ... )
va_list ap;
FILE *fp;
- fp = fopen("dx_error.log", "a");
+ fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
if (fp == NULL)
fp = stderr;
@@ -345,7 +299,7 @@ void dx_line_log(int line, char const * file)
{
FILE *fp;
- fp = fopen("dx_error.log", "a");
+ fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
if (fp == NULL)
fp = stderr;
diff --git a/src/win95/awtexld.cpp b/src/win95/awtexld.cpp
index 337e1d0..bef0b26 100644
--- a/src/win95/awtexld.cpp
+++ b/src/win95/awtexld.cpp
@@ -156,20 +156,20 @@ namespace AwTl
{
public:
inline CreateTextureParms()
- : fileNameS(NULL)
- , fileH(INVALID_HANDLE_VALUE)
+ : loadTextureB(false)
+ , fileNameS(NULL)
+ , fileH(NULL)
, dataP(NULL)
, restoreH(NULL)
, maxReadBytes(UINT_MAX)
, bytesReadP(NULL)
, flags(AW_TLF_DEFAULT)
- , originalWidthP(NULL)
- , originalHeightP(NULL)
, widthP(NULL)
, heightP(NULL)
+ , originalWidthP(NULL)
+ , originalHeightP(NULL)
, prevTexP(static_cast<D3DTexture *>(NULL))
, prevTexB(false)
- , loadTextureB(false)
, callbackF(NULL)
, rectA(NULL)
{
@@ -180,7 +180,7 @@ namespace AwTl
bool loadTextureB;
char *fileNameS;
- HANDLE fileH;
+ FILE *fileH;
PtrUnionConst dataP;
AW_BACKUPTEXTUREHANDLE restoreH;
@@ -228,7 +228,7 @@ namespace AwTl
db_log1(("AW: Potential Memory Leaks Detected!!!"));
}
#ifdef _CPPRTTI
- #pragma message("Run-Time Type Identification (RTTI) is enabled")
+ #warning "Run-Time Type Identification (RTTI) is enabled"
for (Iterator itLeak(*this) ; !itLeak.Done() ; itLeak.Next())
{
db_logf1(("\tAW Object not deallocated: Type: %s RefCnt: %u",typeid(*itLeak.Get()).name(),itLeak.Get()->m_nRefCnt));
@@ -238,7 +238,7 @@ namespace AwTl
db_log1(("AW: Object dump complete"));
}
#else // ! _CPPRTTI
- #pragma message("Run-Time Type Identification (RTTI) is not enabled - memory leak checking will not report types")
+ #warning "Run-Time Type Identification (RTTI) is not enabled - memory leak checking will not report types"
unsigned nRefs(0);
for (Iterator itLeak(*this) ; !itLeak.Done() ; itLeak.Next())
{
@@ -1762,9 +1762,9 @@ namespace AwTl {
SurfUnion CreateTextureParms::DoCreate() const
{
- if (INVALID_HANDLE_VALUE!=fileH)
+ if (NULL != fileH)
{
- MediaWinFileMedium * pMedium = new MediaWinFileMedium;
+ MediaStdFileMedium * pMedium = new MediaStdFileMedium;
pMedium->Attach(fileH);
SurfUnion pTex = LoadTexture(pMedium,*this);
pMedium->Detach();
@@ -1802,7 +1802,7 @@ namespace AwTl {
switch (*_argFormatS++)
{
case 's':
- if (pParams->fileNameS || INVALID_HANDLE_VALUE!=pParams->fileH || pParams->dataP || pParams->restoreH)
+ if (pParams->fileNameS || NULL!=pParams->fileH || pParams->dataP || pParams->restoreH)
bad_parmsB = true;
else
{
@@ -1811,16 +1811,16 @@ namespace AwTl {
}
break;
case 'h':
- if (pParams->fileNameS || INVALID_HANDLE_VALUE!=pParams->fileH || pParams->dataP || pParams->restoreH)
+ if (pParams->fileNameS || NULL!=pParams->fileH || pParams->dataP || pParams->restoreH)
bad_parmsB = true;
else
{
- pParams->fileH = va_arg(ap,HANDLE);
- db_logf4(("\tFile HANDLE = 0x%08x",pParams->fileH));
+ pParams->fileH = va_arg(ap,FILE *);
+ db_logf4(("\tFile HANDLE = %p",pParams->fileH));
}
break;
case 'p':
- if (pParams->fileNameS || INVALID_HANDLE_VALUE!=pParams->fileH || pParams->dataP || pParams->restoreH)
+ if (pParams->fileNameS || NULL!=pParams->fileH || pParams->dataP || pParams->restoreH)
bad_parmsB = true;
else
{
@@ -1829,7 +1829,7 @@ namespace AwTl {
}
break;
case 'r':
- if (pParams->fileNameS || INVALID_HANDLE_VALUE!=pParams->fileH || pParams->dataP || pParams->restoreH || UINT_MAX!=pParams->maxReadBytes || pParams->bytesReadP)
+ if (pParams->fileNameS || NULL!=pParams->fileH || pParams->dataP || pParams->restoreH || UINT_MAX!=pParams->maxReadBytes || pParams->bytesReadP)
bad_parmsB = true;
else
{
@@ -1948,7 +1948,7 @@ namespace AwTl {
}
}
- if (!pParams->fileNameS && INVALID_HANDLE_VALUE==pParams->fileH && !pParams->dataP && !pParams->restoreH)
+ if (!pParams->fileNameS && NULL==pParams->fileH && !pParams->dataP && !pParams->restoreH)
{
awTlLastErr = AW_TLE_BADPARMS;
db_log2("AwCreateGraphic(): ERROR: No data medium is specified");
@@ -1973,9 +1973,9 @@ namespace AwTl {
{
if (pParams->fileNameS)
{
- pParams->fileH = CreateFile(pParams->fileNameS,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
+ pParams->fileH = OpenGameFile(pParams->fileNameS, FILEMODE_READONLY, FILETYPE_PERM);
- if (INVALID_HANDLE_VALUE==pParams->fileH)
+ if (NULL==pParams->fileH)
{
awTlLastErr = AW_TLE_CANTOPENFILE;
// awTlLastWinErr = GetLastError();
@@ -1986,7 +1986,7 @@ namespace AwTl {
SurfUnion textureP = pParams->DoCreate();
- CloseHandle(pParams->fileH);
+ fclose(pParams->fileH);
return textureP;
}
diff --git a/src/win95/awtexld.hpp b/src/win95/awtexld.hpp
index e41400c..e9c70fb 100644
--- a/src/win95/awtexld.hpp
+++ b/src/win95/awtexld.hpp
@@ -254,7 +254,7 @@ namespace AwTl {
case 4:
{
unsigned shift=0;
- unsigned val;
+ unsigned val=0;
--_dstRowP.byteP; // decrement here because we increment before the first write
for (unsigned colcount = _srcWidth; colcount; --colcount)
{
@@ -441,7 +441,7 @@ namespace AwTl {
class TypicalTexFileLoader : public TexFileLoader
{
protected:
- TypicalTexFileLoader() : m_pRowBuf(NULL), m_ppPixMap(NULL), m_pPalette(NULL) {}
+ TypicalTexFileLoader() : m_pPalette(NULL), m_ppPixMap(NULL), m_pRowBuf(NULL) {}
virtual ~TypicalTexFileLoader();
diff --git a/src/win95/bmpnames.cpp b/src/win95/bmpnames.cpp
index 92cb05a..63e139b 100644
--- a/src/win95/bmpnames.cpp
+++ b/src/win95/bmpnames.cpp
@@ -23,7 +23,7 @@ FORCE_CHUNK_INCLUDE_IMPLEMENT(bmpnames)
BMP_Name::BMP_Name (const char * fname, int const gbnc_version)
-: flags((BMPN_Flags)DEFAULT_BMPN_FLAGS), index(0), version_num (gbnc_version << BMPNAME_PARENT_VER_SHIFT), priority (DEFAULT_BMPN_PRIORITY), transparency_colour_union(0), enum_id(0)
+: flags((BMPN_Flags)DEFAULT_BMPN_FLAGS), index(0), version_num (gbnc_version << BMPNAME_PARENT_VER_SHIFT), enum_id(0), priority (DEFAULT_BMPN_PRIORITY), transparency_colour_union(0)
#if cencon
, md5val(0)
#endif
@@ -33,7 +33,7 @@ BMP_Name::BMP_Name (const char * fname, int const gbnc_version)
}
BMP_Name::BMP_Name (const char * fname)
-: flags((BMPN_Flags)DEFAULT_BMPN_FLAGS), index(0), version_num (0), priority (DEFAULT_BMPN_PRIORITY), transparency_colour_union(0), enum_id(0)
+: flags((BMPN_Flags)DEFAULT_BMPN_FLAGS), index(0), version_num (0), enum_id(0), priority (DEFAULT_BMPN_PRIORITY), transparency_colour_union(0)
#if cencon
, md5val(0)
#endif
@@ -824,8 +824,6 @@ Matching_Images_Chunk::Matching_Images_Chunk(Chunk_With_Children * parent, char
: Chunk(parent,"MATCHIMG")
, flags ((MICFlags)(*(int *)(datablock+8) & MICF_MASK))
{
- char const * datastart = datablock;
-
spares[0] = *(int *)datablock;
spares[1] = *(int *)(datablock+4);
@@ -888,7 +886,7 @@ ImageDescriptor const & Matching_Images_Chunk::GetLoadImage(ImageDescriptor cons
RIF_IMPLEMENT_DYNCREATE("BMPMD5ID",Bitmap_MD5_Chunk)
Bitmap_MD5_Chunk::Bitmap_MD5_Chunk(Chunk_With_Children * parent, int const * md5id, BMP_Name const & rcbmp, char const * rname, char const * sname)
-: Chunk(parent,"BMPMD5ID"), spare(0), flags(BMD5F_0), version_num(rcbmp.version_num)
+: Chunk(parent,"BMPMD5ID"), flags(BMD5F_0), version_num(rcbmp.version_num), spare(0)
{
memcpy(md5_val,md5id,16);
@@ -907,7 +905,7 @@ Bitmap_MD5_Chunk::Bitmap_MD5_Chunk(Chunk_With_Children * parent, int const * md5
}
Bitmap_MD5_Chunk::Bitmap_MD5_Chunk(Chunk_With_Children * parent, char const * datablock, size_t)
-: Chunk(parent,"BMPMD5ID"), spare(*(int *)datablock), flags((BMPMD5_Flags)(*(int *)(datablock+4) & BMD5F_MASK)), version_num(*(int *)(datablock+8))
+: Chunk(parent,"BMPMD5ID"), flags((BMPMD5_Flags)(*(int *)(datablock+4) & BMD5F_MASK)), version_num(*(int *)(datablock+8)), spare(*(int *)datablock)
{
memcpy(md5_val,datablock+12,16);
datablock += 28;
diff --git a/src/win95/chnkload.cpp b/src/win95/chnkload.cpp
index 757c68c..1a348df 100644
--- a/src/win95/chnkload.cpp
+++ b/src/win95/chnkload.cpp
@@ -378,32 +378,32 @@ ShapeInMSL const * ShapeInMSL::GetByName(char const * nam)
}
ShapeInMSL::ShapeInMSL()
-: shptr(0)
-, listpos(GLS_NOTINLIST)
+: listpos(GLS_NOTINLIST)
+, shptr(0)
, in_hash_table(FALSE)
{
}
ShapeInMSL::ShapeInMSL(int _p)
-: shptr(0)
-, listpos(_p)
+: listpos(_p)
+, shptr(0)
, in_hash_table(FALSE)
{
}
ShapeInMSL::ShapeInMSL(SHAPEHEADER * _s, char const * _n, int _p)
-: shptr(_s)
+: listpos(_p)
+, shptr(_s)
, name(_n)
-, listpos(_p)
, in_hash_table(FALSE)
{
AddToHashTables();
}
ShapeInMSL::ShapeInMSL(ShapeInMSL const & sim)
-: shptr(sim.shptr)
+: listpos(sim.listpos)
+, shptr(sim.shptr)
, name(sim.name)
-, listpos(sim.listpos)
, in_hash_table(FALSE)
{
if (sim.in_hash_table) AddToHashTables();
@@ -479,11 +479,7 @@ RIFFHANDLE load_rif (const char * fname)
CL_LogFile.lprintf("FAILED TO LOAD RIF: %s\n",fname);
#endif
ReleaseDirect3D();
-#if 0
- char message[200];
- sprintf(message,"Error loading %s",fname);
- MessageBox(NULL,message,"AvP",MB_OK+MB_SYSTEMMODAL);
-#endif
+
fprintf(stderr, "load_rif: Error loading %s\n", fname);
exit(0x111);
return INVALID_RIFFHANDLE;
@@ -516,13 +512,9 @@ RIFFHANDLE load_rif_non_env (const char * fname)
#endif
ReleaseDirect3D();
-#if 0
- char message[200];
- sprintf(message,"Error loading %s",fname);
- MessageBox(NULL,message,"AvP",MB_OK+MB_SYSTEMMODAL);
-#endif
fprintf(stderr, "load_rif_non_env: Error loading %s\n", fname);
exit(0x111);
+
return INVALID_RIFFHANDLE;
}
#if OUTPUT_LOG
@@ -1559,10 +1551,7 @@ void DeallocateRifLoadedShapeheader(SHAPEHEADER * shp)
#if !StandardShapeLanguage
#error Must have standard shape language
#endif
-
- int max_num_texs = 0;
- int i;
-
+
if(shp->animation_header)
{
// so it gets deallocated properly
@@ -1576,6 +1565,9 @@ void DeallocateRifLoadedShapeheader(SHAPEHEADER * shp)
}
#if !USE_LEVEL_MEMORY_POOL
+ int max_num_texs = 0;
+ int i;
+
if (shp->points)
{
if (*shp->points) DeallocateMem(*shp->points);
diff --git a/src/win95/chnktexi.cpp b/src/win95/chnktexi.cpp
index 8fe0345..6487737 100644
--- a/src/win95/chnktexi.cpp
+++ b/src/win95/chnktexi.cpp
@@ -109,12 +109,13 @@ static inline bool IsFileInFastFile(char const * pszFileName)
static bool DoesFileExist(char const * pszFileName)
{
- DWORD dwFileAttributes = GetFileAttributes(pszFileName);
-
- if (0xffffffff == dwFileAttributes || dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ unsigned int attr = GetGameFileAttributes(pszFileName, FILETYPE_PERM);
+
+ if ((attr & FILEATTR_DIRECTORY) != 0)
return false;
- else
- return true;
+ if ((attr & FILEATTR_READABLE) == 0)
+ return false;
+ return true;
}
static char * GetPath(char * pszFileNameBuf, unsigned nBufSize, ImageDescriptor const & idsc, Chunk_With_Children * pEnvDataChunk, bool bGloballyPalettized)
diff --git a/src/win95/db.c b/src/win95/db.c
index 228bb1b..a9d63c7 100644
--- a/src/win95/db.c
+++ b/src/win95/db.c
@@ -85,7 +85,7 @@ int db_option = 0; /* Default is off. */
* logfile will go in the directory that is current when db_log_init()
* is called.
*/
-#define ABSOLUTE_PATH 0
+#define ABSOLUTE_PATH 1
/* M A C R O S ******************************************************** */
@@ -152,12 +152,14 @@ static const char* db_assert_textA[ 3 ] =
"Expression: %s",
"File: %s Line: %d"
};
-#if 0
+
+#ifndef DB_NOWINDOWS
static const char* db_prompt_std =
"Quit program/force e(x)ception? [y/n/x]";
static const char* db_prompt_windows =
"Quit program? [Yes/No]/force exception? [Cancel]";
#endif
+
static const char* db_assert_log_begin_text =
"DB: FAILED ASSERTION BEGINS";
static const char* db_assert_log_end_text =
@@ -394,7 +396,7 @@ void db_log_fired(const char *strP)
if(!InitialisedLog) db_log_init();
{
/* Open a file for appending, creating one if it doesn't yet exist. */
- FILE *fP = fopen(LogFileNameP, "a+");
+ FILE *fP = OpenGameFile(LogFileNameP, FILEMODE_APPEND, FILETYPE_CONFIG);
if(!fP) return;
@@ -409,13 +411,12 @@ void db_log_init(void)
sprintf( LogFileNameP, "%s", db_log_file_name );
#else
/* Append the log file name to the current working directory. */
-/* TODO - path seperator */
sprintf( LogFileNameP, "%s/%s", getcwd( LogFileNameP, 240 ),
db_log_file_name );
#endif
/* Delete old log file. */
- remove(LogFileNameP);
+ DeleteGameFile(LogFileNameP);
/* Flag that we have initialised the log file. */
InitialisedLog = 1;
diff --git a/src/win95/iff_ilbm.cpp b/src/win95/iff_ilbm.cpp
index b5ebcc5..c09d032 100644
--- a/src/win95/iff_ilbm.cpp
+++ b/src/win95/iff_ilbm.cpp
@@ -84,10 +84,6 @@ namespace IFF
return true;
}
-// The uninitialised part of byte is shifted out.
-#ifdef _MSC_VER
-#pragma warning(disable: 4701)
-#endif
bool IlbmBodyChunk::EncodeNextRow(unsigned const * pRow)
{
if (!pEncodeDst) return false;
@@ -96,7 +92,7 @@ namespace IFF
{
UBYTE * pBuf = pEncodeSrc;
- unsigned byte;
+ unsigned byte=0;
for (unsigned x=0; x<nWidth; ++x)
{
byte <<= 1;
@@ -164,9 +160,6 @@ namespace IFF
return true;
}
-#ifdef _MSC_VER
-#pragma warning(default: 4701)
-#endif
bool IlbmBodyChunk::EndEncode()
{
@@ -206,10 +199,6 @@ namespace IFF
return pData != NULL;
}
-// The uninitialised part of pDecodeDst is shifted out.
-#ifdef _MSC_VER
-#pragma warning(disable: 4701)
-#endif
unsigned const * IlbmBodyChunk::DecodeNextRow() const
{
if (!pDecodeSrc || !pDecodeDst) return NULL;
@@ -224,7 +213,7 @@ namespace IFF
for (unsigned b=0; b<nBitPlanes; ++b)
{
- unsigned byte;
+ unsigned byte=0;
for (unsigned x=0; x<nWidth; ++x)
{
if (!(x&7))
@@ -282,7 +271,7 @@ namespace IFF
{
for (unsigned b=0; b<nBitPlanes; ++b)
{
- unsigned byte;
+ unsigned byte=0;
for (unsigned x=0; x<nWidth; ++x)
{
if (!(x&7))
@@ -304,9 +293,6 @@ namespace IFF
return pDecodeDst;
}
-#ifdef _MSC_VER
-#pragma warning(default: 4701)
-#endif
IlbmBodyChunk::~IlbmBodyChunk()
{
diff --git a/src/win95/media.hpp b/src/win95/media.hpp
index 337c790..a7f5a2f 100644
--- a/src/win95/media.hpp
+++ b/src/win95/media.hpp
@@ -2,7 +2,7 @@
#define _INCLUDED_MEDIA_HPP_
//#if defined(_WIN32) || defined(WIN32) || defined(WINDOWS) || defined(_WINDOWS)
- #define _MEDIA_WIN_TARGET
+// #define _MEDIA_WIN_TARGET
// #include <windows.h>
//#endif // WIN32 || _WIN32 || WINDOWS || _WINDOWS
@@ -497,7 +497,12 @@ class MediaStdFileMedium : public MediaMedium
void Open(char const * pszFileName, char const * pszOpenMode)
{
- m_pFile = fopen(pszFileName,pszOpenMode);
+ if (pszOpenMode[0] != 'r' || pszOpenMode[1] != 'b') {
+ fprintf(stderr, "Open(%s, %s)\n", pszFileName, pszOpenMode);
+ m_fError |= MME_OPENFAIL;
+ return;
+ }
+ m_pFile = OpenGameFile(pszFileName, FILEMODE_READONLY, FILETYPE_PERM);
if (!m_pFile)
m_fError |= MME_OPENFAIL;
}
diff --git a/src/win95/mishchnk.cpp b/src/win95/mishchnk.cpp
index f455f07..4c92dd7 100644
--- a/src/win95/mishchnk.cpp
+++ b/src/win95/mishchnk.cpp
@@ -116,8 +116,7 @@ BOOL Lockable_Chunk_With_Children::lock_chunk(File_Chunk & fchunk)
CloseHandle (rif_file);
return TRUE;
- #endif
-
+ #endif
}
BOOL Lockable_Chunk_With_Children::unlock_chunk (File_Chunk & fchunk, BOOL updateyn)
@@ -362,10 +361,9 @@ File_Chunk::File_Chunk(const char * file_name)
// Load in whole chunk and traverse
char rifIsCompressed = FALSE;
char *uncompressedData = NULL;
- HANDLE rif_file;
+ FILE *rif_file;
DWORD file_size;
DWORD file_size_from_file;
- unsigned long bytes_read;
char * buffer;
char * buffer_ptr;
char id_buffer[9];
@@ -380,27 +378,28 @@ File_Chunk::File_Chunk(const char * file_name)
strcpy (filename, file_name);
- rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
- FILE_FLAG_RANDOM_ACCESS, 0);
+ rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
- if (rif_file == INVALID_HANDLE_VALUE) {
+ if (rif_file == NULL) {
error_code = CHUNK_FAILED_ON_LOAD;
return;
}
- file_size = GetFileSize (rif_file, 0);
+ fseek(rif_file, 0, SEEK_END);
+ file_size = ftell(rif_file);
+ rewind(rif_file);
-
- if (!ReadFile(rif_file, id_buffer, 8, &bytes_read, 0)) {
+
+ if (fread(id_buffer, 1, 8, rif_file) != 8) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
#if UseOldChunkLoader
if (strncmp (id_buffer, "REBINFLF", 8)) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
#else
@@ -412,7 +411,7 @@ File_Chunk::File_Chunk(const char * file_name)
else if (strncmp (id_buffer, "REBINFF2", 8))
{
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
#endif
@@ -423,10 +422,9 @@ File_Chunk::File_Chunk(const char * file_name)
pointer to the original data. */
if (rifIsCompressed)
{
- if (!ReadFile(rif_file, buffer+8, (file_size-8), &bytes_read, 0))
- {
+ if (fread(buffer+8, 1, (file_size-8), rif_file) != (file_size-8)) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
uncompressedData = HuffmanDecompress((HuffmanPackage*)buffer);
@@ -438,27 +436,28 @@ File_Chunk::File_Chunk(const char * file_name)
}
else // the normal uncompressed approach:
{
- if (!ReadFile(rif_file, &file_size_from_file, 4, &bytes_read, 0)) {
+ if (fread(&file_size_from_file, 1, 4, rif_file) != 4) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
if (file_size != file_size_from_file) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
- if (!ReadFile(rif_file, buffer, (file_size-12), &bytes_read, 0))
- {
+ if (fread(buffer, 1, (file_size-12), rif_file) != (file_size-12)) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
buffer_ptr = buffer;
}
+ fclose(rif_file);
+
// Process the RIF
// The start of the first chunk
@@ -471,7 +470,6 @@ File_Chunk::File_Chunk(const char * file_name)
DynCreate(buffer_ptr);
buffer_ptr += *(int *)(buffer_ptr + 8);
-
}
/* KJL 17:59:42 19/09/98 - release the memory holding the rif */
@@ -484,10 +482,7 @@ File_Chunk::File_Chunk(const char * file_name)
delete [] buffer;
}
- CloseHandle (rif_file);
-
post_input_processing();
-
}
File_Chunk::File_Chunk()
@@ -1549,10 +1544,7 @@ Environment_Data_Chunk * File_Chunk::get_env_data()
if (e_list.size())
return e_list.first_entry();
- else
- {
- return(0);
- }
+ return 0;
}
void File_Chunk::build_object_array()
@@ -1751,10 +1743,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
{
char rifIsCompressed = FALSE;
char *uncompressedData = NULL;
- HANDLE rif_file;
+ FILE *rif_file;
DWORD file_size;
DWORD file_size_from_file;
- unsigned long bytes_read;
char * buffer;
char * buffer_ptr;
char id_buffer[9];
@@ -1766,21 +1757,21 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
error_code = 0;
- rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
- FILE_FLAG_RANDOM_ACCESS, 0);
+ rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
-
- if (rif_file == INVALID_HANDLE_VALUE) {
+ if (rif_file == NULL) {
error_code = CHUNK_FAILED_ON_LOAD;
Parent_File = ParentFileStore;
return;
}
- file_size = GetFileSize (rif_file, 0);
+ fseek(rif_file, 0, SEEK_END);
+ file_size = ftell(rif_file);
+ rewind(rif_file);
- if (!ReadFile(rif_file, id_buffer, 8, &bytes_read, 0)) {
+ if (fread(id_buffer, 1, 8, rif_file) != 8) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
return;
}
@@ -1792,7 +1783,7 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
}
else if (strncmp (id_buffer, "REBINFF2", 8)) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
return;
}
@@ -1804,10 +1795,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
pointer to the original data. */
if (rifIsCompressed)
{
- if (!ReadFile(rif_file, buffer+8, (file_size-8), &bytes_read, 0))
- {
+ if (fread(buffer+8, 1, (file_size-8), rif_file) != (file_size-8)) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
delete [] buffer;
return;
@@ -1822,9 +1812,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
else // the normal uncompressed approach:
{
//get the file size stored in the rif file
- if (!ReadFile(rif_file, &file_size_from_file, 4, &bytes_read, 0)) {
+ if (fread(&file_size_from_file, 1, 4, rif_file) != 4) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
delete [] buffer;
return;
@@ -1833,25 +1823,24 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
//and compare with the actual file size
if (file_size != file_size_from_file) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
delete [] buffer;
return;
}
//read the rest of the file into the buffer
- if (!ReadFile(rif_file, buffer, (file_size-12), &bytes_read, 0))
- {
+ if (fread(buffer, 1, (file_size-12), rif_file) != (file_size-12)) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
Parent_File = ParentFileStore;
delete [] buffer;
return;
}
buffer_ptr = buffer;
}
-
+ fclose(rif_file);
// Process the RIF
@@ -1879,12 +1868,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
delete [] buffer;
}
- CloseHandle (rif_file);
-
post_input_processing();
Parent_File = ParentFileStore;
-
}
void RIF_File_Chunk::post_input_processing()
@@ -1991,8 +1977,5 @@ Environment_Data_Chunk * RIF_File_Chunk::get_env_data()
if (e_list.size())
return e_list.first_entry();
- else
- {
- return(0);
- }
+ return 0;
}
diff --git a/src/win95/sprchunk.cpp b/src/win95/sprchunk.cpp
index 2b78f40..93f67e6 100644
--- a/src/win95/sprchunk.cpp
+++ b/src/win95/sprchunk.cpp
@@ -184,10 +184,9 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
: Chunk_With_Children(parent,"SPRIHEAD")
{
// Load in whole chunk and traverse
- HANDLE rif_file;
+ FILE *rif_file;
DWORD file_size;
DWORD file_size_from_file;
- unsigned long bytes_read;
char * buffer;
char * buffer_ptr;
char id_buffer[9];
@@ -197,49 +196,51 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
error_code = 0;
- rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
- FILE_FLAG_RANDOM_ACCESS, 0);
-
- if (rif_file == INVALID_HANDLE_VALUE) {
+ rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
+ if (rif_file == NULL) {
return;
}
- file_size = GetFileSize (rif_file, 0);
-
+ fseek(rif_file, 0, SEEK_END);
+ file_size = ftell(rif_file);
+ rewind(rif_file);
- if (!ReadFile(rif_file, id_buffer, 8, &bytes_read, 0)) {
+ if (fread(id_buffer, 1, 8, rif_file) != 8) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
- if (strncmp (id_buffer, "SPRIHEAD", 8)) {
+ if (strncmp(id_buffer, "SPRIHEAD", 8) != 0) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
- if (!ReadFile(rif_file, &file_size_from_file, 4, &bytes_read, 0)) {
+ if (fread(&file_size_from_file, 1, 4, rif_file) != 4) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
if (file_size != file_size_from_file) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
- CloseHandle (rif_file);
+ fclose(rif_file);
return;
}
-
buffer = new char [file_size];
- if (!ReadFile(rif_file, buffer, (file_size-12), &bytes_read, 0)) {
+ if (fread(buffer, 1, (file_size-12), rif_file) != (file_size-12)) {
error_code = CHUNK_FAILED_ON_LOAD;
- CloseHandle (rif_file);
+ delete [] buffer;
+
+ fclose(rif_file);
return;
}
+ fclose(rif_file);
+
// Process the file
buffer_ptr = buffer;
@@ -248,7 +249,6 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
// The start of the first chunk
while ((buffer_ptr-buffer)< ((signed) file_size-12) && !error_code) {
-
if ((*(int *)(buffer_ptr + 8)) + (buffer_ptr-buffer) > ((signed) file_size-12)) {
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
break;
@@ -256,13 +256,9 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
DynCreate(buffer_ptr);
buffer_ptr += *(int *)(buffer_ptr + 8);
-
}
delete [] buffer;
-
- CloseHandle (rif_file);
-
}
@@ -960,5 +956,4 @@ void Sprite_Extent_Chunk::fill_data_block(char* data_start)
data_start+=4;
*(int*)data_start=spare2;
data_start+=4;
-
}
diff --git a/src/winapi.c b/src/winapi.c
index 08aef47..58ca183 100644
--- a/src/winapi.c
+++ b/src/winapi.c
@@ -10,23 +10,6 @@
#include "fixer.h"
-void FixFilename(char *str)
-{
- int len = strlen(str);
- int i;
-
- for (i = 0; i < len; i++) {
- if (str[i] == '\\')
- str[i] = '/';
- else if (str[i] == '\r')
- str[i] = 0;
- else if (str[i] == '\n')
- str[i] = 0;
- else
- str[i] = tolower(str[i]);
- }
-}
-
size_t _mbclen(const unsigned char *s)
{
return strlen((const char *)s);
@@ -35,9 +18,9 @@ size_t _mbclen(const unsigned char *s)
HANDLE CreateFile(const char *file, int mode, int x, int y, int flags, int flags2, int z)
{
int fd;
-/*
+
fprintf(stderr, "CreateFile(%s, %d, %d, %d, %d, %d, %d)\n", file, mode, x, y, flags, flags2, z);
-*/
+
switch(mode) {
case GENERIC_READ:
if (flags != OPEN_EXISTING) {
@@ -78,9 +61,9 @@ HANDLE CreateFileA(const char *file, int write, int x, int y, int flags, int fla
int WriteFile(HANDLE file, const void *data, int len, void *byteswritten, int lpOverlapped)
{
unsigned long *bw, i;
-/*
+
fprintf(stderr, "WriteFile(%d, %p, %d, %p, %d)\n", file, data, len, byteswritten, lpOverlapped);
-*/
+
bw = (unsigned long *)byteswritten;
*bw = 0;
@@ -96,9 +79,9 @@ int WriteFile(HANDLE file, const void *data, int len, void *byteswritten, int lp
int ReadFile(HANDLE file, void *data, int len, void *bytesread, int lpOverlapped)
{
unsigned long *br, i;
-/*
+
fprintf(stderr, "ReadFile(%d, %p, %d, %p, %d)\n", file, data, len, bytesread, lpOverlapped);
-*/
+
br = (unsigned long *)bytesread;
*br = 0;
@@ -114,9 +97,9 @@ int ReadFile(HANDLE file, void *data, int len, void *bytesread, int lpOverlapped
int GetFileSize(HANDLE file, int lpFileSizeHigh)
{
struct stat buf;
-/*
+
fprintf(stderr, "GetFileSize(%d, %d)\n", file, lpFileSizeHigh);
-*/
+
if (fstat(file, &buf) == -1)
return -1;
return buf.st_size;
@@ -124,9 +107,9 @@ int GetFileSize(HANDLE file, int lpFileSizeHigh)
int CloseHandle(HANDLE file)
{
-/*
+
fprintf(stderr, "CloseHandle(%d)\n", file);
-*/
+
if (close(file) == -1)
return 0;
else
@@ -137,9 +120,9 @@ int CloseHandle(HANDLE file)
int DeleteFile(const char *file)
{
-/*
+
fprintf(stderr, "DeleteFile(%s)\n", file);
-*/
+
if (unlink(file) == -1)
return 0;
else
@@ -160,9 +143,9 @@ int GetDiskFreeSpace(int x, unsigned long *a, unsigned long *b, unsigned long *c
int CreateDirectory(char *dir, int lpSecurityAttributes)
{
-/*
+
fprintf(stderr, "CreateDirectory(%s, %d)\n", dir, lpSecurityAttributes);
-*/
+
if (mkdir(dir, S_IRWXU) == -1)
return 0;
else