Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Merge CPP by Andy Bay 1/11/1998
- //Purpose:
- //Take all Doom*.wad files and make one big one.
- //Reason: So texture artwork is centralized and
- // Easy New-Game capability.
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <iostream.h>
- #include "DoomType.h"
- //Globals
- wadinfo_t Src,Mrg,New;//the wad headers
- filelump_t *SrcDat,*MrgDat,*NewDat;//The wad data heads
- FILE *InFile,*OutFile,*TempFile;
- //end Globals
- //Prototypes
- int LoadWad(wadinfo_t *,filelump_t **,FILE*);
- int FindLumpByName(char *,filelump_t **,int num);
- void MergeWads();
- char* GenPNames(char*,char*);
- char* GenTextures(char*,char*);
- char* GenTextures(char*,char*);
- //End prototypes
- int gamemode = 0;//Doom or Doom2
- int main(int argc,char **argv){
- //(in file, out file, special)
- char *in,*merge,*special;
- if(argc<3){
- cout<<"You need to do this:\n"<<argv[0]<<" original.wad merge.wad [-tnt] [-plutonia]\n"<<flush;
- return 1;
- }
- in = argv[1];
- merge = argv[2];
- if(argc>3)
- special = argv[3];
- else
- special = "";
- if(!strcmpi(special,"-tnt")) gamemode = 1;
- if(!strcmpi(special,"-plutonia")) gamemode = 2;
- cout<<"in: "<<in<<" merge: "<<merge<<" special: "<<special<<"\n"<<flush;
- InFile=fopen(in,"rb");
- OutFile=fopen(merge,"r+b");
- //TempFile = fopen("~atbtmp.wad","w+b");
- if(!InFile){
- cout<<"1 File open error!\n"<<flush;
- return 2;
- }
- if(!OutFile){
- cout<<"2 File open error!\n"<<flush;
- return 2;
- }
- /*if(!TempFile){
- cout<<"3 File open error!\n"<<flush;
- return 2;
- } never use it.*/
- //If a conflict of wad enteries ever exists, the merge.wad will win.
- //They both must be IWAD's
- //Lets setup the database:
- cout<<"Reading "<<in<<"\n"<<flush;
- if(LoadWad(&Src,&SrcDat,InFile)){
- cout<<"Bad source file.\n"<<flush;
- return 3;
- }
- cout<<"Reading "<<merge<<"\n"<<flush;
- LoadWad(&Mrg,&MrgDat,OutFile);
- //cout<<"bug"<<flush<<SrcDat<<flush;
- MergeWads();
- if(SrcDat)
- delete SrcDat;
- if(MrgDat)
- delete MrgDat;
- if(NewDat)
- delete NewDat;
- return 0;
- }
- int LoadWad(wadinfo_t * Wad,filelump_t **Data,FILE* File){
- char name[9];
- fseek(File,0,SEEK_SET);
- fread(Wad,sizeof(wadinfo_t),1,File);
- if(strncmp("IWAD",Wad->identification,4)){
- cout<<"Not an IWad\n"<<flush;
- return 1;//not an IWad
- }
- cout<<"There are "<<Wad->numlumps<<" enteries in this wad file.\n"<<flush;
- *Data = new filelump_t[Wad->numlumps];
- //cout<<*Data<<"\n";
- fseek(File,Wad->infotableofs,SEEK_SET);
- fread(*Data,Wad->numlumps,sizeof(filelump_t),File);
- //cout<<*Data<<"\n";
- /*for(int i=0;i<Wad->numlumps;i++){
- strncpy(name,Data[i].name,8);
- name[8]=0;
- cout<<"Wad entry #"<<i<<" is "<<name<<" and is located at "<<Data[i].filepos<<" and is "<<Data[i].size<<" bytes long.\n";
- }*/ //Testing purposes.
- //cout<<*Data<<"\n";
- return 0;
- }
- //This searches the lump list and returns the index where it shows up.
- //returns -1 if not found.
- int FindLumpByName(char * what,filelump_t * Data,int num){
- char Search[9],name[9];
- int i;
- strncpy(Search,what,8);
- Search[8]=0;
- //cout<<"Looking for: "<<Search<<"\n"<<flush;
- for(i=0;i<num;i++){
- memcpy(name,Data[i].name,8);
- name[8]=0;
- //cout<<"Compared to: "<<name<<"\n"<<flush;
- if(!stricmp(Search,name))
- return i;
- }
- //we didn't find it.
- return -1;
- }
- char *LoadLumpByName(char * what,filelump_t * Data,wadinfo_t Wad,FILE* File){
- char *Hold=0;
- int i;
- if((i=FindLumpByName(what,Data,Wad.numlumps))>-1){
- Hold=new char[Data[i].size];
- fseek(File,Data[i].filepos,SEEK_SET);
- fread(Hold,Data[i].size,1,File);
- }
- return Hold;
- }
- //This processes the wad merger.
- void MergeWads(){
- char *Tex1Mrg,*Tex2Mrg,*PNamesMrg,*Hold,Name[9],
- *Tex1Src,*Tex2Src,*PNamesSrc,
- *Tex1New,*Tex2New,*PNamesNew;
- int i,Current=0,workSrc,workMrg,TexFlag=0;
- int WriteWhere=12;//writing pointer.
- int P_Stuff=0,F_Stuff=0,S_Stuff=0,MapStuff=0;
- Name[8]=0;
- //setup the new file header.
- New.identification[0]='I';
- New.identification[1]='W';
- New.identification[2]='A';
- New.identification[3]='D';
- New.numlumps = Src.numlumps+Mrg.numlumps;//Max possible.
- New.infotableofs = -1;//needs to be set later.
- NewDat= new filelump_t[New.numlumps];
- //Clear the new index.
- memset(NewDat,0,New.numlumps*sizeof(filelump_t));
- //memcpy(NewDat,MrgDat,Mrg.numlumps*sizeof(filelump_t));
- //Texture1, Texture2, and PNames will be the last enteries
- //physically in the file we write and will be processed last but read into
- //memory first for destination file.
- //The idea is to never re-write data or move it around in the
- //Merged file.
- Tex1Mrg = LoadLumpByName("TEXTURE1",MrgDat,Mrg,OutFile);
- Tex2Mrg = LoadLumpByName("TEXTURE2",MrgDat,Mrg,OutFile);
- PNamesMrg = LoadLumpByName("PNAMES",MrgDat,Mrg,OutFile);
- Tex1Src = LoadLumpByName("TEXTURE1",SrcDat,Src,InFile);
- Tex2Src = LoadLumpByName("TEXTURE2",SrcDat,Src,InFile);
- PNamesSrc = LoadLumpByName("PNAMES",SrcDat,Src,InFile);
- //Now, lets spin through the wad for the last used byte.
- //If they somehow are not last, at least we won't destroy other data.
- cout<<"Calculating data writing start point.\n"<<flush;
- for(i = 0;i<Mrg.numlumps;i++){
- if(WriteWhere<MrgDat[i].filepos+MrgDat[i].size){
- if(strnicmp(MrgDat[i].name,"TEXTURE1",8)&&
- strnicmp(MrgDat[i].name,"TEXTURE2",8)&&
- strnicmp(MrgDat[i].name,"PNAMES",8)){
- WriteWhere = MrgDat[i].filepos+MrgDat[i].size;
- }
- }
- }
- cout<<"WriteWhere: "<<WriteWhere<<"\n"<<flush;
- //Now, lets spin through the wads.
- //Merge Wad
- cout<<"Updating Merge Wad's Floating Data.\n"<<flush;
- for(i = 0;i<Mrg.numlumps;i++){
- //These will be done separately.
- if(i == FindLumpByName("S_Start",MrgDat,Mrg.numlumps)){
- i = FindLumpByName("S_End",MrgDat,Mrg.numlumps);
- continue;
- }
- if(i == FindLumpByName("P_Start",MrgDat,Mrg.numlumps)){
- i = FindLumpByName("P_End",MrgDat,Mrg.numlumps);
- continue;
- }
- if(i == FindLumpByName("F_Start",MrgDat,Mrg.numlumps)){
- i = FindLumpByName("F_End",MrgDat,Mrg.numlumps);
- continue;
- }
- if(i == FindLumpByName("TEXTURE1",MrgDat,Mrg.numlumps))
- continue;
- if(i == FindLumpByName("TEXTURE2",MrgDat,Mrg.numlumps))
- continue;
- if(i == FindLumpByName("PNAMES",MrgDat,Mrg.numlumps))
- continue;
- //This lump is from the Merged wad.
- //cout<<"Looking "<<strncpy(Name,MrgDat[i].name,8)<<" \r"<<flush;
- if(!(S_Stuff||P_Stuff||F_Stuff)){
- //cout<<"Copying "<<strncpy(Name,MrgDat[i].name,8)<<" \n"<<flush;
- //We aren't in our black-out period.
- NewDat[Current]=MrgDat[i];
- Current++;
- if(MrgDat[i].size == 0){
- if(MrgDat[i].name[0]=='P' || //Plutonia
- MrgDat[i].name[0]=='T' || //TNT
- MrgDat[i].name[0]=='E' || //E#M#
- MrgDat[i].name[0]=='M'){ //Map
- for(MapStuff=10;MapStuff>0;MapStuff--){//Ten associated lumps to a map.
- if(i>Mrg.numlumps)
- break;
- i++;
- NewDat[Current]=MrgDat[i];
- Current++;
- }//For MapStuff
- }//If it is a Map lump marker.
- }//If it is 0 bytes
- }//Find Lumps
- if(i == FindLumpByName("S_End",MrgDat,Mrg.numlumps))
- S_Stuff = 0;
- if(i == FindLumpByName("P_End",MrgDat,Mrg.numlumps))
- P_Stuff = 0;
- if(i == FindLumpByName("F_End",MrgDat,Mrg.numlumps))
- F_Stuff = 0;
- }//For i
- //Reset the blackout: Shouldn't need to though.
- S_Stuff = 0;
- P_Stuff = 0;
- F_Stuff = 0;
- //Source Wad
- cout<<"Adding New Floating Data from input wad.\n"<<flush;
- for(i = 0;i<Src.numlumps;i++){
- //These will be done separately.
- if(i == FindLumpByName("S_Start",SrcDat,Src.numlumps)){
- i = FindLumpByName("S_End",SrcDat,Src.numlumps);
- continue;
- }
- if(i == FindLumpByName("P_Start",SrcDat,Src.numlumps)){
- i = FindLumpByName("P_End",SrcDat,Src.numlumps);
- continue;
- }
- if(i == FindLumpByName("F_Start",SrcDat,Src.numlumps)){
- i = FindLumpByName("F_End",SrcDat,Src.numlumps);
- continue;
- }
- if(i == FindLumpByName("TEXTURE1",SrcDat,Src.numlumps))
- continue;
- if(i == FindLumpByName("TEXTURE2",SrcDat,Src.numlumps))
- continue;
- if(i == FindLumpByName("PNAMES",SrcDat,Src.numlumps))
- continue;
- if(SrcDat[i].size == 0){
- if(SrcDat[i].name[0]=='M'){ //Map
- if(gamemode == 1){//tnt
- SrcDat[i].name[0]='T';
- SrcDat[i].name[1]='N';
- SrcDat[i].name[2]='T';
- cout<<"Tnt Map: "<<SrcDat[i].name<<"\n"<<flush;
- }
- if(gamemode == 2){//plutonia
- SrcDat[i].name[0]='P';
- SrcDat[i].name[1]='L';
- SrcDat[i].name[2]='U';
- cout<<"Plutonia Map: "<<SrcDat[i].name<<"\n"<<flush;
- }
- }
- }
- else{
- if(SrcDat[i].name[0]=='D' && SrcDat[i].name[1]=='_'){ //Music
- if(gamemode == 1){//tnt
- SrcDat[i].name[1]='T';
- cout<<"Tnt Music: "<<strncpy(Name,SrcDat[i].name,8)<<"\n"<<flush;
- }
- if(gamemode == 2){//plutonia
- SrcDat[i].name[1]='L';
- cout<<"Plutonia Music: "<<strncpy(Name,SrcDat[i].name,8)<<"\n"<<flush;
- }
- }
- if(SrcDat[i].name[0]=='C' && SrcDat[i].name[1]=='W'){ //Map Name
- if(gamemode == 1){//tnt
- SrcDat[i].name[0]='T';
- cout<<"Tnt Map Name: "<<SrcDat[i].name<<"\n"<<flush;
- }
- if(gamemode == 2){//plutonia
- SrcDat[i].name[0]='P';
- cout<<"Plutonia Map Name: "<<SrcDat[i].name<<"\n"<<flush;
- }
- }
- }
- if(FindLumpByName(SrcDat[i].name,MrgDat,Mrg.numlumps)==-1 && FindLumpByName(SrcDat[i].name,NewDat,Current)==-1){
- //This lump is NOT in the Merged wad.
- //cout<<"Looking "<<strncpy(Name,SrcDat[i].name,8)<<" \r"<<flush;
- if(!(S_Stuff||P_Stuff||F_Stuff)){
- //cout<<"Copying "<<strncpy(Name,SrcDat[i].name,8)<<" \n"<<flush;
- //We aren't in our black-out period.
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- if(SrcDat[i].size == 0){
- if(SrcDat[i].name[0]=='P' || //Plutonia
- SrcDat[i].name[0]=='T' || //TNT
- SrcDat[i].name[0]=='E' || //E#M#
- SrcDat[i].name[0]=='M'){ //Map
- for(MapStuff=10;MapStuff>0;MapStuff--){
- if(i>Src.numlumps)
- break;
- i++;
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }//For MapStuff
- }//If it is a Map lump marker.
- }//If it is 0 bytes
- }//Find Lumps
- }//If FindLump by Name
- if(i == FindLumpByName("S_End",SrcDat,Src.numlumps))
- S_Stuff = 0;
- if(i == FindLumpByName("P_End",SrcDat,Src.numlumps))
- P_Stuff = 0;
- if(i == FindLumpByName("F_End",SrcDat,Src.numlumps))
- F_Stuff = 0;
- }//For i
- //Ok, that crap is done, now we do the S_Stuff
- cout<<"Updating Sprite data.\n"<<flush;
- workSrc = FindLumpByName("S_Start",SrcDat,Src.numlumps);
- workMrg = FindLumpByName("S_Start",MrgDat,Mrg.numlumps);
- if(workSrc>-1 && workMrg>-1){ //we have both
- //cout<<"Both!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("S_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- i=workSrc+1;
- workSrc = FindLumpByName("S_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- if(FindLumpByName(SrcDat[i].name,MrgDat,Mrg.numlumps)==-1 && FindLumpByName(SrcDat[i].name,NewDat,Current)==-1){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- else if(workSrc>-1){
- //cout<<"Source!\n"<<flush;
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- i=workSrc+1;
- workSrc = FindLumpByName("S_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- }
- else if(workMrg>-1){
- //cout<<"Merge!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("S_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- //Don't worry about it if we don't have any of them.
- cout<<"Updating Wall patch data.\n"<<flush;
- //Ok, that crap is done, now we do the P_Stuff
- workSrc = FindLumpByName("P_Start",SrcDat,Src.numlumps);
- workMrg = FindLumpByName("P_Start",MrgDat,Mrg.numlumps);
- if(workSrc>-1 && workMrg>-1){ //we have both
- TexFlag = 1;
- //cout<<"Both!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("P_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- i=workSrc+1;
- workSrc = FindLumpByName("P_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- if(FindLumpByName(SrcDat[i].name,MrgDat,Mrg.numlumps)==-1 && FindLumpByName(SrcDat[i].name,NewDat,Current)==-1){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- else if(workSrc>-1){
- TexFlag = 2;
- //cout<<"Source!\n"<<flush;
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- i=workSrc+1;
- workSrc = FindLumpByName("P_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- }
- else if(workMrg>-1){
- TexFlag = 3;
- //cout<<"Merge!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("P_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- //Don't worry about it if we don't have any of them.
- cout<<"Updating Floor data.\n"<<flush;
- //Ok, that crap is done, now we do the F_Stuff
- workSrc = FindLumpByName("F_Start",SrcDat,Src.numlumps);
- workMrg = FindLumpByName("F_Start",MrgDat,Mrg.numlumps);
- if(workSrc>-1 && workMrg>-1){ //we have both
- //cout<<"Both!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("F_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- i=workSrc+1;
- workSrc = FindLumpByName("F_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- if(FindLumpByName(SrcDat[i].name,MrgDat,Mrg.numlumps)==-1 && FindLumpByName(SrcDat[i].name,NewDat,Current)==-1){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- else if(workSrc>-1){
- //cout<<"Source!\n"<<flush;
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- i=workSrc+1;
- workSrc = FindLumpByName("F_End",SrcDat,Src.numlumps);
- for(;i<workSrc;i++){
- NewDat[Current]=SrcDat[i];
- NewDat[Current].filepos = WriteWhere;
- fseek(InFile,SrcDat[i].filepos,SEEK_SET);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- Hold = new char[SrcDat[i].size];
- fread(Hold,SrcDat[i].size,1,InFile);
- fwrite(Hold,SrcDat[i].size,1,OutFile);
- delete Hold;
- WriteWhere+=SrcDat[i].size;
- Current++;
- }
- NewDat[Current]=SrcDat[workSrc];
- NewDat[Current].filepos = WriteWhere;
- Current++;
- }
- else if(workMrg>-1){
- //cout<<"Merge!\n"<<flush;
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- i=workMrg+1;
- workMrg = FindLumpByName("F_End",MrgDat,Mrg.numlumps);
- for(;i<workMrg;i++){
- NewDat[Current]=MrgDat[i];
- Current++;
- }
- NewDat[Current]=MrgDat[workMrg];
- Current++;
- }
- //Don't worry about it if we don't have any of them.
- //At this point, we need a new texture resources.
- PNamesNew=GenPNames(PNamesSrc,PNamesMrg);
- Tex1New = 0;
- Tex2New = 0;
- Tex1New=GenTextures(Tex1Src,Tex1Mrg);
- Hold = 0;
- if(Tex2Mrg)
- Tex2New=GenTextures(Hold,Tex2Mrg);//If I have one, continue having it.
- if(Tex2Src)
- Tex1New=GenTextures(Tex2Src,Tex1New+4);//Import it to Texture1 for conversion purposes.
- if(PNamesNew){
- memcpy(&i,PNamesNew,4);
- PNamesNew+=4;
- NewDat[Current].size=i;
- NewDat[Current].filepos = WriteWhere;
- strncpy(NewDat[Current].name,"PNAMES",8);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- fwrite(PNamesNew,NewDat[Current].size,1,OutFile);
- PNamesNew-=4;
- WriteWhere+=NewDat[Current].size;
- Current++;
- }
- if(Tex1New){
- memcpy(&i,Tex1New,4);
- Tex1New+=4;
- NewDat[Current].size=i;
- NewDat[Current].filepos = WriteWhere;
- strncpy(NewDat[Current].name,"TEXTURE1",8);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- fwrite(Tex1New,NewDat[Current].size,1,OutFile);
- Tex1New-=4;
- WriteWhere+=NewDat[Current].size;
- Current++;
- }
- if(Tex2New){
- memcpy(&i,Tex2New,4);
- Tex2New+=4;
- NewDat[Current].size=i;
- NewDat[Current].filepos = WriteWhere;
- strncpy(NewDat[Current].name,"TEXTURE2",8);
- fseek(OutFile,NewDat[Current].filepos,SEEK_SET);
- fwrite(Tex2New,NewDat[Current].size,1,OutFile);
- Tex2New-=4;
- WriteWhere+=NewDat[Current].size;
- Current++;
- }
- New.numlumps = Current;
- New.infotableofs = WriteWhere;//needs to be set later.
- fseek(OutFile,WriteWhere,SEEK_SET);
- fwrite(NewDat,Current,sizeof(filelump_t),OutFile);
- fseek(OutFile,0,SEEK_SET);
- fwrite(&New,sizeof(wadinfo_t),1,OutFile);
- }//End of function
- int PNamesFind(char*what,char*data,int num){
- int i=num-1;
- char name[9];
- name[8]=0;
- //cout<<"What: "<<strncpy(name,what,8);
- //cout<<"\nData "<<i<<": "<<strncpy(name,data+8*i,8)<<"\n"<<flush;
- for(i = 0;i<num;i++){
- if(!strnicmp(what,data,8))
- return i;
- data+=8;
- }
- return -1;
- }
- char * PNamesToUse,*PNamesSrc,*PNamesMrg;
- char* GenPNames(char*src,char*mrg){
- char *Hold=0,*start,names[9];
- int numSrc,numMrg,num;
- int i,j,k;
- names[8]=0;
- PNamesSrc=src;
- PNamesMrg=mrg;
- cout<<"Combining PNames.\n"<<flush;
- if(src && mrg){
- memcpy(&numSrc,src,4);
- memcpy(&numMrg,mrg,4);
- num = numSrc+numMrg;
- i = num*8;
- start=Hold=new char[i+8];//4 for lenght and 4 for number of them.
- src+=4;
- mrg+=4;
- Hold+=8;
- num = numMrg;
- memcpy(Hold,mrg,numMrg*8);
- Hold+=num*8;
- for(j=0;j<numSrc;j++){
- if(PNamesFind(src,mrg,numMrg)==-1){
- memcpy(Hold,src,8);
- Hold+=8;
- memcpy(names,src,8);
- //cout<<"Adding: "<<names<<" to PNames\n"<<flush;
- num++;
- }
- src+=8;
- }
- i=num*8+4;
- Hold = start;
- PNamesToUse=Hold+4;
- memcpy(Hold,&i,4);
- Hold+=4;
- //cout<<"Find me: "<<num<<flush;
- memcpy(Hold,&num,4);
- //for(i = 0;i<num;i++)
- // cout<<"\nData "<<i<<": "<<strncpy(names,Hold+4+8*i,8)<<"\n"<<flush;
- return start;
- }
- else if(src){
- memcpy(&numSrc,src,4);
- i=numSrc*8+4;
- Hold = new char[i+4];
- memcpy(Hold,&i,4);
- memcpy(Hold+4,src,i);
- PNamesToUse=Hold+4;
- //cout<<"PNames is: "<<i<<" bytes long\n"<<flush;
- return Hold;
- }
- else if(mrg){
- memcpy(&numMrg,mrg,4);
- i=numMrg*8+4;
- Hold = new char[i+4];
- memcpy(Hold,&i,4);
- memcpy(Hold+4,mrg,i);
- PNamesToUse=Hold+4;
- //cout<<"PNames is: "<<i<<" bytes long\n"<<flush;
- return Hold;
- }
- return Hold;
- }
- int TNamesFind(char*what, myTex_t *data,int num){
- int i;
- for(i = 0;i<num;i++){
- if(!strnicmp(what,data[i].name,8))
- return i;
- }
- return -1;
- }
- int GetTexture(myTex_t *Tex,char* data){
- memcpy(Tex,data,22);
- Tex->patches = (patches_t*)(data+22);
- /*
- //When in doubt, print it all!
- cout<<"Name: "<<Tex->name<<"\n"<<flush;
- cout<<"zero1: "<<Tex->zero1<<"\n"<<flush;
- cout<<"zero2: "<<Tex->zero2<<"\n"<<flush;
- cout<<"width: "<<Tex->width<<"\n"<<flush;
- cout<<"height: "<<Tex->height<<"\n"<<flush;
- cout<<"zero3: "<<Tex->zero3<<"\n"<<flush;
- cout<<"zero4: "<<Tex->zero4<<"\n"<<flush;
- cout<<"Num patches: "<<Tex->numPatches<<"\n"<<flush;
- */
- return Tex->numPatches*sizeof(patches_t)+22;
- }
- char* GenTextures(char*src,char*mrg){
- char*newbuf=0,*start=0,name[9];
- int inew,*offsnew,*isrc,*offssrc,*imrg,*offsmrg,j,k,len,pat,pos;
- int PNTU=0,PNS=0,PNM=0;
- myTex_t *TextNew,*TextSrc,*TextMrg;
- cout<<"Combining Textures\n"<<flush;
- if(PNamesToUse)
- memcpy(&PNTU,PNamesToUse,4);
- if(PNamesSrc)
- memcpy(&PNS,PNamesSrc,4);
- if(PNamesMrg)
- memcpy(&PNM,PNamesMrg,4);
- //cout<<PNTU<<" "<<PNS<<" "<<PNM<<"\n";
- name[8]=0;
- if(src && mrg){
- isrc=(int*)src;
- imrg=(int*)mrg;
- inew=*isrc+*imrg;
- offsnew=new int[inew];
- offssrc=(int*)(src+4);
- offsmrg=(int*)(mrg+4);
- TextNew=new myTex_t[inew];
- TextSrc=new myTex_t[*isrc];
- TextMrg=new myTex_t[*imrg];
- for(j=0;j<*isrc;j++){
- GetTexture(&TextSrc[j],src+offssrc[j]);
- //cout<<"Src: "<<TextSrc[j].name<<"\n"<<flush;
- }
- len = 0;
- for(j=0;j<*imrg;j++){
- len+=GetTexture(&TextMrg[j],mrg+offsmrg[j]);
- //cout<<"Mrg: "<<TextMrg[j].name<<"\n"<<flush;
- TextNew[j]=TextMrg[j];
- }
- for(k=0;k<*isrc;k++){
- if(TNamesFind(TextSrc[k].name,TextMrg,*imrg)==-1){
- TextNew[j]=TextSrc[k];
- //cout<<"Added: "<<TextNew[j].name<<"\n"<<flush;
- for(pat=0;pat<TextNew[j].numPatches;pat++){
- //cout<<"OldPName: "<<TextNew[j].patches[pat].PName<< " "<<strncpy(name,(PNamesSrc+4+TextNew[j].patches[pat].PName*8),8)<<"\n";
- TextNew[j].patches[pat].PName=PNamesFind((PNamesSrc+4+TextNew[j].patches[pat].PName*8),PNamesToUse+4,PNTU);
- //cout<<"\nNewPName: "<<TextNew[j].patches[pat].PName<< " "<<strncpy(name,(PNamesToUse+4+TextNew[j].patches[pat].PName*8),8)<<"\n"<<flush;
- }
- len+=TextNew[j].numPatches*10+22;
- j++;
- }
- }
- len += 4+j*4;
- start = newbuf = new char[len+4];//4 for the length we send back.
- k=len+4;
- memcpy(newbuf,&k,4);
- newbuf+=4;
- memcpy(newbuf,&j,4);
- pos=j*4+4;
- newbuf+=4;
- for(k=0;k<j;k++){
- memcpy(newbuf,&pos,4);
- newbuf+=4;
- memcpy(start+pos+4,&TextNew[k],22);
- memcpy(start+pos+26,TextNew[k].patches,TextNew[k].numPatches*10);
- pos+=(TextNew[k].numPatches*10+22);
- }
- newbuf=start;
- }
- else if(src){
- isrc=(int*)src;
- len = 0;
- offssrc=(int*)(src+4);
- TextSrc=new myTex_t;
- for(j = 0;j<*isrc;j++){
- if(len < GetTexture(TextSrc,src+offssrc[j])+offssrc[j])
- len = GetTexture(TextSrc,src+offssrc[j])+offssrc[j];
- //cout<<offssrc[j]<<" "<<GetTexture(TextSrc,src+offssrc[j])<<" "<<len<<"\n"<<flush;
- }
- newbuf = new char[len+4];
- memcpy(newbuf,&len,4);
- memcpy(newbuf+4,src,len);
- //cout<<*isrc<<" "<<TextSrc[0].name<<" "<<len<<"\n"<<flush;
- }
- else if(mrg){
- len = 0;
- imrg=(int*)mrg;
- offsmrg=(int*)(mrg+4);
- TextMrg=new myTex_t;
- for(j = 0;j<*imrg;j++){
- if(len < GetTexture(TextMrg,mrg+offsmrg[j])+offsmrg[j])
- len = GetTexture(TextMrg,mrg+offsmrg[j])+offsmrg[j];
- //cout<<len<<"\n"<<flush;
- }
- newbuf = new char[len+4];
- memcpy(newbuf,&len,4);
- memcpy(newbuf+4,mrg,len);
- //cout<<*imrg<<" "<<TextMrg[0].name<<" "<<len<<"\n"<<flush;
- }
- return newbuf;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement