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,palette_lump); if(e>=0) Colors=WADRreadEntry(&iwad,e,&Entrysz); else ProgError("GE00", "%s: no %s lump in the iwad", fname (iwad.filename), lump_name (palette_lump)); WADRclose(&iwad); pwad.ok=0; WADRopenR(&pwad,wadin); e=WADRfindEntry(&pwad,palette_lump); if(e>=0) { Free(Colors); Colors=WADRreadEntry(&pwad,e,&Entrysz); } COLinit(trnR,trnG,trnB,Colors,(Int16)Entrysz, pwad.filename, palette_lump); Free(Colors); e=WADRfindEntry(&pwad,Name); if(e<0) ProgError("GE01", "%s: %s: lump not found", fname (pwad.filename), lump_name (entry)); Phase("GE02", "%s: %s: extracting", fname (wadin), lump_name (entry)); 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("GE03", "Invalid img type %d", (int) Picture); } MakeFileName(file,DataDir,"","",Name,extens); if(PICsaveInFile(file,PGRAPH,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Info("GE04", "Picture insertion point is (%d,%d)",insrX,insrY); Found=TRUE; } /* FIXME try wall as well ? */ 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("GE05", "Invalid snd type %d", (int) Sound); } 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); }
/* ** ** convert raw data (as read from wad) into Textures ** Data= texture entry ** if PatchSz>0, Patch defines the patch list */ void TXUreadTEXTURE(char *Data,Int32 DataSz,char *Patch, Int32 PatchSz,Bool Redefn) { Int32 Pos, Numtex, Numpat, dummy; /* texture data*/ Int16 t,p,i, Xsize, Ysize; /* size x and y */ /* nb of wall patches used to build it */ /* wall patch inside a texture */ Int16 Xofs, Yofs,Pindex; /* x,y coordinate in texture space*/ /* patch name index in PNAMES table */ Int32 MaxPindex; static char tname[8]; /*texture name*/ static char pname[8]; /*patch name*/ size_t header_size; size_t item_size; int have_texture_name; int have_header_dummies; if (input_texture_format == TF_NAMELESS) { header_size = 14; item_size = 10; have_texture_name = 0; have_header_dummies = 1; } else if (input_texture_format == TF_NONE) { Warning ("No texture definitions to read."); return; /* FIXME is it OK to do that ? */ } else if (input_texture_format == TF_NORMAL) { header_size = 22; item_size = 10; have_texture_name = 1; have_header_dummies = 1; } else if (input_texture_format == TF_STRIFE11) { header_size = 18; item_size = 6; have_texture_name = 1; have_header_dummies = 0; } else { Bug ("TXUreadTEXTURE: bad itf %d", (int) input_texture_format); } /*get number of patches*/ if(PatchSz>0) { MaxPindex = peek_i32_le (Patch); dummy=4L+(MaxPindex*8L); if(dummy>PatchSz) ProgError("Bad PNAMES format"); } else { MaxPindex = PNMgetNbOfPatch(); } if((MaxPindex<0)||(MaxPindex>0x7FFF)) ProgError("Bad PNAMES entry"); /*get number of textures*/ Numtex = peek_i32_le (Data); if(Numtex<0) ProgError("Bad TEXTURE entry"); if(Numtex>MAXTEXTURES) ProgError("Too many TEXTUREs"); /*read textures*/ for (t = 0; t <Numtex; t++) { Pos = peek_i32_le (Data + 4L + t * 4L); if (Pos + header_size > DataSz) ProgError("TEXTURE entry too small"); if (have_texture_name) { Normalise (tname, Data + Pos); Pos += 8; } else /* No name. Make one up (TEXnnnn)*/ { if (t > 9999) { Warning ("More than 10000 textures. Ignoring excess."); break; } sprintf (tname, "TEX%04d", (int) t); } Pos += 4; /* Skip 2 dummy unused fields */ Xsize = peek_i16_le (Data + Pos); Pos += 2; if((Xsize<0)||(Xsize>4096)) ProgError ("Texture %s: width out of bound (%d)", lump_name (tname), (int) Xsize); Ysize = peek_i16_le (Data + Pos); Pos += 2; if((Ysize<0)||(Ysize>4096)) ProgError ("Texture %s: height out of bound (%d)", lump_name (tname), (int) Ysize); if (have_header_dummies) Pos += 4; /* Skip 2 dummy unused fields */ Numpat = peek_i16_le (Data + Pos)&0xFFFF; Pos += 2; if((Numpat<0)||(Numpat>MAXPATCHPERTEX)) ProgError("Texture %s: too many patches (%d)", lump_name (tname), (int) Numpat); /* declare texture */ TXUdefineCurTex(tname,Xsize,Ysize,Redefn); if (Pos + (long) Numpat * item_size > DataSz) ProgError("TEXTURE entry too small"); for (p = 0; p < Numpat; p++, Pos += item_size) { Xofs = peek_i16_le (Data + Pos); if((Xofs<-4096)||(Xofs>4096)) ProgError("Texture %s(%d/%d): bad patch X-offset %d", lump_name (tname), (int) p, (int) Numpat, (int) Xofs); Yofs = peek_i16_le (Data + Pos + 2); if((Yofs<-4096)||(Yofs>4096)) ProgError("Texture %s(%d/%d): bad patch Y-offset %d", lump_name (tname), (int) p, (int) Numpat, (int) Yofs); Pindex = peek_i16_le (Data + Pos + 4); if((Pindex<0)||(Pindex>MaxPindex)) ProgError("Texture %s(%d/%d): bad patch index %d", lump_name (tname), (int) p, (int) Numpat, (int) Pindex); /*if new patch list, recalculate Pindex*/ if(PatchSz>0) { for(dummy=(4L+(Pindex*8L)),i=0;i<8;i++) pname[i]=Patch[dummy+i]; Pindex=PNMgetPatchIndex(pname); } /*declare patch*/ TXUaddPatchToCurTex(Pindex,Xofs,Yofs); } } }