OSDN Git Service

updated copyleft and need to test and fix newer version of open watcom
[proj16/16.git] / src / lib / 16_ca.c
index 762a6bb..1cc95aa 100755 (executable)
@@ -1,19 +1,23 @@
-/* Catacomb Apocalypse Source Code\r
- * Copyright (C) 1993-2014 Flat Rock Software\r
+/* Project 16 Source Code~\r
+ * Copyright (C) 2012-2022 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
- * This program is free software; you can redistribute it and/or modify\r
+ * This file is part of Project 16.\r
+ *\r
+ * Project 16 is free software; you can redistribute it and/or modify\r
  * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
+ * the Free Software Foundation; either version 3 of the License, or\r
  * (at your option) any later version.\r
  *\r
- * This program is distributed in the hope that it will be useful,\r
+ * Project 16 is distributed in the hope that it will be useful,\r
  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
  * GNU General Public License for more details.\r
  *\r
- * You should have received a copy of the GNU General Public License along\r
- * with this program; if not, write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
+ * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
+ * Fifth Floor, Boston, MA 02110-1301 USA.\r
+ *\r
  */\r
 \r
 // ID_CA.C\r
@@ -36,8 +40,9 @@ loaded into the data segment
 #pragma warn -pro\r
 #pragma warn -use\r
 \r
-//#define THREEBYTEGRSTARTS\r
+#define THREEBYTEGRSTARTS\r
 //https://github.com/open-watcom/open-watcom-v2/issues/279#issuecomment-244587566 for _seg\r
+//http://www.shikadi.net/moddingwiki/GameMaps_Format for info on the code\r
 /*\r
 =============================================================================\r
 \r
@@ -46,10 +51,10 @@ loaded into the data segment
 =============================================================================\r
 */\r
 \r
-typedef struct\r
+/*typedef struct\r
 {\r
   word bit0,bit1;      // 0-255 is a character, > is a pointer to a node\r
-} huffnode;\r
+} huffnode;*/\r
 \r
 \r
 /*typedef struct\r
@@ -97,16 +102,17 @@ extern     byte    EGAdict;
 extern byte    far     maphead;\r
 extern byte    mapdict;\r
 extern byte    far     audiohead;\r
-extern byte    audiodict;\r
+extern byte    audiodict;*/\r
 \r
+void CA_CannotOpen(char *string, global_game_variables_t *gvar);\r
 \r
-long           _seg *grstarts; // array of offsets in egagraph, -1 for sparse\r
+/*long         _seg *grstarts; // array of offsets in egagraph, -1 for sparse\r
 long           _seg *audiostarts;      // array of offsets in audio / audiot\r
 \r
 #ifdef GRHEADERLINKED\r
-huffnode       *grhuffman;\r
+huffnode       *gvar->ca.grhuffman;\r
 #else\r
-huffnode       grhuffman[255];\r
+huffnode       gvar->ca.grhuffman[255];\r
 #endif\r
 \r
 #ifdef AUDIOHEADERLINKED\r
@@ -119,9 +125,9 @@ huffnode    audiohuffman[255];
 int                    grhandle;               // handle to EGAGRAPH\r
 int                    maphandle;              // handle to MAPTEMP / GAMEMAPS\r
 int                    audiohandle;    // handle to AUDIOT / AUDIO\r
-\r
+*/\r
 long           chunkcomplen,chunkexplen;\r
-\r
+/*\r
 SDMode         oldsoundmode;\r
 \r
 \r
@@ -129,20 +135,21 @@ SDMode            oldsoundmode;
 void   CAL_DialogDraw (char *title,unsigned numcache);\r
 void   CAL_DialogUpdate (void);\r
 void   CAL_DialogFinish (void);*/\r
-//void CAL_CarmackExpand (unsigned far *source, unsigned far *dest,unsigned length);\r
+void   CAL_CarmackExpand (unsigned far *source, unsigned far *dest,\r
+               unsigned length);\r
 \r
 \r
-/*++++#ifdef THREEBYTEGRSTARTS\r
+#ifdef THREEBYTEGRSTARTS\r
 #define FILEPOSSIZE    3\r
 //#define      GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff)\r
-long GRFILEPOS(int c)\r
+CASVT GRFILEPOS(int c, global_game_variables_t *gvar)\r
 {\r
-       long value;\r
+       CASVT value;\r
        int     offset;\r
 \r
        offset = c*3;\r
 \r
-       value = *(long far *)(((byte far *)grstarts)+offset);\r
+       value = *(CASVT far *)(((byte far *)gvar->ca.grstarts)+offset);\r
 \r
        value &= 0x00ffffffl;\r
 \r
@@ -153,8 +160,14 @@ long GRFILEPOS(int c)
 };\r
 #else\r
 #define FILEPOSSIZE    4\r
-#define        GRFILEPOS(c) (grstarts[c])\r
-#endif*/\r
+//#define      GRFILEPOS(c) (gvar->ca.grstarts[c])\r
+CASVT GRFILEPOS(int c, global_game_variables_t *gvar)\r
+{\r
+       return gvar->ca.grstarts[c];\r
+}\r
+#endif\r
+\r
+//#define EXTENSION    "hp1"\r
 \r
 /*\r
 =============================================================================\r
@@ -202,13 +215,13 @@ void CA_CloseDebug(global_game_variables_t *gvar)
 =\r
 ============================\r
 */\r
-/*++++\r
-void CAL_GetGrChunkLength (int chunk)\r
+\r
+void CAL_GetGrChunkLength (int chunk,global_game_variables_t *gvar)\r
 {\r
-       lseek(grhandle,GRFILEPOS(chunk),SEEK_SET);\r
-       read(grhandle,&chunkexplen,sizeof(chunkexplen));\r
-       chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4;\r
-}*/\r
+       lseek(gvar->ca.file.grhandle,GRFILEPOS(chunk,gvar),SEEK_SET);\r
+       read(gvar->ca.file.grhandle,&gvar->ca.chunkexplen,sizeof(gvar->ca.chunkexplen));\r
+       gvar->ca.chunkcomplen = GRFILEPOS(chunk+1,gvar)-GRFILEPOS(chunk,gvar)-4;\r
+}\r
 \r
 \r
 /*\r
@@ -221,63 +234,51 @@ void CAL_GetGrChunkLength (int chunk)
 ==========================\r
 */\r
 \r
-boolean CA_FarRead(int handle, byte huge *dest, dword length, mminfo_t *mm)\r
+boolean CA_FarRead(int handle, byte far *dest, dword length, global_game_variables_t *gvar)\r
 {\r
-       boolean flag;\r
-       //dword fat=0;\r
-       //word segm=0;\r
-       if(mm->EMSVer<0x40)\r
-       if(length>0xfffflu)\r
-       {\r
-               printf("File is a fat bakapee\n");\r
-               //segm=(length%0xfffflu)-1;\r
-               //fat=segm*0xfffflu;\r
-               //length-=fat;\r
-               printf("CA_FarRead doesn't support 64K reads yet!\n");\r
-               return 0;//TODO: EXPAND!!!\r
-       }\r
-\r
-       //if(!fat&&!segm)\r
-       //{\r
-               __asm {\r
-                       push    ds\r
-                       mov     bx,[handle]\r
-                       mov     cx,[WORD PTR length]\r
-                       mov     dx,[WORD PTR dest]\r
-                       mov     ds,[WORD PTR dest+2]\r
-                       mov     ah,0x3f                         // READ w/handle\r
-                       int     21h\r
-                       pop     ds\r
-                       jnc     good\r
-                       mov     errno,ax\r
-                       mov     flag,0\r
-                       jmp End\r
+       boolean flag=0;\r
+       if (length>0xfffflu)\r
+               Quit (gvar, "CA_FarRead doesn't support 64K reads yet!");//TODO: EXPAND!!!\r
+\r
+       __asm {\r
+               push    ds\r
+               mov     bx,[handle]\r
+               mov     cx,[WORD PTR length]\r
+               mov     dx,[WORD PTR dest]\r
+               mov     ds,[WORD PTR dest+2]\r
+               mov     ah,0x3f                         // READ w/handle\r
+               int     21h\r
+               pop     ds\r
+               jnc     good\r
+               mov     errno,ax\r
+               mov     flag,0\r
+               jmp End\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 good:\r
 #ifdef __BORLANDC__\r
-               __asm {\r
+       __asm {\r
 #endif\r
-                       cmp     ax,[WORD PTR length]\r
-                       je      done\r
-//                     errno = EINVFMT;                        // user manager knows this is bad read\r
-                       mov     flag,0\r
-                       jmp End\r
+               cmp     ax,[WORD PTR length]\r
+               je      done\r
+//             errno = EINVFMT;                        // user manager knows this is bad read\r
+               mov     flag,0\r
+               jmp End\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 done:\r
 #ifdef __BORLANDC__\r
-               __asm {\r
+       __asm {\r
 #endif\r
-                       mov     flag,1\r
+               mov     flag,1\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 End:\r
 #ifdef __WATCOMC__\r
-               }\r
+       }\r
 #endif\r
        return flag;\r
 }\r
@@ -286,70 +287,58 @@ End:
 /*\r
 ==========================\r
 =\r
-= CA_SegWrite\r
+= CA_FarWrite\r
 =\r
 = Write from a file to a far pointer\r
 =\r
 ==========================\r
 */\r
 \r
-boolean CA_FarWrite(int handle, byte huge *source, dword length, mminfo_t *mm)\r
+boolean CA_FarWrite(int handle, byte far *source, dword length, global_game_variables_t *gvar)\r
 {\r
-       boolean flag;\r
-       //dword fat=0;\r
-       //word segm=0;\r
-       if(mm->EMSVer<0x40)\r
-       if(length>0xfffflu)\r
-       {\r
-               printf("File is a fat bakapee\n");\r
-               //segm=(length%0xfffflu)-1;\r
-               //fat=segm*0xfffflu;\r
-               //length-=fat;\r
-               printf("CA_FarRead doesn't support 64K reads yet!\n");\r
-               return 0;\r
-       }\r
-\r
-       //if(!fat&&!segm)\r
-       //{\r
-               __asm {\r
-                       push    ds\r
-                       mov     bx,[handle]\r
-                       mov     cx,[WORD PTR length]\r
-                       mov     dx,[WORD PTR source]\r
-                       mov     ds,[WORD PTR source+2]\r
-                       mov     ah,0x40                 // WRITE w/handle\r
-                       int     21h\r
-                       pop     ds\r
-                       jnc     good\r
-                       mov     errno,ax\r
-                       mov flag,0\r
-                       jmp End\r
+       boolean flag=0;\r
+       if (length>0xfffflu)\r
+               Quit (gvar, "CA_FarWrite doesn't support 64K reads yet!");//TODO: EXPAND!!!\r
+\r
+       __asm {\r
+               push    ds\r
+               mov     bx,[handle]\r
+               mov     cx,[WORD PTR length]\r
+               mov     dx,[WORD PTR source]\r
+               mov     ds,[WORD PTR source+2]\r
+               mov     ah,0x40                 // WRITE w/handle\r
+               int     21h\r
+               pop     ds\r
+               jnc     good\r
+               mov     errno,ax\r
+               mov flag,0\r
+               jmp End\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 good:\r
 #ifdef __BORLANDC__\r
-               __asm {\r
+       __asm {\r
 #endif\r
-                       cmp     ax,[WORD PTR length]\r
-                       je      done\r
-                       //errno = ENOMEM;                               // user manager knows this is bad write\r
-                       mov     flag,0\r
-                       jmp End\r
+               cmp     ax,[WORD PTR length]\r
+               je      done\r
+//             errno = ENOMEM;                         // user manager knows this is bad write\r
+               mov     flag,0\r
+               jmp End\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 done:\r
 #ifdef __BORLANDC__\r
-               __asm {\r
+       __asm {\r
 #endif\r
-                       mov     flag,1\r
+               mov     flag,1\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
 End:\r
 #ifdef __WATCOMC__\r
-               }\r
+       }\r
 #endif\r
        return flag;\r
 }\r
@@ -365,7 +354,7 @@ End:
 ==========================\r
 */\r
 \r
-boolean CA_ReadFile(char *filename, memptr *ptr, mminfo_t *mm)\r
+boolean CA_ReadFile(char *filename, memptr *ptr, global_game_variables_t *gvar)\r
 {\r
        int handle;\r
        sdword size;\r
@@ -375,12 +364,23 @@ boolean CA_ReadFile(char *filename, memptr *ptr, mminfo_t *mm)
                return false;\r
 \r
        size = filelength(handle);\r
-       if(!CA_FarRead(handle,*ptr,size, mm))\r
+#ifdef __DEBUG_CA__\r
+       if(dbg_debugca>0){\r
+               printf("===============================================================================\n");\r
+               printf("                CA_ReadFile\n");\r
+               printf("===============================================================================\n");\r
+               //%04x\r
+               printf("        ptr=%Fp\n", ptr);\r
+               printf("        *ptr=%Fp\n", *ptr);\r
+               printf("        &ptr=%Fp\n", &ptr);\r
+       }\r
+#endif\r
+       if(!CA_FarRead(handle,*ptr,size, gvar))\r
        {\r
-               close (handle);\r
+               close(handle);\r
                return false;\r
        }\r
-       close (handle);\r
+       close(handle);\r
        return true;\r
 }\r
 \r
@@ -395,10 +395,10 @@ boolean CA_ReadFile(char *filename, memptr *ptr, mminfo_t *mm)
 ==========================\r
 */\r
 \r
-boolean CA_WriteFile (char *filename, void far *ptr, long length, mminfo_t *mm)\r
+boolean CA_WriteFile (char *filename, void far *ptr, long length, global_game_variables_t *gvar)\r
 {\r
        int handle;\r
-       sdword size;\r
+       //sdword size;\r
        //long size;\r
 \r
        handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,\r
@@ -407,7 +407,7 @@ boolean CA_WriteFile (char *filename, void far *ptr, long length, mminfo_t *mm)
        if (handle == -1)\r
                return false;\r
 \r
-       if (!CA_FarWrite (handle,ptr,length, mm))\r
+       if (!CA_FarWrite (handle,ptr,length, gvar))\r
        {\r
                close(handle);\r
                return false;\r
@@ -428,7 +428,7 @@ boolean CA_WriteFile (char *filename, void far *ptr, long length, mminfo_t *mm)
 ==========================\r
 */\r
 \r
-boolean CA_LoadFile(char *filename, memptr *ptr, mminfo_t *mm, mminfotype *mmi)\r
+boolean CA_LoadFile(char *filename, memptr *ptr, global_game_variables_t *gvar)\r
 {\r
        int handle;\r
        sdword size;\r
@@ -437,9 +437,30 @@ boolean CA_LoadFile(char *filename, memptr *ptr, mminfo_t *mm, mminfotype *mmi)
        if((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
                return false;\r
 \r
-       size = filelength (handle);\r
-       MM_GetPtr(ptr,size, mm, mmi);\r
-       if(!CA_FarRead(handle,*ptr,size, mm))\r
+       size = filelength(handle);\r
+#ifdef __DEBUG_CA__\r
+       if(dbg_debugca>0){\r
+               printf("===============================================================================\n");\r
+               printf("                CA_LoadFile\n");\r
+               printf("===============================================================================\n");\r
+               //%04x\r
+               printf("        ptr=%Fp\n", ptr);\r
+               printf("        *ptr=%Fp\n", *ptr);\r
+               printf("        &ptr=%Fp\n", &ptr);\r
+       }\r
+#endif\r
+       MM_GetPtr(ptr,size, gvar);\r
+#ifdef __DEBUG_CA__\r
+       if(dbg_debugca>0){\r
+               //%04x\r
+               printf("---------------------------------------\n");\r
+               printf("        ptr=%Fp\n", ptr);\r
+               printf("        *ptr=%Fp\n", *ptr);\r
+               printf("        &ptr=%Fp\n", &ptr);\r
+               printf("-------------------------------------------------------------------------------\n");\r
+       }\r
+#endif\r
+       if(!CA_FarRead(handle,*ptr,size, gvar))\r
        {\r
                close(handle);\r
                return false;\r
@@ -498,15 +519,15 @@ void CAL_OptimizeNodes(huffnode *table)
 ======================\r
 */\r
 \r
-void CAL_HuffExpand (byte huge *source, byte huge *dest,\r
+void CAL_HuffExpand (byte far *source, byte far *dest,\r
   long length,huffnode *hufftable)\r
 {\r
 //  unsigned bit,byte,node,code;\r
   unsigned sourceseg,sourceoff,destseg,destoff,endoff;\r
-  huffnode *headptr;\r
+       huffnode *headptr;\r
 //  huffnode *nodeon;\r
 \r
-  headptr = hufftable+254;     // head node is allways node 254\r
+       headptr = hufftable+254;        // head node is allways node 254\r
 \r
   source++;    // normalize\r
   source--;\r
@@ -533,7 +554,7 @@ void CAL_HuffExpand (byte huge *source, byte huge *dest,
 //--------------------------\r
 \r
        __asm {\r
-////           mov     bx,[headptr]\r
+               mov     bx,[word ptr headptr]\r
 \r
                mov     si,[sourceoff]\r
                mov     di,[destoff]\r
@@ -597,7 +618,7 @@ storebyteshort:
 #endif\r
                mov     [es:di],dl\r
                inc     di                                      // write a decopmpressed byte out\r
-////           mov     bx,[headptr]            // back to the head node for next bit\r
+               mov     bx,[word ptr headptr]           // back to the head node for next bit\r
 \r
                cmp     di,ax                           // done?\r
                jne     expandshort\r
@@ -613,7 +634,7 @@ storebyteshort:
   length--;\r
 \r
        __asm {\r
-////           mov     bx,[headptr]\r
+               mov     bx,[word ptr headptr]\r
                mov     cl,1\r
 \r
                mov     si,[sourceoff]\r
@@ -685,7 +706,7 @@ storebyte:
 #endif\r
                mov     [es:di],dl\r
                inc     di              // write a decopmpressed byte out\r
-////           mov     bx,[headptr]    // back to the head node for next bit\r
+               mov     bx,[word ptr headptr]   // back to the head node for next bit\r
 \r
                cmp     di,0x10         // normalize es:di\r
                jb      dinorm\r
@@ -795,12 +816,12 @@ void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned lengt
 ======================\r
 */\r
 \r
-long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,\r
+long CA_RLEWCompress (unsigned far *source, long length, unsigned far *dest,\r
   unsigned rlewtag)\r
 {\r
   long complength;\r
   unsigned value,count,i;\r
-  unsigned huge *start,huge *end;\r
+  unsigned far *start,far *end;\r
 \r
   start = dest;\r
 \r
@@ -852,11 +873,11 @@ long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
 ======================\r
 */\r
 \r
-void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,\r
+void CA_RLEWexpand (unsigned far *source, unsigned far *dest,long length,\r
   unsigned rlewtag)\r
 {\r
 //  unsigned value,count,i;\r
-  unsigned huge *end;\r
+  unsigned far *end;\r
   unsigned sourceseg,sourceoff,destseg,destoff,endseg,endoff;\r
 \r
 \r
@@ -902,7 +923,7 @@ void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
 //\r
 // NOTE: A repeat count that produces 0xfff0 bytes can blow this!\r
 //\r
-       __asm{\r
+       __asm {\r
                mov     bx,rlewtag\r
                mov     si,sourceoff\r
                mov     di,destoff\r
@@ -1001,24 +1022,21 @@ dinorm:
 =\r
 ======================\r
 */\r
-////++++ enable!\r
-/*void CAL_SetupGrFile (void)\r
+\r
+void CAL_SetupGrFile (global_game_variables_t *gvar)\r
 {\r
+       char fname[13];\r
        int handle;\r
+#if NUMPICS>0\r
        memptr compseg;\r
+#endif\r
 \r
 #ifdef GRHEADERLINKED\r
 \r
-#if GRMODE == EGAGR\r
-       grhuffman = (huffnode *)&EGAdict;\r
-       grstarts = (long _seg *)FP_SEG(&EGAhead);\r
-#endif\r
-#if GRMODE == CGAGR\r
-       grhuffman = (huffnode *)&CGAdict;\r
-       grstarts = (long _seg *)FP_SEG(&CGAhead);\r
-#endif\r
+       gvar->ca.grhuffman = (huffnode *)&VGAdict;\r
+       grstarts = (long _seg *)FP_SEG(&VGAhead);\r
 \r
-       CAL_OptimizeNodes (grhuffman);\r
+       CAL_OptimizeNodes (gvar->ca.grhuffman);\r
 \r
 #else\r
 \r
@@ -1026,23 +1044,29 @@ dinorm:
 // load ???dict.ext (huffman dictionary for graphics files)\r
 //\r
 \r
-       if ((handle = open(GREXT"DICT."EXT,\r
+       strcpy(fname,GDICTNAME);\r
+       strcat(fname,"hp1");\r
+\r
+       if ((handle = open(fname,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open "GREXT"DICT."EXT"!");\r
+               CA_CannotOpen(fname,gvar);\r
 \r
-       read(handle, &grhuffman, sizeof(grhuffman));\r
+       read(handle, &gvar->ca.grhuffman, sizeof(gvar->ca.grhuffman));\r
        close(handle);\r
-       CAL_OptimizeNodes (grhuffman);\r
+       CAL_OptimizeNodes (gvar->ca.grhuffman);\r
 //\r
 // load the data offsets from ???head.ext\r
 //\r
-       MM_GetPtr (&(memptr)grstarts,(NUMCHUNKS+1)*FILEPOSSIZE);\r
+       MM_GetPtr (MEMPTRCONV gvar->ca.grstarts,(NUMCHUNKS+1)*FILEPOSSIZE, gvar);\r
 \r
-       if ((handle = open(GREXT"HEAD."EXT,\r
+       strcpy(fname,GHEADNAME);\r
+       strcat(fname,"hp1");\r
+\r
+       if ((handle = open(fname,\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open "GREXT"HEAD."EXT"!");\r
+               CA_CannotOpen(fname,gvar);\r
 \r
-       CA_FarRead(handle, (memptr)grstarts, (NUMCHUNKS+1)*FILEPOSSIZE);\r
+       CA_FarRead(handle, (memptr)gvar->ca.grstarts, (NUMCHUNKS+1)*FILEPOSSIZE, gvar);\r
 \r
        close(handle);\r
 \r
@@ -1052,42 +1076,48 @@ dinorm:
 //\r
 // Open the graphics file, leaving it open until the game is finished\r
 //\r
-       grhandle = open(GREXT"GRAPH."EXT, O_RDONLY | O_BINARY);\r
-       if (grhandle == -1)\r
-               Quit ("Cannot open "GREXT"GRAPH."EXT"!");\r
+       strcpy(fname,GFILENAME);\r
+       strcat(fname,"hp1");\r
+\r
+       gvar->ca.file.grhandle = open(fname, O_RDONLY | O_BINARY);\r
+       if (gvar->ca.file.grhandle == -1)\r
+               CA_CannotOpen(fname,gvar);\r
 \r
 \r
 //\r
 // load the pic and sprite headers into the arrays in the data segment\r
 //\r
 #if NUMPICS>0\r
-       MM_GetPtr(&(memptr)pictable,NUMPICS*sizeof(pictabletype));\r
-       CAL_GetGrChunkLength(STRUCTPIC);                // position file pointer\r
-       MM_GetPtr(&compseg,chunkcomplen);\r
-       CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)pictable,NUMPICS*sizeof(pictabletype),grhuffman);\r
-       MM_FreePtr(&compseg);\r
+       MM_GetPtr(MEMPTRCONV gvar->video.pictable,NUMPICS*sizeof(pictabletype),gvar);\r
+       CAL_GetGrChunkLength(STRUCTPIC,gvar);           // position file pointer\r
+       printf("CAL_SetupGrFile:\n");\r
+       printf("        gvar->ca.chunkcomplen size is %lu\n", gvar->ca.chunkcomplen);\r
+       MM_GetPtr(MEMPTRANDPERCONV compseg,gvar->ca.chunkcomplen,gvar);                                                         IN_Ack(gvar);\r
+       CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen,gvar);\r
+       CAL_HuffExpand (compseg, (byte far *)gvar->video.pictable,NUMPICS*sizeof(pictabletype),gvar->ca.grhuffman);\r
+       MM_FreePtr(MEMPTRANDPERCONV compseg,gvar);\r
 #endif\r
 \r
-#if NUMPICM>0\r
-       MM_GetPtr(&(memptr)picmtable,NUMPICM*sizeof(pictabletype));\r
+#if 0\r
+       //NUMPICM>0\r
+       MM_GetPtr(MEMPTRCONV picmtable,NUMPICM*sizeof(pictabletype));\r
        CAL_GetGrChunkLength(STRUCTPICM);               // position file pointer\r
-       MM_GetPtr(&compseg,chunkcomplen);\r
-       CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)picmtable,NUMPICS*sizeof(pictabletype),grhuffman);\r
+       MM_GetPtr(&compseg,gvar->ca.chunkcomplen);\r
+       CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen);\r
+       CAL_HuffExpand (compseg, (byte far *)picmtable,NUMPICS*sizeof(pictabletype),gvar->ca.grhuffman);\r
        MM_FreePtr(&compseg);\r
-#endif\r
+//#endif\r
 \r
-#if NUMSPRITES>0\r
-       MM_GetPtr(&(memptr)spritetable,NUMSPRITES*sizeof(spritetabletype));\r
+//#if NUMSPRITES>0\r
+       MM_GetPtr(MEMPTRCONV spritetable,NUMSPRITES*sizeof(spritetabletype));\r
        CAL_GetGrChunkLength(STRUCTSPRITE);     // position file pointer\r
-       MM_GetPtr(&compseg,chunkcomplen);\r
-       CA_FarRead (grhandle,compseg,chunkcomplen);\r
-       CAL_HuffExpand (compseg, (byte huge *)spritetable,NUMSPRITES*sizeof(spritetabletype),grhuffman);\r
+       MM_GetPtr(&compseg,gvar->ca.chunkcomplen);\r
+       CA_FarRead (gvar->ca.file.grhandle,compseg,gvar->ca.chunkcomplen);\r
+       CAL_HuffExpand (compseg, (byte far *)spritetable,NUMSPRITES*sizeof(spritetabletype),gvar->ca.grhuffman);\r
        MM_FreePtr(&compseg);\r
 #endif\r
 \r
-}*/\r
+}\r
 \r
 //==========================================================================\r
 \r
@@ -1102,44 +1132,44 @@ dinorm:
 \r
 void CAL_SetupMapFile (global_game_variables_t *gvar)\r
 {\r
+#ifndef MAPHEADERLINKED\r
        int handle;\r
        long length;\r
+#endif\r
 \r
 //\r
 // load maphead.ext (offsets and tileinfo for map file)\r
 //\r
-// #ifndef MAPHEADERLINKED\r
-//     if ((handle = open("MAPHEAD."EXT,\r
-//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-//             Quit ("Can't open MAPHEAD."EXT"!");\r
-//     length = filelength(handle);\r
-//     MM_GetPtr (&(memptr)tinf,length);\r
-//     CA_FarRead(handle, tinf, length);\r
-//     close(handle);\r
-// //#else\r
-//\r
-//     tinf = (byte _seg *)FP_SEG(&maphead);\r
-//\r
-// #endif\r
+#ifndef MAPHEADERLINKED\r
+       if ((handle = open("maphead.mph",\r
+                O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+               Quit (gvar, "Can't open maphead.mph");\r
+       length = filelength(handle);\r
+       MM_GetPtr (MEMPTRCONV gvar->ca.tinf,length,gvar);\r
+       CA_FarRead(handle, gvar->ca.tinf, length,gvar);\r
+       close(handle);\r
+#else\r
+\r
+       gvar->ca.tinf = (byte _seg *)FP_SEG(&maphead);\r
+\r
+#endif\r
 \r
 //\r
 // open the data file\r
 //\r
 //TODO: multiple files\r
-       if ((gvar->ca.file.maphandle[0] = open("data/test.map",\r
+       if ((gvar->ca.file.maphandle = open("data/test.map",\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-       {\r
-               printf("Can't open data/test.map!");\r
-       }\r
-// #ifdef MAPHEADERLINKED\r
-//     if ((maphandle = open("GAMEMAPS."EXT,\r
-//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-//             Quit ("Can't open GAMEMAPS."EXT"!");\r
-// //#else\r
-//     if ((maphandle = open("MAPTEMP."EXT,\r
-//              O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-//             Quit ("Can't open MAPTEMP."EXT"!");\r
-// #endif\r
+               Quit (gvar, "Can't open data/test.map!");\r
+/*#ifdef MAPHEADERLINKED\r
+       if ((maphandle = open("GAMEMAPS.16"ENSION,\r
+                O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+               Quit (gvar, "Can't open GAMEMAPS.16"ENSION"!");\r
+#else\r
+       if ((maphandle = open("MAPTEMP.16"ENSION,\r
+                O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
+               Quit (gvar, "Can't open MAPTEMP.16"ENSION"!");\r
+#endif*/\r
 }\r
 \r
 //==========================================================================\r
@@ -1162,11 +1192,11 @@ void CAL_SetupMapFile (global_game_variables_t *gvar)
 // load maphead.ext (offsets and tileinfo for map file)\r
 //\r
 #ifndef AUDIOHEADERLINKED\r
-       if ((handle = open("AUDIOHED."EXT,\r
+       if ((handle = open("AUDIOHED.16",\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIOHED."EXT"!");\r
+               Quit (gvar, "Can't open AUDIOHED.16""!");\r
        length = filelength(handle);\r
-       MM_GetPtr (&(memptr)audiostarts,length);\r
+       MM_GetPtr (MEMPTRCONV audiostarts,length);\r
        CA_FarRead(handle, (byte far *)audiostarts, length);\r
        close(handle);\r
 #else\r
@@ -1179,13 +1209,13 @@ void CAL_SetupMapFile (global_game_variables_t *gvar)
 // open the data file\r
 //\r
 #ifndef AUDIOHEADERLINKED\r
-       if ((audiohandle = open("AUDIOT."EXT,\r
+       if ((audiohandle = open("AUDIOT.16",\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIOT."EXT"!");\r
+               Quit (gvar, "Can't open AUDIOT.16""!");\r
 #else\r
-       if ((audiohandle = open("AUDIO."EXT,\r
+       if ((audiohandle = open("AUDIO.16",\r
                 O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
-               Quit ("Can't open AUDIO."EXT"!");\r
+               Quit (gvar, "Can't open AUDIO.16""!");\r
 #endif\r
 }*/\r
 \r
@@ -1215,6 +1245,7 @@ void CA_Startup(global_game_variables_t *gvar)
 #endif\r
 #endif//profile\r
 \r
+#ifdef SHOWMEMINFO\r
 #ifdef __BORLANDC__\r
        unlink("meminfo.16b");\r
        gvar->handle.showmemhandle = open("meminfo.16b", O_CREAT | O_WRONLY | O_TEXT);\r
@@ -1223,11 +1254,18 @@ void CA_Startup(global_game_variables_t *gvar)
        unlink("meminfo.16w");\r
        gvar->handle.showmemhandle = open("meminfo.16w", O_CREAT | O_WRONLY | O_TEXT);\r
 #endif\r
-/*\r
-       CAL_SetupGrFile ();\r
-       CAL_SetupAudioFile ();*/\r
+#endif\r
+\r
 \r
+#ifndef NOMAPS\r
        CAL_SetupMapFile (gvar);\r
+#endif\r
+#ifndef NOGRAPHICS\r
+       CAL_SetupGrFile (gvar);\r
+#endif\r
+#ifndef NOAUDIO\r
+       CAL_SetupMapFile (gvar);\r
+#endif\r
 \r
        gvar->ca.mapon = -1;\r
        gvar->ca.ca_levelbit = 1;\r
@@ -1256,12 +1294,13 @@ void CA_Shutdown(global_game_variables_t *gvar)
 #ifdef PROFILE\r
        close(gvar->handle.profilehandle);\r
 #endif\r
+#ifdef SHOWMEMINFO\r
        close(gvar->handle.showmemhandle);\r
+#endif\r
 \r
-       close(*(gvar->ca.file.maphandle));\r
-/*++++\r
-       close(grhandle);\r
-       close(audiohandle);*/\r
+       close(gvar->ca.file.maphandle);\r
+       close(gvar->ca.file.grhandle);\r
+       close(gvar->ca.file.audiohandle);\r
 }\r
 \r
 //===========================================================================\r
@@ -1285,14 +1324,14 @@ void CA_CacheAudioChunk (int chunk)
 \r
        if (audiosegs[chunk])\r
        {\r
-               MM_SetPurge (&(memptr)audiosegs[chunk],0);\r
+               MM_SetPurge (MEMPTRCONV audiosegs[chunk],0);\r
                return;                                                 // allready in memory\r
        }\r
 \r
 // MDM begin - (GAMERS EDGE)\r
 //\r
-       if (!FindFile("AUDIO."EXT,NULL,2))\r
-               Quit("CA_CacheAudioChunk(): Can't find audio files.");\r
+       if (!FindFile("AUDIO.16",NULL,2))\r
+               Quit (gvar, "CA_CacheAudioChunk(): Can't find audio files.");\r
 //\r
 // MDM end\r
 \r
@@ -1307,7 +1346,7 @@ void CA_CacheAudioChunk (int chunk)
 \r
 #ifndef AUDIOHEADERLINKED\r
 \r
-       MM_GetPtr (&(memptr)audiosegs[chunk],compressed);\r
+       MM_GetPtr (MEMPTRCONV audiosegs[chunk],compressed);\r
        if (mmerror)\r
                return;\r
 \r
@@ -1332,7 +1371,7 @@ void CA_CacheAudioChunk (int chunk)
 \r
        expanded = *(long far *)source;\r
        source += 4;                    // skip over length\r
-       MM_GetPtr (&(memptr)audiosegs[chunk],expanded);\r
+       MM_GetPtr (MEMPTRCONV audiosegs[chunk],expanded);\r
        if (mmerror)\r
                goto done;\r
        CAL_HuffExpand (source,audiosegs[chunk],expanded,audiohuffman);\r
@@ -1373,7 +1412,7 @@ void CA_LoadAllSounds (void)
 \r
        for (i=0;i<NUMSOUNDS;i++,start++)\r
                if (audiosegs[start])\r
-                       MM_SetPurge (&(memptr)audiosegs[start],3);              // make purgable\r
+                       MM_SetPurge (MEMPTRCONV audiosegs[start],3);            // make purgable\r
 \r
 cachein:\r
 \r
@@ -1397,7 +1436,7 @@ cachein:
 \r
 //===========================================================================\r
 \r
-//++++#if GRMODE == EGAGR\r
+//????#if GRMODE == EGAGR\r
 \r
 /*\r
 ======================\r
@@ -1413,94 +1452,117 @@ unsigned       static  sheight,swidth;
 boolean static dothemask;\r
 \r
 void CAL_ShiftSprite (unsigned segment,unsigned source,unsigned dest,\r
-       unsigned width, unsigned height, unsigned pixshift, boolean domask)\r
+       unsigned width, unsigned height, unsigned pixshift, boolean domask, global_game_variables_t *gvar)\r
 {\r
 \r
        sheight = height;               // because we are going to reassign bp\r
        swidth = width;\r
        dothemask = domask;\r
 \r
-asm    mov     ax,[segment]\r
-asm    mov     ds,ax           // source and dest are in same segment, and all local\r
+       __asm {\r
+               mov     ax,[segment]\r
+               mov     ds,ax           // source and dest are in same segment, and all local\r
 \r
-asm    mov     bx,[source]\r
-asm    mov     di,[dest]\r
+               mov     bx,[source]\r
+               mov     di,[dest]\r
 \r
-asm    mov     bp,[pixshift]\r
-asm    shl     bp,1\r
-asm    mov     bp,WORD PTR [shifttabletable+bp]        // bp holds pointer to shift table\r
+               mov     bp,[pixshift]\r
+               shl     bp,1\r
+               mov     bp,WORD PTR [shifttabletable+bp]        // bp holds pointer to shift table\r
+//             mov     bp,WORD PTR [gvar->video.shifttabletable+bp]    // bp holds pointer to shift table\r
 \r
-asm    cmp     [ss:dothemask],0\r
-asm    je              skipmask\r
+               cmp     [ss:dothemask],0\r
+               je              skipmask\r
 \r
 //\r
 // table shift the mask\r
 //\r
-asm    mov     dx,[ss:sheight]\r
-\r
+               mov     dx,[ss:sheight]\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 domaskrow:\r
-\r
-asm    mov     BYTE PTR [di],255       // 0xff first byte\r
-asm    mov     cx,ss:[swidth]\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     BYTE PTR [di],255       // 0xff first byte\r
+               mov     cx,ss:[swidth]\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 domaskbyte:\r
-\r
-asm    mov     al,[bx]                         // source\r
-asm    not     al\r
-asm    inc     bx                                      // next source byte\r
-asm    xor     ah,ah\r
-asm    shl     ax,1\r
-asm    mov     si,ax\r
-asm    mov     ax,[bp+si]                      // table shift into two bytes\r
-asm    not     ax\r
-asm    and     [di],al                         // and with first byte\r
-asm    inc     di\r
-asm    mov     [di],ah                         // replace next byte\r
-\r
-asm    loop    domaskbyte\r
-\r
-asm    inc     di                                      // the last shifted byte has 1s in it\r
-asm    dec     dx\r
-asm    jnz     domaskrow\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     al,[bx]                         // source\r
+               not     al\r
+               inc     bx                                      // next source byte\r
+               xor     ah,ah\r
+               shl     ax,1\r
+               mov     si,ax\r
+               mov     ax,[bp+si]                      // table shift into two bytes\r
+               not     ax\r
+               and     [di],al                         // and with first byte\r
+               inc     di\r
+               mov     [di],ah                         // replace next byte\r
+\r
+               loop    domaskbyte\r
+\r
+               inc     di                                      // the last shifted byte has 1s in it\r
+               dec     dx\r
+               jnz     domaskrow\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 skipmask:\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
 //\r
 // table shift the data\r
 //\r
-asm    mov     dx,ss:[sheight]\r
-asm    shl     dx,1\r
-asm    shl     dx,1                            // four planes of data\r
-\r
+               mov     dx,ss:[sheight]\r
+               shl     dx,1\r
+               shl     dx,1                            // four planes of data\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 dodatarow:\r
-\r
-asm    mov     BYTE PTR [di],0         // 0 first byte\r
-asm    mov     cx,ss:[swidth]\r
-\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     BYTE PTR [di],0         // 0 first byte\r
+               mov     cx,ss:[swidth]\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
 dodatabyte:\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     al,[bx]                         // source\r
+               inc     bx                                      // next source byte\r
+               xor     ah,ah\r
+               shl     ax,1\r
+               mov     si,ax\r
+               mov     ax,[bp+si]                      // table shift into two bytes\r
+               or      [di],al                         // or with first byte\r
+               inc     di\r
+               mov     [di],ah                         // replace next byte\r
 \r
-asm    mov     al,[bx]                         // source\r
-asm    inc     bx                                      // next source byte\r
-asm    xor     ah,ah\r
-asm    shl     ax,1\r
-asm    mov     si,ax\r
-asm    mov     ax,[bp+si]                      // table shift into two bytes\r
-asm    or      [di],al                         // or with first byte\r
-asm    inc     di\r
-asm    mov     [di],ah                         // replace next byte\r
-\r
-asm    loop    dodatabyte\r
+               loop    dodatabyte\r
 \r
-asm    inc     di                                      // the last shifted byte has 0s in it\r
-asm    dec     dx\r
-asm    jnz     dodatarow\r
+               inc     di                                      // the last shifted byte has 0s in it\r
+               dec     dx\r
+               jnz     dodatarow\r
 \r
 //\r
 // done\r
 //\r
 \r
-asm    mov     ax,ss                           // restore data segment\r
-asm    mov     ds,ax\r
+               mov     ax,ss                           // restore data segment\r
+               mov     ds,ax\r
+       }\r
 \r
 }\r
 \r
@@ -1518,7 +1580,7 @@ asm       mov     ds,ax
 ======================\r
 */\r
 /*++++\r
-void CAL_CacheSprite (int chunk, byte far *compressed)\r
+void CAL_CacheSprite (int chunk, byte far *compressed, global_game_variables_t *gvar)\r
 {\r
        int i;\r
        unsigned shiftstarts[5];\r
@@ -1526,11 +1588,12 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
        spritetabletype far *spr;\r
        spritetype _seg *dest;\r
 \r
-#if GRMODE == CGAGR\r
+#if 0\r
+//GRMODE == CGAGR\r
 //\r
 // CGA has no pel panning, so shifts are never needed\r
 //\r
-       spr = &spritetable[chunk-STARTSPRITES];\r
+       spr = &gvar->video.spritetable[chunk-STARTSPRITES];\r
        smallplane = spr->width*spr->height;\r
        MM_GetPtr (&grsegs[chunk],smallplane*2+MAXSHIFTS*6);\r
        if (mmerror)\r
@@ -1543,17 +1606,17 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
 //\r
 // expand the unshifted shape\r
 //\r
-       CAL_HuffExpand (compressed, &dest->data[0],smallplane*2,grhuffman);\r
+       CAL_HuffExpand (compressed, &dest->data[0],smallplane*2,gvar->ca.grhuffman);\r
 \r
 #endif\r
 \r
 \r
-#if GRMODE == EGAGR\r
+//#if GRMODE == EGAGR\r
 \r
 //\r
 // calculate sizes\r
 //\r
-       spr = &spritetable[chunk-STARTSPRITES];\r
+       spr = &gvar->video.spritetable[chunk-STARTSPRITES];\r
        smallplane = spr->width*spr->height;\r
        bigplane = (spr->width+1)*spr->height;\r
 \r
@@ -1564,15 +1627,15 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
        shiftstarts[4] = shiftstarts[3] + bigplane*5;   // nothing ever put here\r
 \r
        expanded = shiftstarts[spr->shifts];\r
-       MM_GetPtr (&grsegs[chunk],expanded);\r
-       if (mmerror)\r
+       MM_GetPtr (MEMPTRCONV gvar->ca.grsegs[chunk],expanded, gvar);\r
+       if (gvar->mm.mmerror)\r
                return;\r
-       dest = (spritetype _seg *)grsegs[chunk];\r
+       dest = (spritetype _seg *)gvar->ca.grsegs[chunk];\r
 \r
 //\r
 // expand the unshifted shape\r
 //\r
-       CAL_HuffExpand (compressed, &dest->data[0],smallplane*5,grhuffman);\r
+       CAL_HuffExpand (compressed, &dest->data[0],smallplane*5,gvar->ca.grhuffman);\r
 \r
 //\r
 // make the shifts!\r
@@ -1601,8 +1664,8 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
                        dest->planesize[i] = bigplane;\r
                        dest->width[i] = spr->width+1;\r
                }\r
-               CAL_ShiftSprite ((unsigned)grsegs[chunk],dest->sourceoffset[0],\r
-                       dest->sourceoffset[2],spr->width,spr->height,4,true);\r
+               CAL_ShiftSprite ((unsigned)gvar->ca.grsegs[chunk],dest->sourceoffset[0],\r
+                       dest->sourceoffset[2],spr->width,spr->height,4,true,gvar);\r
                break;\r
 \r
        case    4:\r
@@ -1613,28 +1676,28 @@ void CAL_CacheSprite (int chunk, byte far *compressed)
                dest->sourceoffset[1] = shiftstarts[1];\r
                dest->planesize[1] = bigplane;\r
                dest->width[1] = spr->width+1;\r
-               CAL_ShiftSprite ((unsigned)grsegs[chunk],dest->sourceoffset[0],\r
-                       dest->sourceoffset[1],spr->width,spr->height,2,true);\r
+               CAL_ShiftSprite ((unsigned)gvar->ca.grsegs[chunk],dest->sourceoffset[0],\r
+                       dest->sourceoffset[1],spr->width,spr->height,2,true,gvar);\r
 \r
                dest->sourceoffset[2] = shiftstarts[2];\r
                dest->planesize[2] = bigplane;\r
                dest->width[2] = spr->width+1;\r
-               CAL_ShiftSprite ((unsigned)grsegs[chunk],dest->sourceoffset[0],\r
-                       dest->sourceoffset[2],spr->width,spr->height,4,true);\r
+               CAL_ShiftSprite ((unsigned)gvar->ca.grsegs[chunk],dest->sourceoffset[0],\r
+                       dest->sourceoffset[2],spr->width,spr->height,4,true,gvar);\r
 \r
                dest->sourceoffset[3] = shiftstarts[3];\r
                dest->planesize[3] = bigplane;\r
                dest->width[3] = spr->width+1;\r
-               CAL_ShiftSprite ((unsigned)grsegs[chunk],dest->sourceoffset[0],\r
-                       dest->sourceoffset[3],spr->width,spr->height,6,true);\r
+               CAL_ShiftSprite ((unsigned)gvar->ca.grsegs[chunk],dest->sourceoffset[0],\r
+                       dest->sourceoffset[3],spr->width,spr->height,6,true,gvar);\r
 \r
                break;\r
 \r
        default:\r
-               Quit ("CAL_CacheSprite: Bad shifts number!");\r
+               Quit (gvar, "CAL_CacheSprite: Bad shifts number!");\r
        }\r
 \r
-#endif\r
+//#endif\r
 }*/\r
 \r
 //===========================================================================\r
@@ -1704,7 +1767,7 @@ void CAL_ExpandGrChunk (int chunk, byte far *source)
                MM_GetPtr (&grsegs[chunk],expanded);\r
                if (mmerror)\r
                        return;\r
-               CAL_HuffExpand (source,grsegs[chunk],expanded,grhuffman);\r
+               CAL_HuffExpand (source,grsegs[chunk],expanded,gvar->ca.grhuffman);\r
        }\r
 }\r
 */\r
@@ -1730,21 +1793,21 @@ void CAL_ReadGrChunk (int chunk)
 // load the chunk into a buffer, either the miscbuffer if it fits, or allocate\r
 // a larger buffer\r
 //\r
-       pos = GRFILEPOS(chunk);\r
+       pos = GRFILEPOS(chunk,gvar);\r
        if (pos<0)                                                      // $FFFFFFFF start is a sparse tile\r
          return;\r
 \r
        next = chunk +1;\r
-       while (GRFILEPOS(next) == -1)           // skip past any sparse tiles\r
+       while (GRFILEPOS(next,gvar) == -1)              // skip past any sparse tiles\r
                next++;\r
 \r
-       compressed = GRFILEPOS(next)-pos;\r
+       compressed = GRFILEPOS(next,gvar)-pos;\r
 \r
-       lseek(grhandle,pos,SEEK_SET);\r
+       lseek(gvar->ca.file.grhandle,pos,SEEK_SET);\r
 \r
        if (compressed<=BUFFERSIZE)\r
        {\r
-               CA_FarRead(grhandle,bufferseg,compressed);\r
+               CA_FarRead(gvar->ca.file.grhandle,bufferseg,compressed);\r
                source = bufferseg;\r
        }\r
        else\r
@@ -1753,7 +1816,7 @@ void CAL_ReadGrChunk (int chunk)
                if (mmerror)\r
                        return;\r
                MM_SetLock (&bigbufferseg,true);\r
-               CA_FarRead(grhandle,bigbufferseg,compressed);\r
+               CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed);\r
                source = bigbufferseg;\r
        }\r
 \r
@@ -1780,7 +1843,7 @@ void CA_CacheGrChunk (int chunk)
        byte    far *source;\r
        int             next;\r
 \r
-       gvar->video.grneeded[chunk] |= ca_levelbit;             // make sure it doesn't get removed\r
+       gvar->ca.grneeded[chunk] |= ca_levelbit;                // make sure it doesn't get removed\r
        if (grsegs[chunk])\r
        {\r
                MM_SetPurge (&grsegs[chunk],0);\r
@@ -1789,8 +1852,8 @@ void CA_CacheGrChunk (int chunk)
 \r
 // MDM begin - (GAMERS EDGE)\r
 //\r
-       if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
-               Quit("CA_CacheGrChunk(): Can't find graphics files.");\r
+       if (!FindFile("EGAGRAPH.16",NULL,2))\r
+               Quit (gvar, "CA_CacheGrChunk(): Can't find graphics files.");\r
 //\r
 // MDM end\r
 \r
@@ -1798,7 +1861,7 @@ void CA_CacheGrChunk (int chunk)
 // load the chunk into a buffer, either the miscbuffer if it fits, or allocate\r
 // a larger buffer\r
 //\r
-       pos = GRFILEPOS(chunk);\r
+       pos = GRFILEPOS(chunk,gvar);\r
        if (pos<0)                                                      // $FFFFFFFF start is a sparse tile\r
          return;\r
 \r
@@ -1806,27 +1869,27 @@ void CA_CacheGrChunk (int chunk)
        while (GRFILEPOS(next) == -1)           // skip past any sparse tiles\r
                next++;\r
 \r
-       compressed = GRFILEPOS(next)-pos;\r
+       compressed = GRFILEPOS(next,gvar)-pos;\r
 \r
-       lseek(grhandle,pos,SEEK_SET);\r
+       lseek(gvar->ca.file.grhandle,pos,SEEK_SET);\r
 \r
        if (compressed<=BUFFERSIZE)\r
        {\r
-               CA_FarRead(grhandle,bufferseg,compressed);\r
+               CA_FarRead(gvar->ca.file.grhandle,bufferseg,compressed);\r
                source = bufferseg;\r
        }\r
        else\r
        {\r
                MM_GetPtr(&bigbufferseg,compressed);\r
                MM_SetLock (&bigbufferseg,true);\r
-               CA_FarRead(grhandle,bigbufferseg,compressed);\r
+               CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed);\r
                source = bigbufferseg;\r
        }\r
 \r
        CAL_ExpandGrChunk (chunk,source);\r
 \r
        if (compressed>BUFFERSIZE)\r
-               MM_FreePtr(&bigbufferseg);\r
+               MM_FreePtr (MEMPTRCONV bigbufferseg);\r
 }\r
 */\r
 \r
@@ -1840,7 +1903,7 @@ void CA_CacheGrChunk (int chunk)
 =\r
 ======================\r
 */\r
-/*++++ fuckin segments!\r
+\r
 void CA_CacheMap (global_game_variables_t *gvar)\r
 {\r
        long    pos,compressed;\r
@@ -1857,31 +1920,43 @@ void CA_CacheMap (global_game_variables_t *gvar)
 //\r
 // free up memory from last map\r
 //\r
-//     if (gvar->ca.map.mapon>-1 && gvar->ca.map.mapheaderseg[gvar->ca.map.mapon])\r
-//             MM_SetPurge (&(memptr)gvar->ca.map.mapheaderseg[gvar-ca.map.mapon],3);\r
+       if (gvar->ca.mapon>-1 && gvar->ca.mapheaderseg[gvar->ca.mapon])\r
+               MM_SetPurge ((MEMPTRCONV gvar->ca.mapheaderseg[(gvar->ca.mapon)]), 3, gvar);\r
        for (plane=0;plane<MAPPLANES;plane++)\r
-               if (gvar->ca.map.mapsegs[plane])\r
-                       MM_FreePtr (&(memptr)gvar->ca.map.mapsegs[plane]);\r
+               if (gvar->ca.mapsegs[plane])\r
+                       MM_FreePtr (MEMPTRCONV gvar->ca.mapsegs[plane], gvar);\r
 \r
-       gvar->ca.map.mapon = gvar->ca.map.mapnum;\r
+       gvar->ca.mapon = gvar->ca.mapnum;\r
 \r
 \r
 //\r
 // load map header\r
 // The header will be cached if it is still around\r
 //\r
-       if (!gvar->ca.map.mapheaderseg[gvar->ca.map.mapnum])\r
+       if (!gvar->ca.mapheaderseg[gvar->ca.mapnum])\r
        {\r
-               pos = ((__segmement *)tinf)->headeroffsets[gvar->ca.mapnum];\r
+               pos = ((mapfiletype     _seg *)gvar->ca.tinf)->headeroffsets[gvar->ca.mapnum];\r
                if (pos<0)                                              // $FFFFFFFF start is a sparse map\r
-                 printf("CA_CacheMap: Tried to load a non existent map!");\r
+                       Quit (gvar, "CA_CacheMap: Tried to load a non existent map!");\r
 \r
-               MM_GetPtr(&(memptr)gvar->ca.mapheaderseg[mapnum],sizeof(maptype));\r
-               lseek(maphandle,pos,SEEK_SET);\r
-               CA_FarRead (maphandle,(memptr)mapheaderseg[mapnum],sizeof(maptype));\r
+               MM_GetPtr(MEMPTRCONV gvar->ca.mapheaderseg[gvar->ca.mapnum],sizeof(maptype), gvar);\r
+               lseek(gvar->ca.file.maphandle,pos,SEEK_SET);\r
+#ifdef MAPHEADERLINKED\r
+//#if BUFFERSIZE < sizeof(maptype)\r
+//The general buffer size is too small!\r
+//#endif\r
+               //\r
+               // load in, then unhuffman to the destination\r
+               //\r
+               CA_FarRead (gvar->ca.file.maphandle,gvar->mm.bufferseg,((mapfiletype    _seg *)gvar->ca.tinf)->headersize[gvar->ca.mapnum], gvar);\r
+               CAL_HuffExpand ((byte huge *)bufferseg,\r
+                       (byte huge *)gvar->ca.mapheaderseg[gvar->ca.mapnum],sizeof(maptype),maphuffman, gvar);\r
+#else\r
+               CA_FarRead (gvar->ca.file.maphandle,(memptr)gvar->ca.mapheaderseg[gvar->ca.mapnum],sizeof(maptype), gvar);\r
+#endif\r
        }\r
        else\r
-               MM_SetPurge (&(memptr)mapheaderseg[mapnum],0);\r
+               MM_SetPurge (MEMPTRCONV gvar->ca.mapheaderseg[gvar->ca.mapnum], 0, gvar);\r
 \r
 //\r
 // load the planes in\r
@@ -1889,30 +1964,30 @@ void CA_CacheMap (global_game_variables_t *gvar)
 // allways reloaded, never cached)\r
 //\r
 \r
-       size = mapheaderseg[mapnum]->width * mapheaderseg[mapnum]->height * 2;\r
+       size = gvar->ca.mapheaderseg[gvar->ca.mapnum]->width * gvar->ca.mapheaderseg[gvar->ca.mapnum]->height * 2;\r
 \r
        for (plane = 0; plane<MAPPLANES; plane++)\r
        {\r
-               pos = mapheaderseg[mapnum]->planestart[plane];\r
-               compressed = mapheaderseg[mapnum]->planelength[plane];\r
+               pos = gvar->ca.mapheaderseg[gvar->ca.mapnum]->planestart[plane];\r
+               compressed = gvar->ca.mapheaderseg[gvar->ca.mapnum]->planelength[plane];\r
 \r
                if (!compressed)\r
                        continue;               // the plane is not used in this game\r
 \r
-               dest = &(memptr)mapsegs[plane];\r
-               MM_GetPtr(dest,size);\r
+               dest = MEMPTRCONV gvar->ca.mapsegs[plane];\r
+               MM_GetPtr(dest,size, gvar);\r
 \r
-               lseek(maphandle,pos,SEEK_SET);\r
+               lseek(gvar->ca.file.maphandle,pos,SEEK_SET);\r
                if (compressed<=BUFFERSIZE)\r
-                       source = bufferseg;\r
+                       source = gvar->mm.bufferseg;\r
                else\r
                {\r
-                       MM_GetPtr(&bigbufferseg,compressed);\r
-                       MM_SetLock (&bigbufferseg,true);\r
+                       MM_GetPtr(MEMPTRCONV bigbufferseg,compressed, gvar);\r
+                       MM_SetLock (MEMPTRCONV bigbufferseg,true, gvar);\r
                        source = bigbufferseg;\r
                }\r
 \r
-               CA_FarRead(maphandle,(byte far *)source,compressed);\r
+               CA_FarRead(gvar->ca.file.maphandle,(byte far *)source,compressed, gvar);\r
 #ifdef MAPHEADERLINKED\r
                //\r
                // unhuffman, then unRLEW\r
@@ -1922,7 +1997,7 @@ void CA_CacheMap (global_game_variables_t *gvar)
                //\r
                expanded = *source;\r
                source++;\r
-               MM_GetPtr (&buffer2seg,expanded);\r
+               MM_GetPtr (&buffer2seg,expanded, gvar);\r
                CAL_CarmackExpand (source, (unsigned far *)buffer2seg,expanded);\r
                CA_RLEWexpand (((unsigned far *)buffer2seg)+1,*dest,size,\r
                ((mapfiletype _seg *)tinf)->RLEWtag);\r
@@ -1933,13 +2008,13 @@ void CA_CacheMap (global_game_variables_t *gvar)
                // unRLEW, skipping expanded length\r
                //\r
                CA_RLEWexpand (source+1, *dest,size,\r
-               ((mapfiletype _seg *)tinf)->RLEWtag);\r
+               ((mapfiletype _seg *)gvar->ca.tinf)->RLEWtag);\r
 #endif\r
 \r
                if (compressed>BUFFERSIZE)\r
-                       MM_FreePtr(&bigbufferseg);\r
+                       MM_FreePtr(MEMPTRCONV bigbufferseg, gvar);\r
        }\r
-}*/\r
+}\r
 \r
 //===========================================================================\r
 \r
@@ -1953,15 +2028,15 @@ void CA_CacheMap (global_game_variables_t *gvar)
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_UpLevel (void)\r
+\r
+void CA_UpLevel (global_game_variables_t *gvar)\r
 {\r
-       if (ca_levelnum==7)\r
-               Quit ("CA_UpLevel: Up past level 7!");\r
+       if (gvar->ca.ca_levelnum==7)\r
+               printf("CA_UpLevel: Up past level 7!");\r
 \r
-       ca_levelbit<<=1;\r
-       ca_levelnum++;\r
-}*/\r
+       gvar->ca.ca_levelbit<<=1;\r
+       gvar->ca.ca_levelnum++;\r
+}\r
 \r
 //===========================================================================\r
 \r
@@ -1975,15 +2050,15 @@ void CA_UpLevel (void)
 =\r
 ======================\r
 */\r
-/*++\r
-void CA_DownLevel (void)\r
+\r
+void CA_DownLevel (global_game_variables_t *gvar)\r
 {\r
-       if (!ca_levelnum)\r
-               Quit ("CA_DownLevel: Down past level 0!");\r
-       ca_levelbit>>=1;\r
-       ca_levelnum--;\r
-       CA_CacheMarks(NULL);\r
-}*/\r
+       if (!gvar->ca.ca_levelnum)\r
+               printf("CA_DownLevel: Down past level 0!");\r
+       gvar->ca.ca_levelbit>>=1;\r
+       gvar->ca.ca_levelnum--;\r
+       ////++++++++++++++++++++++++++++++++++++++++++CA_CacheMarks(NULL);\r
+}\r
 \r
 //===========================================================================\r
 \r
@@ -2002,7 +2077,7 @@ void CA_ClearMarks (global_game_variables_t *gvar)
        int i;\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               gvar->video.grneeded[i]&=~gvar->ca.ca_levelbit;\r
+               gvar->ca.grneeded[i]&=~gvar->ca.ca_levelbit;\r
 }\r
 \r
 //===========================================================================\r
@@ -2019,7 +2094,7 @@ void CA_ClearMarks (global_game_variables_t *gvar)
 \r
 void CA_ClearAllMarks (global_game_variables_t *gvar)\r
 {\r
-       _fmemset (gvar->video.grneeded,0,sizeof(gvar->video.grneeded));\r
+       _fmemset (gvar->ca.grneeded,0,sizeof(gvar->ca.grneeded));\r
        gvar->ca.ca_levelbit = 1;\r
        gvar->ca.ca_levelnum = 0;\r
 }\r
@@ -2033,21 +2108,21 @@ void CA_ClearAllMarks (global_game_variables_t *gvar)
 =\r
 ======================\r
 */\r
-/*++++\r
-void CA_SetGrPurge (void)\r
+\r
+void CA_SetGrPurge (global_game_variables_t *gvar)\r
 {\r
        int i;\r
 \r
 //\r
 // free graphics\r
 //\r
-       CA_ClearMarks ();\r
+       CA_ClearMarks (gvar);\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if (grsegs[i])\r
-                       MM_SetPurge (&(memptr)grsegs[i],3);\r
+               if (gvar->ca.grsegs[i])\r
+                       MM_SetPurge (MEMPTRCONV gvar->ca.grsegs[i],3, gvar);\r
 }\r
-*/\r
+\r
 \r
 /*\r
 ======================\r
@@ -2058,41 +2133,41 @@ void CA_SetGrPurge (void)
 =\r
 ======================\r
 */\r
-/*++++++++\r
-void CA_SetAllPurge (void)\r
+\r
+void CA_SetAllPurge (global_game_variables_t *gvar)\r
 {\r
        int i;\r
 \r
-       CA_ClearMarks ();\r
+       CA_ClearMarks (gvar);\r
 \r
 //\r
 // free cursor sprite and background save\r
 //\r
-       VW_FreeCursor ();\r
+       //____VW_FreeCursor ();\r
 \r
 //\r
 // free map headers and map planes\r
 //\r
        for (i=0;i<NUMMAPS;i++)\r
-               if (mapheaderseg[i])\r
-                       MM_SetPurge (&(memptr)mapheaderseg[i],3);\r
+               if (gvar->ca.mapheaderseg[i])\r
+                       MM_SetPurge (MEMPTRCONV gvar->ca.mapheaderseg[i],3, gvar);\r
 \r
        for (i=0;i<3;i++)\r
-               if (mapsegs[i])\r
-                       MM_FreePtr (&(memptr)mapsegs[i]);\r
+               if (gvar->ca.mapsegs[i])\r
+                       MM_FreePtr (MEMPTRCONV gvar->ca.mapsegs[i], gvar);\r
 \r
 //\r
 // free sounds\r
 //\r
        for (i=0;i<NUMSNDCHUNKS;i++)\r
-               if (audiosegs[i])\r
-                       MM_SetPurge (&(memptr)audiosegs[i],3);\r
+               if (gvar->ca.audiosegs[i])\r
+                       MM_SetPurge (MEMPTRCONV gvar->ca.audiosegs[i],3, gvar);\r
 \r
 //\r
 // free graphics\r
 //\r
-       CA_SetGrPurge ();\r
-}*/\r
+       CA_SetGrPurge (gvar);\r
+}\r
 \r
 \r
 //===========================================================================\r
@@ -2217,10 +2292,10 @@ void    CAL_DialogFinish (void)
 = CA_CacheMarks\r
 =\r
 ======================\r
-*//*\r
+*/\r
 #define MAXEMPTYREAD   1024\r
-\r
-void CA_CacheMarks (char *title)\r
+/*++++ segments\r
+void CAL_CacheMarks (char *title, global_game_variables_t *gvar)\r
 {\r
        boolean dialog;\r
        int     i,next,numcache;\r
@@ -2236,17 +2311,17 @@ void CA_CacheMarks (char *title)
 // go through and make everything not needed purgable\r
 //\r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if (gvar->video.grneeded[i]&ca_levelbit)\r
+               if (gvar->ca.grneeded[i]&(gvar->ca.ca_levelbit))//if (grneeded[i]&ca_levelbit)\r
                {\r
-                       if (grsegs[i])                                  // its allready in memory, make\r
-                               MM_SetPurge(&grsegs[i],0);      // sure it stays there!\r
+                       if (gvar->ca.grsegs[i])                                 // its allready in memory, make\r
+                               MM_SetPurge(gvar->ca.grsegs[i],0,gvar); // sure it stays there!\r
                        else\r
                                numcache++;\r
                }\r
                else\r
                {\r
-                       if (grsegs[i])                                  // not needed, so make it purgeable\r
-                               MM_SetPurge(&grsegs[i],3);\r
+                       if (gvar->ca.grsegs[i])                                 // not needed, so make it purgeable\r
+                               MM_SetPurge(gvar->ca.grsegs[i],3,gvar);\r
                }\r
 \r
        if (!numcache)                  // nothing to cache!\r
@@ -2254,8 +2329,8 @@ void CA_CacheMarks (char *title)
 \r
 // MDM begin - (GAMERS EDGE)\r
 //\r
-       if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
-               Quit("CA_CacheMarks(): Can't find graphics files.");\r
+//???? if (!FindFile("EGAGRAPH.16",NULL,2))\r
+//????         Quit (gvar, "CA_CacheMarks(): Can't find graphics files.");\r
 //\r
 // MDM end\r
 \r
@@ -2275,7 +2350,7 @@ void CA_CacheMarks (char *title)
        bufferstart = bufferend = 0;            // nothing good in buffer now\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               if ( (gvar->video.grneeded[i]&ca_levelbit) && !grsegs[i])\r
+               if ( (gvar->ca.grneeded[i]&(gvar->ca.ca_levelbit)) && !gvar->ca.grsegs[i])\r
                {\r
 //\r
 // update thermometer\r
@@ -2283,7 +2358,7 @@ void CA_CacheMarks (char *title)
                        if (dialog && updatecachebox)\r
                                updatecachebox ();\r
 \r
-                       pos = GRFILEPOS(i);\r
+                       pos = GRFILEPOS(i,gvar);\r
                        if (pos<0)\r
                                continue;\r
 \r
@@ -2291,7 +2366,7 @@ void CA_CacheMarks (char *title)
                        while (GRFILEPOS(next) == -1)           // skip past any sparse tiles\r
                                next++;\r
 \r
-                       compressed = GRFILEPOS(next)-pos;\r
+                       compressed = GRFILEPOS(next,gvar)-pos;\r
                        endpos = pos+compressed;\r
 \r
                        if (compressed<=BUFFERSIZE)\r
@@ -2314,10 +2389,10 @@ void CA_CacheMarks (char *title)
                                                if (next == NUMCHUNKS)\r
                                                        continue;\r
 \r
-                                               nextpos = GRFILEPOS(next);\r
-                                               while (GRFILEPOS(++next) == -1) // skip past any sparse tiles\r
+                                               nextpos = GRFILEPOS(next,gvar);\r
+                                               while (GRFILEPOS(++next,gvar) == -1)    // skip past any sparse tiles\r
                                                        ;\r
-                                               nextendpos = GRFILEPOS(next);\r
+                                               nextendpos = GRFILEPOS(next,gvar);\r
                                                if (nextpos - endpos <= MAXEMPTYREAD\r
                                                && nextendpos-pos <= BUFFERSIZE)\r
                                                        endpos = nextendpos;\r
@@ -2325,8 +2400,8 @@ void CA_CacheMarks (char *title)
                                                        next = NUMCHUNKS;                       // read pos to posend\r
                                        }\r
 \r
-                                       lseek(grhandle,pos,SEEK_SET);\r
-                                       CA_FarRead(grhandle,bufferseg,endpos-pos);\r
+                                       lseek(gvar->ca.file.grhandle,pos,SEEK_SET);\r
+                                       CA_FarRead(gvar->ca.file.grhandle,(gvar->mm.bufferseg),endpos-pos,gvar);\r
                                        bufferstart = pos;\r
                                        bufferend = endpos;\r
                                        source = bufferseg;\r
@@ -2335,12 +2410,12 @@ void CA_CacheMarks (char *title)
                        else\r
                        {\r
                        // big chunk, allocate temporary buffer\r
-                               MM_GetPtr(&bigbufferseg,compressed);\r
+                               MM_GetPtr(&bigbufferseg,compressed,gvar);\r
                                if (mmerror)\r
                                        return;\r
                                MM_SetLock (&bigbufferseg,true);\r
-                               lseek(grhandle,pos,SEEK_SET);\r
-                               CA_FarRead(grhandle,bigbufferseg,compressed);\r
+                               lseek(gvar->ca.file.grhandle,pos,SEEK_SET);\r
+                               CA_FarRead(gvar->ca.file.grhandle,bigbufferseg,compressed,gvar);\r
                                source = bigbufferseg;\r
                        }\r
 \r
@@ -2358,4 +2433,14 @@ void CA_CacheMarks (char *title)
 //\r
                if (dialog && finishcachebox)\r
                        finishcachebox();\r
-}*/\r
+}//*/\r
+\r
+void CA_CannotOpen(char *string, global_game_variables_t *gvar)\r
+{\r
+ char str[30];\r
+\r
+ strcpy(str,"Can't open ");\r
+ strcat(str,string);\r
+ strcat(str,"!\n");\r
+ Quit (gvar, str);\r
+}\r