[7910] Resolve problems with vmaps extractor support 3.1.2 archives.
[getmangos.git] / contrib / vmap_extractor_v2 / vmapextract / adtfile.cpp
blob1445a321ed5d081505aeecce855b710d6af673b5
1 #include "adtfile.h"
3 #include <algorithm>
5 char * GetPlainName(char * FileName)
7 char * szTemp;
9 if((szTemp = strrchr(FileName, '\\')) != NULL)
10 FileName = szTemp + 1;
11 return FileName;
14 void fixnamen(char *name, size_t len)
16 for (size_t i=0; i<len-3; i++)
18 if (i>0 && name[i]>='A' && name[i]<='Z' && isalpha(name[i-1]))
20 name[i] |= 0x20;
21 } else if ((i==0 || !isalpha(name[i-1])) && name[i]>='a' && name[i]<='z')
23 name[i] &= ~0x20;
27 void fixname2(char *name, size_t len)
29 for (size_t i=0; i<len-3; i++)
31 if(name[i] == ' ')
32 name[i] = '_';
36 ADTFile::ADTFile(char* filename): ADT(filename)
38 Adtfilename.append(filename);
41 bool ADTFile::init(char *map_id)
43 if(ADT.isEof ())
44 return false;
46 size_t size;
48 string xMap;
49 string yMap;
51 Adtfilename.erase(Adtfilename.find(".adt"),4);
52 string TempMapNumber;
53 TempMapNumber = Adtfilename.substr(Adtfilename.length()-6,6);
54 xMap = TempMapNumber.substr(TempMapNumber.find("_")+1,(TempMapNumber.find_last_of("_")-1) - (TempMapNumber.find("_")));
55 yMap = TempMapNumber.substr(TempMapNumber.find_last_of("_")+1,(TempMapNumber.length()) - (TempMapNumber.find_last_of("_")));
56 Adtfilename.erase((Adtfilename.length()-xMap.length()-yMap.length()-2), (xMap.length()+yMap.length()+2));
57 string AdtMapNumber = xMap + ' ' + yMap + ' ' + GetPlainName((char*)Adtfilename.c_str());
58 printf("Processing map %s...\n", AdtMapNumber.c_str());
59 //printf("MapNumber = %s\n", TempMapNumber.c_str());
60 //printf("xMap = %s\n", xMap.c_str());
61 //printf("yMap = %s\n", yMap.c_str());
63 const char dirname[] = "buildings\\dir";
64 FILE *dirfile;
65 dirfile = fopen(dirname, "ab");
66 if(!dirfile)
68 printf("Can't open dirfile!'%s'\n");
69 return false;
73 while (!ADT.isEof())
75 char fourcc[5];
76 ADT.read(&fourcc,4);
77 ADT.read(&size, 4);
78 flipcc(fourcc);
79 fourcc[4] = 0;
81 size_t nextpos = ADT.getPos() + size;
83 if (!strcmp(fourcc,"MCIN"))
87 else if (!strcmp(fourcc,"MTEX"))
90 else if (!strcmp(fourcc,"MMDX"))
92 if (size)
94 char *buf = new char[size];
95 ADT.read(buf, size);
96 char *p=buf;
97 int t=0;
98 ModelInstansName = new string[size];
99 while (p<buf+size)
101 fixnamen(p,strlen(p));
102 string path(p);
103 char* s=GetPlainName(p);
104 fixname2(s,strlen(s));
105 p=p+strlen(p)+1;
106 ModelInstansName[t++] = s;
108 // < 3.1.0 ADT MMDX section store filename.mdx filenames for corresponded .m2 file
109 std::string ext3 = path.size() >= 4 ? path.substr(path.size()-4,4) : "";
110 std::transform( ext3.begin(), ext3.end(), ext3.begin(), ::tolower );
111 if(ext3 == ".mdx")
113 // replace .mdx -> .m2
114 path.erase(path.length()-2,2);
115 path.append("2");
117 // >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file
118 // nothing do
120 char szLocalFile[MAX_PATH];
121 sprintf(szLocalFile, ".\\buildings\\%s", s);
122 FILE * output = fopen(szLocalFile,"rb");
123 if(!output)
125 Model * m2 = new Model(path);
126 if(m2->open())
127 m2->ConvertToVMAPModel(szLocalFile);
128 delete m2;
130 else
131 fclose(output);
134 delete[] buf;
138 else if (!strcmp(fourcc,"MWMO"))
140 if (size)
142 char *buf = new char[size];
143 ADT.read(buf, size);
144 char *p=buf;
145 int q = 0;
146 WmoInstansName = new string[size];
147 while (p<buf+size)
149 string path(p);
150 char* s=GetPlainName(p);
151 fixnamen(s,strlen(s));
152 fixname2(s,strlen(s));
153 p=p+strlen(p)+1;
154 WmoInstansName[q++] = s;
156 delete[] buf;
159 //======================
160 else if (!strcmp(fourcc,"MDDF"))
162 if (size)
164 nMDX = (int)size / 36;
165 for (int i=0; i<nMDX; ++i)
167 int id;
168 ADT.read(&id, 4);
169 ModelInstance inst(ADT,ModelInstansName[id].c_str(),map_id, dirfile);//!!!!!!!!!!!
171 delete[] ModelInstansName;
174 else if (!strcmp(fourcc,"MODF"))
176 if (size)
178 nWMO = (int)size / 64;
179 for (int i=0; i<nWMO; ++i)
181 int id;
182 ADT.read(&id, 4);
183 WMOInstance inst(ADT,WmoInstansName[id].c_str(),map_id, dirfile);//!!!!!!!!!!!!!
185 delete[] WmoInstansName;
188 //======================
189 #if 0
190 else if (!strcmp(fourcc,"MDDF"))
192 if (size)
194 nMDX = (int)size / 36;
195 for (int i=0; i<nMDX; ++i)
197 int id;
198 ADT.read(&id, 4);
199 ModelInstance inst(ADT,ModelInstansName[id].c_str(),AdtMapNumber.c_str(), dirfile);
201 delete[] ModelInstansName;
204 else if (!strcmp(fourcc,"MODF"))
206 if (size)
208 nWMO = (int)size / 64;
209 for (int i=0; i<nWMO; ++i)
211 int id;
212 ADT.read(&id, 4);
213 WMOInstance inst(ADT,WmoInstansName[id].c_str(),AdtMapNumber.c_str(), dirfile);
215 delete[] WmoInstansName;
218 #endif
219 ADT.seek(nextpos);
221 ADT.close();
222 fclose(dirfile);
223 return true;
226 ADTFile::~ADTFile()
228 ADT.close();