X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_ca.c;h=008e4e84cb54949bf0b645a18a4637db04eea567;hb=181c6beee3d42da41fc53f44f0aa3e9315016ad2;hp=ca0ad83748917056141568a104ccd969488511bf;hpb=b0c0fabf3e7a284d2713e11b30015818f91097e4;p=16.git diff --git a/src/lib/16_ca.c b/src/lib/16_ca.c index ca0ad837..008e4e84 100755 --- a/src/lib/16_ca.c +++ b/src/lib/16_ca.c @@ -1,19 +1,23 @@ -/* Catacomb Apocalypse Source Code - * Copyright (C) 1993-2014 Flat Rock Software +/* Project 16 Source Code~ + * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * - * This program is free software; you can redistribute it and/or modify + * This file is part of Project 16. + * + * Project 16 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * Project 16 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see , or + * write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301 USA. + * */ // ID_CA.C @@ -36,8 +40,9 @@ loaded into the data segment #pragma warn -pro #pragma warn -use -//#define THREEBYTEGRSTARTS +#define THREEBYTEGRSTARTS //https://github.com/open-watcom/open-watcom-v2/issues/279#issuecomment-244587566 for _seg +//http://www.shikadi.net/moddingwiki/GameMaps_Format for info on the code /* ============================================================================= @@ -97,16 +102,17 @@ extern byte EGAdict; extern byte far maphead; extern byte mapdict; extern byte far audiohead; -extern byte audiodict; +extern byte audiodict;*/ +void CA_CannotOpen(char *string, global_game_variables_t *gvar); -long _seg *grstarts; // array of offsets in egagraph, -1 for sparse +/*long _seg *grstarts; // array of offsets in egagraph, -1 for sparse long _seg *audiostarts; // array of offsets in audio / audiot #ifdef GRHEADERLINKED -huffnode *grhuffman; +huffnode *gvar->ca.grhuffman; #else -huffnode grhuffman[255]; +huffnode gvar->ca.grhuffman[255]; #endif #ifdef AUDIOHEADERLINKED @@ -119,9 +125,9 @@ huffnode audiohuffman[255]; int grhandle; // handle to EGAGRAPH int maphandle; // handle to MAPTEMP / GAMEMAPS int audiohandle; // handle to AUDIOT / AUDIO - +*/ long chunkcomplen,chunkexplen; - +/* SDMode oldsoundmode; @@ -129,20 +135,21 @@ SDMode oldsoundmode; void CAL_DialogDraw (char *title,unsigned numcache); void CAL_DialogUpdate (void); void CAL_DialogFinish (void);*/ -//void CAL_CarmackExpand (unsigned far *source, unsigned far *dest,unsigned length); +void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, + unsigned length); #ifdef THREEBYTEGRSTARTS #define FILEPOSSIZE 3 //#define GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff) -long GRFILEPOS(int c, global_game_variables_t *gvar) +CASVT GRFILEPOS(int c, global_game_variables_t *gvar) { - long value; + CASVT value; int offset; offset = c*3; - value = *(long far *)(((byte far *)gvar->ca.grstarts)+offset); + value = *(CASVT far *)(((byte far *)gvar->ca.grstarts)+offset); value &= 0x00ffffffl; @@ -153,7 +160,11 @@ long GRFILEPOS(int c, global_game_variables_t *gvar) }; #else #define FILEPOSSIZE 4 -#define GRFILEPOS(c) (gvar->ca.grstarts[c]) +//#define GRFILEPOS(c) (gvar->ca.grstarts[c]) +CASVT GRFILEPOS(int c, global_game_variables_t *gvar) +{ + return gvar->ca.grstarts[c]; +} #endif /* @@ -202,13 +213,13 @@ void CA_CloseDebug(global_game_variables_t *gvar) = ============================ */ -/*++++ -void CAL_GetGrChunkLength (int chunk) + +void CAL_GetGrChunkLength (int chunk,global_game_variables_t *gvar) { - lseek(grhandle,GRFILEPOS(chunk),SEEK_SET); - read(grhandle,&chunkexplen,sizeof(chunkexplen)); - chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4; -}*/ + lseek(gvar->ca.file.grhandle,GRFILEPOS(chunk,gvar),SEEK_SET); + read(gvar->ca.file.grhandle,&gvar->ca.chunkexplen,sizeof(gvar->ca.chunkexplen)); + gvar->ca.chunkcomplen = GRFILEPOS(chunk+1,gvar)-GRFILEPOS(chunk,gvar)-4; +} /* @@ -375,6 +386,17 @@ boolean CA_ReadFile(char *filename, memptr *ptr, global_game_variables_t *gvar) return false; size = filelength(handle); +#ifdef __DEBUG_CA__ + if(dbg_debugca>0){ + printf("===============================================================================\n"); + printf(" CA_ReadFile\n"); + printf("===============================================================================\n"); + //%04x + printf(" ptr=%Fp\n", ptr); + printf(" *ptr=%Fp\n", *ptr); + printf(" &ptr=%Fp\n", &ptr); + } +#endif if(!CA_FarRead(handle,*ptr,size, gvar)) { close(handle); @@ -1022,24 +1044,19 @@ dinorm: = ====================== */ -////++++ enable! -/*void CAL_SetupGrFile (void) + +void CAL_SetupGrFile (global_game_variables_t *gvar) { + char fname[13]; int handle; memptr compseg; #ifdef GRHEADERLINKED -#if GRMODE == EGAGR - grhuffman = (huffnode *)&EGAdict; - grstarts = (long _seg *)FP_SEG(&EGAhead); -#endif -#if GRMODE == CGAGR - grhuffman = (huffnode *)&CGAdict; - grstarts = (long _seg *)FP_SEG(&CGAhead); -#endif + gvar->ca.grhuffman = (huffnode *)&VGAdict; + grstarts = (long _seg *)FP_SEG(&VGAhead); - CAL_OptimizeNodes (grhuffman); + CAL_OptimizeNodes (gvar->ca.grhuffman); #else @@ -1047,23 +1064,29 @@ dinorm: // load ???dict.ext (huffman dictionary for graphics files) // - if ((handle = open(GREXT"DICT."EXT, + strcpy(fname,GDICTNAME); + strcat(fname,EXTENSION); + + if ((handle = open(fname, O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit (gvar, "Can't open "GREXT"DICT."EXT"!"); + CA_CannotOpen(fname,gvar); - read(handle, &grhuffman, sizeof(grhuffman)); + read(handle, &gvar->ca.grhuffman, sizeof(gvar->ca.grhuffman)); close(handle); - CAL_OptimizeNodes (grhuffman); + CAL_OptimizeNodes (gvar->ca.grhuffman); // // load the data offsets from ???head.ext // - MM_GetPtr (MEMPTR grstarts,(NUMCHUNKS+1)*FILEPOSSIZE); + MM_GetPtr (MEMPTRCONV gvar->ca.grstarts,(NUMCHUNKS+1)*FILEPOSSIZE, gvar); + + strcpy(fname,GHEADNAME); + strcat(fname,EXTENSION); - if ((handle = open(GREXT"HEAD."EXT, + if ((handle = open(fname, O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit (gvar, "Can't open "GREXT"HEAD."EXT"!"); + CA_CannotOpen(fname,gvar); - CA_FarRead(handle, (memptr)grstarts, (NUMCHUNKS+1)*FILEPOSSIZE); + CA_FarRead(handle, (memptr)gvar->ca.grstarts, (NUMCHUNKS+1)*FILEPOSSIZE, gvar); close(handle); @@ -1073,42 +1096,48 @@ dinorm: // // Open the graphics file, leaving it open until the game is finished // - grhandle = open(GREXT"GRAPH."EXT, O_RDONLY | O_BINARY); - if (grhandle == -1) - Quit (gvar, "Cannot open "GREXT"GRAPH."EXT"!"); + strcpy(fname,GFILENAME); + strcat(fname,EXTENSION); + + gvar->ca.file.grhandle = open(fname, O_RDONLY | O_BINARY); + if (gvar->ca.file.grhandle == -1) + CA_CannotOpen(fname,gvar); // // load the pic and sprite headers into the arrays in the data segment // #if NUMPICS>0 - MM_GetPtr(MEMPTR pictable,NUMPICS*sizeof(pictabletype)); - CAL_GetGrChunkLength(STRUCTPIC); // position file pointer - MM_GetPtr(&compseg,chunkcomplen); - CA_FarRead (grhandle,compseg,chunkcomplen); - CAL_HuffExpand (compseg, (byte far *)pictable,NUMPICS*sizeof(pictabletype),grhuffman); - MM_FreePtr(&compseg); + MM_GetPtr(MEMPTRCONV gvar->video.pictable,NUMPICS*sizeof(pictabletype),gvar); + CAL_GetGrChunkLength(STRUCTPIC,gvar); // position file pointer + printf("CAL_SetupGrFile:\n"); + printf(" gvar->ca.chunkcomplen size is %lu\n", gvar->ca.chunkcomplen); + MM_GetPtr(&compseg,gvar->ca.chunkcomplen,gvar); + IN_Ack(gvar); + CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen,gvar); + CAL_HuffExpand (compseg, (byte far *)gvar->video.pictable,NUMPICS*sizeof(pictabletype),gvar->ca.grhuffman); + MM_FreePtr(&compseg,gvar); #endif #if NUMPICM>0 - MM_GetPtr(MEMPTR picmtable,NUMPICM*sizeof(pictabletype)); + MM_GetPtr(MEMPTRCONV picmtable,NUMPICM*sizeof(pictabletype)); CAL_GetGrChunkLength(STRUCTPICM); // position file pointer - MM_GetPtr(&compseg,chunkcomplen); - CA_FarRead (grhandle,compseg,chunkcomplen); - CAL_HuffExpand (compseg, (byte far *)picmtable,NUMPICS*sizeof(pictabletype),grhuffman); + MM_GetPtr(&compseg,gvar->ca.chunkcomplen); + CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen); + CAL_HuffExpand (compseg, (byte far *)picmtable,NUMPICS*sizeof(pictabletype),gvar->ca.grhuffman); MM_FreePtr(&compseg); #endif #if NUMSPRITES>0 - MM_GetPtr(MEMPTR spritetable,NUMSPRITES*sizeof(spritetabletype)); + MM_GetPtr(MEMPTRCONV spritetable,NUMSPRITES*sizeof(spritetabletype)); CAL_GetGrChunkLength(STRUCTSPRITE); // position file pointer - MM_GetPtr(&compseg,chunkcomplen); - CA_FarRead (grhandle,compseg,chunkcomplen); - CAL_HuffExpand (compseg, (byte far *)spritetable,NUMSPRITES*sizeof(spritetabletype),grhuffman); + MM_GetPtr(&compseg,gvar->ca.chunkcomplen); + CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen); + CAL_HuffExpand (compseg, (byte far *)spritetable,NUMSPRITES*sizeof(spritetabletype),gvar->ca.grhuffman); MM_FreePtr(&compseg); #endif -}*/ +} //========================================================================== @@ -1136,7 +1165,7 @@ void CAL_SetupMapFile (global_game_variables_t *gvar) O_RDONLY | O_BINARY, S_IREAD)) == -1) Quit (gvar, "Can't open maphead.mph"); length = filelength(handle); - MM_GetPtr (MEMPTR gvar->ca.tinf,length,gvar); + MM_GetPtr (MEMPTRCONV gvar->ca.tinf,length,gvar); CA_FarRead(handle, gvar->ca.tinf, length,gvar); close(handle); //#else @@ -1149,17 +1178,17 @@ void CAL_SetupMapFile (global_game_variables_t *gvar) // open the data file // //TODO: multiple files - if ((gvar->ca.file.maphandle[0] = open("data/test.map", + if ((gvar->ca.file.maphandle = open("data/test.map", O_RDONLY | O_BINARY, S_IREAD)) == -1) Quit (gvar, "Can't open data/test.map!"); /*#ifdef MAPHEADERLINKED - if ((maphandle = open("GAMEMAPS."EXTENSION, + if ((maphandle = open("GAMEMAPS.16"ENSION, O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit ("Can't open GAMEMAPS."EXTENSION"!"); + Quit ("Can't open GAMEMAPS.16"ENSION"!"); #else - if ((maphandle = open("MAPTEMP."EXTENSION, + if ((maphandle = open("MAPTEMP.16"ENSION, O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit ("Can't open MAPTEMP."EXTENSION"!"); + Quit ("Can't open MAPTEMP.16"ENSION"!"); #endif*/ } @@ -1183,11 +1212,11 @@ void CAL_SetupMapFile (global_game_variables_t *gvar) // load maphead.ext (offsets and tileinfo for map file) // #ifndef AUDIOHEADERLINKED - if ((handle = open("AUDIOHED."EXT, + if ((handle = open("AUDIOHED.16", O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit (gvar, "Can't open AUDIOHED."EXT"!"); + Quit (gvar, "Can't open AUDIOHED.16""!"); length = filelength(handle); - MM_GetPtr (MEMPTR audiostarts,length); + MM_GetPtr (MEMPTRCONV audiostarts,length); CA_FarRead(handle, (byte far *)audiostarts, length); close(handle); #else @@ -1200,13 +1229,13 @@ void CAL_SetupMapFile (global_game_variables_t *gvar) // open the data file // #ifndef AUDIOHEADERLINKED - if ((audiohandle = open("AUDIOT."EXT, + if ((audiohandle = open("AUDIOT.16", O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit (gvar, "Can't open AUDIOT."EXT"!"); + Quit (gvar, "Can't open AUDIOT.16""!"); #else - if ((audiohandle = open("AUDIO."EXT, + if ((audiohandle = open("AUDIO.16", O_RDONLY | O_BINARY, S_IREAD)) == -1) - Quit (gvar, "Can't open AUDIO."EXT"!"); + Quit (gvar, "Can't open AUDIO.16""!"); #endif }*/ @@ -1285,10 +1314,9 @@ void CA_Shutdown(global_game_variables_t *gvar) #endif close(gvar->handle.showmemhandle); - close(*(gvar->ca.file.maphandle)); -/*++++ - close(grhandle); - close(audiohandle);*/ + close(gvar->ca.file.maphandle); + close(gvar->ca.file.grhandle); + close(gvar->ca.file.audiohandle); } //=========================================================================== @@ -1312,13 +1340,13 @@ void CA_CacheAudioChunk (int chunk) if (audiosegs[chunk]) { - MM_SetPurge (MEMPTR audiosegs[chunk],0); + MM_SetPurge (MEMPTRCONV audiosegs[chunk],0); return; // allready in memory } // MDM begin - (GAMERS EDGE) // - if (!FindFile("AUDIO."EXT,NULL,2)) + if (!FindFile("AUDIO.16",NULL,2)) Quit (gvar, "CA_CacheAudioChunk(): Can't find audio files."); // // MDM end @@ -1334,7 +1362,7 @@ void CA_CacheAudioChunk (int chunk) #ifndef AUDIOHEADERLINKED - MM_GetPtr (MEMPTR audiosegs[chunk],compressed); + MM_GetPtr (MEMPTRCONV audiosegs[chunk],compressed); if (mmerror) return; @@ -1359,7 +1387,7 @@ void CA_CacheAudioChunk (int chunk) expanded = *(long far *)source; source += 4; // skip over length - MM_GetPtr (MEMPTR audiosegs[chunk],expanded); + MM_GetPtr (MEMPTRCONV audiosegs[chunk],expanded); if (mmerror) goto done; CAL_HuffExpand (source,audiosegs[chunk],expanded,audiohuffman); @@ -1400,7 +1428,7 @@ void CA_LoadAllSounds (void) for (i=0;idata[0],smallplane*2,grhuffman); + CAL_HuffExpand (compressed, &dest->data[0],smallplane*2,gvar->ca.grhuffman); #endif @@ -1599,7 +1650,7 @@ void CAL_CacheSprite (int chunk, byte far *compressed) // // expand the unshifted shape // - CAL_HuffExpand (compressed, &dest->data[0],smallplane*5,grhuffman); + CAL_HuffExpand (compressed, &dest->data[0],smallplane*5,gvar->ca.grhuffman); // // make the shifts! @@ -1731,7 +1782,7 @@ void CAL_ExpandGrChunk (int chunk, byte far *source) MM_GetPtr (&grsegs[chunk],expanded); if (mmerror) return; - CAL_HuffExpand (source,grsegs[chunk],expanded,grhuffman); + CAL_HuffExpand (source,grsegs[chunk],expanded,gvar->ca.grhuffman); } } */ @@ -1757,21 +1808,21 @@ void CAL_ReadGrChunk (int chunk) // load the chunk into a buffer, either the miscbuffer if it fits, or allocate // a larger buffer // - pos = GRFILEPOS(chunk); + pos = GRFILEPOS(chunk,gvar); if (pos<0) // $FFFFFFFF start is a sparse tile return; next = chunk +1; - while (GRFILEPOS(next) == -1) // skip past any sparse tiles + while (GRFILEPOS(next,gvar) == -1) // skip past any sparse tiles next++; - compressed = GRFILEPOS(next)-pos; + compressed = GRFILEPOS(next,gvar)-pos; - lseek(grhandle,pos,SEEK_SET); + lseek(gvar->ca.file.grhandle,pos,SEEK_SET); if (compressed<=BUFFERSIZE) { - CA_FarRead(grhandle,bufferseg,compressed); + CA_FarRead(gvar->ca.file.grhandle,bufferseg,compressed); source = bufferseg; } else @@ -1780,7 +1831,7 @@ void CAL_ReadGrChunk (int chunk) if (mmerror) return; MM_SetLock (&bigbufferseg,true); - CA_FarRead(grhandle,bigbufferseg,compressed); + CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed); source = bigbufferseg; } @@ -1816,7 +1867,7 @@ void CA_CacheGrChunk (int chunk) // MDM begin - (GAMERS EDGE) // - if (!FindFile("EGAGRAPH."EXT,NULL,2)) + if (!FindFile("EGAGRAPH.16",NULL,2)) Quit (gvar, "CA_CacheGrChunk(): Can't find graphics files."); // // MDM end @@ -1825,7 +1876,7 @@ void CA_CacheGrChunk (int chunk) // load the chunk into a buffer, either the miscbuffer if it fits, or allocate // a larger buffer // - pos = GRFILEPOS(chunk); + pos = GRFILEPOS(chunk,gvar); if (pos<0) // $FFFFFFFF start is a sparse tile return; @@ -1833,20 +1884,20 @@ void CA_CacheGrChunk (int chunk) while (GRFILEPOS(next) == -1) // skip past any sparse tiles next++; - compressed = GRFILEPOS(next)-pos; + compressed = GRFILEPOS(next,gvar)-pos; - lseek(grhandle,pos,SEEK_SET); + lseek(gvar->ca.file.grhandle,pos,SEEK_SET); if (compressed<=BUFFERSIZE) { - CA_FarRead(grhandle,bufferseg,compressed); + CA_FarRead(gvar->ca.file.grhandle,bufferseg,compressed); source = bufferseg; } else { MM_GetPtr(&bigbufferseg,compressed); MM_SetLock (&bigbufferseg,true); - CA_FarRead(grhandle,bigbufferseg,compressed); + CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed); source = bigbufferseg; } @@ -1905,12 +1956,12 @@ void CA_CacheMap (global_game_variables_t *gvar) // if (pos<0) // $FFFFFFFF start is a sparse map // printf("CA_CacheMap: Tried to load a non existent map!"); -// MM_GetPtr(MEMPTR gvar->ca.camapheaderseg[mapnum],sizeof(maptype)); +// MM_GetPtr(MEMPTRCONV gvar->ca.camapheaderseg[mapnum],sizeof(maptype)); // lseek(maphandle,pos,SEEK_SET); // CA_FarRead (maphandle,(memptr)mapheaderseg[mapnum],sizeof(maptype)); // } // else -// MM_SetPurge (MEMPTR mapheaderseg[mapnum], 0, &(gvar->mm)); +// MM_SetPurge (MEMPTRCONV mapheaderseg[mapnum], 0, &(gvar->mm)); // // load the planes in @@ -1928,7 +1979,7 @@ void CA_CacheMap (global_game_variables_t *gvar) if (!compressed) continue; // the plane is not used in this game - dest = MEMPTR mapsegs[plane]; + dest = MEMPTRCONV mapsegs[plane]; MM_GetPtr(dest,size); lseek(maphandle,pos,SEEK_SET); @@ -2283,7 +2334,7 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) // MDM begin - (GAMERS EDGE) // -// if (!FindFile("EGAGRAPH."EXT,NULL,2)) +// if (!FindFile("EGAGRAPH.16",NULL,2)) // Quit (gvar, "CA_CacheMarks(): Can't find graphics files."); // // MDM end @@ -2312,7 +2363,7 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) if (dialog && updatecachebox) updatecachebox (); - pos = GRFILEPOS(i); + pos = GRFILEPOS(i,gvar); if (pos<0) continue; @@ -2320,7 +2371,7 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) while (GRFILEPOS(next) == -1) // skip past any sparse tiles next++; - compressed = GRFILEPOS(next)-pos; + compressed = GRFILEPOS(next,gvar)-pos; endpos = pos+compressed; if (compressed<=BUFFERSIZE) @@ -2343,10 +2394,10 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) if (next == NUMCHUNKS) continue; - nextpos = GRFILEPOS(next); - while (GRFILEPOS(++next) == -1) // skip past any sparse tiles + nextpos = GRFILEPOS(next,gvar); + while (GRFILEPOS(++next,gvar) == -1) // skip past any sparse tiles ; - nextendpos = GRFILEPOS(next); + nextendpos = GRFILEPOS(next,gvar); if (nextpos - endpos <= MAXEMPTYREAD && nextendpos-pos <= BUFFERSIZE) endpos = nextendpos; @@ -2354,8 +2405,8 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) next = NUMCHUNKS; // read pos to posend } - lseek(grhandle,pos,SEEK_SET); - CA_FarRead(grhandle,(gvar->mm.bufferseg),endpos-pos,gvar); + lseek(gvar->ca.file.grhandle,pos,SEEK_SET); + CA_FarRead(gvar->ca.file.grhandle,(gvar->mm.bufferseg),endpos-pos,gvar); bufferstart = pos; bufferend = endpos; source = bufferseg; @@ -2368,8 +2419,8 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) if (mmerror) return; MM_SetLock (&bigbufferseg,true); - lseek(grhandle,pos,SEEK_SET); - CA_FarRead(grhandle,bigbufferseg,compressed,gvar); + lseek(gvar->ca.file.grhandle,pos,SEEK_SET); + CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed,gvar); source = bigbufferseg; } @@ -2388,3 +2439,13 @@ void CAL_CacheMarks (char *title, global_game_variables_t *gvar) if (dialog && finishcachebox) finishcachebox(); }*/ + +void CA_CannotOpen(char *string, global_game_variables_t *gvar) +{ + char str[30]; + + strcpy(str,"Can't open "); + strcat(str,string); + strcat(str,"!\n"); + Quit (gvar, str); +}