Redid the most of the file loading/saving. Now uses $HOME/.avp/ and
$AVP_DIR to look for files.
This commit is contained in:
parent
95b8b49b76
commit
080430b3bd
40 changed files with 1400 additions and 1579 deletions
2
Makefile
2
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
|
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
|
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
|
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
|
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
|
||||||
|
|
39
README
39
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
|
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
|
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
|
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
|
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/),
|
OpenGL support, nasm 0.98, and the latest OpenAL CVS (http://www.openal.org).
|
||||||
and the latest OpenAL CVS (http://www.openal.org). AvP requires a 3D card
|
AvP requires a 3D card with OpenGL support.
|
||||||
with OpenGL support.
|
|
||||||
|
|
||||||
Create the MPConfig and User_Profiles directories if they do not exist.
|
***
|
||||||
(Note: Windows profiles probably do not work in Linux and vice versa)
|
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.
|
||||||
|
|
||||||
|
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.
|
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
|
relnev:~/avp/AvP Demo 3 - Alien$ ls
|
||||||
aenglish.txt alienavp_huds/ alienfastfile/ avp_rifs/ MPConfig/
|
aenglish.txt alienavp_huds/ alienfastfile/ avp_rifs/
|
||||||
User_Profiles/
|
|
||||||
relnev:~/avp/Gold Edition$ ls
|
relnev:~/avp/Gold Edition$ ls
|
||||||
avp_huds/ avp_rifs/ cd tracks.txt default.cfg fastfile/ language.txt
|
avp_huds/ avp_rifs/ cd tracks.txt fastfile/ language.txt
|
||||||
MPConfig/ User_Profiles/
|
|
||||||
|
|
||||||
Support for the demo is not quite complete (some sounds are missing and some
|
Support for the demo is not quite complete (some sounds are missing).
|
||||||
text is incorrect/missing).
|
|
||||||
|
|
||||||
|
|
||||||
Linux Port-specific commands:
|
Linux Port-specific commands:
|
||||||
|
|
|
@ -112,8 +112,9 @@ void LoadCDTrackList()
|
||||||
//clear out the old list first
|
//clear out the old list first
|
||||||
EmptyCDTrackList();
|
EmptyCDTrackList();
|
||||||
|
|
||||||
HANDLE file=CreateFile(CDTrackFileName,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
|
FILE *file = OpenGameFile(CDTrackFileName, FILEMODE_READONLY, FILETYPE_OPTIONAL);
|
||||||
if(file==INVALID_HANDLE_VALUE)
|
|
||||||
|
if(file==NULL)
|
||||||
{
|
{
|
||||||
LOGDXFMT(("Failed to open %s",CDTrackFileName));
|
LOGDXFMT(("Failed to open %s",CDTrackFileName));
|
||||||
return;
|
return;
|
||||||
|
@ -121,13 +122,15 @@ void LoadCDTrackList()
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
int file_size;
|
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
|
//copy the file contents into a buffer
|
||||||
file_size= GetFileSize(file,0);
|
|
||||||
buffer=new char[file_size+1];
|
buffer=new char[file_size+1];
|
||||||
ReadFile(file,buffer,file_size,&bytes_read,0);
|
fread(buffer, 1, file_size, file);
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
|
|
||||||
char* bufferptr=buffer;
|
char* bufferptr=buffer;
|
||||||
|
|
||||||
|
|
|
@ -511,10 +511,10 @@ void Sound_Play(SOUNDINDEX soundNumber, char *format, ...)
|
||||||
if(loop) ActiveSounds[newIndex].loop = 1;
|
if(loop) ActiveSounds[newIndex].loop = 1;
|
||||||
else ActiveSounds[newIndex].loop = 0;
|
else ActiveSounds[newIndex].loop = 0;
|
||||||
|
|
||||||
/*
|
#if 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);
|
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);
|
||||||
printf("Play: %d %d %s l:%d\n", newIndex, soundNumber, GameSounds[soundNumber].wavName, loop);
|
fprintf(stderr, "PSND: Play: %d %d %s l:%d\n", newIndex, soundNumber, GameSounds[soundNumber].wavName, loop);
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
if(worldPosn)
|
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
|
// //sound starts part of the way in
|
||||||
// IDirectSoundBuffer_SetCurrentPosition(ActiveSounds[newIndex].dsBufferP,soundStartPosition);
|
// IDirectSoundBuffer_SetCurrentPosition(ActiveSounds[newIndex].dsBufferP,soundStartPosition);
|
||||||
// }
|
// }
|
||||||
|
#if 0 /* TODO */
|
||||||
if (soundStartPosition)
|
if (soundStartPosition)
|
||||||
fprintf(stderr, "Sound_Play: sound starts part of the way in (%d)\n", soundStartPosition);
|
fprintf(stderr, "Sound_Play: sound starts part of the way in (%d)\n", soundStartPosition);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound_Stop(int activeSoundNumber)
|
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 */
|
/* stop the sound: it may have already stopped, of course, but never mind */
|
||||||
|
|
||||||
PlatStopSound(activeSoundNumber);
|
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 */
|
/* release the active sound slot */
|
||||||
buf = ActiveSounds[activeSoundNumber].ds3DBufferP;
|
buf = ActiveSounds[activeSoundNumber].ds3DBufferP;
|
||||||
ActiveSounds[activeSoundNumber] = BlankActiveSound;
|
ActiveSounds[activeSoundNumber] = BlankActiveSound;
|
||||||
|
@ -853,8 +857,9 @@ void Save_SoundState(int* soundHandle)
|
||||||
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
|
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
|
||||||
// else
|
// else
|
||||||
block->position = 0;
|
block->position = 0;
|
||||||
|
#if 0 /* TODO */
|
||||||
fprintf(stderr, "Save_SoundState: GetCurrentPosition!\n");
|
fprintf(stderr, "Save_SoundState: GetCurrentPosition!\n");
|
||||||
|
#endif
|
||||||
strcpy((char*)(block+1),name);
|
strcpy((char*)(block+1),name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -944,7 +949,9 @@ void Save_SoundsWithNoReference()
|
||||||
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
|
// IDirectSoundBuffer_GetCurrentPosition(sound->dsBufferP,(LPDWORD)&block->position,NULL);
|
||||||
// else
|
// else
|
||||||
block->position = 0;
|
block->position = 0;
|
||||||
|
#if 0 /* TODO */
|
||||||
fprintf(stderr, "Save_SoundsWithNoReference: GetCurrentPosition!\n");
|
fprintf(stderr, "Save_SoundsWithNoReference: GetCurrentPosition!\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
strcpy((char*)(block+1),name);
|
strcpy((char*)(block+1),name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -867,16 +867,14 @@ int FindAndLoadWavFile(int soundNum,char* wavFileName)
|
||||||
|
|
||||||
{
|
{
|
||||||
//check to see if file exists locally first
|
//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)
|
if(!wavFile && SecondSoundDir)
|
||||||
{
|
{
|
||||||
//look for sound over network
|
//look for sound over network
|
||||||
sprintf (sound_name, "%s%s", SecondSoundDir,wavFileName);
|
sprintf (sound_name, "%s%s", SecondSoundDir,wavFileName);
|
||||||
|
|
||||||
wavFile=fopen(sound_name,"rb");
|
wavFile = OpenGameFile(sound_name, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
if(!wavFile)
|
if(!wavFile) {
|
||||||
{
|
|
||||||
LOGDXFMT(("Failed to find %s\n",wavFileName));
|
LOGDXFMT(("Failed to find %s\n",wavFileName));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -905,7 +903,7 @@ void *LoadRebSndFile(char *filename)
|
||||||
void *bufferPtr;
|
void *bufferPtr;
|
||||||
long int save_pos, size_of_file;
|
long int save_pos, size_of_file;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
fp = fopen(filename,"rb");
|
fp = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
|
|
||||||
if (!fp) goto error;
|
if (!fp) goto error;
|
||||||
|
|
||||||
|
|
|
@ -397,8 +397,7 @@ static BOOL SaveGameAllowed()
|
||||||
void SaveGame()
|
void SaveGame()
|
||||||
{
|
{
|
||||||
char filename[100];
|
char filename[100];
|
||||||
HANDLE file;
|
FILE *file;
|
||||||
DWORD bytes_written;
|
|
||||||
int headerLength;
|
int headerLength;
|
||||||
HuffmanPackage *packagePtr;
|
HuffmanPackage *packagePtr;
|
||||||
|
|
||||||
|
@ -456,34 +455,27 @@ void SaveGame()
|
||||||
SaveGameRequest = SAVELOAD_REQUEST_NONE;
|
SaveGameRequest = SAVELOAD_REQUEST_NONE;
|
||||||
|
|
||||||
//write the file
|
//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);
|
GLOBALASSERT("Error saving file"==0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteFile(file,SaveInfo.BufferStart,headerLength,&bytes_written,0);
|
fwrite(SaveInfo.BufferStart, headerLength, 1, file);
|
||||||
|
|
||||||
packagePtr = HuffmanCompression(SaveInfo.BufferStart+headerLength,SaveInfo.BufferSpaceUsed-headerLength);
|
packagePtr = HuffmanCompression(SaveInfo.BufferStart+headerLength,SaveInfo.BufferSpaceUsed-headerLength);
|
||||||
|
|
||||||
WriteFile(file,packagePtr,packagePtr->CompressedDataSize+sizeof(HuffmanPackage),&bytes_written,0);
|
fwrite(packagePtr, packagePtr->CompressedDataSize+sizeof(HuffmanPackage), 1, file);
|
||||||
|
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
|
|
||||||
|
|
||||||
NewOnScreenMessage(GetTextString(TEXTSTRING_SAVEGAME_GAMESAVED));
|
NewOnScreenMessage(GetTextString(TEXTSTRING_SAVEGAME_GAMESAVED));
|
||||||
DisplaySavesLeft();
|
DisplaySavesLeft();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void EndLoadGame()
|
static void EndLoadGame()
|
||||||
{
|
{
|
||||||
|
@ -495,7 +487,6 @@ static void EndLoadGame()
|
||||||
LoadInfo.BufferPos = NULL;
|
LoadInfo.BufferPos = NULL;
|
||||||
LoadInfo.BufferSize = 0;
|
LoadInfo.BufferSize = 0;
|
||||||
LoadInfo.BufferSpaceLeft = 0;
|
LoadInfo.BufferSpaceLeft = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern SAVE_SLOT_HEADER SaveGameSlot[];
|
extern SAVE_SLOT_HEADER SaveGameSlot[];
|
||||||
|
@ -535,9 +526,8 @@ void LoadSavedGame()
|
||||||
{
|
{
|
||||||
SAVE_SLOT_HEADER* save_slot;
|
SAVE_SLOT_HEADER* save_slot;
|
||||||
char filename[100];
|
char filename[100];
|
||||||
HANDLE file;
|
FILE *file;
|
||||||
BOOL terminal_error = FALSE;
|
BOOL terminal_error = FALSE;
|
||||||
unsigned int bytes_read;
|
|
||||||
|
|
||||||
if(LoadGameRequest == SAVELOAD_REQUEST_NONE) return;
|
if(LoadGameRequest == SAVELOAD_REQUEST_NONE) return;
|
||||||
|
|
||||||
|
@ -576,31 +566,32 @@ void LoadSavedGame()
|
||||||
LoadGameRequest = SAVELOAD_REQUEST_NONE;
|
LoadGameRequest = SAVELOAD_REQUEST_NONE;
|
||||||
|
|
||||||
//load the file
|
//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==NULL)
|
||||||
if(file==INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
//failed to load
|
//failed to load
|
||||||
EndLoadGame();
|
EndLoadGame();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadInfo.BufferSize = GetFileSize(file,0);
|
fseek(file, 0, SEEK_END);
|
||||||
|
LoadInfo.BufferSize = ftell(file);
|
||||||
|
rewind(file);
|
||||||
|
|
||||||
if(!LoadInfo.BufferSize)
|
if(!LoadInfo.BufferSize)
|
||||||
{
|
{
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
EndLoadGame();
|
EndLoadGame();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//allocate buffer , and read file into memory
|
//allocate buffer , and read file into memory
|
||||||
LoadInfo.BufferStart = (char*) AllocateMem(LoadInfo.BufferSize);
|
LoadInfo.BufferStart = (char*) AllocateMem(LoadInfo.BufferSize);
|
||||||
ReadFile(file,LoadInfo.BufferStart,LoadInfo.BufferSize,(LPDWORD)&bytes_read,0);
|
fread(LoadInfo.BufferStart, LoadInfo.BufferSize, 1, file);
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LoadInfo.BufferPos = LoadInfo.BufferStart;
|
LoadInfo.BufferPos = LoadInfo.BufferStart;
|
||||||
LoadInfo.BufferSpaceLeft = LoadInfo.BufferSize;
|
LoadInfo.BufferSpaceLeft = LoadInfo.BufferSize;
|
||||||
|
|
||||||
|
@ -1340,10 +1331,6 @@ static void SaveMiscGlobalStuff()
|
||||||
GetFMVInformation(&block->FMV_MessageNumber,&block->FMV_FrameNumber);
|
GetFMVInformation(&block->FMV_MessageNumber,&block->FMV_FrameNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void DisplaySavesLeft()
|
extern void DisplaySavesLeft()
|
||||||
{
|
{
|
||||||
char text [100];
|
char text [100];
|
||||||
|
@ -1353,9 +1340,6 @@ extern void DisplaySavesLeft()
|
||||||
NewOnScreenMessage(text);
|
NewOnScreenMessage(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void ResetNumberOfSaves()
|
extern void ResetNumberOfSaves()
|
||||||
{
|
{
|
||||||
switch(AvP.Difficulty)
|
switch(AvP.Difficulty)
|
||||||
|
@ -1370,7 +1354,7 @@ extern void ResetNumberOfSaves()
|
||||||
case I_Impossible :
|
case I_Impossible :
|
||||||
NumberOfSavesLeft = NUM_SAVES_FOR_HARD_MODE;
|
NumberOfSavesLeft = NUM_SAVES_FOR_HARD_MODE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,6 @@ static CharacterSoundEffects QueenSounds={0,0,0,SID_NOSOUND};
|
||||||
//static SOUNDINDEX global_last_sound;
|
//static SOUNDINDEX global_last_sound;
|
||||||
|
|
||||||
|
|
||||||
/* TODO: dir separator */
|
|
||||||
#if ALIEN_DEMO
|
#if ALIEN_DEMO
|
||||||
#define ScreamFilePath "alienfastfile/"
|
#define ScreamFilePath "alienfastfile/"
|
||||||
#elif LOAD_SCREAMS_FROM_FASTFILES
|
#elif LOAD_SCREAMS_FROM_FASTFILES
|
||||||
|
@ -65,95 +64,6 @@ static CharacterSoundEffects QueenSounds={0,0,0,SID_NOSOUND};
|
||||||
#define ScreamFilePath "sound/"
|
#define ScreamFilePath "sound/"
|
||||||
#endif
|
#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)
|
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;
|
char path[100]=ScreamFilePath;
|
||||||
strcat(path,filename);
|
strcat(path,filename);
|
||||||
|
|
||||||
HANDLE file=CreateFile(path,GENERIC_READ, 0, 0, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS, 0);
|
FILE *file = OpenGameFile(path, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
if(file==INVALID_HANDLE_VALUE)
|
if(file==NULL)
|
||||||
{
|
{
|
||||||
LOGDXFMT(("Failed to open %s",path));
|
LOGDXFMT(("Failed to open %s",path));
|
||||||
return;
|
return;
|
||||||
|
@ -171,12 +81,15 @@ void CharacterSoundEffects::LoadSounds(const char* filename,const char* director
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
int file_size;
|
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];
|
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))
|
if(strncmp("MARSOUND",buffer,8))
|
||||||
{
|
{
|
||||||
|
@ -347,7 +260,6 @@ void UnloadScreamSounds()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: dir separator */
|
|
||||||
void LoadMarineScreamSounds()
|
void LoadMarineScreamSounds()
|
||||||
{
|
{
|
||||||
MarineSounds.LoadSounds("marsound.dat","npc\\marinevoice\\");
|
MarineSounds.LoadSounds("marsound.dat","npc\\marinevoice\\");
|
||||||
|
|
|
@ -53,19 +53,7 @@
|
||||||
#endif
|
#endif
|
||||||
extern unsigned char KeyboardInput[];
|
extern unsigned char KeyboardInput[];
|
||||||
extern unsigned char DebouncedKeyboardInput[];
|
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
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -111,7 +99,8 @@ KeyBinding :: ParseBindCommand
|
||||||
SCString* pSCString_ToBind = new SCString(pProjCh_FollowingTheKey);
|
SCString* pSCString_ToBind = new SCString(pProjCh_FollowingTheKey);
|
||||||
|
|
||||||
// Create the KeyBinding object:
|
// Create the KeyBinding object:
|
||||||
KeyBinding* pNewBinding = new KeyBinding
|
KeyBinding* pNewBinding;
|
||||||
|
pNewBinding = new KeyBinding
|
||||||
(
|
(
|
||||||
theKey,
|
theKey,
|
||||||
pSCString_ToBind
|
pSCString_ToBind
|
||||||
|
@ -185,7 +174,7 @@ KeyBinding :: ParseUnbindCommand
|
||||||
{
|
{
|
||||||
OurBool bGotMatch = No;
|
OurBool bGotMatch = No;
|
||||||
unsigned int LongestMatch = 0;
|
unsigned int LongestMatch = 0;
|
||||||
BindableKey theKey_ToUnbind;
|
BindableKey theKey_ToUnbind = (BindableKey)0;
|
||||||
|
|
||||||
for (int i=0;i<MAX_VALUE_BINDABLE_KEY; i++)
|
for (int i=0;i<MAX_VALUE_BINDABLE_KEY; i++)
|
||||||
{
|
{
|
||||||
|
@ -384,7 +373,7 @@ void KeyBinding :: WriteToConfigFile(char* Filename)
|
||||||
|
|
||||||
GLOBALASSERT(Filename);
|
GLOBALASSERT(Filename);
|
||||||
|
|
||||||
FILE* pFile = fopen(Filename,"w");
|
FILE* pFile = OpenGameFile(Filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
|
|
||||||
if (!pFile)
|
if (!pFile)
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,7 +83,7 @@ BatchFileProcessing :: Run(char* Filename)
|
||||||
RefList<SCString> PendingList;
|
RefList<SCString> PendingList;
|
||||||
|
|
||||||
{
|
{
|
||||||
FILE* pFile = fopen(Filename,"r");
|
FILE* pFile = OpenGameFile(Filename, FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
|
|
||||||
if (NULL==pFile)
|
if (NULL==pFile)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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) \
|
#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); \
|
ReportError(fname); \
|
||||||
post_proc; \
|
post_proc; \
|
||||||
|
@ -181,8 +181,6 @@ FFHeaderI::FFHeaderI(char const *_filename,BOOL _should_be_kept)
|
||||||
{
|
{
|
||||||
filename = new char [strlen(_filename) + 1];
|
filename = new char [strlen(_filename) + 1];
|
||||||
strcpy(filename,_filename);
|
strcpy(filename,_filename);
|
||||||
|
|
||||||
FixFilename(filename);
|
|
||||||
|
|
||||||
Read();
|
Read();
|
||||||
}
|
}
|
||||||
|
@ -280,9 +278,9 @@ FFError FFHeaderI::Read(char const *_filename)
|
||||||
strcpy(filename,_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);
|
ReportError(filename);
|
||||||
return FF_COULDNOTOPENFILE;
|
return FF_COULDNOTOPENFILE;
|
||||||
|
@ -298,40 +296,40 @@ FFError FFHeaderI::Read(char const *_filename)
|
||||||
|
|
||||||
DWORD bytes_read;
|
DWORD bytes_read;
|
||||||
|
|
||||||
READ_FILE(filename,(void)0,CloseHandle(h),h,magic,4,bytes_read,0)
|
READ_FILE(filename,(void)0,fclose(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,fclose(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,fclose(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,fclose(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,&length,4,bytes_read,0)
|
||||||
|
|
||||||
if (strncmp(magic,"RFFL",4))
|
if (strncmp(magic,"RFFL",4))
|
||||||
{
|
{
|
||||||
ReportError(filename,"Incorrect file type");
|
ReportError(filename,"Incorrect file type");
|
||||||
CloseHandle(h);
|
fclose(h);
|
||||||
return FF_COULDNOTREADFILE;
|
return FF_COULDNOTREADFILE;
|
||||||
}
|
}
|
||||||
if (rffl_version>0)
|
if (rffl_version>0)
|
||||||
{
|
{
|
||||||
ReportError(filename,"Version not supported");
|
ReportError(filename,"Version not supported");
|
||||||
CloseHandle(h);
|
fclose(h);
|
||||||
return FF_COULDNOTREADFILE;
|
return FF_COULDNOTREADFILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void * header = malloc(total_headsize);
|
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);
|
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
|
// now parse the header
|
||||||
|
|
||||||
void * headerP = 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);
|
char const * fnameP = (char *)((size_t)headerP + 8);
|
||||||
size_t leng = *(size_t *)((size_t)headerP + 4);
|
size_t leng = *(size_t *)((size_t)headerP + 4);
|
||||||
|
|
|
@ -54,7 +54,7 @@ FFileDesc::FFileDesc(char const * infoline, char const * path)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
c2 = c1 = *infoline++;
|
c2 = c1 = *infoline++;
|
||||||
if (';'==c1||'\n'==c1)
|
if (';'==c1||'\n'==c1||'\r'==c1)
|
||||||
c1 = 0;
|
c1 = 0;
|
||||||
*dbufP++ = (char)c1;
|
*dbufP++ = (char)c1;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ FFileDesc::FFileDesc(char const * infoline, char const * path)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
c1 = *infoline++;
|
c1 = *infoline++;
|
||||||
if ('\n'==c1)
|
if ('\n'==c1||'\r'==c1)
|
||||||
c1 = 0;
|
c1 = 0;
|
||||||
*fbufP++ = (char)c1;
|
*fbufP++ = (char)c1;
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ static List<FFILE *> openlist;
|
||||||
|
|
||||||
int ffInit(char const * infofilename, char const * ffpath)
|
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;
|
if (!fp) return 0;
|
||||||
|
|
||||||
while (fdesclist.size())
|
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
|
#if debug && 0 // dont do this, caller should handle this situation
|
||||||
LOGDXFMT(("%s not in any fastfile",filename));
|
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;
|
if (!sfp) return 0;
|
||||||
|
|
||||||
fseek(sfp,0,SEEK_END);
|
fseek(sfp,0,SEEK_END);
|
||||||
|
@ -442,7 +444,7 @@ int ffseek(FFILE * fp, long offset, int whence)
|
||||||
switch (whence)
|
switch (whence)
|
||||||
{
|
{
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
if (offset > fp->length || offset < 0)
|
if ((unsigned long)offset > fp->length || offset < 0)
|
||||||
{
|
{
|
||||||
fp->flag |= FFF_ERR;
|
fp->flag |= FFF_ERR;
|
||||||
errno = EDOM;
|
errno = EDOM;
|
||||||
|
|
|
@ -182,26 +182,25 @@ static char *RifNamesForEnvironments[] =
|
||||||
"Not a Level",//AVP_ENVIRONMENT_END_OF_LIST
|
"Not a Level",//AVP_ENVIRONMENT_END_OF_LIST
|
||||||
|
|
||||||
//multipack multiplayer levels
|
//multipack multiplayer levels
|
||||||
"Leadworks",//AVP_ENVIRONMENT_LEADWORKS_MP,
|
"leadworks",//AVP_ENVIRONMENT_LEADWORKS_MP,
|
||||||
"HadleysHope",//AVP_ENVIRONMENT_HADLEYSHOPE_MP,
|
"hadleyshope",//AVP_ENVIRONMENT_HADLEYSHOPE_MP,
|
||||||
"Meat_Factory",//AVP_ENVIRONMENT_MEATFACTORY_MP,
|
"meat_factory",//AVP_ENVIRONMENT_MEATFACTORY_MP,
|
||||||
"Nostromo",//AVP_ENVIRONMENT_NOSTROMO_MP,
|
"nostromo",//AVP_ENVIRONMENT_NOSTROMO_MP,
|
||||||
"Subway",//AVP_ENVIRONMENT_SUBWAY_MP,
|
"subway",//AVP_ENVIRONMENT_SUBWAY_MP,
|
||||||
"Elevator",//AVP_ENVIRONMENT_ELEVATOR_MP,
|
"elevator",//AVP_ENVIRONMENT_ELEVATOR_MP,
|
||||||
"Lab14",//AVP_ENVIRONMENT_LAB14_MP,
|
"lab14",//AVP_ENVIRONMENT_LAB14_MP,
|
||||||
"Compound",//AVP_ENVIRONMENT_COMPOUND_MP,
|
"compound",//AVP_ENVIRONMENT_COMPOUND_MP,
|
||||||
"Office",//AVP_ENVIRONMENT_OFFICE_MP,
|
"office",//AVP_ENVIRONMENT_OFFICE_MP,
|
||||||
|
|
||||||
//multipack multiplayer cooperative levels
|
//multipack multiplayer cooperative levels
|
||||||
"Leadworks_coop",//AVP_ENVIRONMENT_LEADWORKS_COOP,
|
"leadworks_coop",//AVP_ENVIRONMENT_LEADWORKS_COOP,
|
||||||
"hadleyshope_coop",//AVP_ENVIRONMENT_HADLEYSHOPE_COOP,
|
"hadleyshope_coop",//AVP_ENVIRONMENT_HADLEYSHOPE_COOP,
|
||||||
"Co-op_Meat_Factory",//AVP_ENVIRONMENT_MEATFACTORY_COOP,
|
"co-op_meat_factory",//AVP_ENVIRONMENT_MEATFACTORY_COOP,
|
||||||
"Nostromo_Coop",//AVP_ENVIRONMENT_NOSTROMO_COOP,
|
"nostromo_coop",//AVP_ENVIRONMENT_NOSTROMO_COOP,
|
||||||
"SubwayCoop",//AVP_ENVIRONMENT_SUBWAY_COOP,
|
"subwaycoop",//AVP_ENVIRONMENT_SUBWAY_COOP,
|
||||||
"Elevator_co-op",//AVP_ENVIRONMENT_ELEVATOR_COOP,
|
"elevator_co-op",//AVP_ENVIRONMENT_ELEVATOR_COOP,
|
||||||
"Lab14coop",//AVP_ENVIRONMENT_LAB14_COOP,
|
"lab14coop",//AVP_ENVIRONMENT_LAB14_COOP,
|
||||||
"CompoundCoop",//AVP_ENVIRONMENT_COMPOUND_COOP,
|
"compoundcoop",//AVP_ENVIRONMENT_COMPOUND_COOP,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char LevelName[];
|
extern char LevelName[];
|
||||||
|
@ -5142,7 +5141,7 @@ void SetLevelToLoadForMultiplayer(int episode)
|
||||||
{
|
{
|
||||||
//it certainly is
|
//it certainly is
|
||||||
//(the game type sent passed to the function doesn't really matter , as long as it isn't NGT_COOP)
|
//(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
|
else
|
||||||
{
|
{
|
||||||
|
@ -5155,7 +5154,7 @@ void SetLevelToLoadForCooperative(int episode)
|
||||||
if(episode>=MAX_NO_OF_COOPERATIVE_EPISODES)
|
if(episode>=MAX_NO_OF_COOPERATIVE_EPISODES)
|
||||||
{
|
{
|
||||||
//it certainly is
|
//it certainly is
|
||||||
sprintf(LevelName,"Custom\\%s",GetCustomMultiplayerLevelName(episode,NGT_Coop));
|
sprintf(LevelName,"Custom/%s",GetCustomMultiplayerLevelName(episode,NGT_Coop));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5200,14 +5199,14 @@ int NumberForCurrentLevel(void) {
|
||||||
|
|
||||||
static BOOL DoesNamedLevelExist(const char* level_name)
|
static BOOL DoesNamedLevelExist(const char* level_name)
|
||||||
{
|
{
|
||||||
HANDLE file_handle;
|
FILE *file_handle;
|
||||||
char filename[200];
|
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);
|
file_handle = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
if(file_handle == INVALID_HANDLE_VALUE) return FALSE;
|
if(file_handle == NULL) return FALSE;
|
||||||
CloseHandle(file_handle);
|
fclose(file_handle);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,6 @@ static void KeyboardEntryQueue_Clear(void);
|
||||||
static void KeyboardEntryQueue_StartProcessing(void);
|
static void KeyboardEntryQueue_StartProcessing(void);
|
||||||
void ScanSaveSlots(void);
|
void ScanSaveSlots(void);
|
||||||
extern void GetFilenameForSaveSlot(int i, unsigned char *filenamePtr);
|
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);
|
static void PasteFromClipboard(char* Text,int MaxTextLength);
|
||||||
/* KJL 11:23:03 23/06/98 - Requirements
|
/* KJL 11:23:03 23/06/98 - Requirements
|
||||||
|
@ -4451,7 +4450,7 @@ void DisplayVideoModeUnavailableScreen(void)
|
||||||
void CheckForCredits(void)
|
void CheckForCredits(void)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
FILE *fp = fopen("credits.txt","rb");
|
FILE *fp = OpenGameFile("credits.txt", FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
|
|
||||||
if (!fp)
|
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 **
|
** Loading and saving main level info **
|
||||||
**------------------------------------*/
|
**------------------------------------*/
|
||||||
|
@ -5502,7 +5479,6 @@ void SaveLevelHeader()
|
||||||
|
|
||||||
block->Difficulty = AvP.Difficulty;
|
block->Difficulty = AvP.Difficulty;
|
||||||
block->NumberOfSavesLeft = (unsigned char) NumberOfSavesLeft;
|
block->NumberOfSavesLeft = (unsigned char) NumberOfSavesLeft;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadLevelHeader(SAVE_BLOCK_HEADER* header)
|
void LoadLevelHeader(SAVE_BLOCK_HEADER* header)
|
||||||
|
@ -5514,48 +5490,43 @@ void LoadLevelHeader(SAVE_BLOCK_HEADER* header)
|
||||||
AvP.ElapsedHours = block->ElapsedTime_Hours;
|
AvP.ElapsedHours = block->ElapsedTime_Hours;
|
||||||
AvP.ElapsedMinutes = block->ElapsedTime_Minutes;
|
AvP.ElapsedMinutes = block->ElapsedTime_Minutes;
|
||||||
AvP.ElapsedSeconds = block->ElapsedTime_Seconds;
|
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;
|
LEVEL_SAVE_BLOCK block;
|
||||||
unsigned int file_size;
|
unsigned int file_size;
|
||||||
unsigned int bytes_read;
|
unsigned char filename[100];
|
||||||
HANDLE file;
|
FILE *file;
|
||||||
|
|
||||||
save_slot->SlotUsed = 0;
|
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)
|
//failed to load (probably doesn't exist)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
file_size = GetFileSize(file,0);
|
file_size = ftell(file);
|
||||||
|
rewind(file);
|
||||||
|
|
||||||
if(file_size < sizeof(LEVEL_SAVE_BLOCK))
|
if(file_size < sizeof(LEVEL_SAVE_BLOCK))
|
||||||
{
|
{
|
||||||
//obviously not much of a save file then...
|
//obviously not much of a save file then...
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
save_slot->TimeStamp = gdf->timestamp;
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
if (stat(filename, &buf) != -1) {
|
|
||||||
save_slot->TimeStamp = buf.st_mtime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//load the level header
|
//load the level header
|
||||||
ReadFile(file,&block,sizeof(block),(LPDWORD)&bytes_read,0);
|
fread(&block, sizeof(block), 1, file);
|
||||||
CloseHandle(file);
|
fclose(file);
|
||||||
|
|
||||||
//a few checks
|
//a few checks
|
||||||
if(block.header.type != SaveBlock_MainHeader ||
|
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;
|
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()
|
static void CheckForLoadGame()
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,22 +15,16 @@
|
||||||
#define UseLocalAssert Yes
|
#define UseLocalAssert Yes
|
||||||
#include "ourasert.h"
|
#include "ourasert.h"
|
||||||
|
|
||||||
#include <glob.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
extern void SetDefaultMultiplayerConfig();
|
extern void SetDefaultMultiplayerConfig();
|
||||||
extern char MP_SessionName[];
|
extern char MP_SessionName[];
|
||||||
extern char MP_Config_Description[];
|
extern char MP_Config_Description[];
|
||||||
|
|
||||||
#define MP_CONFIG_DIR "MPConfig"
|
#define MP_CONFIG_DIR "MPConfig/"
|
||||||
#define MP_CONFIG_WILDCARD "MPConfig/*.cfg"
|
#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*> ConfigurationFilenameList;
|
||||||
static List<char*> ConfigurationLocalisedFilenameList;
|
static List<char*> ConfigurationLocalisedFilenameList;
|
||||||
|
@ -63,68 +57,48 @@ BOOL BuildLoadMPConfigMenu()
|
||||||
load_name=SKIRMISH_CONFIG_WILDCARD;
|
load_name=SKIRMISH_CONFIG_WILDCARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
glob_t globbuf;
|
void *gd;
|
||||||
if (glob(load_name, 0, NULL, &globbuf))
|
GameDirectoryFile *gdf;
|
||||||
|
|
||||||
|
gd = OpenGameDirectory(MP_CONFIG_DIR, load_name, FILETYPE_CONFIG);
|
||||||
|
if (gd == NULL) {
|
||||||
|
CreateGameDirectory(MP_CONFIG_DIR); /* maybe it didn't exist.. */
|
||||||
return FALSE;
|
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++) {
|
while ((gdf = ScanGameDirectory(gd)) != NULL) {
|
||||||
struct stat buf;
|
if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
|
||||||
|
continue;
|
||||||
if (stat(globbuf.gl_pathv[i], &buf) == -1)
|
if ((gdf->attr & FILEATTR_READABLE) == 0)
|
||||||
continue;
|
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];
|
char* name=new char[strlen(gdf->filename)+1];
|
||||||
strcpy(name,filename);
|
strcpy(name,gdf->filename);
|
||||||
char* dotpos=strrchr(name,'.');
|
char* dotpos=strrchr(name,'.');
|
||||||
if(dotpos) *dotpos=0;
|
if(dotpos) *dotpos=0;
|
||||||
|
|
||||||
ConfigurationFilenameList.add_entry(name);
|
ConfigurationFilenameList.add_entry(name);
|
||||||
|
|
||||||
BOOL localisedFilename=FALSE;
|
BOOL localisedFilename=FALSE;
|
||||||
|
|
||||||
//seeif this is one of the default language localised configurations
|
//seeif this is one of the default language localised configurations
|
||||||
if(!strncmp(name,"Config",6))
|
if(!strncmp(name,"Config",6))
|
||||||
|
{
|
||||||
|
if(name[6]>='1' && name[6]<='7' && name[7]=='\0')
|
||||||
{
|
{
|
||||||
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));
|
||||||
TEXTSTRING_ID string_index=(TEXTSTRING_ID)(TEXTSTRING_MPCONFIG1_FILENAME+(name[6]-'1'));
|
localisedFilename=TRUE;
|
||||||
ConfigurationLocalisedFilenameList.add_entry(GetTextString(string_index));
|
|
||||||
localisedFilename=TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!localisedFilename)
|
|
||||||
{
|
|
||||||
ConfigurationLocalisedFilenameList.add_entry(name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!localisedFilename)
|
||||||
|
{
|
||||||
|
ConfigurationLocalisedFilenameList.add_entry(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
globfree(&globbuf);
|
CloseGameDirectory(gd);
|
||||||
|
|
||||||
//delete the old menu
|
//delete the old menu
|
||||||
if(AvPMenu_Multiplayer_LoadConfig) delete AvPMenu_Multiplayer_LoadConfig;
|
if(AvPMenu_Multiplayer_LoadConfig) delete AvPMenu_Multiplayer_LoadConfig;
|
||||||
|
|
||||||
|
@ -195,7 +169,7 @@ const char* GetMultiplayerConfigDescription(int index)
|
||||||
else
|
else
|
||||||
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
||||||
|
|
||||||
file=fopen(filename,"rb");
|
file= OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
if(!file)
|
if(!file)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -233,7 +207,7 @@ void LoadMultiplayerConfiguration(const char* name)
|
||||||
else
|
else
|
||||||
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
||||||
|
|
||||||
file=fopen(filename,"rb");
|
file= OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
if(!file) return;
|
if(!file) return;
|
||||||
|
|
||||||
|
|
||||||
|
@ -330,7 +304,6 @@ void LoadMultiplayerConfiguration(const char* name)
|
||||||
netGameData.customLevelName[0] = 0;
|
netGameData.customLevelName[0] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveMultiplayerConfiguration(const char* name)
|
void SaveMultiplayerConfiguration(const char* name)
|
||||||
|
@ -342,10 +315,15 @@ void SaveMultiplayerConfiguration(const char* name)
|
||||||
else
|
else
|
||||||
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,name);
|
||||||
|
|
||||||
CreateDirectory(MP_CONFIG_DIR,0);
|
|
||||||
file=fopen(filename,"wb");
|
file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
if(!file) return;
|
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.gameType,sizeof(int),1,file);
|
||||||
fwrite(&netGameData.levelNumber,sizeof(int),1,file);
|
fwrite(&netGameData.levelNumber,sizeof(int),1,file);
|
||||||
fwrite(&netGameData.scoreLimit,sizeof(int),1,file);
|
fwrite(&netGameData.scoreLimit,sizeof(int),1,file);
|
||||||
|
@ -427,7 +405,6 @@ void SaveMultiplayerConfiguration(const char* name)
|
||||||
delete [] LastDescriptionText;
|
delete [] LastDescriptionText;
|
||||||
LastDescriptionFile=0;
|
LastDescriptionFile=0;
|
||||||
LastDescriptionText=0;
|
LastDescriptionText=0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,12 +418,12 @@ void DeleteMultiplayerConfigurationByIndex(int index)
|
||||||
else
|
else
|
||||||
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,ConfigurationFilenameList[index]);
|
sprintf(filename,"%s/%s.cfg",MP_CONFIG_DIR,ConfigurationFilenameList[index]);
|
||||||
|
|
||||||
DeleteFile(filename);
|
DeleteGameFile(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define IP_ADDRESS_DIR "IP_Address"
|
#define IP_ADDRESS_DIR "IP_Address/"
|
||||||
#define IP_ADDRESS_WILDCARD "IP_Address/*.IP Address"
|
#define IP_ADDRESS_WILDCARD "*.IP Address"
|
||||||
|
|
||||||
static List<char*> IPAddFilenameList;
|
static List<char*> IPAddFilenameList;
|
||||||
|
|
||||||
|
@ -465,52 +442,29 @@ BOOL BuildLoadIPAddressMenu()
|
||||||
|
|
||||||
//do a search for all the addresses in the address directory
|
//do a search for all the addresses in the address directory
|
||||||
|
|
||||||
glob_t globbuf;
|
void *gd;
|
||||||
const char* load_name=IP_ADDRESS_WILDCARD;
|
GameDirectoryFile *gdf;
|
||||||
|
gd = OpenGameDirectory(IP_ADDRESS_DIR, IP_ADDRESS_WILDCARD, FILETYPE_CONFIG);
|
||||||
if (glob(load_name, 0, NULL, &globbuf))
|
if (gd == NULL) {
|
||||||
|
CreateGameDirectory(IP_ADDRESS_DIR); /* maybe it didn't exist.. */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// get any path in the load_name
|
while ((gdf = ScanGameDirectory(gd)) != NULL) {
|
||||||
int nPathLen = 0;
|
if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
|
||||||
char * pColon = strrchr(load_name,':');
|
continue;
|
||||||
if (pColon) nPathLen = pColon - load_name + 1;
|
if ((gdf->attr & FILEATTR_READABLE) == 0)
|
||||||
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)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0)) {
|
char* name=new char[strlen(gdf->filename)+1];
|
||||||
char *filename = strrchr(globbuf.gl_pathv[i], '/');
|
strcpy(name,gdf->filename);
|
||||||
if (filename)
|
char* dotpos=strchr(name,'.');
|
||||||
filename++;
|
if(dotpos) *dotpos=0;
|
||||||
else
|
IPAddFilenameList.add_entry(name);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
globfree(&globbuf);
|
CloseGameDirectory(gd);
|
||||||
|
|
||||||
//delete the old menu
|
//delete the old menu
|
||||||
if(AvPMenu_Multiplayer_LoadIPAddress) delete [] AvPMenu_Multiplayer_LoadIPAddress;
|
if(AvPMenu_Multiplayer_LoadIPAddress) delete [] AvPMenu_Multiplayer_LoadIPAddress;
|
||||||
|
|
||||||
|
@ -544,9 +498,13 @@ void SaveIPAddress(const char* name,const char* address)
|
||||||
char filename[200];
|
char filename[200];
|
||||||
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
|
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
|
||||||
|
|
||||||
CreateDirectory(IP_ADDRESS_DIR,0);
|
file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
file=fopen(filename,"wb");
|
if (file == NULL) {
|
||||||
if(!file) return;
|
CreateGameDirectory(IP_ADDRESS_DIR); /* try again */
|
||||||
|
file = OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
|
if (file == NULL)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fwrite(address,1,strlen(address)+1,file);
|
fwrite(address,1,strlen(address)+1,file);
|
||||||
|
|
||||||
|
@ -556,15 +514,14 @@ void SaveIPAddress(const char* name,const char* address)
|
||||||
void LoadIPAddress(const char* name)
|
void LoadIPAddress(const char* name)
|
||||||
{
|
{
|
||||||
extern char IPAddressString[];
|
extern char IPAddressString[];
|
||||||
|
|
||||||
|
|
||||||
if(!name) return;
|
if(!name) return;
|
||||||
|
|
||||||
FILE* file;
|
FILE* file;
|
||||||
char filename[200];
|
char filename[200];
|
||||||
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
|
sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
|
||||||
|
|
||||||
file=fopen(filename,"rb");
|
file=OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
if(!file) return;
|
if(!file) return;
|
||||||
|
|
||||||
fread(IPAddressString,1,16,file);
|
fread(IPAddressString,1,16,file);
|
||||||
|
@ -598,41 +555,33 @@ void BuildMultiplayerLevelNameArray()
|
||||||
|
|
||||||
//first do a search for custom level rifs
|
//first do a search for custom level rifs
|
||||||
// allow a wildcard search
|
// allow a wildcard search
|
||||||
|
void *gd;
|
||||||
const char* load_name="avp_rifs/custom/*.rif";
|
GameDirectoryFile *gdf;
|
||||||
|
|
||||||
glob_t globbuf;
|
/* TODO: Have to use PERM until the load_rif code can handle CONFIG */
|
||||||
|
if ((gd = OpenGameDirectory("avp_rifs/Custom/", "*.rif", FILETYPE_PERM)) != NULL) {
|
||||||
if (glob(load_name, 0, NULL, &globbuf) == 0) {
|
|
||||||
char* custom_string = GetTextString(TEXTSTRING_CUSTOM_LEVEL);
|
char* custom_string = GetTextString(TEXTSTRING_CUSTOM_LEVEL);
|
||||||
int cs_len = strlen(custom_string);
|
int cs_len = strlen(custom_string);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < globbuf.gl_pathc; i++) {
|
while ((gdf = ScanGameDirectory(gd)) != NULL) {
|
||||||
struct stat buf;
|
if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
|
||||||
|
|
||||||
if (stat(globbuf.gl_pathv[i], &buf) == -1)
|
|
||||||
continue;
|
continue;
|
||||||
|
if ((gdf->attr & FILEATTR_READABLE) == 0)
|
||||||
if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0)) {
|
continue;
|
||||||
char *filename = strrchr(globbuf.gl_pathv[i], '/');
|
|
||||||
if (filename)
|
char* name=new char[strlen(gdf->filename)+cs_len+3+1];
|
||||||
filename++;
|
|
||||||
else
|
|
||||||
filename = globbuf.gl_pathv[i];
|
|
||||||
|
|
||||||
char* name=new char[strlen(filename)+cs_len+3+1];
|
|
||||||
|
|
||||||
strcpy(name, filename);
|
strcpy(name, gdf->filename);
|
||||||
char* dotpos=strrchr(name,'.');
|
char* dotpos=strrchr(name,'.');
|
||||||
if(dotpos) *dotpos=0;
|
if(dotpos) *dotpos=0;
|
||||||
strcat(name," (");
|
strcat(name," (");
|
||||||
strcat(name,custom_string);
|
strcat(name,custom_string);
|
||||||
strcat(name,")");
|
strcat(name,")");
|
||||||
|
CustomLevelNameList.add_entry(name);
|
||||||
CustomLevelNameList.add_entry(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
globfree(&globbuf);
|
CloseGameDirectory(gd);
|
||||||
|
} else {
|
||||||
|
CreateGameDirectory("Custom/"); /* maybe it didn't exist.. */
|
||||||
}
|
}
|
||||||
|
|
||||||
NumCustomLevels = CustomLevelNameList.size();
|
NumCustomLevels = CustomLevelNameList.size();
|
||||||
|
|
|
@ -20,11 +20,6 @@ extern "C"
|
||||||
#include "pldnet.h"
|
#include "pldnet.h"
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <glob.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int LoadUserProfiles(void);
|
static int LoadUserProfiles(void);
|
||||||
|
|
||||||
static void EmptyUserProfilesList(void);
|
static void EmptyUserProfilesList(void);
|
||||||
|
@ -112,9 +107,9 @@ extern int SaveUserProfile(AVP_USER_PROFILE *profilePtr)
|
||||||
strcat(filename,profilePtr->Name);
|
strcat(filename,profilePtr->Name);
|
||||||
strcat(filename,USER_PROFILES_SUFFIX);
|
strcat(filename,USER_PROFILES_SUFFIX);
|
||||||
|
|
||||||
FILE* file=fopen(filename,"wb");
|
FILE* file=OpenGameFile(filename, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
delete [] filename;
|
delete [] filename;
|
||||||
if(!file) return 0;
|
if (!file) return 0;
|
||||||
|
|
||||||
SaveSettingsToUserProfile(profilePtr);
|
SaveSettingsToUserProfile(profilePtr);
|
||||||
|
|
||||||
|
@ -135,7 +130,7 @@ extern void DeleteUserProfile(int number)
|
||||||
strcat(filename,profilePtr->Name);
|
strcat(filename,profilePtr->Name);
|
||||||
strcat(filename,USER_PROFILES_SUFFIX);
|
strcat(filename,USER_PROFILES_SUFFIX);
|
||||||
|
|
||||||
DeleteFile(filename);
|
DeleteGameFile(filename);
|
||||||
|
|
||||||
delete [] filename;
|
delete [] filename;
|
||||||
{
|
{
|
||||||
|
@ -145,7 +140,7 @@ extern void DeleteUserProfile(int number)
|
||||||
for (i=0; i<NUMBER_OF_SAVE_SLOTS; i++)
|
for (i=0; i<NUMBER_OF_SAVE_SLOTS; i++)
|
||||||
{
|
{
|
||||||
sprintf(filename,"%s%s_%d.sav",USER_PROFILES_PATH,profilePtr->Name,i+1);
|
sprintf(filename,"%s%s_%d.sav",USER_PROFILES_PATH,profilePtr->Name,i+1);
|
||||||
DeleteFile(filename);
|
DeleteGameFile(filename);
|
||||||
}
|
}
|
||||||
delete [] filename;
|
delete [] filename;
|
||||||
}
|
}
|
||||||
|
@ -180,71 +175,54 @@ static int ProfileIsMoreRecent(AVP_USER_PROFILE *profilePtr, AVP_USER_PROFILE *p
|
||||||
|
|
||||||
static int LoadUserProfiles(void)
|
static int LoadUserProfiles(void)
|
||||||
{
|
{
|
||||||
glob_t globbuf;
|
void *gd;
|
||||||
const char* load_name=USER_PROFILES_WILDCARD_NAME;
|
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;
|
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++) {
|
int nPathLen = strlen(USER_PROFILES_PATH);
|
||||||
struct stat buf;
|
|
||||||
|
while ((gdf = ScanGameDirectory(gd)) != NULL) {
|
||||||
if (stat(globbuf.gl_pathv[i], &buf) == -1)
|
if ((gdf->attr & FILEATTR_DIRECTORY) != 0)
|
||||||
|
continue;
|
||||||
|
if ((gdf->attr & FILEATTR_READABLE) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (S_ISREG(buf.st_mode) && (access(globbuf.gl_pathv[i], R_OK) == 0))
|
char * pszFullPath = new char [nPathLen+strlen(gdf->filename)+1];
|
||||||
|
strcpy(pszFullPath, USER_PROFILES_PATH);
|
||||||
|
strcat(pszFullPath, gdf->filename);
|
||||||
|
|
||||||
|
FILE *rif_file;
|
||||||
|
rif_file = OpenGameFile(pszFullPath, FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
|
if(rif_file==NULL)
|
||||||
{
|
{
|
||||||
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;
|
|
||||||
|
|
||||||
if (!ReadFile(rif_file, profilePtr, sizeof(AVP_USER_PROFILE), &bytes_read, 0))
|
|
||||||
{
|
|
||||||
CloseHandle (rif_file);
|
|
||||||
delete[] pszFullPath;
|
|
||||||
delete profilePtr;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
profilePtr->FileTime = buf.st_mtime;
|
|
||||||
|
|
||||||
InsertProfileIntoList(profilePtr);
|
|
||||||
CloseHandle (rif_file);
|
|
||||||
delete[] pszFullPath;
|
delete[] pszFullPath;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AVP_USER_PROFILE *profilePtr = new AVP_USER_PROFILE;
|
||||||
|
|
||||||
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ typedef struct
|
||||||
|
|
||||||
|
|
||||||
#define USER_PROFILES_PATH "User_Profiles/"
|
#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"
|
#define USER_PROFILES_SUFFIX ".prf"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3719,6 +3719,9 @@ void setup_sounds (Environment_Data_Chunk * envd)
|
||||||
stt->outer_range = snd->outer_range * local_scale;
|
stt->outer_range = snd->outer_range * local_scale;
|
||||||
stt->max_volume = snd->max_volume;
|
stt->max_volume = snd->max_volume;
|
||||||
stt->pitch = snd->pitch;
|
stt->pitch = snd->pitch;
|
||||||
|
|
||||||
|
stt->playing = 0;
|
||||||
|
stt->loop = 0;
|
||||||
|
|
||||||
if(snd->flags & SoundObjectFlag_NotPlayingAtStart)
|
if(snd->flags & SoundObjectFlag_NotPlayingAtStart)
|
||||||
stt->playing=0;
|
stt->playing=0;
|
||||||
|
@ -3729,13 +3732,11 @@ void setup_sounds (Environment_Data_Chunk * envd)
|
||||||
stt->loop=0;
|
stt->loop=0;
|
||||||
else
|
else
|
||||||
stt->loop=1;
|
stt->loop=1;
|
||||||
|
|
||||||
|
|
||||||
stt->sound_name =(char*) PoolAllocateMem(strlen (snd->wav_name) + 1);
|
stt->sound_name =(char*) PoolAllocateMem(strlen (snd->wav_name) + 1);
|
||||||
strcpy(stt->sound_name,snd->wav_name);
|
strcpy(stt->sound_name,snd->wav_name);
|
||||||
stt->sound_loaded=GetSoundForMainRif(snd->wav_name);
|
stt->sound_loaded=GetSoundForMainRif(snd->wav_name);
|
||||||
|
|
||||||
|
|
||||||
AddToBehaviourList(snd->snd_name,snd->CalculateID(), I_BehaviourPlacedSound, (void *) stt);
|
AddToBehaviourList(snd->snd_name,snd->CalculateID(), I_BehaviourPlacedSound, (void *) stt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ void catpathandextension(char* dst, char* src)
|
||||||
|
|
||||||
if ((len > 0 && (dst[len-1] != '\\' && dst[len-1] != '/')) && *src != '.')
|
if ((len > 0 && (dst[len-1] != '\\' && dst[len-1] != '/')) && *src != '.')
|
||||||
{
|
{
|
||||||
lstrcat(dst,"\\");
|
lstrcat(dst,"/");
|
||||||
}
|
}
|
||||||
|
|
||||||
lstrcat(dst,src);
|
lstrcat(dst,src);
|
||||||
|
@ -367,7 +367,7 @@ char *LoadTextFile(char *filename)
|
||||||
char *bufferPtr;
|
char *bufferPtr;
|
||||||
long int save_pos, size_of_file;
|
long int save_pos, size_of_file;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
fp = fopen(filename,"rb");
|
fp = OpenGameFile(filename, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
|
|
||||||
if (!fp) goto error;
|
if (!fp) goto error;
|
||||||
|
|
||||||
|
|
|
@ -84,12 +84,6 @@ const char * SubShps_Directory = "SubShps\\All\\";
|
||||||
// const char * GenTex_Directory = 0;
|
// const char * GenTex_Directory = 0;
|
||||||
const char * FixTex_Directory = "\\\\Kate\\Kate Share\\avp\\Fix-Tex\\";
|
const char * FixTex_Directory = "\\\\Kate\\Kate Share\\avp\\Fix-Tex\\";
|
||||||
const char * GameTex_Directory = "\\\\Kate\\Kate Share\\avp\\game-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
|
// new directories for new-style graphics - to be determined properly
|
||||||
char const * FirstTex_Directory = "Graphics"; // currently relative to cwd
|
char const * FirstTex_Directory = "Graphics"; // currently relative to cwd
|
||||||
char const * SecondTex_Directory = 0; // will be the src safe shadow for development builds
|
char const * SecondTex_Directory = 0; // will be the src safe shadow for development builds
|
||||||
|
@ -357,9 +351,9 @@ struct LoadedPlacedHierarchy
|
||||||
#define NumPlacedHierarchy 3
|
#define NumPlacedHierarchy 3
|
||||||
LoadedPlacedHierarchy PlacedHierarchyArray[NumPlacedHierarchy]=
|
LoadedPlacedHierarchy PlacedHierarchyArray[NumPlacedHierarchy]=
|
||||||
{
|
{
|
||||||
"dropship","dropship",INVALID_RIFFHANDLE,
|
{ "dropship","dropship",INVALID_RIFFHANDLE },
|
||||||
"pred ship fury","pred ship fury",INVALID_RIFFHANDLE,
|
{ "pred ship fury","pred ship fury",INVALID_RIFFHANDLE },
|
||||||
"pred ship ob","pred ship ob",INVALID_RIFFHANDLE,
|
{ "pred ship ob","pred ship ob",INVALID_RIFFHANDLE },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -368,7 +362,6 @@ void LoadedPlacedHierarchy::load_rif()
|
||||||
if(placed_rif!=INVALID_RIFFHANDLE) return;
|
if(placed_rif!=INVALID_RIFFHANDLE) return;
|
||||||
char file_path[100];
|
char file_path[100];
|
||||||
|
|
||||||
/* TODO: dir seperator */
|
|
||||||
sprintf(file_path,"avp_huds/%s.rif",file_name);
|
sprintf(file_path,"avp_huds/%s.rif",file_name);
|
||||||
|
|
||||||
placed_rif=avp_load_rif_non_env(file_path);
|
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;
|
sound_array[index].volume=isc->max_volume;
|
||||||
if(dir_chunk)
|
if(dir_chunk)
|
||||||
{
|
{
|
||||||
/* TODO: dir separator */
|
|
||||||
sprintf(wavname,"%s\\%s",dir_chunk->directory,isc->wav_name);
|
sprintf(wavname,"%s\\%s",dir_chunk->directory,isc->wav_name);
|
||||||
sound_array[index].sound_loaded=GetSound(wavname);
|
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)
|
if(sound_array[index].sound_loaded)
|
||||||
{
|
{
|
||||||
sound_array[index].sound_index=(SOUNDINDEX)sound_array[index].sound_loaded->sound_num;
|
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 start_shape_no = rt_temp.start_list_pos;
|
||||||
int list_pos = rt_temp.main_list_pos;
|
int list_pos = rt_temp.main_list_pos;
|
||||||
db_logf3(("Shape copied to %d",list_pos));
|
db_logf3(("Shape copied to %d",list_pos));
|
||||||
MORPHCTRL * mc = rt_temp.mc;
|
|
||||||
#else
|
#else
|
||||||
int list_pos = copy_to_mainshapelist(h,shplif(),flags,&ob->object_data);
|
int list_pos = copy_to_mainshapelist(h,shplif(),flags,&ob->object_data);
|
||||||
int start_shape_no = list_pos;
|
int start_shape_no = list_pos;
|
||||||
|
@ -3010,10 +2996,9 @@ void DeallocateLoadedShapeheader(SHAPEHEADER * shp)
|
||||||
|
|
||||||
void DeallocateModules()
|
void DeallocateModules()
|
||||||
{
|
{
|
||||||
|
|
||||||
MODULE ** m_arrayPtr = MainScene.sm_marray;
|
|
||||||
|
|
||||||
#if !USE_LEVEL_MEMORY_POOL
|
#if !USE_LEVEL_MEMORY_POOL
|
||||||
|
MODULE ** m_arrayPtr = MainScene.sm_marray;
|
||||||
|
|
||||||
while (*m_arrayPtr)
|
while (*m_arrayPtr)
|
||||||
{
|
{
|
||||||
List<Light_Chunk *> lights_for_this_module;
|
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)
|
RIFFHANDLE avp_load_rif (const char * fname)
|
||||||
{
|
{
|
||||||
//see if there is a local copy of the rif file
|
//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 */
|
/* TODO: Let's find a better method */
|
||||||
if (!rifFile && AvpCDPath)
|
if (!rifFile && AvpCDPath)
|
||||||
|
@ -3111,7 +3096,7 @@ RIFFHANDLE avp_load_rif (const char * fname)
|
||||||
RIFFHANDLE avp_load_rif_non_env (const char * fname)
|
RIFFHANDLE avp_load_rif_non_env (const char * fname)
|
||||||
{
|
{
|
||||||
//see if there is a local copy of the rif file
|
//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 */
|
/* TODO: Let's find a better method */
|
||||||
if (!rifFile && AvpCDPath)
|
if (!rifFile && AvpCDPath)
|
||||||
|
|
|
@ -27,10 +27,13 @@ extern void LoadModuleData();
|
||||||
|
|
||||||
void LogCameraPosForModuleLinking()
|
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) return;
|
||||||
if(!playerPherModule->name) return;
|
if(!playerPherModule->name) return;
|
||||||
|
|
||||||
char Filename[100]={"avp_rifs\\"};
|
char Filename[100]={"avp_rifs/"};
|
||||||
|
|
||||||
strcat(Filename,Env_List[AvP.CurrentEnv]->main);
|
strcat(Filename,Env_List[AvP.CurrentEnv]->main);
|
||||||
strcat(Filename,".mlf");
|
strcat(Filename,".mlf");
|
||||||
|
@ -59,6 +62,7 @@ void LogCameraPosForModuleLinking()
|
||||||
fwrite(&output_buffer[0],4,length/4,file);
|
fwrite(&output_buffer[0],4,length/4,file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
textprint("Saving camera for module links");
|
textprint("Saving camera for module links");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
int SaveCameraPosKeyPressed=0;
|
int SaveCameraPosKeyPressed=0;
|
||||||
static BOOL ModuleLinkAssist=FALSE;
|
static BOOL ModuleLinkAssist=FALSE;
|
||||||
|
@ -115,7 +119,7 @@ void ScreenShot()
|
||||||
{
|
{
|
||||||
Name[length]=i/10+'0';
|
Name[length]=i/10+'0';
|
||||||
Name[length+1]=(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;
|
if(!tempfp)break;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -124,7 +128,7 @@ void ScreenShot()
|
||||||
}
|
}
|
||||||
if(i==100) return;
|
if(i==100) return;
|
||||||
|
|
||||||
FILE * fp = fopen(Name,"wb");
|
FILE *fp = OpenGameFile(Name, FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -190,7 +194,7 @@ void ScreenShot()
|
||||||
unsigned char *BufferPtr = &buf[0];
|
unsigned char *BufferPtr = &buf[0];
|
||||||
for (i=h.WinInfo.Height-1; i>=0; --i)
|
for (i=h.WinInfo.Height-1; i>=0; --i)
|
||||||
{
|
{
|
||||||
int j;
|
unsigned int j;
|
||||||
for (j=0; j<h.WinInfo.Width; ++j)
|
for (j=0; j<h.WinInfo.Width; ++j)
|
||||||
{
|
{
|
||||||
PutByte((BYTE)BufferPtr[j*3+2],fp); //b
|
PutByte((BYTE)BufferPtr[j*3+2],fp); //b
|
||||||
|
|
|
@ -734,8 +734,8 @@ void IntegrateNewEnvironment()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char GameDataDirName[20] = {"AVP_RIFS"};
|
const char GameDataDirName[20] = {"avp_rifs"};
|
||||||
const char FileNameExtension[5] = {".RIF"};
|
const char FileNameExtension[5] = {".rif"};
|
||||||
|
|
||||||
void LoadRifFile()
|
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], Env_List[AvP.CurrentEnv]->main); /* root of the file name,smae as dir*/
|
||||||
catpathandextension(&file_and_path[0], (char *)&FileNameExtension[0]); /* extension*/
|
catpathandextension(&file_and_path[0], (char *)&FileNameExtension[0]); /* extension*/
|
||||||
|
|
||||||
FixFilename(file_and_path);
|
|
||||||
|
|
||||||
env_rif = avp_load_rif((const char*)&file_and_path[0]);
|
env_rif = avp_load_rif((const char*)&file_and_path[0]);
|
||||||
Set_Progress_Bar_Position(PBAR_LEVEL_START+PBAR_LEVEL_INTERVAL*.4);
|
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
|
#if MaxImageGroups>1
|
||||||
SetCurrentImageGroup(2); // FOR ENV
|
SetCurrentImageGroup(2); // FOR ENV
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1718,7 +1718,7 @@ void SaveAKeyConfiguration(char* Filename)
|
||||||
|
|
||||||
void SaveDefaultPrimaryConfigs(void)
|
void SaveDefaultPrimaryConfigs(void)
|
||||||
{
|
{
|
||||||
FILE* file=fopen("default.cfg","wb");
|
FILE *file = OpenGameFile("default.cfg", FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
if(!file) return;
|
if(!file) return;
|
||||||
|
|
||||||
fwrite(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
|
fwrite(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
|
||||||
|
@ -1729,7 +1729,7 @@ void SaveDefaultPrimaryConfigs(void)
|
||||||
}
|
}
|
||||||
void LoadDefaultPrimaryConfigs(void)
|
void LoadDefaultPrimaryConfigs(void)
|
||||||
{
|
{
|
||||||
FILE* file=fopen("default.cfg","rb");
|
FILE *file = OpenGameFile("default.cfg", FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
if(!file) return;
|
if(!file) return;
|
||||||
|
|
||||||
fread(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
|
fread(&DefaultMarineInputPrimaryConfig,sizeof(PLAYER_INPUT_CONFIGURATION),1,file);
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
575
src/files.c
Normal file
575
src/files.c
Normal file
|
@ -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
|
34
src/files.h
Normal file
34
src/files.h
Normal file
|
@ -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
|
|
@ -11,7 +11,7 @@ extern "C" {
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <inttypes.h> /* int64_t */
|
#include <inttypes.h> /* int64_t */
|
||||||
|
|
||||||
void FixFilename(char *str);
|
#include "files.h"
|
||||||
|
|
||||||
#define PACKED __attribute__((packed))
|
#define PACKED __attribute__((packed))
|
||||||
|
|
||||||
|
|
150
src/main.c
150
src/main.c
|
@ -48,17 +48,20 @@ int JoystickEnabled;
|
||||||
int MouseVelX;
|
int MouseVelX;
|
||||||
int MouseVelY;
|
int MouseVelY;
|
||||||
|
|
||||||
extern int ScanDrawMode; /* to fix image loading */
|
extern int ScanDrawMode;
|
||||||
extern SCREENDESCRIPTORBLOCK ScreenDescriptorBlock;
|
extern SCREENDESCRIPTORBLOCK ScreenDescriptorBlock;
|
||||||
extern unsigned char KeyboardInput[MAX_NUMBER_OF_INPUT_KEYS];
|
extern unsigned char KeyboardInput[MAX_NUMBER_OF_INPUT_KEYS];
|
||||||
extern unsigned char GotAnyKey;
|
extern unsigned char GotAnyKey;
|
||||||
extern int NormalFrameTime;
|
extern int NormalFrameTime;
|
||||||
|
|
||||||
SDL_Surface *surface;
|
SDL_Surface *surface;
|
||||||
|
/* SDL_Joystick *joy; */
|
||||||
|
|
||||||
|
/* defaults */
|
||||||
static int WantFullscreen = 1;
|
static int WantFullscreen = 1;
|
||||||
static int WantSound = 1;
|
int WantSound = 1;
|
||||||
static int WantCDRom = 1;
|
static int WantCDRom = 1;
|
||||||
|
static int WantJoystick = 1;
|
||||||
|
|
||||||
#if GL_EXT_secondary_color
|
#if GL_EXT_secondary_color
|
||||||
PFNGLSECONDARYCOLORPOINTEREXTPROC pglSecondaryColorPointerEXT;
|
PFNGLSECONDARYCOLORPOINTEREXTPROC pglSecondaryColorPointerEXT;
|
||||||
|
@ -195,13 +198,10 @@ const int TotalVideoModes = sizeof(VideoModeList) / sizeof(VideoModeList[0]);
|
||||||
|
|
||||||
void LoadDeviceAndVideoModePreferences()
|
void LoadDeviceAndVideoModePreferences()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "LoadDeviceAndVideoModePreferences()\n");
|
|
||||||
*/
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
fp = fopen("AvP_TempVideo.cfg", "r");
|
fp = OpenGameFile("AvP_TempVideo.cfg", FILEMODE_READONLY, FILETYPE_CONFIG);
|
||||||
|
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
if (fscanf(fp, "%d", &mode) == 1) {
|
if (fscanf(fp, "%d", &mode) == 1) {
|
||||||
|
@ -235,12 +235,9 @@ void LoadDeviceAndVideoModePreferences()
|
||||||
|
|
||||||
void SaveDeviceAndVideoModePreferences()
|
void SaveDeviceAndVideoModePreferences()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "SaveDeviceAndVideoModePreferences()\n");
|
|
||||||
*/
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen("AvP_TempVideo.cfg", "w");
|
fp = OpenGameFile("AvP_TempVideo.cfg", FILEMODE_WRITEONLY, FILETYPE_CONFIG);
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
fprintf(fp, "%d\n", CurrentVideoMode);
|
fprintf(fp, "%d\n", CurrentVideoMode);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -249,9 +246,6 @@ void SaveDeviceAndVideoModePreferences()
|
||||||
|
|
||||||
void PreviousVideoMode2()
|
void PreviousVideoMode2()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "PreviousVideoMode2()\n");
|
|
||||||
*/
|
|
||||||
int cur = CurrentVideoMode;
|
int cur = CurrentVideoMode;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -267,9 +261,6 @@ void PreviousVideoMode2()
|
||||||
|
|
||||||
void NextVideoMode2()
|
void NextVideoMode2()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "NextVideoMode2()\n");
|
|
||||||
*/
|
|
||||||
int cur = CurrentVideoMode;
|
int cur = CurrentVideoMode;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -286,17 +277,11 @@ void NextVideoMode2()
|
||||||
|
|
||||||
char *GetVideoModeDescription2()
|
char *GetVideoModeDescription2()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "GetVideoModeDescription2()\n");
|
|
||||||
*/
|
|
||||||
return "SDL";
|
return "SDL";
|
||||||
}
|
}
|
||||||
|
|
||||||
char *GetVideoModeDescription3()
|
char *GetVideoModeDescription3()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "GetVideoModeDescription3()\n");
|
|
||||||
*/
|
|
||||||
static char buf[64];
|
static char buf[64];
|
||||||
|
|
||||||
snprintf(buf, 64, "%dx%d", VideoModeList[CurrentVideoMode].w, VideoModeList[CurrentVideoMode].h);
|
snprintf(buf, 64, "%dx%d", VideoModeList[CurrentVideoMode].w, VideoModeList[CurrentVideoMode].h);
|
||||||
|
@ -357,6 +342,19 @@ int InitSDL()
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadDeviceAndVideoModePreferences();
|
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;
|
surface = NULL;
|
||||||
|
|
||||||
|
@ -539,6 +537,18 @@ int InitialiseWindowsSystem(HANDLE hInstance, int nCmdShow, int WinInitMode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ExitWindowsSystem()
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (joy) {
|
||||||
|
SDL_JoystickClose(joy);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
SDL_Quit();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int GotPrintScn, HavePrintScn;
|
static int GotPrintScn, HavePrintScn;
|
||||||
|
|
||||||
static int KeySymToKey(int keysym)
|
static int KeySymToKey(int keysym)
|
||||||
|
@ -848,6 +858,7 @@ static void handle_buttonpress(int button, int press)
|
||||||
DebouncedKeyboardInput[key] = 1;
|
DebouncedKeyboardInput[key] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GotAnyKey = 1;
|
||||||
KeyboardInput[key] = press;
|
KeyboardInput[key] = press;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -924,7 +935,34 @@ void CheckForWindowsMessages()
|
||||||
MouseVelX = 0;
|
MouseVelX = 0;
|
||||||
MouseVelY = 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]) {
|
if ((KeyboardInput[KEY_LEFTALT]||KeyboardInput[KEY_RIGHTALT]) && DebouncedKeyboardInput[KEY_CR]) {
|
||||||
SDL_GrabMode gm;
|
SDL_GrabMode gm;
|
||||||
|
|
||||||
|
@ -967,11 +1005,53 @@ void FlipBuffers()
|
||||||
SDL_Flip(surface);
|
SDL_Flip(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ExitWindowsSystem()
|
char *AvpCDPath = 0;
|
||||||
{
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
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[] = {
|
static struct option getopt_long_options[] = {
|
||||||
|
@ -981,9 +1061,10 @@ static struct option getopt_long_options[] = {
|
||||||
{ "windowed", 0, NULL, 'w' },
|
{ "windowed", 0, NULL, 'w' },
|
||||||
{ "nosound", 0, NULL, 's' },
|
{ "nosound", 0, NULL, 's' },
|
||||||
{ "nocdrom", 0, NULL, 'c' },
|
{ "nocdrom", 0, NULL, 'c' },
|
||||||
|
/* { "nojoy", 0, NULL, 'j' }, */
|
||||||
{ "debug", 0, NULL, 'd' },
|
{ "debug", 0, NULL, 'd' },
|
||||||
/*
|
/*
|
||||||
{ "loadrifs", 0, NULL, 'l' },
|
{ "loadrifs", 1, NULL, 'l' },
|
||||||
{ "server", 0, someval, 1 },
|
{ "server", 0, someval, 1 },
|
||||||
{ "client", 1, someval, 2 },
|
{ "client", 1, someval, 2 },
|
||||||
*/
|
*/
|
||||||
|
@ -999,6 +1080,7 @@ static const char *usage_string =
|
||||||
" [-w | --windowed] Run the game in a window\n"
|
" [-w | --windowed] Run the game in a window\n"
|
||||||
" [-s | --nosound] Do not access the soundcard\n"
|
" [-s | --nosound] Do not access the soundcard\n"
|
||||||
" [-c | --nocdrom] Do not access the CD-ROM\n"
|
" [-c | --nocdrom] Do not access the CD-ROM\n"
|
||||||
|
/* " [-j | --nojoy] Do not access the joystick\n" */
|
||||||
;
|
;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@ -1026,6 +1108,11 @@ int main(int argc, char *argv[])
|
||||||
case 'c':
|
case 'c':
|
||||||
WantCDRom = 0;
|
WantCDRom = 0;
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
case 'j':
|
||||||
|
WantJoystick = 0;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
case 'd': {
|
case 'd': {
|
||||||
extern int DebuggingCommandsActive;
|
extern int DebuggingCommandsActive;
|
||||||
DebuggingCommandsActive = 1;
|
DebuggingCommandsActive = 1;
|
||||||
|
@ -1037,6 +1124,8 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InitGameDirectories(argv[0]);
|
||||||
|
|
||||||
if (InitSDL() == -1) {
|
if (InitSDL() == -1) {
|
||||||
fprintf(stderr, "Could not find a sutable resolution!\n");
|
fprintf(stderr, "Could not find a sutable resolution!\n");
|
||||||
fprintf(stderr, "At least 512x384 is needed. Does OpenGL work?\n");
|
fprintf(stderr, "At least 512x384 is needed. Does OpenGL work?\n");
|
||||||
|
@ -1047,9 +1136,6 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
SetFastRandom();
|
SetFastRandom();
|
||||||
|
|
||||||
/* WeWantAnIntro(); */
|
|
||||||
GetPathFromRegistry();
|
|
||||||
|
|
||||||
#if MARINE_DEMO
|
#if MARINE_DEMO
|
||||||
ffInit("fastfile/mffinfo.txt","fastfile/");
|
ffInit("fastfile/mffinfo.txt","fastfile/");
|
||||||
#elif ALIEN_DEMO
|
#elif ALIEN_DEMO
|
||||||
|
@ -1071,7 +1157,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
LoadKeyConfiguration();
|
LoadKeyConfiguration();
|
||||||
|
|
||||||
if (WantSound) SoundSys_Start();
|
SoundSys_Start();
|
||||||
if (WantCDRom) CDDA_Start();
|
if (WantCDRom) CDDA_Start();
|
||||||
|
|
||||||
InitTextStrings();
|
InitTextStrings();
|
||||||
|
|
289
src/openal.c
289
src/openal.c
|
@ -31,12 +31,15 @@ ALCdevice *AvpSoundDevice;
|
||||||
ALvoid *AvpSoundContext;
|
ALvoid *AvpSoundContext;
|
||||||
int AvpFrequency = 44100;
|
int AvpFrequency = 44100;
|
||||||
|
|
||||||
|
extern int WantSound;
|
||||||
|
|
||||||
static int SoundActivated = 0;
|
static int SoundActivated = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
openal.c TODO:
|
openal.c TODO:
|
||||||
1. AL_PITCH code does not work.
|
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.
|
2. Panning somewhat works now. Need someone to verify.
|
||||||
3. There is no EAX/Reverb. But there's probably not much I can do...
|
3. There is no EAX/Reverb. But there's probably not much I can do...
|
||||||
4. Restarting sound system may or may not work.
|
4. Restarting sound system may or may not work.
|
||||||
|
@ -58,14 +61,16 @@ int PlatStartSoundSys()
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SoundActivated = 0;
|
||||||
|
if (WantSound == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
attrlist[0] = ALC_FREQUENCY;
|
attrlist[0] = ALC_FREQUENCY;
|
||||||
attrlist[1] = AvpFrequency;
|
attrlist[1] = AvpFrequency;
|
||||||
attrlist[2] = ALC_SYNC;
|
attrlist[2] = ALC_SYNC;
|
||||||
attrlist[3] = AL_FALSE;
|
attrlist[3] = AL_FALSE;
|
||||||
attrlist[4] = 0;
|
attrlist[4] = 0;
|
||||||
|
|
||||||
SoundActivated = 0;
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
|
snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
|
||||||
|
|
||||||
AvpSoundDevice = alcOpenDevice(buf);
|
AvpSoundDevice = alcOpenDevice(buf);
|
||||||
|
@ -128,7 +133,7 @@ int PlatStartSoundSys()
|
||||||
void PlatEndSoundSys()
|
void PlatEndSoundSys()
|
||||||
{
|
{
|
||||||
/* TODO - free everything */
|
/* TODO - free everything */
|
||||||
printf("PlatEndSoundSys()\n");
|
fprintf(stderr, "OPENAL: PlatEndSoundSys()\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// this table plots the frequency change for
|
// this table plots the frequency change for
|
||||||
|
@ -391,7 +396,11 @@ int PlatPlaySound(int activeIndex)
|
||||||
|
|
||||||
if (!PlatSoundHasStopped(activeIndex))
|
if (!PlatSoundHasStopped(activeIndex))
|
||||||
PlatStopSound (activeIndex);
|
PlatStopSound (activeIndex);
|
||||||
|
|
||||||
|
/* TODO: hack until pitching works right */
|
||||||
|
if (GameSounds[si].pitch < -500)
|
||||||
|
return 0;
|
||||||
|
|
||||||
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_BUFFER,
|
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_BUFFER,
|
||||||
GameSounds[si].dsBufferP);
|
GameSounds[si].dsBufferP);
|
||||||
|
|
||||||
|
@ -427,18 +436,16 @@ int PlatPlaySound(int activeIndex)
|
||||||
|
|
||||||
if (!ActiveSounds[activeIndex].paused) {
|
if (!ActiveSounds[activeIndex].paused) {
|
||||||
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
|
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
|
||||||
|
|
||||||
|
#ifdef OPENAL_DEBUG
|
||||||
if (ActiveSounds[activeIndex].loop) {
|
if (ActiveSounds[activeIndex].loop) {
|
||||||
/*
|
fprintf(stderr, "OPENAL: Playing sound %i %s looping in slot %i\n",
|
||||||
printf("Playing sound %i %s looping in slot %i\n",
|
|
||||||
si, GameSounds[si].wavName, activeIndex);
|
si, GameSounds[si].wavName, activeIndex);
|
||||||
*/
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
fprintf(stderr, "OPENAL: Playing sound %i %s once in slot %i\n",
|
||||||
printf("Playing sound %i %s once in slot %i\n",
|
si, GameSounds[si].wavName, activeIndex);
|
||||||
si, GameSounds[si].wavName, activeIndex);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -446,8 +453,9 @@ int PlatPlaySound(int activeIndex)
|
||||||
|
|
||||||
void PlatStopSound(int activeIndex)
|
void PlatStopSound(int activeIndex)
|
||||||
{
|
{
|
||||||
/* printf("PlatStopSound(%d)\n", activeIndex); */
|
#ifdef OPENAL_DEBUG
|
||||||
|
fprintf(stderr, "OPENAL: PlatStopSound(%d)\n", activeIndex);
|
||||||
|
#endif
|
||||||
if (!SoundActivated)
|
if (!SoundActivated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -521,19 +529,25 @@ int PlatChangeSoundPitch(int activeIndex, int pitch)
|
||||||
GameSounds[gsi].pitch, pitch);
|
GameSounds[gsi].pitch, pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pitch < -500) { /* currently can't play it anyway... */
|
||||||
|
alSourceStop(ActiveSounds[activeIndex].ds3DBufferP);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
ActiveSounds[activeIndex].pitch = pitch;
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PlatSoundHasStopped(int activeIndex)
|
int PlatSoundHasStopped(int activeIndex)
|
||||||
{
|
{
|
||||||
ALint val;
|
ALint val;
|
||||||
/*
|
|
||||||
printf("PlatSoundHasStopped(%d)\n", activeIndex);
|
#ifdef OPENAL_DEBUG
|
||||||
*/
|
fprintf(stderr, "PlatSoundHasStopped(%d)\n", activeIndex);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!SoundActivated)
|
if (!SoundActivated)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -574,12 +588,12 @@ int PlatDo3dSound(int activeIndex)
|
||||||
if (ActiveSounds[activeIndex].paused) {
|
if (ActiveSounds[activeIndex].paused) {
|
||||||
if (distance < (ActiveSounds[activeIndex].threedeedata.outer_range + SOUND_DEACTIVATERANGE)) {
|
if (distance < (ActiveSounds[activeIndex].threedeedata.outer_range + SOUND_DEACTIVATERANGE)) {
|
||||||
PlatStopSound (activeIndex);
|
PlatStopSound (activeIndex);
|
||||||
#if 1 /* PLEASE REMOVE IFDEF! */
|
|
||||||
if (ActiveSounds[activeIndex].loop)
|
if (ActiveSounds[activeIndex].loop)
|
||||||
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_TRUE);
|
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_TRUE);
|
||||||
else
|
else
|
||||||
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_FALSE);
|
alSourcei (ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, AL_FALSE);
|
||||||
#endif
|
|
||||||
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
|
alSourcePlay (ActiveSounds[activeIndex].ds3DBufferP);
|
||||||
newVolume = 0;
|
newVolume = 0;
|
||||||
ActiveSounds[activeIndex].paused = 0;
|
ActiveSounds[activeIndex].paused = 0;
|
||||||
|
@ -616,9 +630,11 @@ int PlatDo3dSound(int activeIndex)
|
||||||
newVolume = VOLUME_MAX;
|
newVolume = VOLUME_MAX;
|
||||||
if (newVolume < VOLUME_MIN)
|
if (newVolume < VOLUME_MIN)
|
||||||
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) {
|
if (PlatChangeSoundVolume (activeIndex, newVolume) == SOUND_PLATFORMERROR) {
|
||||||
return SOUND_PLATFORMERROR;
|
return SOUND_PLATFORMERROR;
|
||||||
}
|
}
|
||||||
|
@ -634,9 +650,9 @@ int PlatDo3dSound(int activeIndex)
|
||||||
ActiveSounds[activeIndex].PropSetP_pos[2] = (ALfloat)relativePosn.vz / (ALfloat)distance;
|
ActiveSounds[activeIndex].PropSetP_pos[2] = (ALfloat)relativePosn.vz / (ALfloat)distance;
|
||||||
|
|
||||||
alSourcefv (ActiveSounds[activeIndex].ds3DBufferP, AL_POSITION, ActiveSounds[activeIndex].PropSetP_pos);
|
alSourcefv (ActiveSounds[activeIndex].ds3DBufferP, AL_POSITION, ActiveSounds[activeIndex].PropSetP_pos);
|
||||||
/*
|
#ifdef OPENAL_DEBUG
|
||||||
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);
|
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].PropSetP_vel[0] =
|
||||||
ActiveSounds[activeIndex].threedeedata.velocity.vx;
|
ActiveSounds[activeIndex].threedeedata.velocity.vx;
|
||||||
ActiveSounds[activeIndex].PropSetP_vel[1] =
|
ActiveSounds[activeIndex].PropSetP_vel[1] =
|
||||||
|
@ -695,9 +711,9 @@ void PlatUpdatePlayer()
|
||||||
pos[1] = Global_VDB_Ptr->VDB_World.vy; // 10000.0;
|
pos[1] = Global_VDB_Ptr->VDB_World.vy; // 10000.0;
|
||||||
pos[2] = Global_VDB_Ptr->VDB_World.vz; // 10000.0;
|
pos[2] = Global_VDB_Ptr->VDB_World.vz; // 10000.0;
|
||||||
|
|
||||||
/*
|
#ifdef OPENAL_DEBUG
|
||||||
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]);
|
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
|
// fixme: add reverb check
|
||||||
alListenerfv (AL_ORIENTATION, or);
|
alListenerfv (AL_ORIENTATION, or);
|
||||||
// alListenerfv (AL_VELOCITY, vel);
|
// alListenerfv (AL_VELOCITY, vel);
|
||||||
|
@ -709,6 +725,14 @@ void PlatEndGameSound(SOUNDINDEX index)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
GameSounds[index].loaded = 0;
|
||||||
|
GameSounds[index].dsFrequency = 0;
|
||||||
|
|
||||||
|
if (GameSounds[index].wavName) {
|
||||||
|
DeallocateMem(GameSounds[index].wavName);
|
||||||
|
GameSounds[index].wavName = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!SoundActivated)
|
if (!SoundActivated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -726,32 +750,23 @@ void PlatEndGameSound(SOUNDINDEX index)
|
||||||
alDeleteBuffers(1, &(GameSounds[index].dsBufferP));
|
alDeleteBuffers(1, &(GameSounds[index].dsBufferP));
|
||||||
GameSounds[index].dsBufferP = 0;
|
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()
|
unsigned int PlatMaxHWSounds()
|
||||||
{
|
{
|
||||||
/*
|
#ifdef OPENAL_DEBUG
|
||||||
printf("PlatMaxHWSounds()\n");
|
fprintf(stderr, "OPENAL: PlatMaxHWSounds()\n");
|
||||||
*/
|
#endif
|
||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitialiseBaseFrequency(SOUNDINDEX soundNum)
|
void InitialiseBaseFrequency(SOUNDINDEX soundNum)
|
||||||
{
|
{
|
||||||
/* just set the pitch everytime. */
|
|
||||||
#if 0
|
|
||||||
int frequency;
|
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_MAXPLAT) GameSounds[soundNum].pitch=PITCH_MAXPLAT;
|
||||||
if(GameSounds[soundNum].pitch<PITCH_MINPLAT) GameSounds[soundNum].pitch=PITCH_MINPLAT;
|
if(GameSounds[soundNum].pitch<PITCH_MINPLAT) GameSounds[soundNum].pitch=PITCH_MINPLAT;
|
||||||
|
|
||||||
|
@ -761,28 +776,29 @@ void InitialiseBaseFrequency(SOUNDINDEX soundNum)
|
||||||
PITCH_DEFAULTPLAT, GameSounds[soundNum].pitch);
|
PITCH_DEFAULTPLAT, GameSounds[soundNum].pitch);
|
||||||
|
|
||||||
GameSounds[soundNum].dsFrequency = frequency;
|
GameSounds[soundNum].dsFrequency = frequency;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlatSetEnviroment(unsigned int env_index, float reverb_mix)
|
void PlatSetEnviroment(unsigned int env_index, float reverb_mix)
|
||||||
{
|
{
|
||||||
/*
|
#ifdef OPENAL_DEBUG
|
||||||
printf("PlatSetEnvironment(%d, %f)\n", env_index, reverb_mix);
|
fprintf(stderr, "OPENAL: PlatSetEnvironment(%d, %f)\n", env_index, reverb_mix);
|
||||||
*/
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateSoundFrequencies()
|
void UpdateSoundFrequencies()
|
||||||
{
|
{
|
||||||
extern int SoundSwitchedOn;
|
extern int SoundSwitchedOn;
|
||||||
/* extern int TimeScale; */
|
extern int TimeScale;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* printf("FREQ UpdateSoundFreqncies()\n"); */
|
#ifdef OPENAL_DEBUG
|
||||||
|
fprintf(stderr, "OPENAL: UpdateSoundFreqncies()\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!SoundActivated)
|
if (!SoundActivated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!SoundSwitchedOn) /* TODO: maybe I should have used this var.. */
|
if (!SoundSwitchedOn)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < SOUND_MAXACTIVE; i++) {
|
for (i = 0; i < SOUND_MAXACTIVE; i++) {
|
||||||
|
@ -790,11 +806,13 @@ void UpdateSoundFrequencies()
|
||||||
|
|
||||||
if (gameIndex == SID_NOSOUND)
|
if (gameIndex == SID_NOSOUND)
|
||||||
continue;
|
continue;
|
||||||
/*
|
|
||||||
if (TimeScale != ONE_FIXED)
|
if (TimeScale != ONE_FIXED) {
|
||||||
printf("NEWFREQ UpdateSoundFreqncies %d, f = %d\n", i, MUL_FIXED(GameSounds[gameIndex].dsFrequency,TimeScale));
|
#ifdef OPENAL_DEBUG
|
||||||
*/
|
fprintf(stderr, "OPENAL: UpdateSoundFreqncies %d, f = %d\n", i, MUL_FIXED(GameSounds[gameIndex].dsFrequency,TimeScale));
|
||||||
/* TODO: huh? */
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (ActiveSounds[i].pitch != GameSounds[gameIndex].pitch)
|
if (ActiveSounds[i].pitch != GameSounds[gameIndex].pitch)
|
||||||
PlatChangeSoundPitch(i,ActiveSounds[i].pitch);
|
PlatChangeSoundPitch(i,ActiveSounds[i].pitch);
|
||||||
}
|
}
|
||||||
|
@ -805,27 +823,6 @@ void UpdateSoundFrequencies()
|
||||||
extern void *acLoadWAV (void *data, ALuint *size, void **udata,
|
extern void *acLoadWAV (void *data, ALuint *size, void **udata,
|
||||||
ALushort *fmt, ALushort *chan, ALushort *freq);
|
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)
|
static unsigned char *Force8to16 (unsigned char *buf, int *len)
|
||||||
{
|
{
|
||||||
|
@ -843,44 +840,137 @@ static unsigned char *Force8to16 (unsigned char *buf, int *len)
|
||||||
*len *= 2;
|
*len *= 2;
|
||||||
return nbuf;
|
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)
|
unsigned char *ExtractWavFile(int soundIndex, unsigned char *bufferPtr)
|
||||||
{
|
{
|
||||||
ALint len, seclen = 0;
|
ALint len, seclen = 0;
|
||||||
unsigned char *nb;
|
|
||||||
void *udata;
|
void *udata;
|
||||||
ALushort rfmt, rchan, rfreq;
|
ALushort rfmt, rchan, rfreq;
|
||||||
ALuint rsize;
|
ALuint rsize;
|
||||||
int slen;
|
int slen;
|
||||||
|
|
||||||
/* printf("ExtractWavFile(%d, %p)\n", soundIndex, bufferPtr); */
|
#ifdef OPENAL_DEBUG
|
||||||
if (!SoundActivated)
|
fprintf(stderr, "OPENAL: ExtractWavFile(%d, %p)\n", soundIndex, bufferPtr);
|
||||||
return 0;
|
#endif
|
||||||
|
|
||||||
slen = strlen (bufferPtr) + 1;
|
slen = strlen (bufferPtr) + 1;
|
||||||
GameSounds[soundIndex].wavName = (char *)AllocateMem (slen);
|
GameSounds[soundIndex].wavName = (char *)AllocateMem (slen);
|
||||||
strcpy (GameSounds[soundIndex].wavName, bufferPtr);
|
strcpy (GameSounds[soundIndex].wavName, bufferPtr);
|
||||||
|
|
||||||
|
if (!SoundActivated)
|
||||||
|
return 0;
|
||||||
|
|
||||||
bufferPtr += slen;
|
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 1 /* TODO: replace with own routine later */
|
||||||
if (acLoadWAV (bufferPtr, &rsize, &udata, &rfmt,
|
if (acLoadWAV (bufferPtr, &rsize, &udata, &rfmt,
|
||||||
&rchan, &rfreq) == NULL) {
|
&rchan, &rfreq) == NULL) {
|
||||||
printf("Unable to convert data\n");
|
fprintf(stderr, "ExtractWavFile: Unable to convert data\n");
|
||||||
return (unsigned char *)0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = rsize;
|
len = rsize;
|
||||||
|
|
||||||
/* openal conv. 8->16 is not good at all */
|
/* openal conv. 8->16 is not good at all */
|
||||||
if ((rfmt == AUDIO_U8)) {
|
if (rfmt == AUDIO_U8) {
|
||||||
nb = Force8to16 (udata, &len);
|
unsigned char *nb = Force8to16 (udata, &len);
|
||||||
rfmt = AUDIO_S16LSB;
|
rfmt = AUDIO_S16LSB;
|
||||||
|
|
||||||
free (udata);
|
free (udata);
|
||||||
udata = nb;
|
udata = nb;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rfmt == AUDIO_S16LSB) || (rfmt == AUDIO_S16MSB)) {
|
if ((rfmt == AUDIO_S16LSB) || (rfmt == AUDIO_S16MSB)) {
|
||||||
int bps;
|
int bps;
|
||||||
|
@ -902,11 +992,11 @@ printf("Loaded %s\n", GameSounds[soundIndex].wavName);
|
||||||
alBufferData (GameSounds[soundIndex].dsBufferP,
|
alBufferData (GameSounds[soundIndex].dsBufferP,
|
||||||
rfmt, udata, len, rfreq);
|
rfmt, udata, len, rfreq);
|
||||||
|
|
||||||
GameSounds[soundIndex].loaded = 1;
|
/* GameSounds[soundIndex].loaded = 1; */
|
||||||
GameSounds[soundIndex].flags = SAMPLE_IN_HW;
|
GameSounds[soundIndex].flags = SAMPLE_IN_HW;
|
||||||
GameSounds[soundIndex].length = (seclen != 0) ? seclen : 1;
|
GameSounds[soundIndex].length = (seclen != 0) ? seclen : 1;
|
||||||
GameSounds[soundIndex].dsFrequency = rfreq;
|
GameSounds[soundIndex].dsFrequency = rfreq;
|
||||||
GameSounds[soundIndex].pitch = PITCH_DEFAULTPLAT;
|
/* GameSounds[soundIndex].pitch = PITCH_DEFAULTPLAT; */
|
||||||
|
|
||||||
#if 1 /* TODO: see above */
|
#if 1 /* TODO: see above */
|
||||||
free (udata);
|
free (udata);
|
||||||
|
@ -923,11 +1013,10 @@ int LoadWavFromFastFile(int soundNum, char * wavFileName)
|
||||||
FFILE *fp;
|
FFILE *fp;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
unsigned int len = 0;
|
unsigned int len = 0;
|
||||||
|
|
||||||
/* printf("LoadWavFromFastFile(%d, %s)\n", soundNum, wavFileName); */
|
|
||||||
|
|
||||||
if (!SoundActivated)
|
#ifdef OPENAL_DEBUG
|
||||||
return 0;
|
fprintf(stderr, "OPENAL: LoadWavFromFastFile(%d, %s)\n", soundNum, wavFileName);
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((fp = ffopen (wavFileName, "rb")) != NULL) {
|
if ((fp = ffopen (wavFileName, "rb")) != NULL) {
|
||||||
ffseek (fp, 0, SEEK_END);
|
ffseek (fp, 0, SEEK_END);
|
||||||
|
|
54
src/stubs.c
54
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 */
|
/* d3_func.cpp */
|
||||||
int GetTextureHandle(IMAGEHEADER *imageHeaderPtr)
|
int GetTextureHandle(IMAGEHEADER *imageHeaderPtr)
|
||||||
{
|
{
|
||||||
|
@ -191,32 +176,6 @@ void CheckWireFrameMode(int shouldBeOn)
|
||||||
fprintf(stderr, "CheckWireFrameMode(%d)\n", 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 */
|
/* ddplat.cpp */
|
||||||
void MinimizeAllDDGraphics()
|
void MinimizeAllDDGraphics()
|
||||||
|
@ -304,17 +263,12 @@ void GenerateDirectDrawSurface()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* dx_proj.cpp */
|
|
||||||
int use_mmx_math = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* dxlog.c */
|
/* dxlog.c */
|
||||||
void dx_str_log(char const * str, int line, char const * file)
|
void dx_str_log(char const * str, int line, char const * file)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen("dx_error.log", "a");
|
fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
fp = stderr;
|
fp = stderr;
|
||||||
|
|
||||||
|
@ -328,7 +282,7 @@ void dx_strf_log(char const * fmt, ... )
|
||||||
va_list ap;
|
va_list ap;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen("dx_error.log", "a");
|
fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
fp = stderr;
|
fp = stderr;
|
||||||
|
|
||||||
|
@ -345,7 +299,7 @@ void dx_line_log(int line, char const * file)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen("dx_error.log", "a");
|
fp = OpenGameFile("dx_error.log", FILEMODE_APPEND, FILETYPE_CONFIG);
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
fp = stderr;
|
fp = stderr;
|
||||||
|
|
||||||
|
|
|
@ -156,20 +156,20 @@ namespace AwTl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline CreateTextureParms()
|
inline CreateTextureParms()
|
||||||
: fileNameS(NULL)
|
: loadTextureB(false)
|
||||||
, fileH(INVALID_HANDLE_VALUE)
|
, fileNameS(NULL)
|
||||||
|
, fileH(NULL)
|
||||||
, dataP(NULL)
|
, dataP(NULL)
|
||||||
, restoreH(NULL)
|
, restoreH(NULL)
|
||||||
, maxReadBytes(UINT_MAX)
|
, maxReadBytes(UINT_MAX)
|
||||||
, bytesReadP(NULL)
|
, bytesReadP(NULL)
|
||||||
, flags(AW_TLF_DEFAULT)
|
, flags(AW_TLF_DEFAULT)
|
||||||
, originalWidthP(NULL)
|
|
||||||
, originalHeightP(NULL)
|
|
||||||
, widthP(NULL)
|
, widthP(NULL)
|
||||||
, heightP(NULL)
|
, heightP(NULL)
|
||||||
|
, originalWidthP(NULL)
|
||||||
|
, originalHeightP(NULL)
|
||||||
, prevTexP(static_cast<D3DTexture *>(NULL))
|
, prevTexP(static_cast<D3DTexture *>(NULL))
|
||||||
, prevTexB(false)
|
, prevTexB(false)
|
||||||
, loadTextureB(false)
|
|
||||||
, callbackF(NULL)
|
, callbackF(NULL)
|
||||||
, rectA(NULL)
|
, rectA(NULL)
|
||||||
{
|
{
|
||||||
|
@ -180,7 +180,7 @@ namespace AwTl
|
||||||
bool loadTextureB;
|
bool loadTextureB;
|
||||||
|
|
||||||
char *fileNameS;
|
char *fileNameS;
|
||||||
HANDLE fileH;
|
FILE *fileH;
|
||||||
PtrUnionConst dataP;
|
PtrUnionConst dataP;
|
||||||
AW_BACKUPTEXTUREHANDLE restoreH;
|
AW_BACKUPTEXTUREHANDLE restoreH;
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ namespace AwTl
|
||||||
db_log1(("AW: Potential Memory Leaks Detected!!!"));
|
db_log1(("AW: Potential Memory Leaks Detected!!!"));
|
||||||
}
|
}
|
||||||
#ifdef _CPPRTTI
|
#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())
|
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));
|
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"));
|
db_log1(("AW: Object dump complete"));
|
||||||
}
|
}
|
||||||
#else // ! _CPPRTTI
|
#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);
|
unsigned nRefs(0);
|
||||||
for (Iterator itLeak(*this) ; !itLeak.Done() ; itLeak.Next())
|
for (Iterator itLeak(*this) ; !itLeak.Done() ; itLeak.Next())
|
||||||
{
|
{
|
||||||
|
@ -1762,9 +1762,9 @@ namespace AwTl {
|
||||||
|
|
||||||
SurfUnion CreateTextureParms::DoCreate() const
|
SurfUnion CreateTextureParms::DoCreate() const
|
||||||
{
|
{
|
||||||
if (INVALID_HANDLE_VALUE!=fileH)
|
if (NULL != fileH)
|
||||||
{
|
{
|
||||||
MediaWinFileMedium * pMedium = new MediaWinFileMedium;
|
MediaStdFileMedium * pMedium = new MediaStdFileMedium;
|
||||||
pMedium->Attach(fileH);
|
pMedium->Attach(fileH);
|
||||||
SurfUnion pTex = LoadTexture(pMedium,*this);
|
SurfUnion pTex = LoadTexture(pMedium,*this);
|
||||||
pMedium->Detach();
|
pMedium->Detach();
|
||||||
|
@ -1802,7 +1802,7 @@ namespace AwTl {
|
||||||
switch (*_argFormatS++)
|
switch (*_argFormatS++)
|
||||||
{
|
{
|
||||||
case 's':
|
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;
|
bad_parmsB = true;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1811,16 +1811,16 @@ namespace AwTl {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'h':
|
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;
|
bad_parmsB = true;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pParams->fileH = va_arg(ap,HANDLE);
|
pParams->fileH = va_arg(ap,FILE *);
|
||||||
db_logf4(("\tFile HANDLE = 0x%08x",pParams->fileH));
|
db_logf4(("\tFile HANDLE = %p",pParams->fileH));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'p':
|
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;
|
bad_parmsB = true;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1829,7 +1829,7 @@ namespace AwTl {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'r':
|
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;
|
bad_parmsB = true;
|
||||||
else
|
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;
|
awTlLastErr = AW_TLE_BADPARMS;
|
||||||
db_log2("AwCreateGraphic(): ERROR: No data medium is specified");
|
db_log2("AwCreateGraphic(): ERROR: No data medium is specified");
|
||||||
|
@ -1973,9 +1973,9 @@ namespace AwTl {
|
||||||
{
|
{
|
||||||
if (pParams->fileNameS)
|
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;
|
awTlLastErr = AW_TLE_CANTOPENFILE;
|
||||||
// awTlLastWinErr = GetLastError();
|
// awTlLastWinErr = GetLastError();
|
||||||
|
@ -1986,7 +1986,7 @@ namespace AwTl {
|
||||||
|
|
||||||
SurfUnion textureP = pParams->DoCreate();
|
SurfUnion textureP = pParams->DoCreate();
|
||||||
|
|
||||||
CloseHandle(pParams->fileH);
|
fclose(pParams->fileH);
|
||||||
|
|
||||||
return textureP;
|
return textureP;
|
||||||
}
|
}
|
||||||
|
|
|
@ -254,7 +254,7 @@ namespace AwTl {
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
unsigned shift=0;
|
unsigned shift=0;
|
||||||
unsigned val;
|
unsigned val=0;
|
||||||
--_dstRowP.byteP; // decrement here because we increment before the first write
|
--_dstRowP.byteP; // decrement here because we increment before the first write
|
||||||
for (unsigned colcount = _srcWidth; colcount; --colcount)
|
for (unsigned colcount = _srcWidth; colcount; --colcount)
|
||||||
{
|
{
|
||||||
|
@ -441,7 +441,7 @@ namespace AwTl {
|
||||||
class TypicalTexFileLoader : public TexFileLoader
|
class TypicalTexFileLoader : public TexFileLoader
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
TypicalTexFileLoader() : m_pRowBuf(NULL), m_ppPixMap(NULL), m_pPalette(NULL) {}
|
TypicalTexFileLoader() : m_pPalette(NULL), m_ppPixMap(NULL), m_pRowBuf(NULL) {}
|
||||||
|
|
||||||
virtual ~TypicalTexFileLoader();
|
virtual ~TypicalTexFileLoader();
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ FORCE_CHUNK_INCLUDE_IMPLEMENT(bmpnames)
|
||||||
|
|
||||||
|
|
||||||
BMP_Name::BMP_Name (const char * fname, int const gbnc_version)
|
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
|
#if cencon
|
||||||
, md5val(0)
|
, md5val(0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,7 +33,7 @@ BMP_Name::BMP_Name (const char * fname, int const gbnc_version)
|
||||||
}
|
}
|
||||||
|
|
||||||
BMP_Name::BMP_Name (const char * fname)
|
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
|
#if cencon
|
||||||
, md5val(0)
|
, md5val(0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -824,8 +824,6 @@ Matching_Images_Chunk::Matching_Images_Chunk(Chunk_With_Children * parent, char
|
||||||
: Chunk(parent,"MATCHIMG")
|
: Chunk(parent,"MATCHIMG")
|
||||||
, flags ((MICFlags)(*(int *)(datablock+8) & MICF_MASK))
|
, flags ((MICFlags)(*(int *)(datablock+8) & MICF_MASK))
|
||||||
{
|
{
|
||||||
char const * datastart = datablock;
|
|
||||||
|
|
||||||
spares[0] = *(int *)datablock;
|
spares[0] = *(int *)datablock;
|
||||||
spares[1] = *(int *)(datablock+4);
|
spares[1] = *(int *)(datablock+4);
|
||||||
|
|
||||||
|
@ -888,7 +886,7 @@ ImageDescriptor const & Matching_Images_Chunk::GetLoadImage(ImageDescriptor cons
|
||||||
RIF_IMPLEMENT_DYNCREATE("BMPMD5ID",Bitmap_MD5_Chunk)
|
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)
|
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);
|
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)
|
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);
|
memcpy(md5_val,datablock+12,16);
|
||||||
datablock += 28;
|
datablock += 28;
|
||||||
|
|
|
@ -378,32 +378,32 @@ ShapeInMSL const * ShapeInMSL::GetByName(char const * nam)
|
||||||
}
|
}
|
||||||
|
|
||||||
ShapeInMSL::ShapeInMSL()
|
ShapeInMSL::ShapeInMSL()
|
||||||
: shptr(0)
|
: listpos(GLS_NOTINLIST)
|
||||||
, listpos(GLS_NOTINLIST)
|
, shptr(0)
|
||||||
, in_hash_table(FALSE)
|
, in_hash_table(FALSE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ShapeInMSL::ShapeInMSL(int _p)
|
ShapeInMSL::ShapeInMSL(int _p)
|
||||||
: shptr(0)
|
: listpos(_p)
|
||||||
, listpos(_p)
|
, shptr(0)
|
||||||
, in_hash_table(FALSE)
|
, in_hash_table(FALSE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ShapeInMSL::ShapeInMSL(SHAPEHEADER * _s, char const * _n, int _p)
|
ShapeInMSL::ShapeInMSL(SHAPEHEADER * _s, char const * _n, int _p)
|
||||||
: shptr(_s)
|
: listpos(_p)
|
||||||
|
, shptr(_s)
|
||||||
, name(_n)
|
, name(_n)
|
||||||
, listpos(_p)
|
|
||||||
, in_hash_table(FALSE)
|
, in_hash_table(FALSE)
|
||||||
{
|
{
|
||||||
AddToHashTables();
|
AddToHashTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
ShapeInMSL::ShapeInMSL(ShapeInMSL const & sim)
|
ShapeInMSL::ShapeInMSL(ShapeInMSL const & sim)
|
||||||
: shptr(sim.shptr)
|
: listpos(sim.listpos)
|
||||||
|
, shptr(sim.shptr)
|
||||||
, name(sim.name)
|
, name(sim.name)
|
||||||
, listpos(sim.listpos)
|
|
||||||
, in_hash_table(FALSE)
|
, in_hash_table(FALSE)
|
||||||
{
|
{
|
||||||
if (sim.in_hash_table) AddToHashTables();
|
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);
|
CL_LogFile.lprintf("FAILED TO LOAD RIF: %s\n",fname);
|
||||||
#endif
|
#endif
|
||||||
ReleaseDirect3D();
|
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);
|
fprintf(stderr, "load_rif: Error loading %s\n", fname);
|
||||||
exit(0x111);
|
exit(0x111);
|
||||||
return INVALID_RIFFHANDLE;
|
return INVALID_RIFFHANDLE;
|
||||||
|
@ -516,13 +512,9 @@ RIFFHANDLE load_rif_non_env (const char * fname)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ReleaseDirect3D();
|
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);
|
fprintf(stderr, "load_rif_non_env: Error loading %s\n", fname);
|
||||||
exit(0x111);
|
exit(0x111);
|
||||||
|
|
||||||
return INVALID_RIFFHANDLE;
|
return INVALID_RIFFHANDLE;
|
||||||
}
|
}
|
||||||
#if OUTPUT_LOG
|
#if OUTPUT_LOG
|
||||||
|
@ -1559,10 +1551,7 @@ void DeallocateRifLoadedShapeheader(SHAPEHEADER * shp)
|
||||||
#if !StandardShapeLanguage
|
#if !StandardShapeLanguage
|
||||||
#error Must have standard shape language
|
#error Must have standard shape language
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int max_num_texs = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(shp->animation_header)
|
if(shp->animation_header)
|
||||||
{
|
{
|
||||||
// so it gets deallocated properly
|
// so it gets deallocated properly
|
||||||
|
@ -1576,6 +1565,9 @@ void DeallocateRifLoadedShapeheader(SHAPEHEADER * shp)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !USE_LEVEL_MEMORY_POOL
|
#if !USE_LEVEL_MEMORY_POOL
|
||||||
|
int max_num_texs = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (shp->points)
|
if (shp->points)
|
||||||
{
|
{
|
||||||
if (*shp->points) DeallocateMem(*shp->points);
|
if (*shp->points) DeallocateMem(*shp->points);
|
||||||
|
|
|
@ -109,12 +109,13 @@ static inline bool IsFileInFastFile(char const * pszFileName)
|
||||||
|
|
||||||
static bool DoesFileExist(char const * pszFileName)
|
static bool DoesFileExist(char const * pszFileName)
|
||||||
{
|
{
|
||||||
DWORD dwFileAttributes = GetFileAttributes(pszFileName);
|
unsigned int attr = GetGameFileAttributes(pszFileName, FILETYPE_PERM);
|
||||||
|
|
||||||
if (0xffffffff == dwFileAttributes || dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if ((attr & FILEATTR_DIRECTORY) != 0)
|
||||||
return false;
|
return false;
|
||||||
else
|
if ((attr & FILEATTR_READABLE) == 0)
|
||||||
return true;
|
return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char * GetPath(char * pszFileNameBuf, unsigned nBufSize, ImageDescriptor const & idsc, Chunk_With_Children * pEnvDataChunk, bool bGloballyPalettized)
|
static char * GetPath(char * pszFileNameBuf, unsigned nBufSize, ImageDescriptor const & idsc, Chunk_With_Children * pEnvDataChunk, bool bGloballyPalettized)
|
||||||
|
|
|
@ -85,7 +85,7 @@ int db_option = 0; /* Default is off. */
|
||||||
* logfile will go in the directory that is current when db_log_init()
|
* logfile will go in the directory that is current when db_log_init()
|
||||||
* is called.
|
* is called.
|
||||||
*/
|
*/
|
||||||
#define ABSOLUTE_PATH 0
|
#define ABSOLUTE_PATH 1
|
||||||
|
|
||||||
/* M A C R O S ******************************************************** */
|
/* M A C R O S ******************************************************** */
|
||||||
|
|
||||||
|
@ -152,12 +152,14 @@ static const char* db_assert_textA[ 3 ] =
|
||||||
"Expression: %s",
|
"Expression: %s",
|
||||||
"File: %s Line: %d"
|
"File: %s Line: %d"
|
||||||
};
|
};
|
||||||
#if 0
|
|
||||||
|
#ifndef DB_NOWINDOWS
|
||||||
static const char* db_prompt_std =
|
static const char* db_prompt_std =
|
||||||
"Quit program/force e(x)ception? [y/n/x]";
|
"Quit program/force e(x)ception? [y/n/x]";
|
||||||
static const char* db_prompt_windows =
|
static const char* db_prompt_windows =
|
||||||
"Quit program? [Yes/No]/force exception? [Cancel]";
|
"Quit program? [Yes/No]/force exception? [Cancel]";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* db_assert_log_begin_text =
|
static const char* db_assert_log_begin_text =
|
||||||
"DB: FAILED ASSERTION BEGINS";
|
"DB: FAILED ASSERTION BEGINS";
|
||||||
static const char* db_assert_log_end_text =
|
static const char* db_assert_log_end_text =
|
||||||
|
@ -394,7 +396,7 @@ void db_log_fired(const char *strP)
|
||||||
if(!InitialisedLog) db_log_init();
|
if(!InitialisedLog) db_log_init();
|
||||||
{
|
{
|
||||||
/* Open a file for appending, creating one if it doesn't yet exist. */
|
/* 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;
|
if(!fP) return;
|
||||||
|
|
||||||
|
@ -409,13 +411,12 @@ void db_log_init(void)
|
||||||
sprintf( LogFileNameP, "%s", db_log_file_name );
|
sprintf( LogFileNameP, "%s", db_log_file_name );
|
||||||
#else
|
#else
|
||||||
/* Append the log file name to the current working directory. */
|
/* Append the log file name to the current working directory. */
|
||||||
/* TODO - path seperator */
|
|
||||||
sprintf( LogFileNameP, "%s/%s", getcwd( LogFileNameP, 240 ),
|
sprintf( LogFileNameP, "%s/%s", getcwd( LogFileNameP, 240 ),
|
||||||
db_log_file_name );
|
db_log_file_name );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Delete old log file. */
|
/* Delete old log file. */
|
||||||
remove(LogFileNameP);
|
DeleteGameFile(LogFileNameP);
|
||||||
|
|
||||||
/* Flag that we have initialised the log file. */
|
/* Flag that we have initialised the log file. */
|
||||||
InitialisedLog = 1;
|
InitialisedLog = 1;
|
||||||
|
|
|
@ -84,10 +84,6 @@ namespace IFF
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The uninitialised part of byte is shifted out.
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable: 4701)
|
|
||||||
#endif
|
|
||||||
bool IlbmBodyChunk::EncodeNextRow(unsigned const * pRow)
|
bool IlbmBodyChunk::EncodeNextRow(unsigned const * pRow)
|
||||||
{
|
{
|
||||||
if (!pEncodeDst) return false;
|
if (!pEncodeDst) return false;
|
||||||
|
@ -96,7 +92,7 @@ namespace IFF
|
||||||
{
|
{
|
||||||
UBYTE * pBuf = pEncodeSrc;
|
UBYTE * pBuf = pEncodeSrc;
|
||||||
|
|
||||||
unsigned byte;
|
unsigned byte=0;
|
||||||
for (unsigned x=0; x<nWidth; ++x)
|
for (unsigned x=0; x<nWidth; ++x)
|
||||||
{
|
{
|
||||||
byte <<= 1;
|
byte <<= 1;
|
||||||
|
@ -164,9 +160,6 @@ namespace IFF
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(default: 4701)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool IlbmBodyChunk::EndEncode()
|
bool IlbmBodyChunk::EndEncode()
|
||||||
{
|
{
|
||||||
|
@ -206,10 +199,6 @@ namespace IFF
|
||||||
return pData != NULL;
|
return pData != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The uninitialised part of pDecodeDst is shifted out.
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable: 4701)
|
|
||||||
#endif
|
|
||||||
unsigned const * IlbmBodyChunk::DecodeNextRow() const
|
unsigned const * IlbmBodyChunk::DecodeNextRow() const
|
||||||
{
|
{
|
||||||
if (!pDecodeSrc || !pDecodeDst) return NULL;
|
if (!pDecodeSrc || !pDecodeDst) return NULL;
|
||||||
|
@ -224,7 +213,7 @@ namespace IFF
|
||||||
|
|
||||||
for (unsigned b=0; b<nBitPlanes; ++b)
|
for (unsigned b=0; b<nBitPlanes; ++b)
|
||||||
{
|
{
|
||||||
unsigned byte;
|
unsigned byte=0;
|
||||||
for (unsigned x=0; x<nWidth; ++x)
|
for (unsigned x=0; x<nWidth; ++x)
|
||||||
{
|
{
|
||||||
if (!(x&7))
|
if (!(x&7))
|
||||||
|
@ -282,7 +271,7 @@ namespace IFF
|
||||||
{
|
{
|
||||||
for (unsigned b=0; b<nBitPlanes; ++b)
|
for (unsigned b=0; b<nBitPlanes; ++b)
|
||||||
{
|
{
|
||||||
unsigned byte;
|
unsigned byte=0;
|
||||||
for (unsigned x=0; x<nWidth; ++x)
|
for (unsigned x=0; x<nWidth; ++x)
|
||||||
{
|
{
|
||||||
if (!(x&7))
|
if (!(x&7))
|
||||||
|
@ -304,9 +293,6 @@ namespace IFF
|
||||||
|
|
||||||
return pDecodeDst;
|
return pDecodeDst;
|
||||||
}
|
}
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(default: 4701)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
IlbmBodyChunk::~IlbmBodyChunk()
|
IlbmBodyChunk::~IlbmBodyChunk()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define _INCLUDED_MEDIA_HPP_
|
#define _INCLUDED_MEDIA_HPP_
|
||||||
|
|
||||||
//#if defined(_WIN32) || defined(WIN32) || defined(WINDOWS) || defined(_WINDOWS)
|
//#if defined(_WIN32) || defined(WIN32) || defined(WINDOWS) || defined(_WINDOWS)
|
||||||
#define _MEDIA_WIN_TARGET
|
// #define _MEDIA_WIN_TARGET
|
||||||
// #include <windows.h>
|
// #include <windows.h>
|
||||||
//#endif // WIN32 || _WIN32 || WINDOWS || _WINDOWS
|
//#endif // WIN32 || _WIN32 || WINDOWS || _WINDOWS
|
||||||
|
|
||||||
|
@ -497,7 +497,12 @@ class MediaStdFileMedium : public MediaMedium
|
||||||
|
|
||||||
void Open(char const * pszFileName, char const * pszOpenMode)
|
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)
|
if (!m_pFile)
|
||||||
m_fError |= MME_OPENFAIL;
|
m_fError |= MME_OPENFAIL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,8 +116,7 @@ BOOL Lockable_Chunk_With_Children::lock_chunk(File_Chunk & fchunk)
|
||||||
|
|
||||||
CloseHandle (rif_file);
|
CloseHandle (rif_file);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL Lockable_Chunk_With_Children::unlock_chunk (File_Chunk & fchunk, BOOL updateyn)
|
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
|
// Load in whole chunk and traverse
|
||||||
char rifIsCompressed = FALSE;
|
char rifIsCompressed = FALSE;
|
||||||
char *uncompressedData = NULL;
|
char *uncompressedData = NULL;
|
||||||
HANDLE rif_file;
|
FILE *rif_file;
|
||||||
DWORD file_size;
|
DWORD file_size;
|
||||||
DWORD file_size_from_file;
|
DWORD file_size_from_file;
|
||||||
unsigned long bytes_read;
|
|
||||||
char * buffer;
|
char * buffer;
|
||||||
char * buffer_ptr;
|
char * buffer_ptr;
|
||||||
char id_buffer[9];
|
char id_buffer[9];
|
||||||
|
@ -380,27 +378,28 @@ File_Chunk::File_Chunk(const char * file_name)
|
||||||
|
|
||||||
strcpy (filename, file_name);
|
strcpy (filename, file_name);
|
||||||
|
|
||||||
rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
|
rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
FILE_FLAG_RANDOM_ACCESS, 0);
|
|
||||||
|
|
||||||
if (rif_file == INVALID_HANDLE_VALUE) {
|
if (rif_file == NULL) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
return;
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UseOldChunkLoader
|
#if UseOldChunkLoader
|
||||||
if (strncmp (id_buffer, "REBINFLF", 8)) {
|
if (strncmp (id_buffer, "REBINFLF", 8)) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -412,7 +411,7 @@ File_Chunk::File_Chunk(const char * file_name)
|
||||||
else if (strncmp (id_buffer, "REBINFF2", 8))
|
else if (strncmp (id_buffer, "REBINFF2", 8))
|
||||||
{
|
{
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -423,10 +422,9 @@ File_Chunk::File_Chunk(const char * file_name)
|
||||||
pointer to the original data. */
|
pointer to the original data. */
|
||||||
if (rifIsCompressed)
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uncompressedData = HuffmanDecompress((HuffmanPackage*)buffer);
|
uncompressedData = HuffmanDecompress((HuffmanPackage*)buffer);
|
||||||
|
@ -438,27 +436,28 @@ File_Chunk::File_Chunk(const char * file_name)
|
||||||
}
|
}
|
||||||
else // the normal uncompressed approach:
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_size != file_size_from_file) {
|
if (file_size != file_size_from_file) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buffer_ptr = buffer;
|
buffer_ptr = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(rif_file);
|
||||||
|
|
||||||
// Process the RIF
|
// Process the RIF
|
||||||
// The start of the first chunk
|
// The start of the first chunk
|
||||||
|
|
||||||
|
@ -471,7 +470,6 @@ File_Chunk::File_Chunk(const char * file_name)
|
||||||
|
|
||||||
DynCreate(buffer_ptr);
|
DynCreate(buffer_ptr);
|
||||||
buffer_ptr += *(int *)(buffer_ptr + 8);
|
buffer_ptr += *(int *)(buffer_ptr + 8);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* KJL 17:59:42 19/09/98 - release the memory holding the rif */
|
/* 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;
|
delete [] buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseHandle (rif_file);
|
|
||||||
|
|
||||||
post_input_processing();
|
post_input_processing();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
File_Chunk::File_Chunk()
|
File_Chunk::File_Chunk()
|
||||||
|
@ -1549,10 +1544,7 @@ Environment_Data_Chunk * File_Chunk::get_env_data()
|
||||||
|
|
||||||
if (e_list.size())
|
if (e_list.size())
|
||||||
return e_list.first_entry();
|
return e_list.first_entry();
|
||||||
else
|
return 0;
|
||||||
{
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void File_Chunk::build_object_array()
|
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 rifIsCompressed = FALSE;
|
||||||
char *uncompressedData = NULL;
|
char *uncompressedData = NULL;
|
||||||
HANDLE rif_file;
|
FILE *rif_file;
|
||||||
DWORD file_size;
|
DWORD file_size;
|
||||||
DWORD file_size_from_file;
|
DWORD file_size_from_file;
|
||||||
unsigned long bytes_read;
|
|
||||||
char * buffer;
|
char * buffer;
|
||||||
char * buffer_ptr;
|
char * buffer_ptr;
|
||||||
char id_buffer[9];
|
char id_buffer[9];
|
||||||
|
@ -1766,21 +1757,21 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
|
||||||
|
|
||||||
error_code = 0;
|
error_code = 0;
|
||||||
|
|
||||||
rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
|
rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
FILE_FLAG_RANDOM_ACCESS, 0);
|
|
||||||
|
|
||||||
|
if (rif_file == NULL) {
|
||||||
if (rif_file == INVALID_HANDLE_VALUE) {
|
|
||||||
error_code = CHUNK_FAILED_ON_LOAD;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
return;
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
return;
|
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)) {
|
else if (strncmp (id_buffer, "REBINFF2", 8)) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1804,10 +1795,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
|
||||||
pointer to the original data. */
|
pointer to the original data. */
|
||||||
if (rifIsCompressed)
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return;
|
return;
|
||||||
|
@ -1822,9 +1812,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
|
||||||
else // the normal uncompressed approach:
|
else // the normal uncompressed approach:
|
||||||
{
|
{
|
||||||
//get the file size stored in the rif file
|
//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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return;
|
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
|
//and compare with the actual file size
|
||||||
if (file_size != file_size_from_file) {
|
if (file_size != file_size_from_file) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//read the rest of the file into the buffer
|
//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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buffer_ptr = buffer;
|
buffer_ptr = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fclose(rif_file);
|
||||||
|
|
||||||
|
|
||||||
// Process the RIF
|
// Process the RIF
|
||||||
|
@ -1879,12 +1868,9 @@ RIF_File_Chunk::RIF_File_Chunk (Chunk_With_Children * parent, const char * file_
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseHandle (rif_file);
|
|
||||||
|
|
||||||
post_input_processing();
|
post_input_processing();
|
||||||
|
|
||||||
Parent_File = ParentFileStore;
|
Parent_File = ParentFileStore;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RIF_File_Chunk::post_input_processing()
|
void RIF_File_Chunk::post_input_processing()
|
||||||
|
@ -1991,8 +1977,5 @@ Environment_Data_Chunk * RIF_File_Chunk::get_env_data()
|
||||||
|
|
||||||
if (e_list.size())
|
if (e_list.size())
|
||||||
return e_list.first_entry();
|
return e_list.first_entry();
|
||||||
else
|
return 0;
|
||||||
{
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,10 +184,9 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
|
||||||
: Chunk_With_Children(parent,"SPRIHEAD")
|
: Chunk_With_Children(parent,"SPRIHEAD")
|
||||||
{
|
{
|
||||||
// Load in whole chunk and traverse
|
// Load in whole chunk and traverse
|
||||||
HANDLE rif_file;
|
FILE *rif_file;
|
||||||
DWORD file_size;
|
DWORD file_size;
|
||||||
DWORD file_size_from_file;
|
DWORD file_size_from_file;
|
||||||
unsigned long bytes_read;
|
|
||||||
char * buffer;
|
char * buffer;
|
||||||
char * buffer_ptr;
|
char * buffer_ptr;
|
||||||
char id_buffer[9];
|
char id_buffer[9];
|
||||||
|
@ -197,49 +196,51 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
|
||||||
error_code = 0;
|
error_code = 0;
|
||||||
|
|
||||||
|
|
||||||
rif_file = CreateFileA (file_name, GENERIC_READ, 0, 0, OPEN_EXISTING,
|
rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM);
|
||||||
FILE_FLAG_RANDOM_ACCESS, 0);
|
if (rif_file == NULL) {
|
||||||
|
|
||||||
if (rif_file == INVALID_HANDLE_VALUE) {
|
|
||||||
return;
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp (id_buffer, "SPRIHEAD", 8)) {
|
if (strncmp(id_buffer, "SPRIHEAD", 8) != 0) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_size != file_size_from_file) {
|
if (file_size != file_size_from_file) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
CloseHandle (rif_file);
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
buffer = new char [file_size];
|
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;
|
error_code = CHUNK_FAILED_ON_LOAD;
|
||||||
CloseHandle (rif_file);
|
delete [] buffer;
|
||||||
|
|
||||||
|
fclose(rif_file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(rif_file);
|
||||||
|
|
||||||
// Process the file
|
// Process the file
|
||||||
|
|
||||||
buffer_ptr = buffer;
|
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
|
// The start of the first chunk
|
||||||
|
|
||||||
while ((buffer_ptr-buffer)< ((signed) file_size-12) && !error_code) {
|
while ((buffer_ptr-buffer)< ((signed) file_size-12) && !error_code) {
|
||||||
|
|
||||||
if ((*(int *)(buffer_ptr + 8)) + (buffer_ptr-buffer) > ((signed) file_size-12)) {
|
if ((*(int *)(buffer_ptr + 8)) + (buffer_ptr-buffer) > ((signed) file_size-12)) {
|
||||||
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED;
|
||||||
break;
|
break;
|
||||||
|
@ -256,13 +256,9 @@ Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Chil
|
||||||
|
|
||||||
DynCreate(buffer_ptr);
|
DynCreate(buffer_ptr);
|
||||||
buffer_ptr += *(int *)(buffer_ptr + 8);
|
buffer_ptr += *(int *)(buffer_ptr + 8);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
|
|
||||||
CloseHandle (rif_file);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -960,5 +956,4 @@ void Sprite_Extent_Chunk::fill_data_block(char* data_start)
|
||||||
data_start+=4;
|
data_start+=4;
|
||||||
*(int*)data_start=spare2;
|
*(int*)data_start=spare2;
|
||||||
data_start+=4;
|
data_start+=4;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
45
src/winapi.c
45
src/winapi.c
|
@ -10,23 +10,6 @@
|
||||||
|
|
||||||
#include "fixer.h"
|
#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)
|
size_t _mbclen(const unsigned char *s)
|
||||||
{
|
{
|
||||||
return strlen((const 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)
|
HANDLE CreateFile(const char *file, int mode, int x, int y, int flags, int flags2, int z)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
/*
|
|
||||||
fprintf(stderr, "CreateFile(%s, %d, %d, %d, %d, %d, %d)\n", file, mode, x, y, flags, flags2, z);
|
fprintf(stderr, "CreateFile(%s, %d, %d, %d, %d, %d, %d)\n", file, mode, x, y, flags, flags2, z);
|
||||||
*/
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case GENERIC_READ:
|
case GENERIC_READ:
|
||||||
if (flags != OPEN_EXISTING) {
|
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)
|
int WriteFile(HANDLE file, const void *data, int len, void *byteswritten, int lpOverlapped)
|
||||||
{
|
{
|
||||||
unsigned long *bw, i;
|
unsigned long *bw, i;
|
||||||
/*
|
|
||||||
fprintf(stderr, "WriteFile(%d, %p, %d, %p, %d)\n", file, data, len, byteswritten, lpOverlapped);
|
fprintf(stderr, "WriteFile(%d, %p, %d, %p, %d)\n", file, data, len, byteswritten, lpOverlapped);
|
||||||
*/
|
|
||||||
bw = (unsigned long *)byteswritten;
|
bw = (unsigned long *)byteswritten;
|
||||||
*bw = 0;
|
*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)
|
int ReadFile(HANDLE file, void *data, int len, void *bytesread, int lpOverlapped)
|
||||||
{
|
{
|
||||||
unsigned long *br, i;
|
unsigned long *br, i;
|
||||||
/*
|
|
||||||
fprintf(stderr, "ReadFile(%d, %p, %d, %p, %d)\n", file, data, len, bytesread, lpOverlapped);
|
fprintf(stderr, "ReadFile(%d, %p, %d, %p, %d)\n", file, data, len, bytesread, lpOverlapped);
|
||||||
*/
|
|
||||||
br = (unsigned long *)bytesread;
|
br = (unsigned long *)bytesread;
|
||||||
*br = 0;
|
*br = 0;
|
||||||
|
|
||||||
|
@ -114,9 +97,9 @@ int ReadFile(HANDLE file, void *data, int len, void *bytesread, int lpOverlapped
|
||||||
int GetFileSize(HANDLE file, int lpFileSizeHigh)
|
int GetFileSize(HANDLE file, int lpFileSizeHigh)
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
/*
|
|
||||||
fprintf(stderr, "GetFileSize(%d, %d)\n", file, lpFileSizeHigh);
|
fprintf(stderr, "GetFileSize(%d, %d)\n", file, lpFileSizeHigh);
|
||||||
*/
|
|
||||||
if (fstat(file, &buf) == -1)
|
if (fstat(file, &buf) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
return buf.st_size;
|
return buf.st_size;
|
||||||
|
@ -124,9 +107,9 @@ int GetFileSize(HANDLE file, int lpFileSizeHigh)
|
||||||
|
|
||||||
int CloseHandle(HANDLE file)
|
int CloseHandle(HANDLE file)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "CloseHandle(%d)\n", file);
|
fprintf(stderr, "CloseHandle(%d)\n", file);
|
||||||
*/
|
|
||||||
if (close(file) == -1)
|
if (close(file) == -1)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
|
@ -137,9 +120,9 @@ int CloseHandle(HANDLE file)
|
||||||
|
|
||||||
int DeleteFile(const char *file)
|
int DeleteFile(const char *file)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "DeleteFile(%s)\n", file);
|
fprintf(stderr, "DeleteFile(%s)\n", file);
|
||||||
*/
|
|
||||||
if (unlink(file) == -1)
|
if (unlink(file) == -1)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
|
@ -160,9 +143,9 @@ int GetDiskFreeSpace(int x, unsigned long *a, unsigned long *b, unsigned long *c
|
||||||
|
|
||||||
int CreateDirectory(char *dir, int lpSecurityAttributes)
|
int CreateDirectory(char *dir, int lpSecurityAttributes)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
fprintf(stderr, "CreateDirectory(%s, %d)\n", dir, lpSecurityAttributes);
|
fprintf(stderr, "CreateDirectory(%s, %d)\n", dir, lpSecurityAttributes);
|
||||||
*/
|
|
||||||
if (mkdir(dir, S_IRWXU) == -1)
|
if (mkdir(dir, S_IRWXU) == -1)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue