//------------------------------------------------------------------------------ //initialize a pigfile, reading headers //returns the size of all the bitmap data void PiggyInitPigFile (char *filename) { CFile *cfP = cfPiggy + gameStates.app.bD1Data; char szName [16]; char szNameRead [16]; char szPigName [FILENAME_LEN]; int nHeaderSize, nBitmapNum, nDataSize, nDataStart, i; grsBitmap bmTemp; tPIGBitmapHeader bmh; PiggyCloseFile (); //close old pig if still open strcpy (szPigName, filename); //rename pigfile for shareware if (!stricmp (DEFAULT_PIGFILE, DEFAULT_PIGFILE_SHAREWARE) && !CFile::Exist (szPigName, gameFolders.szDataDir, 0)) strcpy (szPigName, DEFAULT_PIGFILE_SHAREWARE); strlwr (szPigName); if (!cfP->Open (szPigName, gameFolders.szDataDir, "rb", 0)) { #ifdef EDITOR return; //if editor, ok to not have pig, because we'll build one #else if (!CopyPigFileFromCD (*cfP, szPigName)) return; #endif } int pig_id = cfP->ReadInt (); int pigVersion = cfP->ReadInt (); if (pig_id != PIGFILE_ID || pigVersion != PIGFILE_VERSION) { cfP->Close (); //out of date pig return; } strncpy (szCurrentPigFile [0], szPigName, sizeof (szCurrentPigFile [0])); nBitmapNum = cfP->ReadInt (); nHeaderSize = nBitmapNum * sizeof (tPIGBitmapHeader); nDataStart = nHeaderSize + cfP->Tell (); nDataSize = cfP->Length () - nDataStart; gameData.pig.tex.nBitmaps [0] = 1; for (i = 0; i < nBitmapNum; i++) { PIGBitmapHeaderRead (&bmh, *cfP); memcpy (szNameRead, bmh.name, 8); szNameRead [8] = 0; if (bmh.dflags & DBM_FLAG_ABM) sprintf (szName, "%s#%d", szNameRead, bmh.dflags & DBM_NUM_FRAMES); else strcpy (szName, szNameRead); memset (&bmTemp, 0, sizeof (grsBitmap)); bmTemp.bmProps.w = bmTemp.bmProps.rowSize = bmh.width + ((short) (bmh.wh_extra & 0x0f) << 8); bmTemp.bmProps.h = bmh.height + ((short) (bmh.wh_extra & 0xf0) << 4); bmTemp.bmProps.flags |= BM_FLAG_PAGED_OUT; bmTemp.bmAvgColor = bmh.bmAvgColor; gameData.pig.tex.bitmapFlags [0][i+1] = bmh.flags & BM_FLAGS_TO_COPY; bitmapOffsets [0][i+1] = bmh.offset + nDataStart; Assert ((i+1) == gameData.pig.tex.nBitmaps [0]); PiggyRegisterBitmap (&bmTemp, szName, 1); } bPigFileInitialized = 1; }
//------------------------------------------------------------------------------ //initialize a pigfile, reading headers //returns the size of all the bitmap data void PiggyInitPigFile (char *filename) { CFile *cfP = cfPiggy + gameStates.app.bD1Data; char szName [16]; char szNameRead [16]; char szPigName [FILENAME_LEN]; int nHeaderSize, nBitmapNum, nDataSize, nDataStart, i; CBitmap bm; tPIGBitmapHeader bmh; PiggyCloseFile (); //close old pig if still open strcpy (szPigName, filename); //rename pigfile for shareware if (!stricmp (DefaultPigFile (), DefaultPigFile (1)) && !CFile::Exist (szPigName, gameFolders.szDataDir, 0)) strcpy (szPigName, DefaultPigFile (1)); strlwr (szPigName); if (!cfP->Open (szPigName, gameFolders.szDataDir, "rb", 0)) { if (!CopyPigFileFromCD (*cfP, szPigName)) return; } int pig_id = cfP->ReadInt (); int pigVersion = cfP->ReadInt (); if (pig_id != PIGFILE_ID || pigVersion != PIGFILE_VERSION) { cfP->Close (); //out of date pig return; } strncpy (szCurrentPigFile [0], szPigName, sizeof (szCurrentPigFile [0])); nBitmapNum = cfP->ReadInt (); nHeaderSize = nBitmapNum * sizeof (tPIGBitmapHeader); nDataStart = nHeaderSize + cfP->Tell (); nDataSize = cfP->Length () - nDataStart; gameData.pig.tex.nBitmaps [0] = 1; for (i = 0; i < nBitmapNum; i++) { PIGBitmapHeaderRead (&bmh, *cfP); memcpy (szNameRead, bmh.name, 8); szNameRead [8] = 0; if (bmh.dflags & DBM_FLAG_ABM) sprintf (szName, "%s#%d", szNameRead, bmh.dflags & DBM_NUM_FRAMES); else strcpy (szName, szNameRead); memset (&bm, 0, sizeof (CBitmap)); bm.SetWidth (bmh.width + ((short) (bmh.wh_extra & 0x0f) << 8)); bm.SetHeight (bmh.height + ((short) (bmh.wh_extra & 0xf0) << 4)); bm.SetBPP (1); bm.SetFlags (BM_FLAG_PAGED_OUT); bm.SetAvgColorIndex (bmh.avgColor); gameData.pig.tex.bitmapFlags [0][i+1] = bmh.flags & BM_FLAGS_TO_COPY; bitmapOffsets [0][i+1] = bmh.offset + nDataStart; Assert ((i+1) == gameData.pig.tex.nBitmaps [0]); PiggyRegisterBitmap (&bm, szName, 1); } bPigFileInitialized = 1; }
int CSubTitles::Init (const char* filename) { CFile cf; int size, readCount; ubyte *p; int bHaveBinary = 0; m_nCaptions = 0; if (!gameOpts->movies.bSubTitles) return 0; if (!cf.Open (filename, gameFolders.szDataDir, "rb", 0)) { // first try text version char filename2 [FILENAME_LEN]; //no text version, try binary version CFile::ChangeFilenameExtension (filename2, filename, ".txb"); if (!cf.Open (filename2, gameFolders.szDataDir, "rb", 0)) return 0; bHaveBinary = 1; } size = cf.Length (); m_rawDataP = new ubyte [size+1]; readCount = (int) cf.Read (m_rawDataP, 1, size); cf.Close (); m_rawDataP [size] = 0; if (readCount != size) { delete[] m_rawDataP; return 0; } p = m_rawDataP; while (p && (p < m_rawDataP + size)) { char* endp = strchr (reinterpret_cast<char*> (p), '\n'); if (endp) { if (endp [-1] == '\r') endp [-1] = 0; //handle 0d0a pair *endp = 0; //string termintor } if (bHaveBinary) DecodeTextLine (reinterpret_cast<char*> (p)); if (*p != ';') { m_captions [m_nCaptions].first_frame = atoi (reinterpret_cast<char*> (p)); if (!(p = NextField (p))) continue; m_captions [m_nCaptions].last_frame = atoi (reinterpret_cast<char*> (p)); if (!(p = NextField (p))) continue; m_captions [m_nCaptions].msg = reinterpret_cast<char*> (p); Assert (m_nCaptions==0 || m_captions [m_nCaptions].first_frame >= m_captions [m_nCaptions-1].first_frame); Assert (m_captions [m_nCaptions].last_frame >= m_captions [m_nCaptions].first_frame); m_nCaptions++; } p = reinterpret_cast<ubyte*> (endp + 1); } return 1; }
/* calculate table to translate d1 bitmaps to current palette, * return -1 on error */ ubyte *LoadD1Palette (void) { tPalette palette; CFile cf; if (!cf.Open (D1_PALETTE, gameFolders.szDataDir, "rb", 1) || (cf.Length () != 9472)) return NULL; cf.Read (palette, 256, 3); cf.Close (); palette [254] = SUPER_TRANSP_COLOR; palette [255] = TRANSPARENCY_COLOR; return d1Palette = AddPalette (palette); }
ubyte *GrUsePaletteTable (const char *pszFile, const char *pszLevel) { CFile cf; int i = 0, fsize; tPalette palette; #ifdef SWAP_0_255 ubyte c; #endif if (pszLevel) { char ifile_name [FILENAME_LEN]; CFile::ChangeFilenameExtension (ifile_name, pszLevel, ".pal"); i = cf.Open (ifile_name, gameFolders.szDataDir, "rb", 0); } if (!i) i = cf.Open (pszFile, gameFolders.szDataDir, "rb", 0); // the following is a hack to enable the loading of d2 levels // even if only the d2 mac shareware datafiles are present. // However, if the pig file is present but the palette file isn't, // the textures in the level will look wierd... if (!i) i = cf.Open (DEFAULT_LEVEL_PALETTE, gameFolders.szDataDir, "rb", 0); if (!i) { Error(TXT_PAL_FILES, pszFile, DEFAULT_LEVEL_PALETTE); return NULL; } fsize = cf.Length (); Assert (fsize == 9472); cf.Read (palette, 256*3, 1); cf.Read (grFadeTable, 256*34, 1); cf.Close (); // This is the TRANSPARENCY COLOR for (i = 0; i < GR_FADE_LEVELS; i++) grFadeTable [i * 256 + 255] = 255; gameData.render.nComputedColors = 0; // Flush palette cache. // swap colors 0 and 255 of the palette along with fade table entries #ifdef SWAP_0_255 for (i = 0; i < 3; i++) { c = palette [i]; palette [i] = palette [765 + i]; palette [765 + i] = c; } for (i = 0; i < GR_FADE_LEVELS * 256; i++) if (grFadeTable [i] == 0) grFadeTable [i] = 255; for (i = 0; i < GR_FADE_LEVELS; i++) grFadeTable [i * 256] = TRANSPARENCY_COLOR; #endif return fadePalette = AddPalette (palette); }
/* calculate table to translate d1 bitmaps to current palette, * return -1 on error */ CPalette* CPaletteManager::LoadD1 (void) { CPalette palette; CFile cf; if (!cf.Open (D1_PALETTE, gameFolders.szDataDir, "rb", 1) || (cf.Length () != 9472)) return NULL; palette.Read (cf); cf.Close (); palette.Raw () [254] = SUPER_TRANSP_COLOR; palette.Raw () [255] = TRANSPARENCY_COLOR; SetD1 (Add (palette)); return D1 (); }
void PiggyBitmapReadD1 ( CFile &cf, CBitmap *bmP, /* read into this bmP */ int nBmDataOffs, /* specific to file */ tPIGBitmapHeader *bmh, /* header info for bmP */ ubyte **pNextBmP, /* where to write it (if 0, use reinterpret_cast<ubyte*> (D2_ALLOC) */ ubyte *colorMap) /* how to translate bmP's colors */ { int zSize, bSwap0255; memset (bmP, 0, sizeof (CBitmap)); bmP->SetWidth (bmh->width + ((short) (bmh->wh_extra&0x0f)<<8)); bmP->SetHeight (bmh->height + ((short) (bmh->wh_extra&0xf0)<<4)); bmP->SetBPP (1); bmP->SetAvgColorIndex (bmh->avgColor); bmP->AddFlags (bmh->flags & BM_FLAGS_TO_COPY); cf.Seek (nBmDataOffs + bmh->offset, SEEK_SET); if (bmh->flags & BM_FLAG_RLE) { zSize = cf.ReadInt (); cf.Seek (-4, SEEK_CUR); } else zSize = bmP->Width () * bmP->Width (); if (pNextBmP) { bmP->SetBuffer (*pNextBmP); *pNextBmP += zSize; } else { if (bmP->CreateBuffer ()) UseBitmapCache (bmP, (int) bmP->FrameSize ()); else return; } bmP->Read (cf, zSize); bSwap0255 = 0; switch (cf.Length ()) { case D1_MAC_PIGSIZE: case D1_MAC_SHARE_PIGSIZE: if (bmh->flags & BM_FLAG_RLE) bSwap0255 = 1; else bmP->Swap_0_255 (); } if (bmh->flags & BM_FLAG_RLE) bmP->RLEExpand (NULL, bSwap0255); bmP->Remap (paletteManager.D1 (), TRANSPARENCY_COLOR, -1); }
void PiggyBitmapReadD1 ( CFile &cf, grsBitmap *bmP, /* read into this bmP */ int nBmDataOffs, /* specific to file */ tPIGBitmapHeader *bmh, /* header info for bmP */ ubyte **pNextBmP, /* where to write it (if 0, use (ubyte *) D2_ALLOC) */ ubyte *palette, /* what palette the bmP has */ ubyte *colorMap) /* how to translate bmP's colors */ { int zSize, bSwap0255; memset (bmP, 0, sizeof (grsBitmap)); bmP->bmProps.w = bmP->bmProps.rowSize = bmh->width + ((short) (bmh->wh_extra&0x0f)<<8); bmP->bmProps.h = bmh->height + ((short) (bmh->wh_extra&0xf0)<<4); bmP->bmAvgColor = bmh->bmAvgColor; bmP->bmProps.flags |= bmh->flags & BM_FLAGS_TO_COPY; cf.Seek (nBmDataOffs + bmh->offset, SEEK_SET); if (bmh->flags & BM_FLAG_RLE) { zSize = cf.ReadInt (); cf.Seek (-4, SEEK_CUR); } else zSize = bmP->bmProps.h * bmP->bmProps.w; if (pNextBmP) { bmP->bmTexBuf = *pNextBmP; *pNextBmP += zSize; } else { bmP->bmTexBuf = (ubyte *) D2_ALLOC (bmP->bmProps.h * bmP->bmProps.rowSize); UseBitmapCache (bmP, (int) bmP->bmProps.h * (int) bmP->bmProps.rowSize); } cf.Read (bmP->bmTexBuf, 1, zSize); bSwap0255 = 0; switch (cf.Length ()) { case D1_MAC_PIGSIZE: case D1_MAC_SHARE_PIGSIZE: if (bmh->flags & BM_FLAG_RLE) bSwap0255 = 1; else swap_0_255 (bmP); } if (bmh->flags & BM_FLAG_RLE) rle_expand (bmP, NULL, bSwap0255); GrRemapBitmapGood (bmP, d1Palette, TRANSPARENCY_COLOR, -1); }
CPalette *CPaletteManager::Load (const char *pszFile, const char *pszLevel) { CFile cf; int i = 0, fsize; CPalette palette; #ifdef SWAP_0_255 ubyte c; #endif if (pszLevel) { char ifile_name [FILENAME_LEN]; CFile::ChangeFilenameExtension (ifile_name, pszLevel, ".pal"); i = cf.Open (ifile_name, gameFolders.szDataDir, "rb", 0); } if (!i) i = cf.Open (pszFile, gameFolders.szDataDir, "rb", 0); // the following is a hack to enable the loading of d2 levels // even if only the d2 mac shareware datafiles are present. // However, if the pig file is present but the palette file isn't, // the textures in the level will look wierd... if (!i) i = cf.Open (DEFAULT_LEVEL_PALETTE, gameFolders.szDataDir, "rb", 0); if (!i) { Error(TXT_PAL_FILES, pszFile, DEFAULT_LEVEL_PALETTE); return NULL; } fsize = cf.Length (); Assert (fsize == 9472); palette.Read (cf); cf.Read (m_data.fadeTable, sizeof (m_data.fadeTable), 1); cf.Close (); // This is the TRANSPARENCY COLOR for (i = 0; i < MAX_FADE_LEVELS; i++) m_data.fadeTable [i * 256 + 255] = 255; // swap colors 0 and 255 of the palette along with fade table entries #ifdef SWAP_0_255 palette.SwapTransparency (); for (i = 0; i < MAX_FADE_LEVELS * 256; i++) if (m_fadeTable [i] == 0) m_fadeTable [i] = 255; for (i = 0; i < MAX_FADE_LEVELS; i++) m_fadeTable [i * 256] = TRANSPARENCY_COLOR; #endif ClearEffect (&palette); return Add (palette); }
void LoadD1PigHeader (CFile& cf, int *pSoundNum, int *pBmHdrOffs, int *pBmDataOffs, int *pBitmapNum, int bReadTMapNums) { # define D1_PIG_LOAD_FAILED "Failed loading " D1_PIGFILE int nPigDataStart, nHeaderSize, nBmHdrOffs, nBmDataOffs, nSoundNum, nBitmapNum; switch (cf.Length ()) { case D1_SHARE_BIG_PIGSIZE: case D1_SHARE_10_PIGSIZE: case D1_SHARE_PIGSIZE: case D1_10_BIG_PIGSIZE: case D1_10_PIGSIZE: nPigDataStart = 0; Warning ("%s %s. %s", TXT_LOAD_FAILED, D1_PIGFILE, TXT_D1_SUPPORT); return; default: Warning ("%s %s", TXT_UNKNOWN_SIZE, D1_PIGFILE); Int3 (); // fall through case D1_PIGSIZE: case D1_OEM_PIGSIZE: case D1_MAC_PIGSIZE: case D1_MAC_SHARE_PIGSIZE: nPigDataStart = cf.ReadInt (); if (bReadTMapNums) BMReadD1TMapNums (cf); break; } cf.Seek (nPigDataStart, SEEK_SET); nBitmapNum = cf.ReadInt (); nSoundNum = cf.ReadInt (); nHeaderSize = nBitmapNum * PIGBITMAPHEADER_D1_SIZE + nSoundNum * sizeof (tPIGSoundHeader); nBmHdrOffs = nPigDataStart + 2 * sizeof (int); nBmDataOffs = nBmHdrOffs + nHeaderSize; if (pSoundNum) *pSoundNum = nSoundNum; *pBmHdrOffs = nBmHdrOffs; *pBmDataOffs = nBmDataOffs; *pBitmapNum = nBitmapNum; }
int do_ipc(int qid, struct msgbuf *buf, int flags) { int ipc_read; CFile cf; int l=0; ipc_read = msgrcv(qid,buf,16,0,flags | MSG_NOERROR); switch (ipc_read) { case -1: if (errno == ENOMSG) break; perror("IPC trouble"); break; case 0: break; default: //printf ("do_ipc %s\n", buf->mtext);//##########3 switch (buf->mtext[0]) { case 'v': volume=(double) ((double) buf->mtext[0]/127.0); break; case 'p': if (cf.Open(&cf, (buf->mtext+1), gameFolders.szDataDir,"rb", 0)) { l = cf.Length(&cf); data=realloc(data,(size_t) l); cf.Read(data, l, 1); cf.Close(&cf); //printf ("good. fpr=%p l=%i data=%p\n", fptr, l, data);//##########3 } stop = 0; break; case 's': stop = 2; break; case 'q': // SDL_KillThread(player_thread); break; } } return ipc_read; }
int CAudioChannel::ReadWAV (void) { CFile cf; int l; if (!cf.Open ("d2x-temp.wav", gameFolders.szDataDir, "rb", 0)) return 0; if (0 >= (l = cf.Length ())) l = -1; else if (!m_info.sample.Create (l)) l = -1; else if (m_info.sample.Read (cf, l) != (size_t) l) l = -1; cf.Close (); if ((l < 0) && m_info.sample.Buffer ()) { m_info.sample.Destroy (); } return l > 0; }
void LoadReplacementBitmaps (const char *pszLevelName) { char szFilename [SHORT_FILENAME_LEN]; CFile cf; int i, j; CBitmap bm; //first, free up data allocated for old bitmaps PrintLog (" loading replacement textures\n"); CFile::ChangeFilenameExtension (szFilename, pszLevelName, ".pog"); if (cf.Open (szFilename, gameFolders.szDataDir, "rb", 0)) { int id, version, nBitmapNum, bTGA; int bmDataSize, bmDataOffset, bmOffset; ushort *indices; tPIGBitmapHeader *bmh; id = cf.ReadInt (); version = cf.ReadInt (); if (id != MAKE_SIG ('G','O','P','D') || version != 1) { cf.Close (); return; } nBitmapNum = cf.ReadInt (); indices = new ushort [nBitmapNum]; bmh = new tPIGBitmapHeader [nBitmapNum]; #if 0 cf.Read (indices, nBitmapNum * sizeof (ushort), 1); cf.Read (bmh, nBitmapNum * sizeof (tPIGBitmapHeader), 1); #else for (i = 0; i < nBitmapNum; i++) indices [i] = cf.ReadShort (); for (i = 0; i < nBitmapNum; i++) PIGBitmapHeaderRead (bmh + i, cf); #endif bmDataOffset = cf.Tell (); bmDataSize = cf.Length () - bmDataOffset; for (i = 0; i < nBitmapNum; i++) { bmOffset = bmh [i].offset; memset (&bm, 0, sizeof (CBitmap)); bm.AddFlags (bmh [i].flags & (BM_FLAGS_TO_COPY | BM_FLAG_TGA)); bm.SetWidth (bmh [i].width + ((short) (bmh [i].wh_extra & 0x0f) << 8)); bm.SetRowSize (bm.Width ()); if ((bTGA = (bm.Flags () & BM_FLAG_TGA)) && (bm.Width () > 256)) bm.SetHeight (bm.Width () * bmh [i].height); else bm.SetHeight (bmh [i].height + ((short) (bmh [i].wh_extra & 0xf0) << 4)); bm.SetBPP (bTGA ? 4 : 1); if (!(bm.Width () * bm.Width ())) continue; bm.SetAvgColorIndex (bmh [i].avgColor); bm.SetType (BM_TYPE_ALT); if (!bm.CreateBuffer ()) break; cf.Seek (bmDataOffset + bmOffset, SEEK_SET); #if DBG if (indices [i] == nDbgTexture) nDbgTexture = nDbgTexture; #endif if (bTGA) { int nFrames = bm.Height () / bm.Width (); tTgaHeader h; h.width = bm.Width (); h.height = bm.Width (); h.bits = 32; if (!ReadTGAImage (cf, &h, &bm, -1, 1.0, 0, 1)) { bm.DestroyBuffer (); break; } bm.SetFrameCount ((ubyte) nFrames); if (nFrames > 1) { tEffectClip *ecP = NULL; tWallClip *wcP; tVideoClip *vcP; while ((ecP = FindEffect (ecP, indices [i]))) { //e->vc.nFrameCount = nFrames; ecP->flags |= EF_ALTFMT | EF_FROMPOG; } if (!ecP) { if ((wcP = FindWallAnim (indices [i]))) { //w->nFrameCount = nFrames; wcP->flags |= WCF_ALTFMT | WCF_FROMPOG; } else if ((vcP = FindVClip (i))) { //v->nFrameCount = nFrames; vcP->flags |= WCF_ALTFMT | WCF_FROMPOG; } } } j = indices [i]; bm.SetId (j); } else { #if DBG if (j == nDbgTexture) nDbgTexture = nDbgTexture; #endif ReadBitmap (&bm, int (bm.Width ()) * int (bm.Height ()), &cf, true, false); j = indices [i]; bm.SetId (j); bm.RLEExpand (NULL, 0); *bm.Props () = *gameData.pig.tex.bitmapP [j].Props (); bm.Remap (paletteManager.Game (), TRANSPARENCY_COLOR, SUPER_TRANSP_COLOR); } #if DBG if (j == nDbgTexture) nDbgTexture = nDbgTexture; #endif gameData.pig.tex.bitmapP [j].Unload (j, 0); bm.SetFromPog (1); char szName [20]; if (*gameData.pig.tex.bitmapP [j].Name ()) sprintf (szName, "[%s]", gameData.pig.tex.bitmapP [j].Name ()); else sprintf (szName, "POG#%04d", j); bm.SetName (szName); gameData.pig.tex.altBitmapP [j] = bm; gameData.pig.tex.altBitmapP [j].SetBuffer (bm.Buffer (), 0, bm.Length ()); bm.SetBuffer (NULL); gameData.pig.tex.bitmapP [j].SetOverride (gameData.pig.tex.altBitmapP + j); CBitmap* bmP = gameData.pig.tex.altBitmapP + j; tRgbColorf color; if (0 <= bmP->AvgColor (&color)) bmP->SetAvgColorIndex (bmP->Palette ()->ClosestColor (&color)); UseBitmapCache (gameData.pig.tex.altBitmapP + j, (int) bm.Width () * (int) bm.RowSize ()); } delete[] indices; delete[] bmh; cf.Close (); paletteManager.SetLastPig (""); TexMergeFlush (); //for re-merging with new textures } }