/* This file is part of DeuTex. DeuTex incorporates code derived from DEU 5.21 that was put in the public domain in 1994 by Raphaël Quinet and Brendon Wyber. DeuTex is Copyright © 1994-1995 Olivier Montanuy, Copyright © 1999-2000 André Majorel. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "deutex.h" #include "tools.h" #include "endianm.h" #include "text.h" #include "mkwad.h" #include "texture.h" #include "ident.h" #include "color.h" #include "picture.h" #include "sound.h" #include "usedidx.h" /*compile only for DeuTex*/ #if defined DeuTex /************** Begin XTRACT WAD module **************/ /* ** here we go for some real indecent programming. sorry */ extern char file[128]; /* DEBUG */ #if 0 static void stop (void) { ; } #endif /* ** try to save entry as BitMap .BMP */ static Bool XTRbmpSave(Int16 *pinsrX,Int16 *pinsrY,struct WADDIR *entry, PICTYPE type,const char *DataDir,const char *dir,struct WADINFO *info,IMGTYPE Picture,Bool WSafe, cusage_t *cusage) { Bool res; Int32 start=entry->start; Int32 size =entry->size; char *name=entry->name; char *buffer; char *extens=NULL; if(size<8L) return FALSE; switch(Picture) { case PICGIF: extens="GIF";break; case PICBMP: extens="BMP";break; case PICPPM: extens="PPM";break; case PICTGA: extens="TGA";break; default: Bug("img type"); } res = MakeFileName(file,DataDir,dir,"",name,extens); if((WSafe==TRUE)&&(res==TRUE)) { Warning("Will not overwrite file %s",file); return TRUE; } buffer=(char *)Malloc(size); WADRseek(info,start); WADRreadBytes(info,buffer,size); res = PICsaveInFile(file,type,buffer,size,pinsrX,pinsrY,Picture, name, cusage); if(res==TRUE)Detail("Saved picture as %s\n",file); Free(buffer); return res; } /* ** extract entries from a WAD ** ** Called with cusage == NULL, (-xtract) this function extracts ** everything in the wad to separate files. ** ** Called with cusage != NULL, (-usedidx) this function creates ** no files but print statistics about which colours are used ** in the wad. */ void XTRextractWAD(const char *doomwad, const char *DataDir, const char *wadin, const char *wadinfo, IMGTYPE Picture,SNDTYPE Sound,Bool fullSND,NTRYB select, char trnR, char trnG, char trnB,Bool WSafe, cusage_t *cusage) { static struct WADINFO pwad; static struct WADINFO iwad; static struct WADINFO lwad; struct WADDIR *pdir; Int16 pnb; ENTRY *piden; Int16 p; Int32 ostart,osize; char *buffer; Bool res; Int16 insrX=0,insrY=0; Bool EntryFound; /*PNAMES*/ Int16 pnm;char *Pnam;Int32 Pnamsz; char *extens=NULL; /*text file to write*/ static struct TXTFILE *TXT = NULL; Phase("Extracting entries from WAD %s\n",wadin); /*open iwad,get iwad directory*/ iwad.ok=0; WADRopenR(&iwad,doomwad); /* If -usedidx, we're only interested in graphics. */ if (cusage != NULL) select &= (BGRAPHIC | BSPRITE | BPATCH | BFLAT | BSNEAP | BSNEAT); /*find PNAMES*/ pnm=WADRfindEntry(&iwad,"PNAMES"); if(pnm<0) ProgError("Can't find PNAMES in main WAD"); Pnam=WADRreadEntry(&iwad,pnm,&Pnamsz); /*read WAD*/ pwad.ok=0; WADRopenR(&pwad,wadin); pnb=(Int16)pwad.ntry; pdir=pwad.dir; piden=IDENTentriesPWAD(&pwad, Pnam, Pnamsz); /**/ Free(Pnam); /* ** prepare for graphics */ /* Read PLAYPAL */ { char *Colors=NULL; pnm=WADRfindEntry(&pwad,"PLAYPAL"); if(pnm>=0) Colors=WADRreadEntry(&pwad,pnm,&Pnamsz); else { pnm=WADRfindEntry(&iwad,"PLAYPAL"); if(pnm>=0) Colors=WADRreadEntry(&iwad,pnm,&Pnamsz); else /* FIXME Should not be fatal, if all you want is to extract levels. */ ProgError("Can't find PLAYPAL."); } COLinit(trnR,trnG,trnB,Colors,(Int16)Pnamsz); Free(Colors); } /* If TITLEPAL exists, read the first 768 bytes of it. But don't prepare COLpal2 because we don't know yet whether we need it. Indeed, if there are no sneats to extract, we're not interested in seeing any TITLEPAL-related warnings. */ { int n; char *titlepal_data = NULL; Int32 titlepal_size = 3 * NCOLOURS; n = WADRfindEntry (&pwad, "TITLEPAL"); if (n >= 0) titlepal_data = WADRreadEntry2 (&pwad, n, &titlepal_size); else { n = WADRfindEntry (&iwad, "TITLEPAL"); if (n >= 0) titlepal_data = WADRreadEntry2 (&iwad, n, &titlepal_size); else { titlepal_data = NULL; titlepal_size = 0; } } COLinitAlt (titlepal_data, titlepal_size); } /* ** read the PNAMES entry in PWAD ** or in DOOM.WAD if it does not exist elsewhere */ pnm=WADRfindEntry(&pwad,"PNAMES"); if(pnm>=0) Pnam=WADRreadEntry(&pwad,pnm,&Pnamsz); else { pnm=WADRfindEntry(&iwad,"PNAMES"); if(pnm>=0) Pnam=WADRreadEntry(&iwad,pnm,&Pnamsz); else ProgError("Can't find PNAMES in main WAD"); } PNMinit(Pnam,Pnamsz); Free(Pnam); /* ** iwad not needed anymore */ WADRclose(&iwad); /* ** output WAD creation directives ** and save entries depending on their type. ** If -usedidx, do _not_ create a directives file. */ if (cusage != NULL) TXT = &TXTdummy; /* Notional >/dev/null */ else { /*check if file exists*/ TXT=TXTopenW(wadinfo); { char comment[81]; sprintf (comment, "DeuTex %.32s by Olivier Montanuy", deutex_version); TXTaddComment (TXT, comment); } TXTaddComment(TXT,"PWAD creation directives"); } /* ** LEVELS */ if(select&BLEVEL) { Phase("Extracting levels...\n"); for(EntryFound=FALSE,p=0;puses[n], n, cusage->nlumps[n], (cusage->uses[n] == 0) ? "" : lump_name (cusage->where_first[n])); putchar ('\n'); } /* ** exit graphics and end */ COLfree(); Free(piden); WADRclose(&pwad); TXTaddEmptyLine (TXT); TXTaddComment(TXT,"End of extraction"); TXTcloseW(TXT); Phase("End of extraction.\n"); } /*********** End Xtract Module ***************/ void XTRgetEntry(const char *doomwad, const char *DataDir, const char *wadin, const char *entry, IMGTYPE Picture,SNDTYPE Sound,Bool fullSND, char trnR, char trnG, char trnB) { static struct WADINFO pwad; static struct WADINFO iwad; static char Name[8]; Int16 e; char *Entry; Int32 Entrysz; char *Colors=NULL; Int16 insrX,insrY; char *extens=NULL; Bool Found=FALSE; Normalise(Name,entry); iwad.ok=0; WADRopenR(&iwad,doomwad); /*find PLAYPAL*/ e=WADRfindEntry(&iwad,"PLAYPAL"); if(e>=0) Colors=WADRreadEntry(&iwad,e,&Entrysz); else ProgError("Can't find PLAYPAL in main WAD"); WADRclose(&iwad); pwad.ok=0; WADRopenR(&pwad,wadin); e=WADRfindEntry(&pwad,"PLAYPAL"); if(e>=0) { Free(Colors); Colors=WADRreadEntry(&pwad,e,&Entrysz); } COLinit(trnR,trnG,trnB,Colors,(Int16)Entrysz); Free(Colors); e=WADRfindEntry(&pwad,Name); if(e<0) ProgError("Can't find entry %s in WAD", lump_name (Name)); Phase("Extracting entry %s from WAD %s\n", lump_name (entry), wadin); Entry=WADRreadEntry(&pwad,e,&Entrysz); /*try graphic*/ if(Found!=TRUE) if(Entrysz>8) { switch(Picture) { case PICGIF: extens="GIF";break; case PICBMP: extens="BMP";break; case PICPPM: extens="PPM";break; case PICTGA: extens="TGA";break; default: Bug("img type"); } MakeFileName(file,DataDir,"","",Name,extens); if(PICsaveInFile(file,PGRAPH,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Info("Picture insertion point is (%d,%d)",insrX,insrY); Found=TRUE; } else if((Entrysz==0x1000)||(Entrysz==0x1040)) { if(PICsaveInFile(file,PFLAT,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Found=TRUE; } } else if(Entrysz==64000L) { if(PICsaveInFile(file,PLUMP,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Found=TRUE; } } } if (Found!=TRUE) if (peek_i16_le (Entry) == 3) if (Entrysz >= 8 + peek_i32_le (Entry + 4)) { /*save as sound*/ switch(Sound) { case SNDAU: extens="AU";break; case SNDWAV: extens="WAV";break; case SNDVOC: extens="VOC";break; default: Bug("snd type"); } MakeFileName(file,DataDir,"","",Name,extens); SNDsaveSound(file,Entry,Entrysz,Sound,fullSND, Name); Found=TRUE; } if(Found!=TRUE) { /*save as lump*/ MakeFileName(file,DataDir,"","",Name,"LMP"); WADRsaveEntry(&pwad,e,file); } Free(Entry); WADRclose(&pwad); } #endif /*DeuTex*/