From 667e353c39d11c4147b54a5641510e7419f358b0 Mon Sep 17 00:00:00 2001 From: Charles A Edwards Date: Sat, 30 Jul 2016 08:29:30 +0100 Subject: [PATCH] The tools folder structure redone tools' folder structure is now the same as previous cores. --- src/tools/CMakeLists.txt | 29 +- src/tools/Extractor_Binaries/make_vmaps.bat | 46 ++ .../Extractor_Binaries/mmap_excluded.txt | 1 + src/tools/Extractor_projects/CMakeLists.txt | 52 ++ .../Movemap-Generator/.gitignore | 0 .../Movemap-Generator/CMakeLists.txt | 0 .../Movemap-Generator/IntermediateValues.cpp | 0 .../Movemap-Generator/IntermediateValues.h | 0 .../Movemap-Generator/MMapCommon.h | 0 .../Movemap-Generator/MangosMap.h | 0 .../Movemap-Generator/MapBuilder.cpp | 0 .../Movemap-Generator/MapBuilder.h | 0 .../Movemap-Generator/Movemap-Generator.rc | 0 .../Movemap-Generator/TerrainBuilder.cpp | 0 .../Movemap-Generator/TerrainBuilder.h | 0 .../Movemap-Generator/VMapExtensions.cpp | 0 .../Movemap-Generator/generator.cpp | 0 .../Movemap-Generator/mmap_extract.py | 0 .../Movemap-Generator/offmesh_example.txt | 0 .../Movemap-Generator/readme | 0 src/tools/Extractor_projects/README.md | 11 + .../map-extractor/.gitignore | 0 .../map-extractor/CMakeLists.txt | 23 +- .../map-extractor/README.md | 0 .../map-extractor/System.cpp | 12 +- .../map-extractor/dbcfile.cpp | 0 .../map-extractor/dbcfile.h | 0 .../map-extractor/map-extractor.rc | 0 .../shared/ExtractorCommon.cpp | 572 ++++++++++++++++++ .../shared/ExtractorCommon.h | 56 ++ src/tools/Extractor_projects/tools.ico | Bin 0 -> 272486 bytes .../vmap-assembler/.gitignore | 0 .../vmap-assembler/CMakeLists.txt | 0 .../vmap-assembler/README | 0 .../vmap-assembler/vmap-assembler.rc | 0 .../vmap-assembler/vmap_assembler.cpp | 0 .../vmap-extractor/.gitignore | 0 .../vmap-extractor/CMakeLists.txt | 3 + .../vmap-extractor/README.md | 0 .../vmap-extractor/adtfile.cpp | 0 .../vmap-extractor/adtfile.h | 0 .../vmap-extractor/dbcfile.cpp | 0 .../vmap-extractor/dbcfile.h | 0 .../vmap-extractor/gameobject_extract.cpp | 0 .../vmap-extractor/loadlib/loadlib.h | 0 .../vmap-extractor/make_vmaps.bat | 0 .../vmap-extractor/model.cpp | 0 .../vmap-extractor/model.h | 0 .../vmap-extractor/modelheaders.h | 0 .../vmap-extractor/mpqfile.cpp | 0 .../vmap-extractor/mpqfile.h | 0 .../vmap-extractor/vec3d.h | 0 .../vmap-extractor/vmap-extractor.rc | 0 .../vmap-extractor/vmapexport.cpp | 10 +- .../vmap-extractor/vmapexport.h | 0 .../vmap-extractor/wdtfile.cpp | 0 .../vmap-extractor/wdtfile.h | 0 .../vmap-extractor/wmo.cpp | 0 .../vmap-extractor/wmo.h | 0 src/tools/tools.ico | Bin 1150 -> 0 bytes 60 files changed, 766 insertions(+), 49 deletions(-) create mode 100644 src/tools/Extractor_Binaries/make_vmaps.bat create mode 100644 src/tools/Extractor_Binaries/mmap_excluded.txt create mode 100644 src/tools/Extractor_projects/CMakeLists.txt rename src/tools/{ => Extractor_projects}/Movemap-Generator/.gitignore (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/CMakeLists.txt (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/IntermediateValues.cpp (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/IntermediateValues.h (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/MMapCommon.h (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/MangosMap.h (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/MapBuilder.cpp (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/MapBuilder.h (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/Movemap-Generator.rc (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/TerrainBuilder.cpp (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/TerrainBuilder.h (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/VMapExtensions.cpp (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/generator.cpp (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/mmap_extract.py (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/offmesh_example.txt (100%) rename src/tools/{ => Extractor_projects}/Movemap-Generator/readme (100%) create mode 100644 src/tools/Extractor_projects/README.md rename src/tools/{ => Extractor_projects}/map-extractor/.gitignore (100%) rename src/tools/{ => Extractor_projects}/map-extractor/CMakeLists.txt (75%) rename src/tools/{ => Extractor_projects}/map-extractor/README.md (100%) rename src/tools/{ => Extractor_projects}/map-extractor/System.cpp (99%) rename src/tools/{ => Extractor_projects}/map-extractor/dbcfile.cpp (100%) rename src/tools/{ => Extractor_projects}/map-extractor/dbcfile.h (100%) rename src/tools/{ => Extractor_projects}/map-extractor/map-extractor.rc (100%) create mode 100644 src/tools/Extractor_projects/shared/ExtractorCommon.cpp create mode 100644 src/tools/Extractor_projects/shared/ExtractorCommon.h create mode 100644 src/tools/Extractor_projects/tools.ico rename src/tools/{ => Extractor_projects}/vmap-assembler/.gitignore (100%) rename src/tools/{ => Extractor_projects}/vmap-assembler/CMakeLists.txt (100%) rename src/tools/{ => Extractor_projects}/vmap-assembler/README (100%) rename src/tools/{ => Extractor_projects}/vmap-assembler/vmap-assembler.rc (100%) rename src/tools/{ => Extractor_projects}/vmap-assembler/vmap_assembler.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/.gitignore (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/CMakeLists.txt (92%) rename src/tools/{ => Extractor_projects}/vmap-extractor/README.md (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/adtfile.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/adtfile.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/dbcfile.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/dbcfile.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/gameobject_extract.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/loadlib/loadlib.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/make_vmaps.bat (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/model.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/model.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/modelheaders.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/mpqfile.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/mpqfile.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/vec3d.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/vmap-extractor.rc (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/vmapexport.cpp (99%) rename src/tools/{ => Extractor_projects}/vmap-extractor/vmapexport.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/wdtfile.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/wdtfile.h (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/wmo.cpp (100%) rename src/tools/{ => Extractor_projects}/vmap-extractor/wmo.h (100%) delete mode 100644 src/tools/tools.ico diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 181abb9f9..6cd00e18f 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -17,32 +17,5 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#Used by vmap-assembler and mmap-generator -include_directories( - ${CMAKE_SOURCE_DIR}/src/shared - ${CMAKE_SOURCE_DIR}/src/game/vmap - ${CMAKE_SOURCE_DIR}/dep/g3dlite - ${CMAKE_SOURCE_DIR}/src/framework - ${ACE_INCLUDE_DIR} -) -add_definitions(-DMMAP_GENERATOR -DNO_CORE_FUNCS) - -add_library(vmap - ${CMAKE_SOURCE_DIR}/src/game/vmap/BIH.cpp - ${CMAKE_SOURCE_DIR}/src/game/vmap/VMapManager2.cpp - ${CMAKE_SOURCE_DIR}/src/game/vmap/MapTree.cpp - ${CMAKE_SOURCE_DIR}/src/game/vmap/TileAssembler.cpp - ${CMAKE_SOURCE_DIR}/src/game/vmap/WorldModel.cpp - ${CMAKE_SOURCE_DIR}/src/game/vmap/ModelInstance.cpp -) - -target_link_libraries(vmap g3dlite zlib) - -# Used for install targets in subdirs -set(TOOLS_DIR "tools") - -add_subdirectory(Movemap-Generator) -add_subdirectory(map-extractor) -add_subdirectory(vmap-assembler) -add_subdirectory(vmap-extractor) +add_subdirectory(Extractor_projects) diff --git a/src/tools/Extractor_Binaries/make_vmaps.bat b/src/tools/Extractor_Binaries/make_vmaps.bat new file mode 100644 index 000000000..aca4c651b --- /dev/null +++ b/src/tools/Extractor_Binaries/make_vmaps.bat @@ -0,0 +1,46 @@ +@echo off +cls +echo. +echo Welcome to the vmaps extractor and assembler +echo. +echo You need 2GB of free space in disk, CTRL+C to stop process +echo Hit Enter to start . . . +pause>nul +cls +echo. +echo. +echo. +IF EXIST buildings\dir (ECHO The buildings folder already exist do you want to delete it? +echo If YES hit Enter to continue if no CLOSE the program now! . . . +pause>nul +DEL /S /Q buildings) +vmapExtractor.exe +cls +echo. +echo. +echo. +IF NOT %ERRORLEVEL% LEQ 1 (echo The vmap extract tool finalized with errors. +echo Hit Enter to continue . . . +pause>nul) +cls +echo. +echo. +echo. +echo Vmaps extracted check log.txt for errors, now it's time to assemble the vmaps press any key to continue . . . +pause>nul +md vmaps +vmap_assembler.exe buildings vmaps +cls +echo. +echo. +echo. +IF NOT %ERRORLEVEL% LEQ 1 (echo The vmap assembler tool finalized with errors. +echo Hit Enter to continue . . . +pause>nul) +cls +echo. +echo. +echo. +echo Process done! copy vmaps folder to the MaNGOS main directory +echo Press any key to exit . . . +pause>nul diff --git a/src/tools/Extractor_Binaries/mmap_excluded.txt b/src/tools/Extractor_Binaries/mmap_excluded.txt new file mode 100644 index 000000000..a913e57a4 --- /dev/null +++ b/src/tools/Extractor_Binaries/mmap_excluded.txt @@ -0,0 +1 @@ +13 25 29 35 37 42 44 169 451 598 diff --git a/src/tools/Extractor_projects/CMakeLists.txt b/src/tools/Extractor_projects/CMakeLists.txt new file mode 100644 index 000000000..cc0b0031d --- /dev/null +++ b/src/tools/Extractor_projects/CMakeLists.txt @@ -0,0 +1,52 @@ +# MaNGOS is a full featured server for World of Warcraft, supporting +# the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8 +# +# Copyright (C) 2005-2016 MaNGOS project +# +# 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#Used by vmap-assembler and mmap-generator +include_directories( + ${CMAKE_SOURCE_DIR}/src/shared + ${CMAKE_SOURCE_DIR}/src/game/vmap + ${CMAKE_SOURCE_DIR}/dep/g3dlite + ${CMAKE_SOURCE_DIR}/src/framework + ${ACE_INCLUDE_DIR} +) + +add_definitions(-DMMAP_GENERATOR -DNO_CORE_FUNCS) + +add_library(vmap + ${CMAKE_SOURCE_DIR}/src/game/vmap/BIH.cpp + ${CMAKE_SOURCE_DIR}/src/game/vmap/VMapManager2.cpp + ${CMAKE_SOURCE_DIR}/src/game/vmap/MapTree.cpp + ${CMAKE_SOURCE_DIR}/src/game/vmap/TileAssembler.cpp + ${CMAKE_SOURCE_DIR}/src/game/vmap/WorldModel.cpp + ${CMAKE_SOURCE_DIR}/src/game/vmap/ModelInstance.cpp +) + +target_link_libraries(vmap g3dlite zlib) + +# Used for install targets in subdirs +set(TOOLS_DIR "tools") + +add_subdirectory(Movemap-Generator) +add_subdirectory(map-extractor) +add_subdirectory(vmap-assembler) +add_subdirectory(vmap-extractor) + + + + diff --git a/src/tools/Movemap-Generator/.gitignore b/src/tools/Extractor_projects/Movemap-Generator/.gitignore similarity index 100% rename from src/tools/Movemap-Generator/.gitignore rename to src/tools/Extractor_projects/Movemap-Generator/.gitignore diff --git a/src/tools/Movemap-Generator/CMakeLists.txt b/src/tools/Extractor_projects/Movemap-Generator/CMakeLists.txt similarity index 100% rename from src/tools/Movemap-Generator/CMakeLists.txt rename to src/tools/Extractor_projects/Movemap-Generator/CMakeLists.txt diff --git a/src/tools/Movemap-Generator/IntermediateValues.cpp b/src/tools/Extractor_projects/Movemap-Generator/IntermediateValues.cpp similarity index 100% rename from src/tools/Movemap-Generator/IntermediateValues.cpp rename to src/tools/Extractor_projects/Movemap-Generator/IntermediateValues.cpp diff --git a/src/tools/Movemap-Generator/IntermediateValues.h b/src/tools/Extractor_projects/Movemap-Generator/IntermediateValues.h similarity index 100% rename from src/tools/Movemap-Generator/IntermediateValues.h rename to src/tools/Extractor_projects/Movemap-Generator/IntermediateValues.h diff --git a/src/tools/Movemap-Generator/MMapCommon.h b/src/tools/Extractor_projects/Movemap-Generator/MMapCommon.h similarity index 100% rename from src/tools/Movemap-Generator/MMapCommon.h rename to src/tools/Extractor_projects/Movemap-Generator/MMapCommon.h diff --git a/src/tools/Movemap-Generator/MangosMap.h b/src/tools/Extractor_projects/Movemap-Generator/MangosMap.h similarity index 100% rename from src/tools/Movemap-Generator/MangosMap.h rename to src/tools/Extractor_projects/Movemap-Generator/MangosMap.h diff --git a/src/tools/Movemap-Generator/MapBuilder.cpp b/src/tools/Extractor_projects/Movemap-Generator/MapBuilder.cpp similarity index 100% rename from src/tools/Movemap-Generator/MapBuilder.cpp rename to src/tools/Extractor_projects/Movemap-Generator/MapBuilder.cpp diff --git a/src/tools/Movemap-Generator/MapBuilder.h b/src/tools/Extractor_projects/Movemap-Generator/MapBuilder.h similarity index 100% rename from src/tools/Movemap-Generator/MapBuilder.h rename to src/tools/Extractor_projects/Movemap-Generator/MapBuilder.h diff --git a/src/tools/Movemap-Generator/Movemap-Generator.rc b/src/tools/Extractor_projects/Movemap-Generator/Movemap-Generator.rc similarity index 100% rename from src/tools/Movemap-Generator/Movemap-Generator.rc rename to src/tools/Extractor_projects/Movemap-Generator/Movemap-Generator.rc diff --git a/src/tools/Movemap-Generator/TerrainBuilder.cpp b/src/tools/Extractor_projects/Movemap-Generator/TerrainBuilder.cpp similarity index 100% rename from src/tools/Movemap-Generator/TerrainBuilder.cpp rename to src/tools/Extractor_projects/Movemap-Generator/TerrainBuilder.cpp diff --git a/src/tools/Movemap-Generator/TerrainBuilder.h b/src/tools/Extractor_projects/Movemap-Generator/TerrainBuilder.h similarity index 100% rename from src/tools/Movemap-Generator/TerrainBuilder.h rename to src/tools/Extractor_projects/Movemap-Generator/TerrainBuilder.h diff --git a/src/tools/Movemap-Generator/VMapExtensions.cpp b/src/tools/Extractor_projects/Movemap-Generator/VMapExtensions.cpp similarity index 100% rename from src/tools/Movemap-Generator/VMapExtensions.cpp rename to src/tools/Extractor_projects/Movemap-Generator/VMapExtensions.cpp diff --git a/src/tools/Movemap-Generator/generator.cpp b/src/tools/Extractor_projects/Movemap-Generator/generator.cpp similarity index 100% rename from src/tools/Movemap-Generator/generator.cpp rename to src/tools/Extractor_projects/Movemap-Generator/generator.cpp diff --git a/src/tools/Movemap-Generator/mmap_extract.py b/src/tools/Extractor_projects/Movemap-Generator/mmap_extract.py similarity index 100% rename from src/tools/Movemap-Generator/mmap_extract.py rename to src/tools/Extractor_projects/Movemap-Generator/mmap_extract.py diff --git a/src/tools/Movemap-Generator/offmesh_example.txt b/src/tools/Extractor_projects/Movemap-Generator/offmesh_example.txt similarity index 100% rename from src/tools/Movemap-Generator/offmesh_example.txt rename to src/tools/Extractor_projects/Movemap-Generator/offmesh_example.txt diff --git a/src/tools/Movemap-Generator/readme b/src/tools/Extractor_projects/Movemap-Generator/readme similarity index 100% rename from src/tools/Movemap-Generator/readme rename to src/tools/Extractor_projects/Movemap-Generator/readme diff --git a/src/tools/Extractor_projects/README.md b/src/tools/Extractor_projects/README.md new file mode 100644 index 000000000..d239f5b4b --- /dev/null +++ b/src/tools/Extractor_projects/README.md @@ -0,0 +1,11 @@ +## Unified Extractor Projects + +The submodule contains the unified Extractors for MaNGOS. + +This initially Supports:- + +* MaNGOS Zero + +* MaNGOS One + +* MaNGOS Two diff --git a/src/tools/map-extractor/.gitignore b/src/tools/Extractor_projects/map-extractor/.gitignore similarity index 100% rename from src/tools/map-extractor/.gitignore rename to src/tools/Extractor_projects/map-extractor/.gitignore diff --git a/src/tools/map-extractor/CMakeLists.txt b/src/tools/Extractor_projects/map-extractor/CMakeLists.txt similarity index 75% rename from src/tools/map-extractor/CMakeLists.txt rename to src/tools/Extractor_projects/map-extractor/CMakeLists.txt index b4b8f4ca9..2a8d45a66 100644 --- a/src/tools/map-extractor/CMakeLists.txt +++ b/src/tools/Extractor_projects/map-extractor/CMakeLists.txt @@ -29,9 +29,14 @@ endif() include_directories( ${CMAKE_SOURCE_DIR}/dep/StormLib/src ${CMAKE_SOURCE_DIR}/dep/loadlib + ${CMAKE_SOURCE_DIR}/src/tools/Extractor_projects/shared ) -add_executable(${EXECUTABLE_NAME} dbcfile.cpp System.cpp ${EXECUTABLE_SRCS}) +set(SOURCES + ${CMAKE_SOURCE_DIR}/src/tools/Extractor_projects/shared/ExtractorCommon.cpp +) + +add_executable(${EXECUTABLE_NAME} dbcfile.cpp System.cpp ${SOURCES} ${EXECUTABLE_SRCS}) target_link_libraries(${EXECUTABLE_NAME} loadlib StormLib) @@ -58,12 +63,12 @@ endif() #install documentation and generation scripts install( FILES - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/ExtractResources.sh" - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/make_vmaps.bat" - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/mmap_excluded.txt" - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/MoveMapGen.sh" - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/offmesh.txt" - "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries/README.txt" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/ExtractResources.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/make_vmaps.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/mmap_excluded.txt" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/MoveMapGen.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/offmesh.txt" + "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries/README.txt" DESTINATION "${BIN_DIR}/${TOOLS_DIR}" ) @@ -73,13 +78,13 @@ if( WIN32 ) add_custom_command(TARGET ${EXECUTABLE_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/tools/" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries" "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/tools/" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries" "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/tools/" ) elseif ( MINGW ) add_custom_command(TARGET ${EXECUTABLE_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/tools/" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/../Extractor_Binaries" "${CMAKE_BINARY_DIR}/bin/tools/" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/../../Extractor_Binaries" "${CMAKE_BINARY_DIR}/bin/tools/" ) endif() endif() \ No newline at end of file diff --git a/src/tools/map-extractor/README.md b/src/tools/Extractor_projects/map-extractor/README.md similarity index 100% rename from src/tools/map-extractor/README.md rename to src/tools/Extractor_projects/map-extractor/README.md diff --git a/src/tools/map-extractor/System.cpp b/src/tools/Extractor_projects/map-extractor/System.cpp similarity index 99% rename from src/tools/map-extractor/System.cpp rename to src/tools/Extractor_projects/map-extractor/System.cpp index 473067d0d..41674b604 100644 --- a/src/tools/map-extractor/System.cpp +++ b/src/tools/Extractor_projects/map-extractor/System.cpp @@ -44,6 +44,8 @@ #include "sl/wdt.h" #include +#include "../shared/ExtractorCommon.h" + #ifndef WIN32 #include #endif @@ -101,21 +103,13 @@ float CONF_float_to_int16_limit = 2048.0f; // Max accuracy = val/65536 float CONF_flat_height_delta_limit = 0.005f; // If max - min less this value - surface is flat float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - liquid surface is flat -static char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; +// static char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; #define LANG_COUNT 12 #define MIN_SUPPORTED_BUILD 15595 // code expect mpq files and mpq content files structure for this build or later #define EXPANSION_COUNT 3 #define WORLD_COUNT 2 -void CreateDir(const std::string& Path) -{ -#ifdef WIN32 - _mkdir(Path.c_str()); -#else - mkdir(Path.c_str(), 0777); -#endif -} bool FileExists(const char* FileName) { diff --git a/src/tools/map-extractor/dbcfile.cpp b/src/tools/Extractor_projects/map-extractor/dbcfile.cpp similarity index 100% rename from src/tools/map-extractor/dbcfile.cpp rename to src/tools/Extractor_projects/map-extractor/dbcfile.cpp diff --git a/src/tools/map-extractor/dbcfile.h b/src/tools/Extractor_projects/map-extractor/dbcfile.h similarity index 100% rename from src/tools/map-extractor/dbcfile.h rename to src/tools/Extractor_projects/map-extractor/dbcfile.h diff --git a/src/tools/map-extractor/map-extractor.rc b/src/tools/Extractor_projects/map-extractor/map-extractor.rc similarity index 100% rename from src/tools/map-extractor/map-extractor.rc rename to src/tools/Extractor_projects/map-extractor/map-extractor.rc diff --git a/src/tools/Extractor_projects/shared/ExtractorCommon.cpp b/src/tools/Extractor_projects/shared/ExtractorCommon.cpp new file mode 100644 index 000000000..b0c97122e --- /dev/null +++ b/src/tools/Extractor_projects/shared/ExtractorCommon.cpp @@ -0,0 +1,572 @@ +/** + * MaNGOS is a full featured server for World of Warcraft, supporting + * the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8 + * + * Copyright (C) 2005-2016 MaNGOS project + * + * 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * World of Warcraft, and all World of Warcraft or Warcraft art, images, + * and lore are copyrighted by Blizzard Entertainment, Inc. + */ + +#include +#include +#include +#include +#include +#include "ExtractorCommon.h" + +#ifdef WIN32 +#include +#else +#include +#endif + +#include + +#ifndef WIN32 +#include + /* This isn't the nicest way to do things.. + * TODO: Fix this with snprintf instead and check that it still works + */ +#define sprintf_s sprintf +#endif + +#if defined( __GNUC__ ) +#define _open open +#define _close close +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#else +#include +#endif + +#ifdef O_LARGEFILE +#define OPEN_FLAGS (O_RDONLY | O_BINARY | O_LARGEFILE) +#else +#define OPEN_FLAGS (O_RDONLY | O_BINARY) +#endif + +/** +* This function searches for and opens the WoW exe file, using all known variations on its spelling +* +* @RETURN pFile the pointer to the file, so that it can be worked on +*/ +FILE* openWoWExe() +{ + FILE *pFile; + const char* ExeFileName[] = { "WoW.exe", "Wow.exe", "wow.exe" ,"World of Warcraft.exe", "World of Warcraft.app/Contents/MacOS/World of Warcraft"}; + int iExeSpelling = 5; ///> WoW.exe (Classic, CATA), Wow.exe (TBC, MoP, WoD), wow.exe (WOTLK) and a variant + + /// loop through all possible file names + for (int iFileCount = 0; iFileCount < iExeSpelling; iFileCount++) + { +#ifdef WIN32 + if (fopen_s(&pFile, ExeFileName[iFileCount], "rb") == 0) + return pFile; ///< successfully located the WoW executable +#else + if ((pFile = fopen(ExeFileName[iFileCount], "rb"))) + return pFile; ///< successfully located the WoW executable +#endif + } + + return 0; ///< failed to locate WoW executable +} + +/** +* This function loads up a binary file (WoW executable), then searches for a specified +* group of hex values in order to locate and return the Build # of the file +* +* @PARAM sFilename is the filename of the WoW executable to be loaded +* @RETURN iBuild the build number of the WoW executable, or 0 if failed +*/ +int getBuildNumber() +{ + int iBuild = -1; ///< build version # of the WoW executable (returned value) + + bool bBuildFound = false; + + /// hex values of the text/bytes we need to search for: + /// WoW [ + int iHexValue_W = 0x57; + int iHexValue_o = 0x6F; + int iHexValue_space = 0x20; + int iHexValue_OpeningBracket = 0x5B; // [ + + /// buffers used for working on the file's bytes + unsigned char byteSearchBuffer[1]; ///< used for reading in a single character, ready to be + ///< tested for the required text we are searching for: "WoW [Rel" + unsigned char jumpBytesBuffer[128]; ///< used for skipping past the bytes from the file's start + ///< to the base # area, before we start searching for the base #, for faster processing + unsigned char jumpNonAssertionBytesBuffer[7]; ///< used for skipping past the bytes between the text being + ///< searched for and the Base #, so that we can then get at the Base # + unsigned char jumpAssertionBytesBuffer[26]; ///< skip the 'assertions enabled' part of the version string in an OS X based + ///< version of the game. + unsigned char buildNumber[6]; ///< stored here prior to conversion to an integer + + FILE *pFile; + if (!(pFile = openWoWExe())) + return 0; ///> failed to locate exe file + + /// jump over as much of the file as possible, before we start searching for the base # + for (int i = 0; i < 3300; i++) + fread(jumpBytesBuffer, sizeof(jumpBytesBuffer), 1, pFile); + + /// Search for the build # + while (!bBuildFound && fread(byteSearchBuffer, 1, 1, pFile)) + { + /// find W + if (byteSearchBuffer[0] == 0x57) + { + /// is the next byte an o + fread(byteSearchBuffer, 1, 1, pFile); + if (byteSearchBuffer[0] == iHexValue_o) + { + /// is the next byte a W + fread(byteSearchBuffer, 1, 1, pFile); + if (byteSearchBuffer[0] == iHexValue_W) + { + /// is the next byte a space + fread(byteSearchBuffer, 1, 1, pFile); + if (byteSearchBuffer[0] == iHexValue_space) + { + /// is the next byte an open square bracket + fread(byteSearchBuffer, 1, 1, pFile); + if (byteSearchBuffer[0] == iHexValue_OpeningBracket) + { + // Check for assertions + unsigned char releaseBuffer[7]; + fread(releaseBuffer, sizeof(releaseBuffer), 1, pFile); + + fread(byteSearchBuffer, 1, 1, pFile); + if (byteSearchBuffer[0] == iHexValue_space) + { + /* + * Longer version name found. E.g.; + * WoW [Release Assertions Enabled] Build 5875 + */ + fread(jumpAssertionBytesBuffer, sizeof(jumpAssertionBytesBuffer), 1, pFile); + } else { + /** + * Regular build version found. E.g.; + * WoW [Release] Build 5875 + */ + /// grab data leading up to the build # + fread(jumpNonAssertionBytesBuffer, sizeof(jumpNonAssertionBytesBuffer), 1, pFile); + } + + bBuildFound = true; + } + } + } + } + } + } + + if (!bBuildFound) + { + /// close the file + fclose(pFile); ///< housekeping + return 0; ///< we reached the end of the file without locating the build #, exit funcion + } + + /// grab the bytes containing the number + fread(buildNumber, sizeof(buildNumber), 1, pFile); + + /// place the build number into a string (easy conversion to int) + std::stringstream ss; + std::string sbuildNumber; + ss << buildNumber[0] << buildNumber[1] << buildNumber[2] << buildNumber[3] << buildNumber[4]; + ss >> sbuildNumber; + + fclose(pFile); ///< housekeping + + /// convert build number into an int + iBuild = atoi(sbuildNumber.c_str()); + + return iBuild; ///< build # found +} + +/** +* This function looks up the Core Version based in the found build Number +* +* @RETURN iCoreNumber the build number of the WoW executable, or -1 if failed +*/ +int getCoreNumber() +{ + return getCoreNumberFromBuild(getBuildNumber()); +} + +/** +* This function looks up the Core Version based in the found build Number +* +* @PARAM iBuildNumber is the build number of the WoW executable +* @RETURN iCoreNumber the build number of the WoW executable, or -1 if failed +*/ +int getCoreNumberFromBuild(int iBuildNumber) +{ + switch (iBuildNumber) + { + case 5875: //CLASSIC + case 6005: //CLASSIC + case 6141: //CLASSIC + return CLIENT_CLASSIC; + break; + case 8606: //TBC + return CLIENT_TBC; + break; + case 12340: //WOTLK + return CLIENT_WOTLK; + break; + case 15595: //CATA + return CLIENT_CATA; + break; + case 18414: //MOP + return CLIENT_MOP; + break; + case 21355: //WOD + return CLIENT_WOD; + break; + case 20740: //LEGION ALPHA + return CLIENT_LEGION; + break; + + default: + return -1; + break; + } +} + +/** +* This function displays the standard mangos banner to the console +* +* @PARAM sTitle is the Title text (directly under the MaNGOS logo) +* @PARAM iCoreNumber is the Core Number +*/ +void showBanner(const std::string& sTitle, int iCoreNumber) +{ + printf( + " __ __ _ _ ___ ___ ___ \n" + " | \\/ |__ _| \\| |/ __|/ _ \\/ __| \n" + " | |\\/| / _` | .` | (_ | (_) \\__ \\ \n" + " |_| |_\\__,_|_|\\_|\\___|\\___/|___/ \n" + " %s for ", sTitle.c_str()); + + switch (iCoreNumber) + { + case CLIENT_CLASSIC: + printf("MaNGOSZero\n"); + break; + case CLIENT_TBC: + printf("MaNGOSOne\n"); + break; + case CLIENT_WOTLK: + printf("MaNGOSTwo\n"); + break; + case CLIENT_CATA: + printf("MaNGOSThree\n"); + break; + case CLIENT_MOP: + printf("MaNGOSFour\n"); + break; + case CLIENT_WOD: + printf("MaNGOSFive\n"); + break; + case CLIENT_LEGION: + printf("MaNGOSSix\n"); + break; + default: + printf("Unknown Version\n"); + break; + } + printf(" ________________________________________________\n"); + +} + +/** +* This function displays the standard mangos help banner to the console +*/ +void showWebsiteBanner() +{ + printf( + " ________________________________________________\n\n" + " For help and support please visit: \n" + " Website / Forum / Wiki: https://getmangos.eu \n" + " ________________________________________________\n" + ); +} + + +/** +* This function returns the .map file 'magic' number based on the core number +* +* @PARAM iCoreNumber is the Core Number +*/ +void setMapMagicVersion(int iCoreNumber, char* magic) +{ + switch (iCoreNumber) + { + case CLIENT_CLASSIC: + std::strcpy(magic,"z1.4"); + break; + case CLIENT_TBC: + std::strcpy(magic,"s1.4"); + break; + case CLIENT_WOTLK: + std::strcpy(magic,"v1.4"); + break; + case CLIENT_CATA: + std::strcpy(magic,"c1.4"); + break; + case CLIENT_MOP: + std::strcpy(magic,"p1.4"); + break; + case CLIENT_WOD: + std::strcpy(magic,"w1.4"); + break; + case CLIENT_LEGION: + std::strcpy(magic,"l1.4"); + break; + default: + std::strcpy(magic,"UNKN"); + break; + } +} + +/** +* This function returns the .vmap file 'magic' number based on the core number +* +* @PARAM iCoreNumber is the Core Number +*/ +void setVMapMagicVersion(int iCoreNumber, char* magic) +{ + switch (iCoreNumber) + { + case CLIENT_CLASSIC: + std::strcpy(magic,"VMAPz06"); + break; + case CLIENT_TBC: + std::strcpy(magic,"VMAPs06"); + break; + case CLIENT_WOTLK: + std::strcpy(magic,"VMAPt06"); + break; + case CLIENT_CATA: + std::strcpy(magic,"VMAPc06"); + break; + case CLIENT_MOP: + std::strcpy(magic,"VMAPp06"); + break; + case CLIENT_WOD: + std::strcpy(magic,"VMAPw06"); + break; + case CLIENT_LEGION: + std::strcpy(magic,"VMAPl06"); + break; + default: + std::strcpy(magic,"VMAPUNK"); + break; + } +} + +/** +* @Create Folders based on the path provided +* +* @param sPath +*/ +void CreateDir(const std::string& sPath) +{ +#ifdef WIN32 + _mkdir(sPath.c_str()); +#else + mkdir(sPath.c_str(), 0777); +#endif +} + +/** +* @Checks whether the Filename in the client exists +* +* @param sFileName +* @return bool +*/ +bool ClientFileExists(const char* sFileName) +{ + int fp = _open(sFileName, OPEN_FLAGS); + if (fp != -1) + { + _close(fp); + return true; + } + + return false; +} + +/**************************************************************************/ +bool isTransportMap(int mapID) +{ + switch (mapID) + { + // transport maps + case 582: // Transport: Rut'theran to Auberdine + case 584: // Transport: Menethil to Theramore + case 586: // Transport: Exodar to Auberdine + case 587: // Transport: Feathermoon Ferry - (TBC / WOTLK / CATA / MOP) + case 588: // Transport: Menethil to Auberdine - (TBC / WOTLK / CATA / MOP) + case 589: // Transport: Orgrimmar to Grom'Gol - (TBC / WOTLK / CATA / MOP) + case 590: // Transport: Grom'Gol to Undercity - (TBC / WOTLK / CATA / MOP) + case 591: // Transport: Undercity to Orgrimmar - (TBC / WOTLK / CATA / MOP) + case 592: // Transport: Borean Tundra Test - (WOTLK / CATA / MOP) + case 593: // Transport: Booty Bay to Ratchet - (TBC / WOTLK / CATA / MOP) + case 594: // Transport: Howling Fjord Sister Mercy (Quest) - (WOTLK / CATA / MOP) + case 596: // Transport: Naglfar - (WOTLK / CATA / MOP) + case 610: // Transport: Tirisfal to Vengeance Landing - (WOTLK / CATA / MOP) + case 612: // Transport: Menethil to Valgarde - (WOTLK / CATA / MOP) + case 613: // Transport: Orgrimmar to Warsong Hold - (WOTLK / CATA / MOP) + case 614: // Transport: Stormwind to Valiance Keep - (WOTLK / CATA / MOP) + case 620: // Transport: Moa'ki to Unu'pe - (WOTLK / CATA / MOP) + case 621: // Transport: Moa'ki to Kamagua - (WOTLK / CATA / MOP) + case 622: // Transport: Orgrim's Hammer - (WOTLK / CATA / MOP) + case 623: // Transport: The Skybreaker - (WOTLK / CATA / MOP) + case 641: // Transport: Alliance Airship BG - (WOTLK / CATA / MOP) + case 642: // Transport: HordeAirshipBG - (WOTLK / CATA / MOP) + case 647: // Transport: Orgrimmar to Thunder Bluff - (WOTLK / CATA / MOP) + case 662: // Transport: Alliance Vashj'ir Ship - (WOTLK / CATA / MOP) + case 672: // Transport: The Skybreaker (Icecrown Citadel Raid) - (WOTLK / CATA / MOP) + case 673: // Transport: Orgrim's Hammer (Icecrown Citadel Raid) - (WOTLK / CATA / MOP) + case 674: // Transport: Ship to Vashj'ir - (WOTLK / CATA / MOP) + case 712: // Transport: The Skybreaker (IC Dungeon) - (WOTLK / CATA / MOP) + case 713: // Transport: Orgrim's Hammer (IC Dungeon) - (WOTLK / CATA / MOP) + case 718: // Transport: The Mighty Wind (Icecrown Citadel Raid) - (WOTLK / CATA / MOP) + case 738: // Ship to Vashj'ir (Orgrimmar -> Vashj'ir) - (CATA / MOP) + case 739: // Vashj'ir Sub - Horde - (CATA / MOP) + case 740: // Vashj'ir Sub - Alliance - (CATA / MOP) + case 741: // Twilight Highlands Horde Transport - (CATA / MOP) + case 742: // Vashj'ir Sub - Horde - Circling Abyssal Maw - (CATA / MOP) + case 743: // Vashj'ir Sub - Alliance circling Abyssal Maw - (CATA / MOP) + case 746: // Uldum Phase Oasis - (CATA / MOP) + case 747: // Transport: Deepholm Gunship - (CATA / MOP) + case 748: // Transport: Onyxia/Nefarian Elevator - (CATA / MOP) + case 749: // Transport: Gilneas Moving Gunship - (CATA / MOP) + case 750: // Transport: Gilneas Static Gunship - (CATA / MOP) + case 762: // Twilight Highlands Zeppelin 1 - (CATA / MOP) + case 763: // Twilight Highlands Zeppelin 2 - (CATA / MOP) + case 765: // Krazzworks Attack Zeppelin - (CATA / MOP) + case 766: // Transport: Gilneas Moving Gunship 02 - (CATA / MOP) + case 767: // Transport: Gilneas Moving Gunship 03 - (CATA / MOP) + case 1113: // Transport: DarkmoonCarousel - (MOP) + case 1132: // Transport218599 - The Skybag (Brawl'gar Arena) - (MOP) + case 1133: // Transport218600 - Zandalari Ship (Mogu Island) - (MOP) + case 1172: // Transport: Siege of Orgrimmar (Alliance) - (MOP) + case 1173: // Transport: Siege of Orgrimmar (Horde) - (MOP) + case 1192: // Transport: Iron_Horde_Gorgrond_Train - (WOD) + case 1231: // Transport: Wavemurder Barge - (WOD) + return true; + default: // no transport maps + return false; + } +} + +/**************************************************************************/ +bool shouldSkipMap(int mapID,bool m_skipContinents, bool m_skipJunkMaps, bool m_skipBattlegrounds) +{ + if (m_skipContinents) + switch (mapID) + { + case 0: // Eastern Kingdoms - (CLASSIC / TBC / WOTLK / CATA / MOP) + case 1: // Kalimdor - (CLASSIC - TBC / WOTLK / CATA / MOP) + case 530: // Outland - (TBC / WOTLK / CATA / MOP) + case 571: // Northrend - (WOTLK / CATA / MOP) + case 870: // Pandaria - (MOP) + case 1116: // Draenor - (WOD) + return true; + default: + break; + } + + if (m_skipJunkMaps) + switch (mapID) + { + case 13: // test.wdt + case 25: // ScottTest.wdt + case 29: // Test.wdt + case 35: // StornWind Crypt (Unused Instance) + case 37: // Ashara.wdt (Unused Raid Area) + case 42: // Colin.wdt + case 44: // Monastry.wdt (Unused Old SM) + case 169: // EmeraldDream.wdt (unused, and very large) + case 451: // development.wdt + case 573: // ExteriorTest.wdt - (WOTLK / CATA / MOP) + case 597: // CraigTest.wdt - (WOTLK / CATA / MOP) + case 605: // development_nonweighted.wdt - (WOTLK / CATA / MOP) + case 606: // QA_DVD.wdt - (WOTLK / CATA / MOP) + case 627: // unused.wdt - (CATA / MOP) + case 930: // (UNUSED) Scenario: Alcaz Island - (MOP) + case 995: // The Depths [UNUSED] - (MOP) + case 1010: // MistsCTF3 + case 1014: // (UNUSED) Peak of Serenity Scenario - (MOP) + case 1028: // (UNUSED) Scenario: Mogu Ruins - (MOP) + case 1029: // (UNUSED) Scenario: Mogu Crypt - (MOP) + case 1049: // (UNUSED) Scenario: Black Ox Temple - (MOP) + case 1060: // Level Design Land - Dev Only - (MOP) + case 1181: // PattyMack Test Garrison Bldg Map - (WOD) + case 1250: // Alliance - Garrison - Herb Garden 1 (UNUSED) - (WOD) + case 1251: // Alliance - Garrison - Inn 1 DONT USE - (WOD) + case 1264: // Propland - Dev Only - (WOD) + case 1270: // Development Land 3 - (WOD) + case 1310: // Expansion 5 QA Model Map - (WOD) + case 1407: // GorgrondFinaleScenarioMap(zzzOld) - (WOD) + case 1427: // PattyMack Test Garrison Bld Map2 - (WOD) + + return true; + default: + if (isTransportMap(mapID)) + { + return true; + } + break; + } + + if (m_skipBattlegrounds) + switch (mapID) + { + case 30: // AV + case 37: // AC + case 489: // WSG + case 529: // AB + case 566: // EotS - (TBC / WOTLK / CATA / MOP) + case 607: // SotA - (WOTLK / CATA / MOP) + case 628: // IoC - (WOTLK / CATA / MOP) + case 726: // TP - (CATA / MOP) + case 727: // SM - (CATA / MOP) + case 728: // BfG - (CATA / MOP) + case 761: // BfG2 - (CATA / MOP) + case 968: // EotS2 - (CATA / MOP) + case 998: // VOP - (MOP) + case 1010: // CTF3 - (MOP) + case 1101: // DOTA - (MOP) + case 1105: // GR - (MOP) + case 1166: // Small Battleground - (WOD) + case 1431: // SparringArenaLevel3Stadium 'The Coliseum' - (WOD) + + return true; + default: + break; + } + + return false; +} + diff --git a/src/tools/Extractor_projects/shared/ExtractorCommon.h b/src/tools/Extractor_projects/shared/ExtractorCommon.h new file mode 100644 index 000000000..c923cd608 --- /dev/null +++ b/src/tools/Extractor_projects/shared/ExtractorCommon.h @@ -0,0 +1,56 @@ +/** + * MaNGOS is a full featured server for World of Warcraft, supporting + * the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8 + * + * Copyright (C) 2005-2016 MaNGOS project + * + * 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * World of Warcraft, and all World of Warcraft or Warcraft art, images, + * and lore are copyrighted by Blizzard Entertainment, Inc. + */ + +#include +#include +#include +#include + +FILE* openWoWExe(); +int getBuildNumber(); +int getCoreNumber(); +int getCoreNumberFromBuild(int iBuildNumber); +void showBanner(const std::string& title, int iCoreNumber); +void showWebsiteBanner(); +void setMapMagicVersion(int iCoreNumber, char* magic); +void setVMapMagicVersion(int iCoreNumber, char* magic); +void CreateDir(const std::string& sPath); +bool ClientFileExists(const char* sFileName); +bool isTransportMap(int mapID); +bool shouldSkipMap(int mapID, bool m_skipContinents, bool m_skipJunkMaps, bool m_skipBattlegrounds); + + +static const char *langs[12] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; + +/// Enumerated Core Numbers +enum CoreNumber +{ + CLIENT_CLASSIC = 0, + CLIENT_TBC = 1, + CLIENT_WOTLK = 2, + CLIENT_CATA = 3, + CLIENT_MOP = 4, + CLIENT_WOD = 5, + CLIENT_LEGION = 6 +}; \ No newline at end of file diff --git a/src/tools/Extractor_projects/tools.ico b/src/tools/Extractor_projects/tools.ico new file mode 100644 index 0000000000000000000000000000000000000000..82e3b26577b75e3d4d0d642828b39e2281e588ff GIT binary patch literal 272486 zcmeF42YejG^~YD1i)2fdTqW7EihHG)W}0o90n=+Jrib1k5IVLoC3J#mq4(Zn41{6` zy%=na3nds5{sBTSp#{(X``gu=_V)Jf_KJ$(?xWSV*(tyG=FQBTH*XxL$f#$@mD+g4S&IL`o3L6{NDX06CG##jU9-;>HS#8Ipd!lh~K-vt(Ncm z6cc~beVOCzIJTJhz54@-9cS72V&X6H;@{kH_FKQ0_`UlV`a90~=NA)y)BC=Be@8L# zd-u0>cbrq^DE_8K9p{=(9f`l`eOL0| zt0VC@-FJ4J&j)lQ{-*F9NPlog;`i={gZ21f9UY=|rYZsMg`0j;!M5-#AW%S{fItC( z0s;jD3J4SsC?HTkpnyODfdT>r1PTZg5GWu}K%js?Is}X{9X|c^({V4n@WQe8-h1zj zfBy5IpE~#4b6-8{th3(8=W*tlXTFi@IOB{n-e@mJs(k8QK5#kboO9-#fByN;-get< zcmDnFf1mc@haXOY7M^lB9ntdep0uhLE?ju}_19nj;k0Sf%+W_5Z4Nr_P-X_(t*Is*>OpiVH+|%TGWSXYJrz(fug_U2=f>`O^ zkEyUe@W2Djkw+eBPC4ZibHx=`eD%^xFJ1Y=4?jrl-y%Qg-tnLR{O57kUVH5~2OoT} z*tRWo+%*tEyWE3a&FIaXR}C9}L8QOX+yJAar}R$0Z^L)fpi)>>xM zO*eIUX6DS9KQCUq_%dk4Y+3$(|M|~T6@hj4|E1bu(SNb}bw&fPt{h^%yj0 zkmT@(Z@>Na*12*3eAM+%fBMsTRaI3#7ihkG@qBrCxjFREL+_^U_REG3=FOWo4te`- zf$qx}-GlV1uCD&#p@$yYDH9&J|Ni@@^y<~?$6#Dx_obz!rc0MDrgP`crenvBg(FK0 zI(6#gVkjJiXGuwk5w<#XtwZnZp)h(EMw75-j2q63!UGRJ_~1^+j$gv!@IO=f@Rr+$ zJ^Spl%{A9tV{X0mR>Qa??}y?}7Vqu1-)^EDcieG@`L!Ik+;WS#@I_V_y=%bGs#-C=+oH;FiJoC&mEuKbe zl%u86c>3w5&BYgAY#JLI)5-&MHG78ffW~+0t+(E5L3-Q!o;`cIbZ;%1`>|4*Dx?2d z;X1M2sh(VR*=43rpFTK^|aSf0(6p@Z8YQU>X{^ASO7vy;;52%0luYdh( zsO5nN9(Z6EKh5oRU0q$fpuOeu0uN-)1FNmJS||_9m@(rVOMi6BcUqd;v)X(3qD^JK zrMv%J;DO9|KzM1KX6b6r((PFK4;wZtLH46NYIn4^d{F2MWX1y;KU=!{&zAoFXSzoB z)2`&crMo>BWI$&0SA7{WWJm%JB%{CP6)o27^<3bA%y{50fB8#f`rmioeeIt9;>!XL zMCSov)uTs`I35VA|LXTCY<5RC`auKW9X zVfBBHJ@#1c=wE0HqS2o@z)<>+9zFU)%NOl=+-K{1vU8XmP~Z2(7hg0_Jn@8?HEWh( z{==Owyy>Q!%+*(4ZLYfNDx+)74KnX-m@9X~V%O^G(2}LKJU+kRf(t_FKV{042QB?& z+qXQH&F1;pXPh znE?X^n1KTa8tQ~ufBp5%$tRy|uDtR}!@T%%)i1Jm_|Mp9$LNp#=bu*o^L(16|1P`i zvRu($b^dRE`{wZC*|I%reqFk7^^G+5ednEbnx~$6YPpjS*l@-$ zp`E|q(*NqU){(S#pb)M&T2DgKi$4Vd*=iHT+owGK8a_e z=HKw)!#}nd&YnHH-N^ve_scK8+^u)AZMAuAFK6XRYa-NtY>#}PJo#nhci(*%XBWKl z&O6VxSgK##UgW;$uD<#B@#FK_rrWaS`>cM4*6T=4wI@E1y`C*AecOLG*L?4awP~l@ z_s1P~T)UvZXutdJySEEDZ?TDb)|{)>$F&z8z`iR+fBN{dg7k+!wzXxOJb7}P(_j6n zapT6t@@(_Ayq$%m#tLmMPme$T_!yShYo8XR{}*3;(O|J{%RZoO=QRem`N_w*v}bSA zf75NusC|zxD;;&RS>x1m&Dv*QZq_~bN;7WS`DT@4rkl|R9Bmr5*~N70QBOn!2K*<}7F zrq7aJjI-E8Ix3eeGaJA8g_->9+h)>D51CQ>9hoyvXkFh?M;+BBJP_>rX}lM#|GM9P z`|bZ`>94VMYtmn|*V<>Bex_&9e9Xben#qs6YU&sN6p7AJ`9a~tKa-z%%Z!_Tfhn)5 z$vU4}hu+$9K<$skQ?_1VwAV9i0{>*g;Zvd2=r7tc{)pw#<{`?tPvao7!BuyeAq)ST zcbX^TkA6#jHXGkF#|+qfdn3M!l23n_ZMNB_Re3<`qip&+?6AWl$>`6xe@7cmI*rz- z|DwHg&Nkhs=Zb!{F5PROMKU_I#`85ETVVPRADMCf)gHH&9KiQTEPvGNr0W1b{`lj; z7JsevZw>nU=Ok>}sm`iz>aR5{{xNg9AAG8Dq8t(X36{UqHf(tP1E#ERqMdE3vh2F+ zuC2lY{`$qZ3J>hzKh}YCV2MOs zg|Xo?Jdb?iD>H2MH6xctWjprRV_S4yQSw!Dn-<59KKf{2IQ6}!TWz(~Q#P#T!&^!Q zFa`;=OSfqU&ueVDd3JT)Ps0|bzxbv%vS6Ka|B_L^pe6g-nh&>FYJ8W9_Iigup$lwy z{K>Qk{l$}`MvaQ)%cd80mb}+kUASgjFJs@e0{v}TlWu(^Qu$P7=?aBOOVl;3;jy@C ze3y>?*vQ1zg0++_&}pZg7R!^(Ti98&U;TzzxzpXsfE?)G_pN1V^U?55fJaF$sxD*F zq)9E(7tp$Ji|zF3(_?GClJUXPrAtTJ@bd4KZ=RIgSKq>>k?ic&`?sMs}ERPTlb%|#JDVQ)Xz#7ux92vZzj$T!+a8a^1Gs3(n+%ZMtHqi5lrL1bQ_=A9e_rNXu2)<-xv!p6z(0?MGSn?%jV853qJD0&PnF12Vmfl&Hm)e&1Z2_VrxzRM z#n7(C=x=ecXYJjTY28u>&o8M)}15s%jMms+p?X?XTJlpsFv%;jIbJ%;$ zcaC1i8>5Hep=alvcV5Og%TC9}$5`zkOTS#t%a$#JRlPo-^!b_6Uvf!u-sUZMmd*19 zSKpHrmTsN&)1~w4#(%t7ucmMayMZB%J<##hv z`YZhY`|lsio6V#DtZ{()L}B$MHC%V>6h#Efd?LVyW-BKU!t<8FRO3;<@8@`4eW;3-{1b}p9Ag1$CDqO>-re? zmpyo``I~I$FMYA%lFmL?dI!Hpk8`Zer+l1dlRxP*Z5+XKSy`D;KVbNRZ!+V7)~x?I z(q4LwQEPjCOoQdO_u1NgYFuXP*U?8GeQl6_x!ynb+;bb+Jj$Ls8~Uf~2da;-!A`rf z_Ai6Awyi;brI91;Rre>%ywTO6SRBL7+4TEF3#}Kh@v)BhkX-2<{Qk=?zwBw_|KlJ3 zm=*oi50qV!jVJ7^JsLK=;lb!Kpe5;V>7EDLulDzMT|ZG_Wwy^$_DuC_wjN5)ZsVCd zckWt2`sL$(l~q=GPibT`FJ<$oIYcX`Y<~S``Ag_GY=l|m#eYTPfhhF%(=pTQEXH@i z{^|(Yw7StNxc;mCW%XYR6Uj%5Q>JI_?WFkdKmChz_W7W9Fb@1$->o#1*KGMz<PwF%+__MdReZQ~0&TOMf9HQ{;W3%~y#$$aTFWIG>L zHv3F;%XO`%+Eg1Kdp8^rq+7o3zxn2yzBZj))+SgvpnYa7-`aSCXSD_L`?uCZubS?e zj0^He*C=vcVJ!XCcTpck{2MHf|6XOk;)*M>Zu2dU@*8C1ef8B>$LEXQVex3MK&6#y zdu8*keTmcYfaXawHq6HuEGjLt4o7<=9}n6G#L^_$IUD;9i<|#^>ZzWODe35?s}G}F zzMg5{FqJ1?J_=M0**T=+0qKWEj$1p92NL9g)zA9RVRFF#-hUl6tS?+#9z=WOy~Z%f zXl|dY{^Zh!_S0WB)`}M${gQmqIaxf~D^RphdinHKr9Fqz@qp4)y%NTuvcOMEd+noD ztWMi^!E@BGzHqB9`QFWo=H1m+S^6eBtBhLPpD)@g9@*uHCg|vIO-8qTJ=b1=N=rw+ z{lm%+sbd_LD+f#Lz#_4wPNd|gYXX%5uVIn~)ui?*PD zs=V2E(s}0#n_xVeFR=9yy6|Ps`YyATW=r^owdE5JXr4*+#^M-uZqM|Wyq6z_ ze6{r!8~<5*4T=`*mG*8jdgc4M_6k&*8k4nT*;G!oZ|W;2>l9#X+eHd zxBr3n_S=N-a-hHb?P{G=OVmx0v$!~6tuM8CVZFT8-=ys>1_G2p`pQO4z@MuZZTDzuyl}pM!xBsDn9Kc zp|tbmAJ&#B%2^l-dt_c5EfVPHr+<>VZ)utEt>uBhcM4~}(OGMvWOv(|bhj8ucWUYX z_19nbPDQVLztdh4N;_ZvVQrZ*Je2l7F?e8iCpeN%la+H1TitkH-5%$R=@ zONX{RzwyQ!YiZwD0oshvxkY7cLy<$9Q?T z)|x@>BZ7Y5ZrO~G=d}IvLKw&3_w@_eSjhLH?5&muT1UyF)(^-p1$y&MkiC-&M>7W0 z{SCEl^Skf9`_<4p3QrWm6c8vNP(Yx7KmmaQ0tEyL2ow+~AW%S{fItC(0s;jD3J4Ss zC?HTkpnyODfdT>r1PTZg5GWu}K%js?0f7Pn1q2ERZ8yI<;$kMME#T{6FqV>rH#yGNd7dLPGN zd>?mTpZR?pgYkXbJ@Plx`#1(W)x-;A?&BDWTR*`eUmSseKMrug?|=-;jp(BkzL495_y zcG!G;MDLUiBm8>w1&^8d`2R`!bQc#FyGMr(9ZXSC(XZ-InQZw=OG`~-W1|7Dn=ZQO zqCsIeu^w}6!Yq>SjZU39xd-7~OssEu`KOP1XpaybQNy=XIQduAAzv;!?7i~VxpQZC z-CoCz9o_PZCk6}{@BwSoHuq!1-a{*~f91csbm?MBN=n>sl;6!Z+sw#UnSA_fk2Cqp z(>cl^pYS^T-{`t6jyvzX(*zIs`kXdxn(LQAe)z=;D!-1}+S+gM$v;ULu`fp{Yq*~g zE*6_jH{I0rXUYERhP7Yj`RAWE_;kqV&^P$~&gh#=)5s;f^7qOsuNd~FF?Zj6w=0KK z=PX9lrFYrCrthRlllJoS8f#t+>)g$YFTR-5-dI}WEq@g9nbV%vdn+Y{6pAo8Sv}<2c-@cG++Hb%8T>LVPGfH^z&+>wic!)lv zmDitx&*y62wDw+gFiLr|36l;ZTMz9yn>6zAjb!ij*I)1UO{inS<_qmjeakJkxb00o z(nuDE#YlBsyewJw+H0@5bWy%kw{_@Rv{KutYlUqsSufcue-@)gjS>%iNn5{Y;J|_A z-h1zL+u~$p%k{Z15gxW(R6mGuo!h^nui^R&nKEUH*>%@l-D|ZajO~o}iMZ#Udt7{k zm5!FItHMXVEHvJspZqbtfo_vOi<@q`$?fOlibL>w(O$fueMv94-~yw45#$?RJZt+~ zl7Gn#^=YA@`u-Xx8TnRL8HBYk&$q8%<@bRH9x(D3k3aLLX~RyG{JHSL3-c;}ly~7G z|BTwVd+gY;Zr@8dsBO>~Mtw1jeRK#1|6!jijPj>8SKq2%qCHyV*F}7!H1f$$;%~RXKeahRht@y={LF`%>@vgK4yxfCuA($z= z?W?Izvc?)~xb2F{r2cR=c@2IeyoJ5!M>~H2dkc*s-(TXF+f73TvQ(E$+r2P_=hiuCr`bz#xoH$YY7yKW-g=&b~88&R#y=uc|&z_yt*uwIS z>XY;%%5SXhP$x<{bu^_s>(i&Nso8!HGw`bWP5D#rnLh6t)BWGf1b)P!^Zzv+P0z|X z_g#u}v1k8j2Hx<9shzT)>08&}#^qw|lUYhrX=_i+Y-N&g)d3#TgS;SY^kW=$ipHpF z8?qT+h_8i>_(gKTVxxLhLcV)cRGPYd4mJHATVT5W3k-BnZs#oy`J#U9JLAm%!8mXH z=pDM&Grd!o_c-{bgroQK@0*%GOn0$X+>%>1J*BPsruIM>WhyJgI~vQYy~O9|6&^Z{ zgMM-wwGrr;-9A~ex*2?~wpIC%en|Qv$r~@P-ApO@>_+~p*ID26`|Hc5%VXL{!kuW!Jr6LIx>a-r!zX-iW^8YQIFmA!kEw#p$o zX`f@|Etuz2_X;on%))rxb=N(>;&bGYN3KYH`&NCEOyX3Vp?;-wlf>ojIih^3K9wVD z2JUsJ>A4U-5H`VbT6~1rE(g2cD~{NqXF)tIt~&pdO~u~*#WbFHF0#FoDJ4zeqkT_A zC-v#HCyV-%sW9=sQ(qokq44M~!>QeKoN>l0Od4L=TH*Q$$>Ex-HS?@ZsmeLrLmsd|f#&eV?wwb#tU4?i49MoZ>Q zpFZ7{H@2NB0T(7pOvCYKo6eH8Z*wHWMi@oJ$B#?G^*hFNcz2oUH*Kb=>_%Ilx&}Uy zeZoj%lql`KFw`EA+5-qIo~2zc_Tw{t{P;7)lNuLEPK9A?pQ(SZJ-Rf8Q~$>Dj`}MN z+f6au|M9bN$ag|nEZ^93KJXF#q*d~?~QKeSzQ| z>BX+`W20+y_B*J3)RhFFd)Cif{6XkBv)x zg~i{S>hT-7bQ#5zjry5)m=5Z@*gU5@=YxOzX&{UG-ub@oLfq%L` z@ek9N@tqxm2p{$BB%{OXh33(u^Fc1F-*j~%GTsyBn5Sr*q5b5-WVGT|8tnTM!$)$t zcGL={=Zl{hhyF;L^AGjA`pq9q!?<-^{ebveZR{qSY~u1r7(ObKbk35^=;4k|hR^Az zpS}X^(T~#KC&Ncr%dW$=>(Ws)tg$wEV!!rGWRLi&CHRN&S`Bn+oH!{CAL$>}FHv3c z*9TpztmmG4uIb*r`?8ZyK6#^L_%QaRi7$J9i!HVY)s+c*;UhT~hYz%>S;&~OHSrO) zVRe`1HT2mV*Gt4lGBpez$qdy$`ng}yhV@H^k7P7`zFF#*3x^;t+WMt^jflgQ&ElWB zv8$UtuYVP-Pv|dGw){i+llINUKW{NETW7sE{*ew%GB{W!@sHYT>1>hBFEi%um<%61 zr@wioMasQ!mYK*q~;V$07Ja+iT zUok!rf2x0V?c>Hd_FNAm#p_Rp_-h6(uT_QxKN;tRPmS~P zm&SPoUeoc?=f=_ae$S(uaj_WfaioWx#wn8f8qeu`)04(2q0D<76C2+bk&X^G?GI?* z?|sqquB>1z*4#(bSW$culs&>swl327u-C^C7KdbK+OE}+Q~y2fw9`WS3u^aoz4cbb z2ZZvY>aQ@8T_WGO`WESg>sMLB^qv20xC~MmU*nzdu>4`qYj13vF{>s% zA34@I8*b$tqkZqU|2=8^60SF){`Fq`lNmIAeN#%^k}gQ?i00dr@320veM*IkeFrw@3>`Yuo%0OC zTylHXtXW1neT~6HC-G3@N~@Tfmp}IMZ{>l`x#Clb&R_b(WPH<MR z_4zbj3>y!K_9~z3Ul~{3V9THG3^r3FUnFOQZ&0S`UOFe$LE`dszv!k^=SS~#i0LLd z4@ml9GMOm`<}gfS7#jZqvj-%>E0B#^lidk`H=3Yl(BNpt|eyB zSy#IGjm=L8AGKFQ$0XLTBhNI>jgJ`T%Grs>W$fMk*n1u>YR8gb(+O+_UUZY`UFOXT zC@+#bssk#2G8#+vsGZiBlQ}!r9@Aow>dc--RkZQ%9CXk@Dd#gp7i^|oY&0L+O&HOp z_U?u~@i|wUQpqA=BVKy-YvY`Cy>X`h#W<&3=^ZCuVw}IeX`D}ZuYOSQ5Fe_K6ztG z?zm%UKiXg4WTT@wIps-*ixK(kC5(>ylj(v^&!JD^@{-zXVew7V@gL5@ZXt)T(LA9J zU5i(A2p{`g*9r?>oe5L^_K)s7K%a8xB5b;qx$U|7W-50oY$TgS-@W(VTk`W2WHV~4 z=s)aVE*?F4v}+5ay5z^if30-Hr_y<-uVMM9D_B)BCtR`Xfu_SVA9%W<&nVjsPtt$c z%{#7n)WbsaILDpW{9M<1CY%(;hS#^mp?SihXa8loY`cf4(7baKT|^(%E7=f99*4Cp zHt+TwbEDE}+!`GjFC_CE`>0-GzmRr5L+yZQq4`DisWp!&`PhyAS$D=C<^AeR=`m-S zPP3mk#lPFXSq2@0p6yfNK!0ZJTFuXOt!H|tFio;t-*zUBsz07(%KO)w^5P=Xjr7Df zYDYyM*$An9O+`~-r1!EDW6WhX-+c4qGR0@jHP>7XTn+0sLfb}52YVJqlI5!N)*c;7(Bv#roF3lxbO8$?-Zs9AAPGhv`?U($R2GV>pO?wK2Hv{7tcEi9d6&s5(;Pt7Arc5B{NVQrsM<#XHnzrSOg z9=+Z6So2Rh)Hdsxqj%~PG~uIf6^F(H?4#z|?uoaf)F*#F#bctO^nmo0Zq6JT?+dUw zNOniL*tRO~Dud*q@)XBEf4adqyD`sB`9%lmVRY!)#YFEErU@T?t2k6X8>heAQLmL3 z&7+SSH%@)XlfBYr{-64}ipKrwW2$|MntoU~@zcC{^W3>iTV7}DJ&aS)(=ET|W0h|m zx^~0pox(KXBijnap}4}*i26)*QTlkzCBui2`^`ZF(Zd(BSMj5g35rvBkD7!EpLE7kort$z|-F)Ia-{e&ocs!e)8H8nKON z%Rbben6?ei1}D{xAU_A$6^1ww08ASl^!;naFKk_Sz}82Jf9)sw$Bod z(9dW`N6>%&gmLRK*{-SYDSlGDi+V_=%64D2`u5OVHv2rga@WQq8LVe|XT#~NZxx3P z7v-!x>O0x)OBX~LR2NnaEo2@ZGXJv{efjr^DuMso^E3L{|D?aPULGKb90h&PUf2x{ z)PWwVu{|Bi6E^RStP$uFxj==01q2ER6c8vNP(Yx7KmmaQ0tE!pAb=j#`w`Awx&sG$ zlj6B`nK^+l);(uE*GoC{lacHkUGURlhN-&X7s&{~3)&|Cr#7Xkd}ew*$M>zhR@pPX zUdlK63B#qj;1~7Ux>}XfuqfA-b_#E=MaL-DmIoBxUW*?xy|&&>PvzSv*M@NV>D=U6 z6$1sX=kO19bFaO^SGd<+q^G*q5qR4M$u<0NGBc55Do2si!2g0DQWu26zXAdU1PTbG zKmZwBjD7C*7hinw)y#*#gx>uv{O!H%Kd^Io+kfEq@@@ZtPW$baIQ(ho+Mfqq`}26p zDW}ZEufh%Jfp?R?yc9)_y~5UD0{Y0OG*>8JGxEt0<{|bf zUh`#qog}p*2A^`~Ezf1{>1Wx(0LZWEkd2Mj4q|67->!XQ1m^-9ir&meKOy@+*>0%p znoAd!S_iIq^QZ?lkZHrpb|T-0{IuxM8YO$JwHxALl}lx^>n53-o{JrQy)dAz7hz9! zr|fO?Ugeh!i|m6me&WDrmJF+TW#J&3O!<&t4TW1)omp3T zApG%=Xf7K)+05i)p5K<=&QrFBvoKcKWP7B#EncU7zk+?)$EpUhB@oZ#YU5zbny+|l zeEB$A3}j!cGK0gH(ESVXz1D`R9_1q)#i6v?BL=Dqno}14!}p(2??0Cz}kH3S!>iAr6ZXrzuwp(I5Hb>>hQg|&DH3-OGwz~`sA=9+8VzD%}li|W4oK#ITU z`|TuqZ}{zVt;bLwDHAMZQz|?aCu339--q%UqcwR~dED|s`+lsoY}oR5rgHy3n(7&s zn*kTxWa=)w+0>kIg{eI7cvHXi&Zc(Ux~4n*b@>l-v7oOa-&~4QacfTit$UO#Roco! zCV5spQeJ8Me_*UTlKy`OY~WthSV6p%iOjWa*v>oe?B-2%+4?&xVI8N+P=ybP{>RQR z)epXA%HH_a^k9uh2d%&PoI~p*bg*`$h-W?U5z-xh0aXt#Fau6zy}_#EOc}C4eqO{! zS{I-+goDyl`7^~pG?p9&&v#i*?dk+r&v>QQ)THvS62w^ir~0lnEy|C^7A~Ej7m=Di zgNB*fGcGkf7kq7swT?(@k+c>~$1@)p=YjdgnYGY6bggGvlce{ovFX4XFRe4G(i*Ih zE4Xo%cJchlssE}pHP)2OiYgbCXN8qqMfTlK9PSTUbp(5JxIXxz%0Tgv*2+p&+p^0? zT6gl*f16!RuU9@c9aQdjIapH`JGA!fqC1V#l`&~KQv^D6t!H}Y4+|E;p~o9vo7z3` zy-E2?NyGJ3*Mx!mGbk@n_*T54c1dML_RX;6XC3WE$irolU#eF@TKn%+-_)+luaD}a zq2Q$J=2&?_2Haz&T%nFCkrH}v|dE(qZs?`Y|GD>sGr6GQP#Yu&Z|AvJ~7I_ z$}Yat`qKVqUTHdt=Hg-UowWQH-_u-fi-Ddsm0xQR{om@oh&YSDwfphsnjXjk@tV?B z+aN!N>Q9Qkep&^uRbP?!(ue#&zhaCnKhHW~EB%UeGUBD+cm8|5N6+ZyKh~a8hQ|H> zV7ge}cY*x-%i{8Qit@*W^~WPTkq@0&$Jh^?%aE`BwcxVzmTXf!2s>2wHU5>nqHX>M zWyYm!^AFwSH5v!#+hlF4XfK_R*2fC>uJXG_*=r_DLRR5}D_Gb4`M1~N|7^-{zXyX7 zWN8gD#IuEAfj=L?NexcVE(CO^O0Ytc^QEUk?KtJ8z! z$3NXB$c1HEM_tQAlb)L#EKI(JpQ>Gjq?24a2@ucdd*4Bsh2ShvB!lUc_0X^V~!SYK6G7fl+ zd4kY>u8#N)yGtNNfmi^h-0zB7a6w)c!F zCi8xo`ba?;DEXoFy=rIF-e_z#VC7X!?>D|{S^BFlDgR5swng-RdzqrTrIA$v)4yjH^pGA1L?!;NmhODQMd4*v+@k#@x0_y_pacCd)qUkzeyW4*mdc=Uf!a0t zN4upfKYn)xQcu3po)}^M2#x>b&sgQLO${%Uz++AS9X1G$?uKwBHxl>V^@`-$p`8W^n22-f0PVFPA-t2fUvQIcu93bJm6wL z`jP{KHp7SUJOA_KwDM`oUpKg!pGEV5!|@?_lyRmU8h`A12>$k_8|R@#UL0X%M>dwf zx6Cx|w708U6#n8v&7UM2|En*gb?x|M_yD~xuDH_wkb$?TuM}(pBwMZiNAsn&&(XDO zH&+fd?EHJv{ayUOSY4ldGwpw(apd1^7yN(hbb#mgMDImko&AT}M;)~7{<`GqKj>qZ zLHkDbW{|Ia@xAnJ>Wj)RWEkz0UzI^)e(J}g=}Yc~Kn5PCv6Sk2ur0A|qSA}g{~-(H z=d6C~T}=7Qv~%(~EtxGokiPdTjxU<-#UC0opwn^>UF(^`OWvv7*E9KC0*fxhRr&g7 zrjC7WY}u_2R646*TV?ZT+bqrP(>FLfYWdNRZmE8b`bK(e4{8WEox5K<=XI$&{2f7eP z@mZgW{_moe`Lao=fEv&`!S~IV*OCH($1kZNNMp=GD_N^YZ{00>)`oKk+dkl`H zf@z2kRL7))l`m7}y$fTJj9^mo$YxoH5R^D8GUF(_ZfWi=m zzR|Zs`!n8PtSO&Mdam)OJ5s=vm*(~^Dvgbz^7NB_}Y-k~{`Fd1m$w`bKe z)j{djWqYQ6f$}OpkP)yH6-#3QnEp#0~0rHcL^ zd&q6%e^v4$RUHeaDXdgyBzt7TARZOn+%l@|fA9_0Cs;Lmf@?oG9lCaXgXx{ZP=0-* zx~2U=t(=KU2jxlM2tWBFp+B={^pbla87~e-AM&kaU~nuPEOXes@~*Z+eovZgO^h>S zR7~#4uahv+p=*`dm5B<&wZ74}ibHXQrIG5H_(b|n=0^TU8@WoRa?vZ<|*ZzJKVL)W%VbA6pQm0#bcDr2&D;uB#fzb=e<=187rQ+~c5!Cc|L z)z490GN}hPZ~89A|DrL6eA5X}@u&`6>zUr!L*Hame#NJdU@$yD)V)IS8pcW8GUPa?o{oHjYHR(Pt`kx(V=hjtql|9th|Xv z8lTY?FNN>2_AzD4ud{srBg@ZcO~Ak9+g4*^^$jK8q8#!^D7~}}U8|i`9QIpX>sc_I zeV^`Z^CH_;+Ko@q16{_vc%#1z`M5?mP=#(}NBRa+v6;Js`NB&%r#+Ctm->&e@AS+c zM%Pi|Zi?#?=rf(X?Lxh&%|}@aaTE|JAW%S{fItC(0s_BY1Q;7c`Zf7vsBiM?P%+1Y zqKu&UrptJHDRYR6(dFOAI5fdN&SHX}*}>=|?~z`z$*-!bo7Mb> z4(VxwN3!R^aGBiO^nzz>*bKT$?OXFOYpF)teCy1f5*wit`9yQ&+-iRk?f>KISG9Lv zvP1R&_MLRG`8u@jOb26F_fQ(reJF1_(Di?bo%Xg|JJ4qk`bddi*Jr-g1IZpw`VQ%x z+xn2cQ92sU!^#dpx_{-B^(x^dSIwk4rQXN)TmMToX-bo*; zyh-nE_b6a~`F`wzKGZsT&815(C*88u@kKe?{6z_yYZ&ECx-jXL(0xm{`WdwNQuZ-X z=5vyz-Y40W&OiTr*Jr(K)uf}>A$_;>w3;iDK2haRda6HB z)A5JX_lgU?|A=Fj=GrsGUl~Ds9CXRdz_u&}OS$y@ENs-)TP1&KD%hx1KA0@rm%VYyFjXtrt-~S@>aklyx<| z>KjduH7A&wO}8~QleaTH*ILi?Y8YgCGAFArZh4w)4K(jA+duJ=;!alvrL8tezGs+& zIuQI;zy{@K*%qgoN3nUwM~mCeD&Mm8&_08*t?0edYNqc=XPcf6yli^C&e}R`Lprm5 zuruokb=`B`x2ESqud!C@0@H`Jlv-P=JtZ|Kuej89YaN8qqTE?_=fhpzRE zce1A|eGgl&EABD9hmG>+(PRUlwO7iU>P0d>5cZmHU=Hsy`k7Va#X$x=raG9c4v1!Y zXXhi`^+n{pdi~8z<%=JB_Nmq`OEya6&)tWRFeAMAME(s&M zC56@ew&Y7P*`$1^-XV8hR^Iia4xg)eAuCV(Wfv{=T(-;V-)TNkc4>XL*&Q6QEs>p- z>?^E|qRs!r&Aq%U|GFms9eCHlhU1$K(4*s9Kbne7cW~phwnx~MxM_y*k@9lz!3S$z z?u4&mMejLlfoBKi$KB>Dllb2}#sJq|br=Y*hzs~gMo)(Y$`w^m-cu;nbD5BV3u7l})%N!4Tf1dr|7| zsp7$Trh8ZR%R{ar)7|}~{QRKu$Uc&Gey%|*2l9W3_HpskO#CN15RH8ZYCzyZ6Uu)4e zEfc-0>=nOh-GusO9ms$6$T6nk4eZgtDlY9nK3rLoO8%&=kn9S4*JH^tQ-j^S@R$9U z##HK4DF4D#`H{UkvUB5L{#omj4^EHdAFqmUGxw}d;CpxN2zJN)ZhM-&<30Z(>Px6U zW_dw$kj)e2dQ}xv7j@Ra2{hGP7WqoRz z^DEnMtqmc(dsJaRIT2gA(W`m)8*K+Iu%{M1n%a;~(5+#g!(;MOemngA0m((RL-5WW zVR_dxY(oxZy=$Bd68^H6qHLxUZDZdam8N<&?U(GdmA3LP{2PZg=hx;t>@0gc>qC|#-9L^zPLO{})e|d&Ls*ATXwWcm zk||UA!q4Wvs(*9-<$Ix?{mlI9bF^MVdvjX(Wb@AVrSzc&Y_X%;2T~gHjc9q;)?MAp zmk6?ab739!qhHY7aPLs)2=Yi zn>>3RS*1hkjkF)T>aGv>4#=Pq>cxP4k9Pf2sPEGU8KE}T-w#k;)E}bF{hofq;IO>w znV~AdLvv-D=>J}AuxMcSZtg%oPW~|Z?Xb7$tbUwi&ifozrc1u+SO|~n5RG)qr|r<8 zcYM=z(Kn`g$^owJdog*J&ePib`}>}fK`Ik=REytw>n)ZjCjWu)4e|%*uRH#_toUjF zTwW0!%GQ`*I^OuOapru$zMLbCGi;2vKIIAItawU?u2nYKFv^be$)%>-O|wnuD(krG zH3Xg3%}aJDT|e(CZPnciFT7B)C+3?ZSqbQu9<6?aUk2Iy>#TYt8Eb8_)h;(;pMBaD zSDVUC9Xva8jS0jsi+_H_Qye4rG5)wNrXedus3}>+1i4c~_b$lWgJ9c}^vK z${*wTNm^s#uRs3$>sn>gcv*fa#IrS3ea(Y+-)Z_*K$jkUsH5=A>Jv?6Ir-(#wfl^B z3Zt+!wCRph1QOPP6I(uUR1Uj0`%*tWyQW6$DE)oGPOHlET? z$y=le1AW!# znpE9)3Zt;LU*pef*tPPYeYB~&7pKp;7lQsp1?y~{ldO@hS9B0BB|Ai4_4DlbTX{YE z>~q|2^}Vj${PSF46jt9Pi%-v$roL6Zrf>W@cKaFa`v$Fgq7VE(%KeLEui_Msh8^Mo zt)G;S3GMBxev0yE!|Gbk^iE+ER^Qn7!L!m*-xEGqMjk#w$L8vJqT=rlN8f)Gn7w21 zYpt{Va8X}11z-3T5GWu}K%iYBK%bu<4NKtc+C#A@b&hgPCv&RKEocp9<4<>dDER;`>*<@y^J`!c3uz}0YDE<>C`?JH?=6ub+NS7j?RI4;=e|_`KH;wE7n4|rKwYOhOH){2%VSRP`Onpn` zLt!;ev4_TMdZs+su&K__$lhF74 z=c*sBZ<3|2vPzeQE!k^~i!TZ4^z3&ktIDJCj@3&@UtPwyv7&LX={atK>AB`aQ!#L; zDI-sMr~EVy9O&9%SiEd}_AFX8&GlXn{eQ1H-mv`2oyj^!0B|_lMswJ&r%qRMvTRT+%;iT%tVKbnRLEqPbdhGDnc#aq>mt4=36w zKk}W^LF@M^Q?JQ8n69t<+x7eF`bc=>ZO>PZ{N?CceiJylzW%A{wasqsH^M@^p}770 zpnJ`=!vC7<>xpjkbH7eiye4`xMss!cz0k*Xl8(^M3F~~{YcbmEy2!pmUstSo$DQ_b z^+0{m-D;e!v6{*+no2i;F6Ud)?#JQ4hc8NxXzPHRzb4&ykI`dI$r5yX=p?O9+s()Q z^P1DwwbGaFT>4k^x19-Jx%#?p80k?&OIv?+Mi#$8(y)x#g-5AULXp8J(4$LD1abSu_3hjc5_^C5eV^-^~nWbk;^Tj8$!NypQJ z`O3gnTc`YOA8VL$vSezH zrdRiJcfM3*Q@z3-Slz99U;0JZ-MlXT)1h!<@d2WG*Ynn=y*VOb@H+Du(x-3CoWa4T zum&F+8QI3lKiSnBnm;=KW{+28TXXkIrZaM2G=2?i+$tYyE*FzFy~ySt?Z8daH|o9U zAb%aaHPzcpF&$<90#CcT`mUaiS?>~#v#$00!$6~AWI+x7brfdbCSSLb`LZ{~C)+(d zkNcq$Ia+?+B?puTg{wvvN*CAkx#VtBBz)zct6#lwI-<8*ZGv%_^LKV24IOvA?CI-C zy9oQDURTY+=AhX0fsQJdFctmPcG2!9%+bu=p$LBv*f3R7dw(&-6}V z1~adFDRtb+JR6s2iw^N!(ucJZf2<+CC#)}`da38qNgsdIk?;U>kiR>~?6&n*?xAZv zJN~F6T)m)VxxTUK>MZ%Ea$%o6J27SN33{yqcMZh z@dl&A)r0eF#`I}!7=_h0{y3zwR6m3M^-;;v=Xn?U|944`F6=}v@q^Afl)h*&1Ybv6 zZ?U;~bKyew(DjhP-a37SvEl8vN?W$Yl>I@{V5%|o4|{{1={wv8?>&KD^GWQcp0EdV zK~Eq*pU^w{E$*RfJ<~fIPG^0qcktouq`h0}R10r^iwJmn1f%VUi>F2eK;bxwg2x=< z2p&tRQ}&?It+(mfv-A{|91R>Ttfv^t+{tX}_s7()|Ip|BB-NoX*qVKeypSKbk(?Ju zerS$FePgwcI@>u1$u?c%v0tM8|FSl`Ommb31rro$sIn&O#vaNKD+JW3lraSJo7rpoPuDXjYHj8E>w zm&MU;eB^oC4c4Qtv$g3!TkCw!u>t)a9bCK5ChcIhoVaeR{lNz5cx>%9lz!m}@axYU zvGe$QUO$q4inIC7#@P&?KDwsgRP^+Rrn+{3`5PFk@4y&!Q)p0&?ET@fhh~|op~Fp) z`XcYp=4(HcEwJg4Kd66k|KjJS1AgIp4;f(|e&9ZH_0?Cay=~wqqU~Sw#{79^#UX=@ zbK_H9KW)X;jZ;crK{g$SokqL5XNt;Gk>Z5rvjKX`W|@tt%fi{Oh_pPpk@TX%w) zxXt$Nq3c)XJn6oZFBpxnS;Hml?5`NVw$o^f-eA15ggMwHyX?I4lIbU%8xd!QM@*DME}a9{dY9K9RF3qUN>2R8mvVr}w~{kc6$9^!oN8S)Z+7q9 z75*0xC?HTkpnyODfdT>r1PTZg5GWu}K%js?0f7PnNf1EijA{#u7L-K$WcXt(Qs@uc zj3__UDVhGFL`#^^T=6hs`G5j9MeJ&g;ynp$xjsg%#EdBu_srR#s>D($^v8a^952|4cvOZ$J` zLvlrNkUaP@0y?k?0LYp{ruWiPfo1i89QYQyJxmp_szs*J3bSPjGefk<%$MZyBa%!% z$2zgCeoRQlei$F{i`{ZTL1=R^^u?}|!3^cGMpe`^d@EU~}y!fgN;E#o7>@62?J_8M;P2PDvK+0b+{;`tcArZk&U(}B< zCNh2!;LRiU7LkR634A!kVrbC|_@qVSZ}Z40APzUE1p)CM!yglo82DV!;L_B#X10F| zB*5OEQGg$3Jl%ODK)n!q4)e1z3&#Sji9c!m76cJ|j^vL)&5C{xf4_zS=4a(XD}(Pf(ASiiIh;E&p; z^(B9R+`oDfFsh1GfdKvtjRR=3$?dP31We%t@Q*dh?2X(efF~vzN&+5Y5zoRXMunLA zvoe6%%8v_fdB`gQgnpZtL|Z+fZy&%P-KqD4S>3kERbslp$PZMpYDe9N(vKyrtkk;U zh8ys|$qfsl&rS=V1=2jNe&!M&78ocy6GQvc7}mA(o(S;@z|1O5=` zIiM#&oe1afLrE3;am#alXu25JFk8W(60HjqVc|ctU?~%;yy=0rd5wt49~j2NpP{jb zKkHrE3V(zQjLPC6j9XxGxEdW4zA6AVQHAd1Htl~tMC-+f5?bH}hLt^(9Thz_tEKgd zDPUyw%F8*rWew z0Av(fQA237G5BObB8BFyC&E_r6sXRW%hg{VHnubJ4wTb$Oq@Wj%ZG-j8sUYnphR+M*ew8EWZvnU1uVCCn%M z_%j6X>IHKIjCxuEdE%sTx%~3WG19Q>{r{PzOhH+;I2bPR*auiwb}MH zTklf4<6d>U?pHr$|JvW}-G7@YRh#e7bG^x3hmNXj9NeRRU}gUSkSRJjX!jX7AQG{Q zXrba0E$r69fc5#FW^HKz?0RMAOVccn2YiPGDFA!{;_@$)iCd=)6Jmj zVdNZ&w*O(bva-s4{mTXouik8jA%~sRW9rO`YaXtBbWy`A|EYiTyOPDf;Or{JU+2Zk z>KA_B@Y)x3bNguIggt(2Dv1M@`u&pGED z?=1tgJmOD-OP?w*@8&No*VszZo|X?C*|^8Sy-&Ylz++1)7ygtK+gH9~ACaVgNoq&8 z#s8~+=7X}!@2@>_TF=odSMlVXsPVWD5C>9DtSQz zmPU(6+%y5Ga6|E@8%zLN=e&%{(Wha`5}Vxd6-$?rIeq%ptvSAG`poLNpGU#1DGVSd z`$fawi>KF{Kh&Iiecg_GR@Bx9^5(zAZzzMN+yw%i9|ju4jG84`_EDRANi&_1V~Py4 zQT)Q){<6fb0l&O|UF}vo51e^>RJM;Xb|&~2Enb$4vKIi;M{?~KeD7($a;rZ zZqdi)-WD_V@ghXil?;FEoV_rN&T_#Y$%9rcnO4UGzu#Vm^}GA|wEf8t^fJM}G&%m| zOPac}jdR}ZG-=z?K$gLV*C@hD6j6{ zfA7O<9)BwY+ZdClxX1+mZprblu=taW&Nt5KJZU?6zscGH7P;gog;=iQ;lTW3GW>bY z52_#v>vq_q-xKd-2|jem1pgHB$De^Nkm-gwgZ4hOtbbiH63~`q zJ&B3%_lCDLzDz)*z@Jqc;17EA+p{A9j@+0l4Dh^n%h-0{+7kxd_oBb-8DD3De@2lH zdS+?Ay$|o!rz$k_Or>RQoQ7jXkFk--DZu9yQz2gJ*)6+(`I*KF%|CqAd+3N!m)?<$ z%=e3<7Q-K6^?UN&nn_zGQx-8}LIGjsOn+1y4-r9 zC14EjxC>TLZohlYyl*lR2;qTS82`#eKh+<4V%J{btIjc6$YP2dovMchT%8(!-g^4s zENl_cHtfcu4iOUa+0PJ77NS9k3hUIo~tBvZ+N z9s@`*Z%zw70gyZ%+h#f?8d%5VMIusG_Z#!b8_BV4kNEd{^^3l%uNy0Z{{nNnjPQqz zJtYi%%P9EA<|x@VB%_2p{gOYc-u0j@cgRDt8>&L}79q ze}Vih&pLO$93{C8Zuo1UINoim?{2*r{l!u7^OtPAHRH|Ssk_G?q!Q| zvf&H@l?(nJ_!Bo55rh06R0F~`YfL*ov``Vdg%})q_%o}R1^zfuWe)cKr&a}@q3jJJp{kX2@!H+~|8@;QMJcfaa@Qs^JAGR6OmAK5rpe_n*^ zx!{jpogIt=_!lQk1C4q0lZKI_0>$ALHp99s3MTl_1Hjli>rAPD0WhEQi?}3Yv&}Xm za3I4pK;$NTf*g!4zQ>RfzJb81-$zmFEII^?B@lDVa~<+TQ&Xhi3k3lqkwNp7yi7)(IaaPI@NkqRi z)JmKSCFYsY-?(F^cY8DWk_vzEQ{W#1Gt-OWjspLph~S$p3;(y?c~>HQ63c>RV8j6_ zrXYMyW07fQ{oy^4o{_r48*v13-Z*N^@HuZqY6bF+Kj05v$+_sxXq=A>TsG*1e~(^s z?LZN{+la!43WBi~pU{W&zhA~Kld*>>t%yQ`cd#F49mx8 zwh}Y1R^Zmhx-3k$$R#iMd&mzS=?q)Jx#0Hb;1@0WWys@;2d%K8*YE{O!QRFZdp=mt zdUAkiDLdb#TO%7oc!qpD=(TDqJB*e}`ZBa5gaOiO z$IYmC^~+QwNP+*r;m**}k^T;w?wo(C{(OQZ^)*>4pZD$P3vcLK-;fAC%*;Zzh|CXA zm^u&%mB^1|cGnoL6BV{Y5%DJ&wU6+LrQk{5x`t7g+}8cIualAh{ELgj|9ExYtx^9X zBQLrvTGnm;e}`Z9P|d)>p^^s$az-{Mp7s*&BH3Z?|B8uSaDxG&<4;KZDTOv+^v7xj z4IX~wePyqI8%_dP7r7n!$E%D`O%u4OCqOnz=l^%`jgK~tUcnRE0nVZGKxZ zBz_M+en>OA#%-6EpNtkoQdJpuhYC`U1VgWWp!?jfix#p7E51i`?#)h$zci4>v_;h}}s8HZ!1a-2&9{!oG{vaDHv=40v$R4#| z*kyNBy!c6R#Bo{vkoPK4{oB7dZ~okU?pGN6H;f7gpM0YJ&D7u-7lIyQh>m2CX7rqP zlL%QsmJu5em}Q&n$`?ukYC+F_wPQ}dr0eX3;9v!duPy{s&;k4dZ@En!p!sc65`7l^ zttjvq!l5j*^TWH2}cEsS%sp3c9@&1CD^ur685`R4Ohlvjmi+1!akCPB8 zK?ER4C;rF@E`V62n;rOkMSlsnjyme7_$*|9$MPj2w}@B=OI~Qz`|fN zM^_Ix@bvI+&Q(6H7|#-IbnR<0qEI~<8?qjXY93k96>*v)S<$@bxD29PkTO2~T<_5T5G_8$Ql}o}EhL~*ge+osp4bA$fC}a~ z2J8(_#$I)Bf3aJKSFvEtPjwZGHh@2D&pZnMx6jfJ&I31*SiZYxPWL8 zkBq7UDQ1033q`+(!G&KO#efRtI1E^NDg5F>h6N))EZP|UBuYa`O~mn6*8PgavQv)$ ziv2g^a+UK9`e&l$$KWn8(X5{^v}A??5P$+eh(88YFv}jW3x1A0hxfg}T*Mwa1n@#O zKhjk!T2Iu&NC3qGE7r{Bh3!2An3_c8LMfQHicdcecjTFv>5FEKcIbx`AD11p%M3P= zNHL&-IrdP!_1V~S>}tHgaRxR7NQpnbK_K^r8*WG^Cy&T`MPrKrAmSIxWF9YYqeski zt3qMS@gY#4-$P-=e-G7Q&Ow!NtNq28-wPa91w3tr4e6b|U_{P@2tDDvBkvU-gF_&q zuNa?re(vb}5IHSNj!>ul9F+J4GY$T?zYu$f9fAj`_n+I?D+MEP{LhOskBwJoDKIz$ zBDS%JPdq<&cmgDH1a(9MjL;lLe;CX(3IyNJ559Npd+A7n5&w&xZq^|oE(2#EO6%k# zK5J3$&_8=k0H)3@%}9U{%+_76#GVut6?y#Z|Ifo%0LK^Ddzdw<(LaO@Xng5K;99>q zCwaZ{=*u`IYfoI!i<2Vb_$p6~hleRXNerLgC&&a^MwmZGgP#;d;1$zw$RDVTB|uA8 zffPAO23;1PB#SDe=RkpGjDZZpNtTYL$VTq3=p~X0x^X&r1Of<{cK`Edn9Tm*zppoDssFxM2(adt)s#3j^?rCHNcNkU*IytNn||DxjFG*J zN{)*R46QM`Wc_KxA9k~O{G~{gwK@JDnZ$6N6&$Gx$XXlEiG68lDNCy`@nxN9?ms*O z=l;V4mmkiSy&u=uq622k>po8sOUGgXF96H%+1m@}2`rpB=%9oC_{Tr8_Brj3^<{{Zd0hZw^X?2I$cm@#7pCbFzbm_2(o7UOAu zIPFOrChr08{Wq)y?W9c)HH zSTp4n%_A1{#mQCZhs(u7Xvc;ZURfv?OH;XKF-XL{QBssKJ1=u7BFy5Ix0elWd=RRX zi{1UQh$Qey+j66q8Qd>;B=i1f;oUJ%sCIH2+hiOWNYV0}D?j15W?>QQuiGAqhV&*!6~o-dolj<$cLH#i37v z_n~~1i&l&U7p#pU|Lonv@*I5o5I-F`oH2UcJ1)58A+HF)W&!MzLK#^|m@g+t6le0} z$(}sS5j0wGN`zMvR(ox=)mC&$>AA)F03;OpBLGXoSQAG95nRxbNbpXO3unUQq{T)& zhwRhRW_?yLsNOC)&vAwrfk1`>*ROV@%pz5WI( zh3O_KZFPeoZbZT#%*cWZawN6O9l@0{wl_AT(ixtbyN1Q-|fKu+wRtL{mo*p zdejeO@2JEWsGdZgg{wn+U%)e7x#-Mu9m{Z(3sPh+NGe6Fx9R1rvR`dUD%aIZs)Px^E5)Jq#)`l#78-^*V* zb3SPP-K zlAIw=EOjorQ|(8L>3G70b&oBH<+=Ids)wDuj%xnn)|M-FQT_6N_`GWD8WmMF{+I#( zoO8~Jm@$I!EuP6eKJ-LKM2gc$!G8XvyVvxuU2{U!X_v+_8N3K=$-!+xxx6Pe=iN}Z z<6b4b`uO7~pAm(>C*)&=;sQYwWv@@le(}W@L!4N;-TPGa-~FJPnRj$wY#rhy<~ee? zN*4c8`{3M;8*f+9Pea1kkHL5p*y-5tiN9P7E%7;-w#8@YO`97_jyg49+g)oOe=8aO zP0u5jt10}APYv4VuyS8>fO>?UNosDS|3(7==KgZAWhWw$-dc)pp)$&!SfNV0cI`cM zWbJ(sHssB;T#L=1XO`A%FxlS(;6jQF&|yyYqk`bw0%_(i*XgI9PKHryq$n5NfLNh) zQP()|gmcnR%Hzq*%SE(f!s zXGJd$vEHk%L&jpi6pfKL;0hGVD;J+9D;GnmSmay`J?NN7l*)k*z4+@cyxE^_3W4th zODvbC=tu?#BE=v7O0WF8b;{La(NF$#X=RcjPq3JV&0jh;;pG*c;zBEV47tM!1{tSqf*K*PK2+bbDC9+2*{gjGbqshm~ zM(Bre!jLxIt2hz==Z{|WghR8(jx#iHjBa9O@n6srP9_ptgI@E(_aOH337w+Qa^b9) z0ja+%{%ce#bQD8Bq{;TjU%W`0E=B!|La$f8a_)F3F+z6x^`}d-8=5`H!I0lymcTXT zqNz&!7LAHO{{C~nNX$dilUKiX{D17!lcHR_^#Y%9t#icbiE)-K_`#oUvTYg3cIs_^ z2|!0Hv0Oay$3OAbza{3O>B)?%9RDAivnQ5|Jwd!bwqN%Gj|tg(od}0Ny1<_H<_{mr33*2$p&uGETOtj#DpivA}@aaS2qqUotI=|yFiSIJ6Xpzt>&VmyJPYe zQxd5UZk^}-w|?ZPSfaSx49yrisKD?fkOgkh=P=j_{hTR3s2NM8_R9OqUi&&RKZ$XM zKk>E=O}-Ox>Adf%uYEX{92dy|$9XuIho@qndK=eidVk~ z7A>&5WwK30wT0+yA>{u5_Ra=KkL0}Tt$SB__jEp=ESF0U+>7JgR{+QwR@gIKo zIlunf>32dA%5e8!rU*ozelGeUkc|xp(5q)iAN$0tz3eUJb3XOktqm^s>~&e5GRAflB|v&;C!oiI(OF=7?Zn%nS=t33&`*h%9A4=BJ~Do?{PUQ3?$C zW@4H(w7RAI#K~X%@BDk_?JNuiD*ZRS?_+exweIl?TPEfZG1dmE8cggmK@bP7$8r?I zsj)2Qh*=o(FdL{J!b@|5(!mL<>U2tUk>6?0w>||Ye9}k=}Aa(jE`I%MrIdN)PcFt zUFC}^0ewt9*F&Sk$m+Lz%eSyBWFTLO{>~e|MVN%MGLYo@!I!z>A_4ccUF8d-K|gkP zj%+&~jLblKH(%~!AMrCE{sSM$r#+OOKGK3^lnO;j>WR120tdb;L9O7bOqnd`*KY)P zA$*tNgZ~yk&9&-}N1_M}pKMV21(~O0Jf5H=W4T_|0teO}u$+=Xt+8RZl>eaL3;AdM z;|QvJE6X8jF!|g-6k}MMDPmSu%oQ<6kQ%S^`e;tm*ums;1DSnhaaU(F zK4m+@&muRbC$J1|x7S+wa_r8V%=PW%kzj5XQUcUaeQ03@M+;|UCynA+mDl#tyWmz8 zc`E1Gzsx8_*Qbn8c>1wpA*uk%P>WEEH$11R?$%E)f@Ys_Y&yg6{0ce-Ke|0>p0{a%&x4>701>%-xwAr=ax-1-! zo#kPB{Av7QYyTbiDHU+S4SIr`TlxVq=xb)o)R zD9qH+Xy%VQf2iC<2Jg)Xm-h(dz=H4|0dta*eYbCceG7ceTj15Nel_zztv&R;6J`ja z+uM%*m>f@!y$?W*#b<7q@MeQCyQ&zhWY%r2V`k#UU0({)I}Vi?8fG|eM$KWknQ<|O zU34q^H_UVFL!L*n$9OpFybizkag0JTAccCkein2eKKeudJ>T;^x@Dc62D2Tjz-JTO zNGvPW;Lk5i)c@$CkD?y4Yh;1f1f;nj1m&6Tf|%jFbSQR)e-ASyGq}x-VrvBIF}u%D zBMQeQ+W2w2L4eV^xlB3)H#rMPf9qS{N)}XSihweLSrDUr^gV+0EA<9oVs{MWDZop7#~|Y7XIAP|ay(@jP9svS5gLcV-k=4~o;x z(s*bS_&6@3{LF1UU9wP{ISlRyH?BXkJLrtItd-=8hAi9S+kxyRVl^HP5B0Ms3Yuj$ z4@1Um*^OrewOK>VeqB6!=EfW_=4IY=b90mZgxtPqnYpHDr7;d|G7b-?Oz*MOgPs6n z++wJ)B;2!H3K6y0Zwx~`i|jh*D{CJIb#{B3Uw8+5n_oO@Z!={yo;WDu4U)U+|oJU&tc}wH&F)`KOtT9fBDN_jz31t_8{erZ+xR(^-*~?kS}MeFZz?; zapZ}&PoDTu{%?EtKfm*X|K`OX{f)am_G#Ix{7*in;kQ3=;qLD&Ab#%MSxkzMayZq0@%_n^GOrA1?M!A{^6~rbE&dw2aPNHo&)**R+pvzm`Y+8tr*6&D zt)KtDFZ$VEf%w>?Pmu6A&wXyp1@8<(lfjkZQSImHWk;sr9{vz)H zVj`R*^n%p>{BlYS98+7vSvjgXRdLUK(Ot*B{V&}5#(&gN%%Aqx?tA^+I?j-n=e_xT zU;nzlzI;^rFzUDx$Cju@_4MT|QF%OEM6Y|@>motlL(Som2}0QT{XDi4-}N)UIIKMC zEv7%o@2&pR(jWaZx4-DF$eisuvzHdpi|#DL;-)jU>Rt1~O*6JO?65ulP=43H{Ewr` zkLy3YOW}Q=#2V?YTH3e14Pywa16je7+Mj(&WIq!0Jv8;vK8NnUH+$z#&r*I||FKke zeeyp&=j&e@MQ}r$achQ*w`isM>%Q5sB)p*@a>hz`JoZClYBb@a^=EXq((?A3(_OMN zHeI6(;}xm?_z4{AMet}7^*?;~@r8EA?p}ZLe&>S^MM12w>sJFpXeXiRD9gKWpE|dJ(Dq1EwC##h&aB^HkQL{R}P~;Em&%(*M%~8#q&0eM{0pqGYOb>Zks^=RNP~r%HJ)x?^*0{b5_< zPsfd#zEjcJrP+dRucvDVyW70$DYr?8ohKp01r+%Iz23swCcbMvb`ltRyOYL~^>V_Qs{inY)ut)LN zzGV0(ivJ(}3G;h?zxlBbE33Hs<^G@hOe||QUHA28&3b3#Gu5BRYD%Y{iZ|&Hj)VEj z{>)#vMOTeS&DE1K8r+L`{(XjjqW;)-m~Z@j=E6Vg*x{DX{mwUk?_-EiS&Y{9H6e

NjQJ&Km{^EaQFiNG+AMST% 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 literal 0 HcmV?d00001 diff --git a/src/tools/vmap-assembler/.gitignore b/src/tools/Extractor_projects/vmap-assembler/.gitignore similarity index 100% rename from src/tools/vmap-assembler/.gitignore rename to src/tools/Extractor_projects/vmap-assembler/.gitignore diff --git a/src/tools/vmap-assembler/CMakeLists.txt b/src/tools/Extractor_projects/vmap-assembler/CMakeLists.txt similarity index 100% rename from src/tools/vmap-assembler/CMakeLists.txt rename to src/tools/Extractor_projects/vmap-assembler/CMakeLists.txt diff --git a/src/tools/vmap-assembler/README b/src/tools/Extractor_projects/vmap-assembler/README similarity index 100% rename from src/tools/vmap-assembler/README rename to src/tools/Extractor_projects/vmap-assembler/README diff --git a/src/tools/vmap-assembler/vmap-assembler.rc b/src/tools/Extractor_projects/vmap-assembler/vmap-assembler.rc similarity index 100% rename from src/tools/vmap-assembler/vmap-assembler.rc rename to src/tools/Extractor_projects/vmap-assembler/vmap-assembler.rc diff --git a/src/tools/vmap-assembler/vmap_assembler.cpp b/src/tools/Extractor_projects/vmap-assembler/vmap_assembler.cpp similarity index 100% rename from src/tools/vmap-assembler/vmap_assembler.cpp rename to src/tools/Extractor_projects/vmap-assembler/vmap_assembler.cpp diff --git a/src/tools/vmap-extractor/.gitignore b/src/tools/Extractor_projects/vmap-extractor/.gitignore similarity index 100% rename from src/tools/vmap-extractor/.gitignore rename to src/tools/Extractor_projects/vmap-extractor/.gitignore diff --git a/src/tools/vmap-extractor/CMakeLists.txt b/src/tools/Extractor_projects/vmap-extractor/CMakeLists.txt similarity index 92% rename from src/tools/vmap-extractor/CMakeLists.txt rename to src/tools/Extractor_projects/vmap-extractor/CMakeLists.txt index 30df59573..db3be8eae 100644 --- a/src/tools/vmap-extractor/CMakeLists.txt +++ b/src/tools/Extractor_projects/vmap-extractor/CMakeLists.txt @@ -25,9 +25,11 @@ if(WIN32) endif() include_directories( + ${CMAKE_SOURCE_DIR}/src/shared #${CMAKE_SOURCE_DIR}/dep/libmpq ${CMAKE_SOURCE_DIR}/dep/StormLib/src ${CMAKE_SOURCE_DIR}/dep/loadlib + ${CMAKE_SOURCE_DIR}/src/tools/Extractor_projects/shared ) add_executable(${EXECUTABLE_NAME} ${EXECUTABLE_SRCS} @@ -38,6 +40,7 @@ add_executable(${EXECUTABLE_NAME} ${EXECUTABLE_SRCS} vmapexport.cpp wdtfile.cpp wmo.cpp + ${CMAKE_SOURCE_DIR}/src/tools/Extractor_projects/shared/ExtractorCommon.cpp ) target_link_libraries(${EXECUTABLE_NAME} StormLib loadlib bzip2 zlib) diff --git a/src/tools/vmap-extractor/README.md b/src/tools/Extractor_projects/vmap-extractor/README.md similarity index 100% rename from src/tools/vmap-extractor/README.md rename to src/tools/Extractor_projects/vmap-extractor/README.md diff --git a/src/tools/vmap-extractor/adtfile.cpp b/src/tools/Extractor_projects/vmap-extractor/adtfile.cpp similarity index 100% rename from src/tools/vmap-extractor/adtfile.cpp rename to src/tools/Extractor_projects/vmap-extractor/adtfile.cpp diff --git a/src/tools/vmap-extractor/adtfile.h b/src/tools/Extractor_projects/vmap-extractor/adtfile.h similarity index 100% rename from src/tools/vmap-extractor/adtfile.h rename to src/tools/Extractor_projects/vmap-extractor/adtfile.h diff --git a/src/tools/vmap-extractor/dbcfile.cpp b/src/tools/Extractor_projects/vmap-extractor/dbcfile.cpp similarity index 100% rename from src/tools/vmap-extractor/dbcfile.cpp rename to src/tools/Extractor_projects/vmap-extractor/dbcfile.cpp diff --git a/src/tools/vmap-extractor/dbcfile.h b/src/tools/Extractor_projects/vmap-extractor/dbcfile.h similarity index 100% rename from src/tools/vmap-extractor/dbcfile.h rename to src/tools/Extractor_projects/vmap-extractor/dbcfile.h diff --git a/src/tools/vmap-extractor/gameobject_extract.cpp b/src/tools/Extractor_projects/vmap-extractor/gameobject_extract.cpp similarity index 100% rename from src/tools/vmap-extractor/gameobject_extract.cpp rename to src/tools/Extractor_projects/vmap-extractor/gameobject_extract.cpp diff --git a/src/tools/vmap-extractor/loadlib/loadlib.h b/src/tools/Extractor_projects/vmap-extractor/loadlib/loadlib.h similarity index 100% rename from src/tools/vmap-extractor/loadlib/loadlib.h rename to src/tools/Extractor_projects/vmap-extractor/loadlib/loadlib.h diff --git a/src/tools/vmap-extractor/make_vmaps.bat b/src/tools/Extractor_projects/vmap-extractor/make_vmaps.bat similarity index 100% rename from src/tools/vmap-extractor/make_vmaps.bat rename to src/tools/Extractor_projects/vmap-extractor/make_vmaps.bat diff --git a/src/tools/vmap-extractor/model.cpp b/src/tools/Extractor_projects/vmap-extractor/model.cpp similarity index 100% rename from src/tools/vmap-extractor/model.cpp rename to src/tools/Extractor_projects/vmap-extractor/model.cpp diff --git a/src/tools/vmap-extractor/model.h b/src/tools/Extractor_projects/vmap-extractor/model.h similarity index 100% rename from src/tools/vmap-extractor/model.h rename to src/tools/Extractor_projects/vmap-extractor/model.h diff --git a/src/tools/vmap-extractor/modelheaders.h b/src/tools/Extractor_projects/vmap-extractor/modelheaders.h similarity index 100% rename from src/tools/vmap-extractor/modelheaders.h rename to src/tools/Extractor_projects/vmap-extractor/modelheaders.h diff --git a/src/tools/vmap-extractor/mpqfile.cpp b/src/tools/Extractor_projects/vmap-extractor/mpqfile.cpp similarity index 100% rename from src/tools/vmap-extractor/mpqfile.cpp rename to src/tools/Extractor_projects/vmap-extractor/mpqfile.cpp diff --git a/src/tools/vmap-extractor/mpqfile.h b/src/tools/Extractor_projects/vmap-extractor/mpqfile.h similarity index 100% rename from src/tools/vmap-extractor/mpqfile.h rename to src/tools/Extractor_projects/vmap-extractor/mpqfile.h diff --git a/src/tools/vmap-extractor/vec3d.h b/src/tools/Extractor_projects/vmap-extractor/vec3d.h similarity index 100% rename from src/tools/vmap-extractor/vec3d.h rename to src/tools/Extractor_projects/vmap-extractor/vec3d.h diff --git a/src/tools/vmap-extractor/vmap-extractor.rc b/src/tools/Extractor_projects/vmap-extractor/vmap-extractor.rc similarity index 100% rename from src/tools/vmap-extractor/vmap-extractor.rc rename to src/tools/Extractor_projects/vmap-extractor/vmap-extractor.rc diff --git a/src/tools/vmap-extractor/vmapexport.cpp b/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp similarity index 99% rename from src/tools/vmap-extractor/vmapexport.cpp rename to src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp index b2a29b939..13d484103 100644 --- a/src/tools/vmap-extractor/vmapexport.cpp +++ b/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp @@ -55,7 +55,7 @@ #include "vmapexport.h" -#include "vmapexport.h" +#include "../shared/ExtractorCommon.h" //------------------------------------------------------------------------------ // Defines @@ -547,7 +547,6 @@ bool processArgv(int argc, char** argv) return result; } - //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Main // @@ -559,7 +558,7 @@ bool processArgv(int argc, char** argv) int main(int argc, char** argv) { - bool success = true; + bool success = true; std::string outDir = std::string(output_path) + "/vmaps"; // Use command line arguments, when some @@ -598,12 +597,17 @@ int main(int argc, char** argv) printf("Extract for %s. Beginning work ....\n", szRawVMAPMagic); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory + CreateDir(std::string(szWorkDirWmo)); + CreateDir(outDir); + + /* if (mkdir(szWorkDirWmo #ifdef __linux__ , 0711 #endif )) success = (errno == EEXIST); + */ LoadCommonMPQFiles(CONF_TargetBuild); diff --git a/src/tools/vmap-extractor/vmapexport.h b/src/tools/Extractor_projects/vmap-extractor/vmapexport.h similarity index 100% rename from src/tools/vmap-extractor/vmapexport.h rename to src/tools/Extractor_projects/vmap-extractor/vmapexport.h diff --git a/src/tools/vmap-extractor/wdtfile.cpp b/src/tools/Extractor_projects/vmap-extractor/wdtfile.cpp similarity index 100% rename from src/tools/vmap-extractor/wdtfile.cpp rename to src/tools/Extractor_projects/vmap-extractor/wdtfile.cpp diff --git a/src/tools/vmap-extractor/wdtfile.h b/src/tools/Extractor_projects/vmap-extractor/wdtfile.h similarity index 100% rename from src/tools/vmap-extractor/wdtfile.h rename to src/tools/Extractor_projects/vmap-extractor/wdtfile.h diff --git a/src/tools/vmap-extractor/wmo.cpp b/src/tools/Extractor_projects/vmap-extractor/wmo.cpp similarity index 100% rename from src/tools/vmap-extractor/wmo.cpp rename to src/tools/Extractor_projects/vmap-extractor/wmo.cpp diff --git a/src/tools/vmap-extractor/wmo.h b/src/tools/Extractor_projects/vmap-extractor/wmo.h similarity index 100% rename from src/tools/vmap-extractor/wmo.h rename to src/tools/Extractor_projects/vmap-extractor/wmo.h diff --git a/src/tools/tools.ico b/src/tools/tools.ico deleted file mode 100644 index 052553e462c944e17b03cb062380f3122dc926fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbu5X-HI26vv-s5n35knmVGU=@5vNWFIP;6q(R0CM|U|GmUgetSlGY6AjSp_ZNkmOQjM73Yu23^h^Y7lPLPVeJJ$~<=^FQbR&b^o849L4_6Gt8! zF2a!GOi9EiP|1d1z`h(OAho|ApH~|AbZb|}k~iXw4(IwcaF=z%C9x5EuQo%FtAtm@ zAp9C85%zK#lEDSgzCWRJk9KJg(zgIXVIQo5O2G>(fu*<@76FAY_s_?+lQNk3-Xxj~ z{HXhI&1^zI`#0vHUN5Bv0X#u55`zb>&thvuS^BQgK_XBe(Lp5EbhUY z>}{=EBFs)p*?%{RvS1hYkj0*zKVcf24_Q@ZYW_v>J<0JPcRh3!*gjiT`9D-?5Fv9?@Vkb^F3OpVRR$|g2x}QTh;@o zoOY}eroo%s9ql{uTFbDGyp2`lTxKCsmYewIfS+6kerh8e6YH2JQp|xTDTlEr2ma*z z)O)6XfngtAg*C!dScR7$lxSOmq_B;;3lqOwh!s;zqxz2cI+&gu|hOi8PY)!ppHioDX3^7t5(ei659p%CHv6G#=KWXz~~Cyw^jJ)dZ7M#c)n| z#PW-cqllJ|qfD(~IqfM`Yax-VaiL{`Y1CW)S&xqIdK{A~uvJnG%cxpZzMWy3{G$eW zy5