All pastes #992938 Raw Edit

Anonymous

public text v1 · immutable
#992938 ·published 2008-04-22 06:35 UTC
rendered paste body
Index: contrib/vmap_extractor_v2/vmapextract/model.cpp
===================================================================
--- contrib/vmap_extractor_v2/vmapextract/model.cpp	(revision 5676)
+++ contrib/vmap_extractor_v2/vmapextract/model.cpp	(working copy)
@@ -34,31 +34,25 @@
             return false;
         }
 #endif
-        trans = 1.0f;
-        origVertices = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
+        
+        origBoundingVertices = (BoundingVertex*)(f.getBuffer() + header.ofsBoundingVertices);
+        boundingVertices = new Vec3D[header.nBoundingVertices];
 
-        vertices = new Vec3D[header.nVertices];
-        normals = new Vec3D[header.nVertices];
-
-        for (size_t i=0; i<header.nVertices; i++) 
+        for (size_t i=0; i<header.nBoundingVertices; i++) 
         {
-            origVertices[i].pos = fixCoordSystem(origVertices[i].pos);
-            origVertices[i].normal = fixCoordSystem(origVertices[i].normal);
-            vertices[i] = origVertices[i].pos;
-            normals[i] = origVertices[i].normal.normalize();	
-        }
+            origBoundingVertices[i].pos = fixCoordSystem(origBoundingVertices[i].pos);
+            boundingVertices[i] = origBoundingVertices[i].pos;
+		}
 
-        ModelView *view = (ModelView*)(f.getBuffer() + header.ofsViews);
+        uint16 *triangles = (uint16*)(f.getBuffer() + header.ofsBoundingTriangles);
 
-        uint16 *indexLookup = (uint16*)(f.getBuffer() + view->ofsIndex);
-        uint16 *triangles = (uint16*)(f.getBuffer() + view->ofsTris);
-
-        nIndices = view->nTris;
-        indices = new uint16[nIndices];
-        for (size_t i = 0; i<nIndices; i++) 
+        nBoundingIndices = header.nBoundingTriangles;
+        boundingIndices = new uint16[nBoundingIndices];
+        for (size_t i = 0; i<nBoundingIndices; i++) 
         {
-            indices[i] = indexLookup[triangles[i]];
+            boundingIndices[i] = triangles[i];
         }
+
         f.close();
     } else {
         //printf("not included %s\n", filename.c_str());
@@ -151,8 +145,8 @@
         return false;
     }
     fwrite("VMAP002",8,1,output);
-    int nVertices = header.nVertices;
-    fwrite(&nVertices, sizeof(int), 1, output);
+    int nBoundingVertices = header.nBoundingVertices;
+    fwrite(&nBoundingVertices, sizeof(int), 1, output);
     uint32 nofgroups = 1;
     fwrite(&nofgroups,sizeof(uint32), 1, output);
     fwrite(N,4,1,output);
@@ -162,29 +156,29 @@
     wsize = sizeof(branches) + sizeof(uint32) * branches;
     fwrite(&wsize, sizeof(int), 1, output);
     fwrite(&branches,sizeof(branches), 1, output);
-    uint32 nIdexes = (uint32) nIndices;
-    fwrite(&nIndices,sizeof(uint32), 1, output);
+    uint32 nBoundingIdexes = (uint32) nBoundingIndices;
+    fwrite(&nBoundingIndices,sizeof(uint32), 1, output);
     fwrite("INDX",4, 1, output);
-    wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
+    wsize = sizeof(uint32) + sizeof(unsigned short) * nBoundingIdexes;
     fwrite(&wsize, sizeof(int), 1, output);
-    fwrite(&nIdexes, sizeof(uint32), 1, output);
-    if(nIdexes >0) 
+    fwrite(&nBoundingIdexes, sizeof(uint32), 1, output);
+    if(nBoundingIdexes >0) 
     {
-        fwrite(indices, sizeof(unsigned short), nIdexes, output);
+        fwrite(boundingIndices, sizeof(unsigned short), nBoundingIdexes, output);
     }
     fwrite("VERT",4, 1, output);
-    wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
+    wsize = sizeof(int) + sizeof(float) * 3 * nBoundingVertices;
     fwrite(&wsize, sizeof(int), 1, output);
-    fwrite(&nVertices, sizeof(int), 1, output);
-    if(nVertices >0) 
+    fwrite(&nBoundingVertices, sizeof(int), 1, output);
+    if(nBoundingVertices >0) 
     {
-        for(int vpos=0; vpos <nVertices; ++vpos) 
+        for(int vpos=0; vpos <nBoundingVertices; ++vpos) 
         {
-            float sy = vertices[vpos].y;
-            vertices[vpos].y = vertices[vpos].z;
-            vertices[vpos].z = sy;
+            float sy = boundingVertices[vpos].y;
+            boundingVertices[vpos].y = boundingVertices[vpos].z;
+            boundingVertices[vpos].z = sy;
         }
-        fwrite(vertices, sizeof(float)*3, nVertices, output);
+        fwrite(boundingVertices, sizeof(float)*3, nBoundingVertices, output);
     }
 
     delete[] vertices;
@@ -193,7 +187,7 @@
 
     fclose(output);
 
-    return true;
+	return true;
 }
 
 Model::~Model()
Index: contrib/vmap_extractor_v2/vmapextract/model.h
===================================================================
--- contrib/vmap_extractor_v2/vmapextract/model.h	(revision 5676)
+++ contrib/vmap_extractor_v2/vmapextract/model.h	(working copy)
@@ -28,9 +28,10 @@
 
 	bool isAnimated(MPQFile &f);
 	ModelVertex *origVertices;
-	Vec3D *vertices, *normals;
-	uint16 *indices;
-	size_t nIndices;
+	BoundingVertex *origBoundingVertices;
+	Vec3D *vertices, *normals, *boundingVertices;
+	uint16 *indices, *boundingIndices;
+	size_t nIndices, nBoundingIndices;
 	
 	bool open();
 	bool ConvertToVMAPModel(char * outfilename);
Index: contrib/vmap_extractor_v2/vmapextract/modelheaders.h
===================================================================
--- contrib/vmap_extractor_v2/vmapextract/modelheaders.h	(revision 5676)
+++ contrib/vmap_extractor_v2/vmapextract/modelheaders.h	(working copy)
@@ -153,6 +153,13 @@
 	int unk1, unk2; // always 0,0 so this is probably unused
 };
 
+struct BoundingVertex {
+	Vec3D pos;
+};
+struct BoundingTriangle {
+	Vec3D pos;
+};
+
 struct ModelView {
     uint32 nIndex, ofsIndex; // Vertices in this model (index into vertices[])
     uint32 nTris, ofsTris;	 // indices
@@ -301,4 +308,5 @@
 #pragma pack(pop)
 
 
-#endif
\ No newline at end of file
+#endif
+
Index: contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
===================================================================
--- contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp	(revision 5676)
+++ contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp	(working copy)
@@ -1,566 +1,566 @@
-/*****************************************************************************/
-/* StormLibTest.cpp                       Copyright (c) Ladislav Zezula 2003 */
-/*---------------------------------------------------------------------------*/
-/* This module uses very brutal test methods for StormLib. It extracts all   */
-/* files from the archive with Storm.dll and with stormlib and compares them,*/
-/* then tries to build a copy of the entire archive, then removes a few files*/
-/* from the archive and adds them back, then compares the two archives, ...  */
-/*---------------------------------------------------------------------------*/
-/*   Date    Ver   Who  Comment                                              */
-/* --------  ----  ---  -------                                              */
-/* 25.03.03  1.00  Lad  The first version of StormLibTest.cpp                */
-/*****************************************************************************/
-
-#define _CRT_SECURE_NO_DEPRECATE
-#include <io.h>
-#include <conio.h>
-#include <stdio.h>
-#include <windows.h>
-#include <mmsystem.h>
-#include <vector>
-#include <list>
-
-
-#define __STORMLIB_SELF__               // Don't use StormLib.lib
-#include "StormLib.h"
-
-#pragma warning(disable : 4505) 
-#pragma comment(lib, "Winmm.lib")
-
-//From Extractor
-#include "adtfile.h"
-#include "wdtfile.h"
-#include "dbcfile.h"
-#include "mpq.h"
-#include "wmo.h"
-
-//------------------------------------------------------------------------------
-// Defines
-
-#define MPQ_BLOCK_SIZE 0x1000
-
-//-----------------------------------------------------------------------------
-// from extractor
-typedef unsigned char uint8;
-typedef unsigned short uint16;
-typedef unsigned int uint32;
-typedef struct{
-    char name[64];
-    unsigned int id;
-}map_id;
-
-map_id * map_ids;
-uint16 * areas;
-uint16 *areamax;
-uint32 map_count;
-char output_path[128]=".";
-char input_path[1024]=".";
-bool hasInputPathParam = false;
-char tmp[512];
-bool preciseVectorData = false;
-//char gamepath[1024];	
-
-//Convert function
-//bool ConvertADT(char*,char*);
-
-// Constants
-
-//static const char * szWorkDirMaps = ".\\Maps";
-static const char * szWorkDirWmo = ".\\buildings";
-
-//static LPBYTE pbBuffer1 = NULL;
-//static LPBYTE pbBuffer2 = NULL;
-
-// Local testing functions
-
-static void clreol()
-{
-    printf("\r                                                                              \r");
-}
-
-static const char * GetPlainName(const char * szFileName)
-{
-    const char * szTemp;
-
-    if((szTemp = strrchr(szFileName, '\\')) != NULL)
-        szFileName = szTemp + 1;
-    return szFileName;
-}
-//------------------------------------------------------------------------------
-static void ShowProcessedFile(const char * szFileName)
-{
-    char szLine[80];
-    size_t nLength = strlen(szFileName);
-
-    memset(szLine, 0x20, sizeof(szLine));
-    szLine[sizeof(szLine)-1] = 0;
-
-    if(nLength > sizeof(szLine)-1)
-        nLength = sizeof(szLine)-1;
-    memcpy(szLine, szFileName, nLength);
-    printf("\r%s\n", szLine);
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-int ExtractWmo(const std::vector<std::string>& pArchiveNames)
-{
-
-    char* szListFile = ""; 
-    char   szLocalFile[MAX_PATH] = "";
-    HANDLE hMpq = ""; 
-    BOOL bResult = FALSE;
-
-    //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"};
-
-    int nError = ERROR_SUCCESS;
-    if(szListFile == NULL || *szListFile == 0)
-        szListFile = NULL;
-    //char tmp[1024];
-    //for (size_t i=0; i<4; i++)
-    for (size_t i=0; i<pArchiveNames.size(); i++)
-    {
-
-        //sprintf(tmp,"%s\\%s", input_path, ParsArchiveNames[i]);
-        //if(!SFileOpenArchive(tmp, 0, 0, &hMpq))
-        if(!SFileOpenArchive(pArchiveNames[i].c_str(), 0, 0, &hMpq))
-            printf("NOT open!!! %s\n",pArchiveNames[i].c_str());
-
-        // Copy files from archive
-        if(nError == ERROR_SUCCESS)
-        {	
-            SFILE_FIND_DATA wf;
-            HANDLE hFind = SFileFindFirstFile(hMpq,"*.wmo*", &wf, szListFile);
-            bResult = TRUE;
-
-            while(hFind != NULL && bResult == TRUE)
-            {
-                ShowProcessedFile(wf.cFileName);
-                SFileSetLocale(wf.lcLocale);
-                sprintf(szLocalFile, "%s\\%s", szWorkDirWmo, GetPlainName(wf.cFileName));
-                fixnamen(szLocalFile,strlen(szLocalFile));
-                FILE * n;
-                if ((n = fopen(szLocalFile, "rb"))== NULL)
-                {
-                    int p = 0;
-                    //Select root wmo files
-                    const char * rchr = strrchr(GetPlainName(wf.cFileName),0x5f);
-                    if(rchr != NULL)
-                    {
-                        char cpy[4];
-                        strncpy((char*)cpy,rchr,4);
-                        for (int i=0;i<4;i++)
-                        {
-                            int m = cpy[i];
-                            if(isdigit(m))
-                                p++;	
-                        }
-                    }
-                    if(p != 3)
-                    {
-                        //printf("RootWmo!\n");
-                        string s = wf.cFileName;
-                        WMORoot * froot = new WMORoot(s);
-                        if(!froot->open())
-                        {
-                            printf("Not open RootWmo!!!\n");
-                            bResult = SFileFindNextFile(hFind, &wf);
-                            continue;
-                        }
-                         FILE *output=fopen(szLocalFile,"wb");
-                        froot->ConvertToVMAPRootWmo(output);
-                        int Wmo_nVertices = 0;
-                        if(froot->nGroups !=0)
-                        {
-                            for (int i=0; i<froot->nGroups; i++)
-                            {
-                                char temp[512];
-                                strcpy(temp, wf.cFileName);
-                                temp[strlen(wf.cFileName)-4] = 0;
-                                char groupFileName[512];
-                                sprintf(groupFileName,"%s_%03d.wmo",temp, i);
-                                printf("%s\n",groupFileName);
-                                //printf("GroupWmo!\n");
-                                string s = groupFileName;
-                                WMOGroup * fgroup = new WMOGroup(s);
-                                if(!fgroup->open())
-                                {
-                                    printf("Not all open Group file for: %s\n",GetPlainName(wf.cFileName));
-                                    bResult = SFileFindNextFile(hFind, &wf);
-                                    break;
-                                }
-								Wmo_nVertices += fgroup->ConvertToVMAPGroupWmo(output, preciseVectorData);	
-                            }
-                        }
-                        fseek(output, 8, SEEK_SET); // store the correct no of vertices
-                        fwrite(&Wmo_nVertices,sizeof(int),1,output);
-                        fclose(output);	
-                    }
-                } else {
-                    fclose(n);
-                }
-                wf.dwFileFlags &= ~MPQ_FILE_HAS_EXTRA;
-                wf.dwFileFlags &= ~MPQ_FILE_EXISTS;
-                // Find the next file
-                bResult = SFileFindNextFile(hFind, &wf);
-            }
-            // Delete the extracted file in the case of an error
-            if(nError != ERROR_SUCCESS)
-                DeleteFile(szLocalFile);
-            // Close the search handle
-            if(hFind != NULL)
-                SFileFindClose(hFind);
-
-        }
-    }
-    // Close both archives
-    if(hMpq != NULL)
-        //SFileCloseArchive(hMpq);
-        if(nError == ERROR_SUCCESS)
-            printf("\nExtract wmo complete (No errors)\n");
-
-    return nError;
-
-}
-
-void ExtractMapsFromMpq()
-{
-
-}
-//-----------------------------------------------------------------------------
-void ParsMapFiles()
-{
-    char fn[512];
-    char id_filename[64];
-    char id[10];
-    for (unsigned int i=0; i<map_count; i++)
-    {
-        sprintf(id,"%03u",map_ids[i].id);
-        sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
-        WDTFile WDT(fn,map_ids[i].name);
-        if(WDT.init(id))
-        {
-            for (int x=0; x<64; x++)
-            {
-                for (int y=0; y<64; y++)
-                {
-                    if (ADTFile*ADT = WDT.GetMap(x,y))
-                    {
-                        sprintf(id_filename,"%02u %02u %03u",x,y,map_ids[i].id);//!!!!!!!!!
-                        ADT->init(id_filename);
-                        delete ADT;
-                    }
-
-                }
-            }
-        }
-    }
-}
-#if 0
-void ParsMapFiles()
-{
-
-    char fn[512];
-    for (unsigned int i=0; i<map_count; i++)
-    {
-        sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
-        WDTFile WDT(fn,map_ids[i].name);
-        if(WDT.init())
-        {
-            for (int x=0; x<64; x++)
-            {
-                for (int y=0; y<64; y++) 
-                {
-                    if (ADTFile*ADT = WDT.GetMap(x,y))
-                    {
-                        ADT->init();
-                        delete ADT;
-                    }
-
-                }
-            }
-        }
-    }
-}
-#endif
-//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
-void getGamePath()
-{
-#ifdef _WIN32
-    HKEY key;
-    DWORD t,s;
-    LONG l;
-    s = sizeof(input_path);
-    memset(input_path,0,s);
-    l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\World of Warcraft",0,KEY_QUERY_VALUE,&key);
-    //l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\Burning Crusade Closed Beta",0,KEY_QUERY_VALUE,&key);
-    l = RegQueryValueEx(key,"InstallPath",0,&t,(LPBYTE)input_path,&s);
-    RegCloseKey(key);
-	if (strlen(input_path) > 0)
-	{
-		if (input_path[strlen(input_path) - 1] != '\\') strcat(input_path, "\\");
-	}
-    strcat(input_path,"Data\\");
-#else
-    strcpy(input_path,"data/");
-#endif
-}
-
-//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
-bool scan_patches(char* scanmatch, std::vector<std::string>& pArchiveNames)
-{
-    int i;
-    char path[512];
-    std::list<std::string> matches;
-
-    WIN32_FIND_DATA ffData;
-    HANDLE hFind;
-
-    for (i = 1; i <= 99; i++)
-    {
-        if (i != 1)
-        {
-            sprintf(path, "%s-%d.mpq", scanmatch, i);
-        }
-        else
-        {
-            sprintf(path, "%s.mpq", scanmatch);
-        }
-
-        hFind = INVALID_HANDLE_VALUE;
-        hFind = FindFirstFile(path, &ffData);
-        if (hFind == INVALID_HANDLE_VALUE) break;
-        FindClose(hFind);
-
-        matches.push_back(path);
-    }
-
-    matches.reverse();
-    for (std::list<std::string>::iterator i = matches.begin(); i != matches.end(); i++)
-    {
-        pArchiveNames.push_back(i->c_str());
-    }
-
-    printf("\n");
-
-    return(true);
-}
-
-//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
-bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
-    //srand((unsigned int)time(0));
-
-    if(!hasInputPathParam)
-        getGamePath();
-
-    printf("\nGame path: %s\n", input_path);
-
-    char path[512];
-    std::vector<std::string> locales;
-
-    // scan game directories
-    WIN32_FIND_DATA ffData;
-    HANDLE hFind;
-    DWORD dwError;
-
-    // first, scan for locales (4-letter directories)
-    printf("Scanning for locales.\n");
-    sprintf(path, "%s*.*", input_path);
-    hFind = INVALID_HANDLE_VALUE;
-    hFind = FindFirstFile(path, &ffData);
-    if (hFind == INVALID_HANDLE_VALUE)
-    {
-        printf("\nCould not open data directory for reading. Aborting.\n");
-        return(false);
-    }
-    do
-    {
-        if (ffData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-        {
-            if (ffData.cFileName[0] != '.')
-            {
-                if (strlen(ffData.cFileName) == 4)
-                {
-                    printf("Found locale: %s\n", ffData.cFileName);
-                    locales.push_back(ffData.cFileName);
-                }
-            }
-        }
-    } while (FindNextFile(hFind, &ffData) != 0);
-    dwError = GetLastError();
-    FindClose(hFind);
-    if (dwError != ERROR_NO_MORE_FILES)
-    {
-        printf("\nError reading data directory while scanning locales. Aborting.\n");
-        return(false);
-    }
-    printf("\n");
-
-    if (locales.size() == 0)
-    {
-        printf("Sorry, no locales found. Aborting.\n");
-        return(false);
-    }
-
-    // now, scan for the patch levels in the core dir
-    printf("Loading patch levels from data directory.\n");
-    sprintf(path, "%spatch", input_path);
-    if (!scan_patches(path, pArchiveNames)) return(false);
-
-    // now, scan for the patch levels in locale dirs
-    printf("Loading patch levels from locale directories.\n");
-    for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
-    {
-        printf("Locale: %s\n", i->c_str());
-        sprintf(path, "%s%s\\patch-%s", input_path, i->c_str(), i->c_str());
-        if (!scan_patches(path, pArchiveNames)) return(false);
-    }
-
-    // open expansion and common files
-    printf("Opening data files from data directory.\n");
-    sprintf(path, "%sexpansion.mpq", input_path);
-    pArchiveNames.push_back(path);
-    sprintf(path, "%scommon.mpq", input_path);
-    pArchiveNames.push_back(path);
-    printf("\n");
-
-    // open locale expansion and common files
-    printf("Opening data files from locale directories.\n");
-    for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
-    {
-        printf("Locale: %s\n", i->c_str());
-        sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str());
-        pArchiveNames.push_back(path);
-        sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str());
-        pArchiveNames.push_back(path);
-        printf("\n");
-    }
-    return true;
-}
-//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-// return false it normal processing can not proceed
-
-bool processArgv(int argc, char ** argv, char*versionString)
-{
-    bool result = true;
-    hasInputPathParam = false;
-    bool preciseVectorData = false;
-
-    for(int i=1; i< argc; ++i) {
-		if(strcmp("-s",argv[i]) == 0) {
-			preciseVectorData = false;
-		} else if(strcmp("-d",argv[i]) == 0) {
-            if((i+1)<argc) {
-                hasInputPathParam = true;
-                strcpy(input_path, argv[i+1]);
-                if (input_path[strlen(input_path) - 1] != '\\' || input_path[strlen(input_path) - 1] != '/')
-                    strcat(input_path, "\\");
-                ++i;
-            } else {
-                result = false;
-            }
-		} else if(strcmp("-?",argv[1]) == 0) {
-            result = false;
-		} else if(strcmp("-l",argv[i]) == 0) {
-			preciseVectorData = true;
-        } else {
-            result = false;
-            break;
-        }
-    }
-    if(!result)     {
-        printf("Extract %s.\n",versionString);
-        printf("%s [-?][-s][-l][-d <path>]\n", argv[0]);
-        printf("   -s : (default) small size (data size optimization), ~500MB less vmap data.\n");
-        printf("   -l : large size, ~500MB more vmap data. (might contain more details)\n");
-        printf("   -d <path>: Path to the vector data source folder.\n");
-        printf("   -? : This message.\n");
-    }
-    return result;
-}
-
-//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-// Main
-// 
-// The program must be run with two command line arguments
-//
-// Arg1 - The source MPQ name (for testing reading and file find)
-// Arg2 - Listfile name
-//
-
-int main(int argc, char ** argv)
-{
-    //char tmp[512];
-//    FILE* pDatei;
-//    char tmp[512];
-//    char tmp1[512];
-    //char tmp2[512];
-//    char tmp3[512];
-//    char tmp4[512];
-//    char szMpqName[MAX_PATH] = "";
-//    char szListFile[MAX_PATH] = "";
-    int nError = ERROR_SUCCESS;
-    char *versionString = "V2.4 2007_07_12";
-
-    // Use command line arguments, when some
-    if(!processArgv(argc, argv, versionString)) 
-        return 1;
- 
-    printf("Extract %s. Beginning work ....\n",versionString);
-    // Set the lowest priority to allow running in the background
-    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
-    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    // Create the working directory
-    if(nError == ERROR_SUCCESS)
-    {
-        //if(!CreateDirectory(szWorkDirMaps, NULL))
-        // nError = GetLastError();
-        if(!CreateDirectory(szWorkDirWmo, NULL))
-            nError = GetLastError();
-        if(nError == ERROR_ALREADY_EXISTS)
-            nError = ERROR_SUCCESS;
-    } 
-    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    // patch goes first -> fake priority handling
-    std::vector<MPQArchive*> archives;
-
-    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    std::vector<std::string> archiveNames;
-
-    fillArchiveNameVector(archiveNames);
-    for (size_t i=0; i<archiveNames.size(); i++) {
-        archives.push_back(new MPQArchive(archiveNames[i].c_str()));
-    }
-    ExtractWmo(archiveNames);
-
-     //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    //map.dbc
-    if(nError == ERROR_SUCCESS)
-    {
-        DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc");
-        dbc->open();
-        map_count=dbc->getRecordCount ();
-        map_ids=new map_id[map_count];
-        for(unsigned int x=0;x<map_count;x++)
-        {
-            map_ids[x].id=dbc->getRecord (x).getUInt(0);
-            strcpy(map_ids[x].name,dbc->getRecord(x).getString(1));
-            printf("Map - %s\n",map_ids[x].name);		 
-        }
-
-        delete dbc;
-        ParsMapFiles();
-        delete [] map_ids;
-        nError = ERROR_SUCCESS;
-    }
-
-    clreol();
-    if(nError != ERROR_SUCCESS) {
-        printf("ERROR: Extract %s. Work NOT complete.\n   Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData);
-        _getch();
-    }
-    printf("Extract %s. Work complete. No errors.",versionString);
-}
+/*****************************************************************************/
+/* StormLibTest.cpp                       Copyright (c) Ladislav Zezula 2003 */
+/*---------------------------------------------------------------------------*/
+/* This module uses very brutal test methods for StormLib. It extracts all   */
+/* files from the archive with Storm.dll and with stormlib and compares them,*/
+/* then tries to build a copy of the entire archive, then removes a few files*/
+/* from the archive and adds them back, then compares the two archives, ...  */
+/*---------------------------------------------------------------------------*/
+/*   Date    Ver   Who  Comment                                              */
+/* --------  ----  ---  -------                                              */
+/* 25.03.03  1.00  Lad  The first version of StormLibTest.cpp                */
+/*****************************************************************************/
+
+#define _CRT_SECURE_NO_DEPRECATE
+#include <io.h>
+#include <conio.h>
+#include <stdio.h>
+#include <windows.h>
+#include <mmsystem.h>
+#include <vector>
+#include <list>
+
+
+#define __STORMLIB_SELF__               // Don't use StormLib.lib
+#include "StormLib.h"
+
+#pragma warning(disable : 4505) 
+#pragma comment(lib, "Winmm.lib")
+
+//From Extractor
+#include "adtfile.h"
+#include "wdtfile.h"
+#include "dbcfile.h"
+#include "mpq.h"
+#include "wmo.h"
+
+//------------------------------------------------------------------------------
+// Defines
+
+#define MPQ_BLOCK_SIZE 0x1000
+
+//-----------------------------------------------------------------------------
+// from extractor
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef struct{
+    char name[64];
+    unsigned int id;
+}map_id;
+
+map_id * map_ids;
+uint16 * areas;
+uint16 *areamax;
+uint32 map_count;
+char output_path[128]=".";
+char input_path[1024]=".";
+bool hasInputPathParam = false;
+char tmp[512];
+bool preciseVectorData = false;
+//char gamepath[1024];	
+
+//Convert function
+//bool ConvertADT(char*,char*);
+
+// Constants
+
+//static const char * szWorkDirMaps = ".\\Maps";
+static const char * szWorkDirWmo = ".\\buildings";
+
+//static LPBYTE pbBuffer1 = NULL;
+//static LPBYTE pbBuffer2 = NULL;
+
+// Local testing functions
+
+static void clreol()
+{
+    printf("\r                                                                              \r");
+}
+
+static const char * GetPlainName(const char * szFileName)
+{
+    const char * szTemp;
+
+    if((szTemp = strrchr(szFileName, '\\')) != NULL)
+        szFileName = szTemp + 1;
+    return szFileName;
+}
+//------------------------------------------------------------------------------
+static void ShowProcessedFile(const char * szFileName)
+{
+    char szLine[80];
+    size_t nLength = strlen(szFileName);
+
+    memset(szLine, 0x20, sizeof(szLine));
+    szLine[sizeof(szLine)-1] = 0;
+
+    if(nLength > sizeof(szLine)-1)
+        nLength = sizeof(szLine)-1;
+    memcpy(szLine, szFileName, nLength);
+    printf("\r%s\n", szLine);
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+int ExtractWmo(const std::vector<std::string>& pArchiveNames)
+{
+
+    char* szListFile = ""; 
+    char   szLocalFile[MAX_PATH] = "";
+    HANDLE hMpq = ""; 
+    BOOL bResult = FALSE;
+
+    //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"};
+
+    int nError = ERROR_SUCCESS;
+    if(szListFile == NULL || *szListFile == 0)
+        szListFile = NULL;
+    //char tmp[1024];
+    //for (size_t i=0; i<4; i++)
+    for (size_t i=0; i<pArchiveNames.size(); i++)
+    {
+
+        //sprintf(tmp,"%s\\%s", input_path, ParsArchiveNames[i]);
+        //if(!SFileOpenArchive(tmp, 0, 0, &hMpq))
+        if(!SFileOpenArchive(pArchiveNames[i].c_str(), 0, 0, &hMpq))
+            printf("NOT open!!! %s\n",pArchiveNames[i].c_str());
+
+        // Copy files from archive
+        if(nError == ERROR_SUCCESS)
+        {	
+            SFILE_FIND_DATA wf;
+            HANDLE hFind = SFileFindFirstFile(hMpq,"*.wmo*", &wf, szListFile);
+            bResult = TRUE;
+
+            while(hFind != NULL && bResult == TRUE)
+            {
+                ShowProcessedFile(wf.cFileName);
+                SFileSetLocale(wf.lcLocale);
+                sprintf(szLocalFile, "%s\\%s", szWorkDirWmo, GetPlainName(wf.cFileName));
+                fixnamen(szLocalFile,strlen(szLocalFile));
+                FILE * n;
+                if ((n = fopen(szLocalFile, "rb"))== NULL)
+                {
+                    int p = 0;
+                    //Select root wmo files
+                    const char * rchr = strrchr(GetPlainName(wf.cFileName),0x5f);
+                    if(rchr != NULL)
+                    {
+                        char cpy[4];
+                        strncpy((char*)cpy,rchr,4);
+                        for (int i=0;i<4;i++)
+                        {
+                            int m = cpy[i];
+                            if(isdigit(m))
+                                p++;	
+                        }
+                    }
+                    if(p != 3)
+                    {
+                        //printf("RootWmo!\n");
+                        string s = wf.cFileName;
+                        WMORoot * froot = new WMORoot(s);
+                        if(!froot->open())
+                        {
+                            printf("Not open RootWmo!!!\n");
+                            bResult = SFileFindNextFile(hFind, &wf);
+                            continue;
+                        }
+                         FILE *output=fopen(szLocalFile,"wb");
+                        froot->ConvertToVMAPRootWmo(output);
+                        int Wmo_nVertices = 0;
+                        if(froot->nGroups !=0)
+                        {
+                            for (int i=0; i<froot->nGroups; i++)
+                            {
+                                char temp[512];
+                                strcpy(temp, wf.cFileName);
+                                temp[strlen(wf.cFileName)-4] = 0;
+                                char groupFileName[512];
+                                sprintf(groupFileName,"%s_%03d.wmo",temp, i);
+                                printf("%s\n",groupFileName);
+                                //printf("GroupWmo!\n");
+                                string s = groupFileName;
+                                WMOGroup * fgroup = new WMOGroup(s);
+                                if(!fgroup->open())
+                                {
+                                    printf("Not all open Group file for: %s\n",GetPlainName(wf.cFileName));
+                                    bResult = SFileFindNextFile(hFind, &wf);
+                                    break;
+                                }
+								Wmo_nVertices += fgroup->ConvertToVMAPGroupWmo(output, preciseVectorData);	
+                            }
+                        }
+                        fseek(output, 8, SEEK_SET); // store the correct no of vertices
+                        fwrite(&Wmo_nVertices,sizeof(int),1,output);
+                        fclose(output);	
+                    }
+                } else {
+                    fclose(n);
+                }
+                wf.dwFileFlags &= ~MPQ_FILE_HAS_EXTRA;
+                wf.dwFileFlags &= ~MPQ_FILE_EXISTS;
+                // Find the next file
+                bResult = SFileFindNextFile(hFind, &wf);
+            }
+            // Delete the extracted file in the case of an error
+            if(nError != ERROR_SUCCESS)
+                DeleteFile(szLocalFile);
+            // Close the search handle
+            if(hFind != NULL)
+                SFileFindClose(hFind);
+
+        }
+    }
+    // Close both archives
+    if(hMpq != NULL)
+        //SFileCloseArchive(hMpq);
+        if(nError == ERROR_SUCCESS)
+            printf("\nExtract wmo complete (No errors)\n");
+
+    return nError;
+
+}
+
+void ExtractMapsFromMpq()
+{
+
+}
+//-----------------------------------------------------------------------------
+void ParsMapFiles()
+{
+    char fn[512];
+    char id_filename[64];
+    char id[10];
+    for (unsigned int i=0; i<map_count; i++)
+    {
+        sprintf(id,"%03u",map_ids[i].id);
+        sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
+        WDTFile WDT(fn,map_ids[i].name);
+        if(WDT.init(id))
+        {
+            for (int x=0; x<64; x++)
+            {
+                for (int y=0; y<64; y++)
+                {
+                    if (ADTFile*ADT = WDT.GetMap(x,y))
+                    {
+                        sprintf(id_filename,"%02u %02u %03u",x,y,map_ids[i].id);//!!!!!!!!!
+                        ADT->init(id_filename);
+                        delete ADT;
+                    }
+
+                }
+            }
+        }
+    }
+}
+#if 0
+void ParsMapFiles()
+{
+
+    char fn[512];
+    for (unsigned int i=0; i<map_count; i++)
+    {
+        sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
+        WDTFile WDT(fn,map_ids[i].name);
+        if(WDT.init())
+        {
+            for (int x=0; x<64; x++)
+            {
+                for (int y=0; y<64; y++) 
+                {
+                    if (ADTFile*ADT = WDT.GetMap(x,y))
+                    {
+                        ADT->init();
+                        delete ADT;
+                    }
+
+                }
+            }
+        }
+    }
+}
+#endif
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+void getGamePath()
+{
+#ifdef _WIN32
+    HKEY key;
+    DWORD t,s;
+    LONG l;
+    s = sizeof(input_path);
+    memset(input_path,0,s);
+    l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\World of Warcraft",0,KEY_QUERY_VALUE,&key);
+    //l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\Burning Crusade Closed Beta",0,KEY_QUERY_VALUE,&key);
+    l = RegQueryValueEx(key,"InstallPath",0,&t,(LPBYTE)input_path,&s);
+    RegCloseKey(key);
+	if (strlen(input_path) > 0)
+	{
+		if (input_path[strlen(input_path) - 1] != '\\') strcat(input_path, "\\");
+	}
+    strcat(input_path,"Data\\");
+#else
+    strcpy(input_path,"data/");
+#endif
+}
+
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+bool scan_patches(char* scanmatch, std::vector<std::string>& pArchiveNames)
+{
+    int i;
+    char path[512];
+    std::list<std::string> matches;
+
+    WIN32_FIND_DATA ffData;
+    HANDLE hFind;
+
+    for (i = 1; i <= 99; i++)
+    {
+        if (i != 1)
+        {
+            sprintf(path, "%s-%d.mpq", scanmatch, i);
+        }
+        else
+        {
+            sprintf(path, "%s.mpq", scanmatch);
+        }
+
+        hFind = INVALID_HANDLE_VALUE;
+        hFind = FindFirstFile(path, &ffData);
+        if (hFind == INVALID_HANDLE_VALUE) break;
+        FindClose(hFind);
+
+        matches.push_back(path);
+    }
+
+    matches.reverse();
+    for (std::list<std::string>::iterator i = matches.begin(); i != matches.end(); i++)
+    {
+        pArchiveNames.push_back(i->c_str());
+    }
+
+    printf("\n");
+
+    return(true);
+}
+
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
+    //srand((unsigned int)time(0));
+
+    if(!hasInputPathParam)
+        getGamePath();
+
+    printf("\nGame path: %s\n", input_path);
+
+    char path[512];
+    std::vector<std::string> locales;
+
+    // scan game directories
+    WIN32_FIND_DATA ffData;
+    HANDLE hFind;
+    DWORD dwError;
+
+    // first, scan for locales (4-letter directories)
+    printf("Scanning for locales.\n");
+    sprintf(path, "%s*.*", input_path);
+    hFind = INVALID_HANDLE_VALUE;
+    hFind = FindFirstFile(path, &ffData);
+    if (hFind == INVALID_HANDLE_VALUE)
+    {
+        printf("\nCould not open data directory for reading. Aborting.\n");
+        return(false);
+    }
+    do
+    {
+        if (ffData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+        {
+            if (ffData.cFileName[0] != '.')
+            {
+                if (strlen(ffData.cFileName) == 4)
+                {
+                    printf("Found locale: %s\n", ffData.cFileName);
+                    locales.push_back(ffData.cFileName);
+                }
+            }
+        }
+    } while (FindNextFile(hFind, &ffData) != 0);
+    dwError = GetLastError();
+    FindClose(hFind);
+    if (dwError != ERROR_NO_MORE_FILES)
+    {
+        printf("\nError reading data directory while scanning locales. Aborting.\n");
+        return(false);
+    }
+    printf("\n");
+
+    if (locales.size() == 0)
+    {
+        printf("Sorry, no locales found. Aborting.\n");
+        return(false);
+    }
+
+    // now, scan for the patch levels in the core dir
+    printf("Loading patch levels from data directory.\n");
+    sprintf(path, "%spatch", input_path);
+    if (!scan_patches(path, pArchiveNames)) return(false);
+
+    // now, scan for the patch levels in locale dirs
+    printf("Loading patch levels from locale directories.\n");
+    for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
+    {
+        printf("Locale: %s\n", i->c_str());
+        sprintf(path, "%s%s\\patch-%s", input_path, i->c_str(), i->c_str());
+        if (!scan_patches(path, pArchiveNames)) return(false);
+    }
+
+    // open expansion and common files
+    printf("Opening data files from data directory.\n");
+    sprintf(path, "%sexpansion.mpq", input_path);
+    pArchiveNames.push_back(path);
+    sprintf(path, "%scommon.mpq", input_path);
+    pArchiveNames.push_back(path);
+    printf("\n");
+
+    // open locale expansion and common files
+    printf("Opening data files from locale directories.\n");
+    for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
+    {
+        printf("Locale: %s\n", i->c_str());
+        sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str());
+        pArchiveNames.push_back(path);
+        sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str());
+        pArchiveNames.push_back(path);
+        printf("\n");
+    }
+    return true;
+}
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+// return false it normal processing can not proceed
+
+bool processArgv(int argc, char ** argv, char*versionString)
+{
+    bool result = true;
+    hasInputPathParam = false;
+    bool preciseVectorData = false;
+
+    for(int i=1; i< argc; ++i) {
+		if(strcmp("-s",argv[i]) == 0) {
+			preciseVectorData = false;
+		} else if(strcmp("-d",argv[i]) == 0) {
+            if((i+1)<argc) {
+                hasInputPathParam = true;
+                strcpy(input_path, argv[i+1]);
+                if (input_path[strlen(input_path) - 1] != '\\' || input_path[strlen(input_path) - 1] != '/')
+                    strcat(input_path, "\\");
+                ++i;
+            } else {
+                result = false;
+            }
+		} else if(strcmp("-?",argv[1]) == 0) {
+            result = false;
+		} else if(strcmp("-l",argv[i]) == 0) {
+			preciseVectorData = true;
+        } else {
+            result = false;
+            break;
+        }
+    }
+    if(!result)     {
+        printf("Extract %s.\n",versionString);
+        printf("%s [-?][-s][-l][-d <path>]\n", argv[0]);
+        printf("   -s : (default) small size (data size optimization), ~500MB less vmap data.\n");
+        printf("   -l : large size, ~500MB more vmap data. (might contain more details)\n");
+        printf("   -d <path>: Path to the vector data source folder.\n");
+        printf("   -? : This message.\n");
+    }
+    return result;
+}
+
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+// Main
+// 
+// The program must be run with two command line arguments
+//
+// Arg1 - The source MPQ name (for testing reading and file find)
+// Arg2 - Listfile name
+//
+
+int main(int argc, char ** argv)
+{
+    //char tmp[512];
+//    FILE* pDatei;
+//    char tmp[512];
+//    char tmp1[512];
+    //char tmp2[512];
+//    char tmp3[512];
+//    char tmp4[512];
+//    char szMpqName[MAX_PATH] = "";
+//    char szListFile[MAX_PATH] = "";
+    int nError = ERROR_SUCCESS;
+    char *versionString = "V2.5 2008_04_12";
+
+    // Use command line arguments, when some
+    if(!processArgv(argc, argv, versionString)) 
+        return 1;
+ 
+    printf("Extract %s. Beginning work ....\n",versionString);
+    // Set the lowest priority to allow running in the background
+    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
+    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+    // Create the working directory
+    if(nError == ERROR_SUCCESS)
+    {
+        //if(!CreateDirectory(szWorkDirMaps, NULL))
+        // nError = GetLastError();
+        if(!CreateDirectory(szWorkDirWmo, NULL))
+            nError = GetLastError();
+        if(nError == ERROR_ALREADY_EXISTS)
+            nError = ERROR_SUCCESS;
+    } 
+    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+    // patch goes first -> fake priority handling
+    std::vector<MPQArchive*> archives;
+
+    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+    std::vector<std::string> archiveNames;
+
+    fillArchiveNameVector(archiveNames);
+    for (size_t i=0; i<archiveNames.size(); i++) {
+        archives.push_back(new MPQArchive(archiveNames[i].c_str()));
+    }
+    ExtractWmo(archiveNames);
+
+     //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+    //map.dbc
+    if(nError == ERROR_SUCCESS)
+    {
+        DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc");
+        dbc->open();
+        map_count=dbc->getRecordCount ();
+        map_ids=new map_id[map_count];
+        for(unsigned int x=0;x<map_count;x++)
+        {
+            map_ids[x].id=dbc->getRecord (x).getUInt(0);
+            strcpy(map_ids[x].name,dbc->getRecord(x).getString(1));
+            printf("Map - %s\n",map_ids[x].name);		 
+        }
+
+        delete dbc;
+        ParsMapFiles();
+        delete [] map_ids;
+        nError = ERROR_SUCCESS;
+    }
+
+    clreol();
+    if(nError != ERROR_SUCCESS) {
+        printf("ERROR: Extract %s. Work NOT complete.\n   Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData);
+        _getch();
+    }
+    printf("Extract %s. Work complete. No errors.",versionString);
+}