-/* 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
#pragma warn -pro\r
#pragma warn -use\r
\r
-//#define THREEBYTEGRSTARTS\r
-\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
=============================================================================\r
*/\r
\r
-typedef struct\r
+/*typedef struct\r
{\r
- unsigned bit0,bit1; // 0-255 is a character, > is a pointer to a node\r
-} huffnode;\r
+ word bit0,bit1; // 0-255 is a character, > is a pointer to a node\r
+} huffnode;*/\r
\r
\r
/*typedef struct\r
byte _seg *audiosegs[NUMSNDCHUNKS];\r
void _seg *grsegs[NUMCHUNKS];\r
\r
-byte far grneeded[NUMCHUNKS];\r
-byte ca_levelbit,ca_levelnum;*/\r
+byte far grneeded[NUMCHUNKS];*/\r
\r
void (*drawcachebox) (char *title, unsigned numcache);\r
void (*updatecachebox) (void);\r
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
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
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
};\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
=\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
==========================\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
+//old if (length>0xfffflu)\r
+//old 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
/*\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
==========================\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
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
+ return false;\r
+ }\r
+ close(handle);\r
+ return true;\r
+}\r
+\r
+\r
+/*\r
+==========================\r
+=\r
+= CA_WriteFile\r
+=\r
+= Writes a file from a memory buffer\r
+=\r
+==========================\r
+*/\r
+\r
+boolean CA_WriteFile (char *filename, void far *ptr, long length, global_game_variables_t *gvar)\r
+{\r
+ int handle;\r
+ //sdword size;\r
+ //long size;\r
+\r
+ handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,\r
+ S_IREAD | S_IWRITE | S_IFREG);\r
+\r
+ if (handle == -1)\r
+ return false;\r
+\r
+ if (!CA_FarWrite (handle,ptr,length, gvar))\r
{\r
close(handle);\r
return false;\r
==========================\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
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
======================\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
// expand less than 64k of data\r
//--------------------------\r
\r
- __asm\r
- {\r
- mov bx,[headptr]\r
+ __asm {\r
+ mov bx,[word ptr headptr]\r
\r
mov si,[sourceoff]\r
mov di,[destoff]\r
mov ch,[si] // load first byte\r
inc si\r
mov cl,1\r
-\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
expandshort:\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
test ch,cl // bit set?\r
jnz bit1short\r
mov dx,[ss:bx] // take bit0 path from node\r
shl cl,1 // advance to next bit position\r
jc newbyteshort\r
jnc sourceupshort\r
-\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
bit1short:\r
-asm mov dx,[ss:bx+2] // take bit1 path\r
-asm shl cl,1 // advance to next bit position\r
-asm jnc sourceupshort\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov dx,[ss:bx+2] // take bit1 path\r
+ shl cl,1 // advance to next bit position\r
+ jnc sourceupshort\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
newbyteshort:\r
-asm mov ch,[si] // load next byte\r
-asm inc si\r
-asm mov cl,1 // back to first bit\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov ch,[si] // load next byte\r
+ inc si\r
+ mov cl,1 // back to first bit\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
sourceupshort:\r
-asm or dh,dh // if dx<256 its a byte, else move node\r
-asm jz storebyteshort\r
-asm mov bx,dx // next node = (huffnode *)code\r
-asm jmp expandshort\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ or dh,dh // if dx<256 its a byte, else move node\r
+ jz storebyteshort\r
+ mov bx,dx // next node = (huffnode *)code\r
+ jmp expandshort\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
storebyteshort:\r
-asm mov [es:di],dl\r
-asm inc di // write a decopmpressed byte out\r
-asm mov bx,[headptr] // back to the head node for next bit\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov [es:di],dl\r
+ inc di // write a decopmpressed byte out\r
+ mov bx,[word ptr headptr] // back to the head node for next bit\r
\r
-asm cmp di,ax // done?\r
-asm jne expandshort\r
+ cmp di,ax // done?\r
+ jne expandshort\r
}\r
}\r
else\r
\r
length--;\r
\r
- __asm\r
- {\r
-asm mov bx,[headptr]\r
-asm mov cl,1\r
-\r
-asm mov si,[sourceoff]\r
-asm mov di,[destoff]\r
-asm mov es,[destseg]\r
-asm mov ds,[sourceseg]\r
+ __asm {\r
+ mov bx,[word ptr headptr]\r
+ mov cl,1\r
\r
-asm lodsb // load first byte\r
+ mov si,[sourceoff]\r
+ mov di,[destoff]\r
+ mov es,[destseg]\r
+ mov ds,[sourceseg]\r
\r
+ lodsb // load first byte\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
expand:\r
-asm test al,cl // bit set?\r
-asm jnz bit1\r
-asm mov dx,[ss:bx] // take bit0 path from node\r
-asm jmp gotcode\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ test al,cl // bit set?\r
+ jnz bit1\r
+ mov dx,[ss:bx] // take bit0 path from node\r
+ jmp gotcode\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
bit1:\r
-asm mov dx,[ss:bx+2] // take bit1 path\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov dx,[ss:bx+2] // take bit1 path\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
gotcode:\r
-asm shl cl,1 // advance to next bit position\r
-asm jnc sourceup\r
-asm lodsb\r
-asm cmp si,0x10 // normalize ds:si\r
-asm jb sinorm\r
-asm mov cx,ds\r
-asm inc cx\r
-asm mov ds,cx\r
-asm xor si,si\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ shl cl,1 // advance to next bit position\r
+ jnc sourceup\r
+ lodsb\r
+ cmp si,0x10 // normalize ds:si\r
+ jb sinorm\r
+ mov cx,ds\r
+ inc cx\r
+ mov ds,cx\r
+ xor si,si\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
sinorm:\r
-asm mov cl,1 // back to first bit\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov cl,1 // back to first bit\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
sourceup:\r
-asm or dh,dh // if dx<256 its a byte, else move node\r
-asm jz storebyte\r
-asm mov bx,dx // next node = (huffnode *)code\r
-asm jmp expand\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ or dh,dh // if dx<256 its a byte, else move node\r
+ jz storebyte\r
+ mov bx,dx // next node = (huffnode *)code\r
+ jmp expand\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
storebyte:\r
-asm mov [es:di],dl\r
-asm inc di // write a decopmpressed byte out\r
-asm mov bx,[headptr] // back to the head node for next bit\r
-\r
-asm cmp di,0x10 // normalize es:di\r
-asm jb dinorm\r
-asm mov dx,es\r
-asm inc dx\r
-asm mov es,dx\r
-asm xor di,di\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ mov [es:di],dl\r
+ inc di // write a decopmpressed byte out\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
+ mov dx,es\r
+ inc dx\r
+ mov es,dx\r
+ xor di,di\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
dinorm:\r
-\r
-asm sub [WORD PTR ss:length],1\r
-asm jnc expand\r
-asm dec [WORD PTR ss:length+2]\r
-asm jns expand // when length = ffff ffff, done\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ sub [WORD PTR ss:length],1\r
+ jnc expand\r
+ dec [WORD PTR ss:length+2]\r
+ jns expand // when length = ffff ffff, done\r
}\r
}\r
\r
- __asm\r
- {\r
+ __asm {\r
mov ax,ss\r
mov ds,ax\r
}\r
\r
-}*/\r
+}\r
\r
\r
/*\r
=\r
======================\r
*/\r
-/*++++\r
+\r
#define NEARTAG 0xa7\r
#define FARTAG 0xa8\r
\r
count = ch&0xff;\r
if (!count)\r
{ // have to insert a word containing the tag byte\r
- ch |= *((unsigned char far *)inptr)++;\r
+ ch |= *(/*(unsigned char far *)*/inptr)++;\r
*outptr++ = ch;\r
length--;\r
}\r
else\r
{\r
- offset = *((unsigned char far *)inptr)++;\r
+ offset = *(/*(unsigned char far *)*/inptr)++;\r
copyptr = outptr - offset;\r
length -= count;\r
while (count--)\r
count = ch&0xff;\r
if (!count)\r
{ // have to insert a word containing the tag byte\r
- ch |= *((unsigned char far *)inptr)++;\r
+ ch |= *(/*(unsigned char far *)*/inptr)++;\r
*outptr++ = ch;\r
length --;\r
}\r
}\r
}\r
}\r
-*/\r
\r
\r
/*\r
=\r
======================\r
*/\r
-/*++++\r
-long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,\r
+\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
complength = 2*(dest-start);\r
return complength;\r
}\r
-*/\r
+\r
\r
/*\r
======================\r
=\r
======================\r
*/\r
-/*++++\r
-void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,\r
+\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
//\r
// NOTE: A repeat count that produces 0xfff0 bytes can blow this!\r
//\r
-\r
-asm mov bx,rlewtag\r
-asm mov si,sourceoff\r
-asm mov di,destoff\r
-asm mov es,destseg\r
-asm mov ds,sourceseg\r
-\r
+ __asm {\r
+ mov bx,rlewtag\r
+ mov si,sourceoff\r
+ mov di,destoff\r
+ mov es,destseg\r
+ mov ds,sourceseg\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
expand:\r
-asm lodsw\r
-asm cmp ax,bx\r
-asm je repeat\r
-asm stosw\r
-asm jmp next\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ lodsw\r
+ cmp ax,bx\r
+ je repeat\r
+ stosw\r
+ jmp next\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
repeat:\r
-asm lodsw\r
-asm mov cx,ax // repeat count\r
-asm lodsw // repeat value\r
-asm rep stosw\r
-\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ lodsw\r
+ mov cx,ax // repeat count\r
+ lodsw // repeat value\r
+ rep stosw\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
next:\r
-\r
-asm cmp si,0x10 // normalize ds:si\r
-asm jb sinorm\r
-asm mov ax,si\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm mov dx,ds\r
-asm add dx,ax\r
-asm mov ds,dx\r
-asm and si,0xf\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ cmp si,0x10 // normalize ds:si\r
+ jb sinorm\r
+ mov ax,si\r
+ shr ax,1\r
+ shr ax,1\r
+ shr ax,1\r
+ shr ax,1\r
+ mov dx,ds\r
+ add dx,ax\r
+ mov ds,dx\r
+ and si,0xf\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
sinorm:\r
-asm cmp di,0x10 // normalize es:di\r
-asm jb dinorm\r
-asm mov ax,di\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm shr ax,1\r
-asm mov dx,es\r
-asm add dx,ax\r
-asm mov es,dx\r
-asm and di,0xf\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ cmp di,0x10 // normalize es:di\r
+ jb dinorm\r
+ mov ax,di\r
+ shr ax,1\r
+ shr ax,1\r
+ shr ax,1\r
+ shr ax,1\r
+ mov dx,es\r
+ add dx,ax\r
+ mov es,dx\r
+ and di,0xf\r
+#ifdef __BORLANDC__\r
+ }\r
+#endif\r
dinorm:\r
+#ifdef __BORLANDC__\r
+ __asm {\r
+#endif\r
+ cmp di,ss:endoff\r
+ jne expand\r
+ mov ax,es\r
+ cmp ax,ss:endseg\r
+ jb expand\r
\r
-asm cmp di,ss:endoff\r
-asm jne expand\r
-asm mov ax,es\r
-asm cmp ax,ss:endseg\r
-asm jb expand\r
-\r
-asm mov ax,ss\r
-asm mov ds,ax\r
-\r
+ mov ax,ss\r
+ mov ds,ax\r
+ }\r
}\r
-*/\r
\r
\r
/*\r
======================\r
*/\r
\r
-/*void CAL_SetupGrFile (void)\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
// 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
//\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
======================\r
*/\r
\r
-/*void CAL_SetupMapFile (void)\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
+ if ((handle = open("maphead.mph",\r
O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
- Quit ("Can't open MAPHEAD."EXT"!");\r
+ Quit (gvar, "Can't open maphead.mph");\r
length = filelength(handle);\r
- MM_GetPtr (&(memptr)tinf,length);\r
- CA_FarRead(handle, tinf, length);\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
- tinf = (byte _seg *)FP_SEG(&maphead);\r
+ gvar->ca.tinf = (byte _seg *)FP_SEG(&maphead);\r
\r
#endif\r
\r
//\r
// open the data file\r
//\r
-#ifdef MAPHEADERLINKED\r
- if ((maphandle = open("GAMEMAPS."EXT,\r
+//TODO: multiple files\r
+ if ((gvar->ca.file.maphandle = open("data/test.map",\r
O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
- Quit ("Can't open GAMEMAPS."EXT"!");\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."EXT,\r
+ if ((maphandle = open("MAPTEMP.16"ENSION,\r
O_RDONLY | O_BINARY, S_IREAD)) == -1)\r
- Quit ("Can't open MAPTEMP."EXT"!");\r
-#endif\r
-}*/\r
+ Quit (gvar, "Can't open MAPTEMP.16"ENSION"!");\r
+#endif*/\r
+}\r
\r
//==========================================================================\r
\r
// 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
// 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
unlink("profile.16w");\r
gvar->handle.profilehandle = open("profile.16w", O_CREAT | O_WRONLY | O_TEXT);\r
#endif\r
-#endif\r
-// unlink("debug0.16");\r
-// gvar->handle.showmemhandle = open("debug0.16", O_CREAT | O_WRONLY | O_TEXT);\r
-/*++++\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
- if(!FindFile("AUDIO."EXT,NULL,2))\r
- Quit("CA_Startup(): Can't find audio files.");\r
-//\r
-// MDM end\r
+#endif//profile\r
\r
-#ifndef NOAUDIO\r
- CAL_SetupAudioFile();\r
+#ifdef SHOWMEMINFO\r
+#ifdef __BORLANDC__\r
+ unlink("meminfo.16b");\r
+ gvar->handle.showmemhandle = open("meminfo.16b", O_CREAT | O_WRONLY | O_TEXT);\r
+#endif\r
+#ifdef __WATCOMC__\r
+ unlink("meminfo.16w");\r
+ gvar->handle.showmemhandle = open("meminfo.16w", O_CREAT | O_WRONLY | O_TEXT);\r
+#endif\r
#endif\r
\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
- if (!FindFile("GAMEMAPS."EXT,NULL,1))\r
- Quit("CA_Startup(): Can't find level files.");\r
-//\r
-// MDM end\r
\r
#ifndef NOMAPS\r
- CAL_SetupMapFile ();\r
+ CAL_SetupMapFile (gvar);\r
#endif\r
-\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
- if (!FindFile("EGAGRAPH."EXT,NULL,2))\r
- Quit("CA_Startup(): Can't find graphics files.");\r
-//\r
-// MDM end\r
-\r
#ifndef NOGRAPHICS\r
- CAL_SetupGrFile ();\r
+ CAL_SetupGrFile (gvar);\r
+#endif\r
+#ifndef NOAUDIO\r
+ CAL_SetupMapFile (gvar);\r
#endif\r
\r
- mapon = -1;\r
- ca_levelbit = 1;\r
- ca_levelnum = 0;\r
+ gvar->ca.mapon = -1;\r
+ gvar->ca.ca_levelbit = 1;\r
+ gvar->ca.ca_levelnum = 0;\r
\r
- drawcachebox = CAL_DialogDraw;\r
+/* drawcachebox = CAL_DialogDraw;\r
updatecachebox = CAL_DialogUpdate;\r
finishcachebox = CAL_DialogFinish;*/\r
}\r
#ifdef PROFILE\r
close(gvar->handle.profilehandle);\r
#endif\r
-// close(gvar->handle.showmemhandle);\r
-/*++++\r
- close(maphandle);\r
- close(grhandle);\r
- close(audiohandle);*/\r
+#ifdef SHOWMEMINFO\r
+ close(gvar->handle.showmemhandle);\r
+#endif\r
+\r
+ close(gvar->ca.file.maphandle);\r
+ close(gvar->ca.file.grhandle);\r
+ close(gvar->ca.file.audiohandle);\r
}\r
\r
//===========================================================================\r
\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
\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
\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
\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
\r
//===========================================================================\r
\r
-//++++#if GRMODE == EGAGR\r
+//????#if GRMODE == EGAGR\r
\r
/*\r
======================\r
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
======================\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
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
//\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
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
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
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
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
// 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
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
byte far *source;\r
int next;\r
\r
- 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
\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
// 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
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
=\r
======================\r
*/\r
-/*++++\r
-void CA_CacheMap (int mapnum)\r
+\r
+void CA_CacheMap (global_game_variables_t *gvar)\r
{\r
long pos,compressed;\r
int plane;\r
#endif\r
\r
\r
-// MDM begin - (GAMERS EDGE)\r
-//\r
- if (!FindFile("GAMEMAPS."EXT,NULL,1))\r
- Quit("CA_CacheMap(): Can't find level files.");\r
-//\r
-// MDM end\r
-\r
-\r
//\r
// free up memory from last map\r
//\r
- if (mapon>-1 && mapheaderseg[mapon])\r
- MM_SetPurge (&(memptr)mapheaderseg[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 (mapsegs[plane])\r
- MM_FreePtr (&(memptr)mapsegs[plane]);\r
+ if (gvar->ca.mapsegs[plane])\r
+ MM_FreePtr (MEMPTRCONV gvar->ca.mapsegs[plane], gvar);\r
\r
- mapon = 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 (!mapheaderseg[mapnum])\r
+ if (!gvar->ca.mapheaderseg[gvar->ca.mapnum])\r
{\r
- pos = ((mapfiletype _seg *)tinf)->headeroffsets[mapnum];\r
+ pos = ((mapfiletype _seg *)gvar->ca.tinf)->headeroffsets[gvar->ca.mapnum];\r
if (pos<0) // $FFFFFFFF start is a sparse map\r
- Quit ("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)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
// 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
//\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
// 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
=\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
=\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
=\r
======================\r
*/\r
-/*\r
-void CA_ClearMarks (void)\r
+\r
+void CA_ClearMarks (global_game_variables_t *gvar)\r
{\r
int i;\r
\r
for (i=0;i<NUMCHUNKS;i++)\r
- grneeded[i]&=~ca_levelbit;\r
+ gvar->ca.grneeded[i]&=~gvar->ca.ca_levelbit;\r
}\r
-*/\r
\r
//===========================================================================\r
\r
=\r
======================\r
*/\r
-/*\r
-void CA_ClearAllMarks (void)\r
+\r
+void CA_ClearAllMarks (global_game_variables_t *gvar)\r
{\r
- _fmemset (grneeded,0,sizeof(grneeded));\r
- ca_levelbit = 1;\r
- ca_levelnum = 0;\r
+ _fmemset (gvar->ca.grneeded,0,sizeof(gvar->ca.grneeded));\r
+ gvar->ca.ca_levelbit = 1;\r
+ gvar->ca.ca_levelnum = 0;\r
}\r
-*/\r
\r
//===========================================================================\r
\r
=\r
======================\r
*/\r
-/*++++\r
-void CA_FreeGraphics (void)\r
+\r
+void CA_SetGrPurge (global_game_variables_t *gvar)\r
{\r
- int i;\r
+ int i;\r
+\r
+//\r
+// free graphics\r
+//\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
=\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_FreeGraphics ();\r
+ CA_SetGrPurge (gvar);\r
}\r
\r
\r
-void CA_SetGrPurge (void)\r
-{\r
- int i;\r
-\r
-//\r
-// free graphics\r
-//\r
- for (i=0;i<NUMCHUNKS;i++)\r
- if (grsegs[i])\r
- MM_SetPurge (&(memptr)grsegs[i],3);\r
-}*/\r
-\r
-\r
//===========================================================================\r
\r
\r
= 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
// go through and make everything not needed purgable\r
//\r
for (i=0;i<NUMCHUNKS;i++)\r
- if (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
\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
bufferstart = bufferend = 0; // nothing good in buffer now\r
\r
for (i=0;i<NUMCHUNKS;i++)\r
- if ( (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
if (dialog && updatecachebox)\r
updatecachebox ();\r
\r
- pos = GRFILEPOS(i);\r
+ pos = GRFILEPOS(i,gvar);\r
if (pos<0)\r
continue;\r
\r
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
while ( next < NUMCHUNKS )\r
{\r
while (next < NUMCHUNKS &&\r
- !(grneeded[next]&ca_levelbit && !grsegs[next]))\r
+ !(gvar->video.grneeded[next]&ca_levelbit && !grsegs[next]))\r
next++;\r
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
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
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
//\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