diff --git a/.gitignore b/.gitignore index 53a6521ceb..4fc2c24f49 100644 --- a/.gitignore +++ b/.gitignore @@ -14,11 +14,15 @@ distribution/windows/*.exe # Build artifacts artifacts .cache +.dependencies #lib lib libversion +#sequences +data/title + ################# ## Eclipse ################# diff --git a/CMakeLists.txt b/CMakeLists.txt index 12e33a2915..7992ec6683 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -396,6 +396,9 @@ list(APPEND DOC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/contributors.md" "${CMAKE_CUR # CMake does not allow specifying a dependency chain which includes built-in # targets, like `install`, so we have to trick it and execute dependency ourselves. install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" --build \"${CMAKE_CURRENT_BINARY_DIR}\" --target g2)") +install(CODE "file(DOWNLOAD https://github.com/OpenRCT2/title-sequences/releases/download/v0.0.5/title-sequence-v0.0.5.zip ${CMAKE_INSTALL_PREFIX}/share/${PROJECT}/title/title-sequences.zip EXPECTED_HASH_SHA1=79ffb2585d12abcbfce205d7696e3472a504b005 SHOW_PROGRESS)") +install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E chdir ${CMAKE_INSTALL_PREFIX}/share/${PROJECT}/title/ \"${CMAKE_COMMAND}\" -E tar xvf title-sequences.zip)") +install(CODE "file(REMOVE ${CMAKE_INSTALL_PREFIX}/share/${PROJECT}/title/title-sequences.zip)") install(TARGETS ${PROJECT} RUNTIME DESTINATION bin) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/g2.dat" DESTINATION share/${PROJECT}) install(DIRECTORY data/ DESTINATION share/${PROJECT}) diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index 9001105cc5..b66371f027 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -2297,6 +2297,7 @@ buildConfigurationList = D497D0891C20FD53002BF46A /* Build configuration list for PBXNativeTarget "OpenRCT2" */; buildPhases = ( D4EC48E91C264FC20024B507 /* Download Libraries */, + D4E09E831E049C0600F53CE3 /* Download Title Sequences */, D4EC012A1C25532B00DAFE69 /* Setup AppIcon */, D4CA88671D4E962100060C11 /* Get Git Variables */, D497D0741C20FD52002BF46A /* Sources */, @@ -2415,6 +2416,20 @@ shellPath = /bin/sh; shellScript = "echo \"#define\" OPENRCT2_BRANCH \\\"$(git rev-parse --abbrev-ref HEAD)\\\" > \"${DERIVED_FILE_DIR}/gitversion.h\"\necho \"#define\" OPENRCT2_COMMIT_SHA1 \\\"$(git rev-parse HEAD)\\\" >> \"${DERIVED_FILE_DIR}/gitversion.h\"\necho \"#define\" OPENRCT2_COMMIT_SHA1_SHORT \\\"$(git rev-parse --short HEAD)\\\" >> \"${DERIVED_FILE_DIR}/gitversion.h\"\ncp \"${SRCROOT}/distribution/macos/Info.plist\" \"${DERIVED_FILE_DIR}/Info.plist\"\nplutil -replace CFBundleVersion -string \"$(git rev-parse --short HEAD)\" \"${DERIVED_FILE_DIR}/Info.plist\""; }; + D4E09E831E049C0600F53CE3 /* Download Title Sequences */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Download Title Sequences"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "version=\"0.0.5\"\nzipname=\"title-sequence-v$version.zip\"\nliburl=\"https://github.com/OpenRCT2/title-sequences/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/data/title\" || ! -e \"${SRCROOT}/sequencesversion\" || $(head -n 1 \"${SRCROOT}/sequencesversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/data/title\" ]]; then rm -r \"${SRCROOT}/data/title\"; fi\nmkdir -p \"${SRCROOT}/data/title\"\n\ncurl -L -o \"${SRCROOT}/data/title/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/data/title\" \"${SRCROOT}/data/title/$zipname\"\nrm \"${SRCROOT}/data/title/$zipname\"\n\necho $version > \"${SRCROOT}/sequencesversion\"\nfi"; + }; D4EC012A1C25532B00DAFE69 /* Setup AppIcon */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/data/title/openrct2/Cypress Grove Title.sv6 b/data/title/openrct2/Cypress Grove Title.sv6 deleted file mode 100644 index 0becfb65cb..0000000000 Binary files a/data/title/openrct2/Cypress Grove Title.sv6 and /dev/null differ diff --git a/data/title/openrct2/Ill Paradise.sv6 b/data/title/openrct2/Ill Paradise.sv6 deleted file mode 100644 index 62ac421cf8..0000000000 Binary files a/data/title/openrct2/Ill Paradise.sv6 and /dev/null differ diff --git a/data/title/openrct2/TaCW.sv6 b/data/title/openrct2/TaCW.sv6 deleted file mode 100644 index fefd623dcd..0000000000 Binary files a/data/title/openrct2/TaCW.sv6 and /dev/null differ diff --git a/data/title/openrct2/Title Sequence Park 1.sv6 b/data/title/openrct2/Title Sequence Park 1.sv6 deleted file mode 100644 index 873ebb9b80..0000000000 Binary files a/data/title/openrct2/Title Sequence Park 1.sv6 and /dev/null differ diff --git a/data/title/openrct2/script.txt b/data/title/openrct2/script.txt deleted file mode 100644 index a20b7ecab8..0000000000 --- a/data/title/openrct2/script.txt +++ /dev/null @@ -1,84 +0,0 @@ -# OpenRCT2 0.0.4 Title Sequence Script -# Arranged by NWSpacek (Kelson Blakewood). -# If you have parks you think would work well in a title sequence (must be NCSO), contact me on reddit at u/spacek_toast - - -LOAD Ill Paradise.sv6 -LOCATION 113 105 -WAIT 15 - -LOCATION 120 102 -ROTATE 3 -WAIT 10 - -LOCATION 73 136 -ROTATE 1 -WAIT 15 - -LOAD Title Sequence Park 1.sv6 -ROTATE 2 -LOCATION 120 43 -WAIT 15 - -LOCATION 124 74 -WAIT 15 - -ROTATE 1 -LOCATION 120 90 -WAIT 10 - -LOCATION 123 130 -WAIT 20 - -LOCATION 70 85 -ROTATE 1 -WAIT 15 - -LOAD Cypress Grove Title.sv6 -LOCATION 106 43 -ROTATE 3 -WAIT 15 - -LOCATION 60 103 -ROTATE 1 -WAIT 10 - -LOCATION 91 83 -WAIT 10 - -ROTATE 1 -LOCATION 117 61 -WAIT 10 - -LOCATION 82 95 -ROTATE 1 -WAIT 20 - -LOCATION 110 94 -ROTATE 3 -WAIT 15 - -LOCATION 79 94 -WAIT 10 - -LOCATION 63 97 -ROTATE 1 -WAIT 10 - -LOAD TaCW.sv6 -WAIT 15 - -ROTATE 1 -LOCATION 110 95 -WAIT 15 - -LOCATION 57 101 -ROTATE 3 -WAIT 15 - -LOCATION 100 63 -ROTATE 2 -WAIT 15 - -RESTART -END diff --git a/data/title/rct1/script.txt b/data/title/rct1/script.txt deleted file mode 100644 index 6d9ea69198..0000000000 --- a/data/title/rct1/script.txt +++ /dev/null @@ -1,98 +0,0 @@ -# RollerCoaster Tycoon 1 Title Sequence - -############################## -# RollerCoaster Tycoon 1 # -############################## -# SC_DIAMOND_HEIGHTS -LOADRCT1 3 -ROTATE 2 -LOCATION 47, 99 -WAIT 15 -ROTATE 2 -LOCATION 90, 48 -WAIT 15 -ROTATE 1 -LOCATION 86, 43 -WAIT 15 -ROTATE 3 -LOCATION 57, 50 -WAIT 15 -ROTATE 2 -LOCATION 86, 64 -WAIT 15 - -# SC_KATIES_DREAMLAND -LOADRCT1 7 -LOCATION 48, 44 -WAIT 15 -LOCATION 64, 41 -WAIT 15 - -# SC_POKEY_PARK, -LOADRCT1 8 -ROTATE 2 -LOCATION 56, 64 -WAIT 15 - -# SC_WHITE_WATER_PARK -LOADRCT1 9 -ROTATE 3 -LOCATION 96, 88 -WAIT 15 -LOCATION 84, 95 -WAIT 15 - -# SC_MILLENNIUM_MINES -LOADRCT1 10 -ROTATE 1 -ROTATE 1 -LOCATION 64, 37 -WAIT 15 - -# SC_KARTS_COASTERS -LOADRCT1 11 -LOCATION 84, 56 -WAIT 15 -LOCATION 34, 36 -WAIT 15 -LOCATION 33, 65 -WAIT 15 - -# SC_MELS_WORLD -LOADRCT1 12 -ROTATE 3 -LOCATION 50, 50 -WAIT 15 -LOCATION 35, 39 -WAIT 15 -ROTATE 3 -LOCATION 62, 39 -WAIT 15 - -# SC_CRUMBLY_WOODS -LOADRCT1 15 -ROTATE 3 -LOCATION 57, 94 -WAIT 15 -LOCATION 44, 84 -WAIT 15 -ROTATE 1 -LOCATION 76, 59 -WAIT 15 -LOCATION 76, 48 -WAIT 15 - -# SC_LIGHTNING_PEAKS -LOADRCT1 17 -LOCATION 80, 49 -WAIT 15 -LOCATION 60, 62 -WAIT 15 - -# SC_IVORY_TOWERS -LOADRCT1 18 -ROTATE 3 -LOCATION 50, 77 -WAIT 15 - -RESTART diff --git a/data/title/rct1aa/script.txt b/data/title/rct1aa/script.txt deleted file mode 100644 index a3dd850a27..0000000000 --- a/data/title/rct1aa/script.txt +++ /dev/null @@ -1,187 +0,0 @@ -# RollerCoaster Tycoon 1 Title Sequence - -############################## -# Added Attractions # -############################## -# SC_HAUNTED_HARBOR -LOADRCT1 45 -LOCATION 62, 53 -WAIT 11 -ROTATE 3 -LOCATION 78, 45 -WAIT 16 - -# SC_CANARY_MINES -LOADRCT1 42 -LOCATION 52, 28 -WAIT 15 - -# SC_GENTLE_GLEN -LOADRCT1 48 -LOCATION 68, 45 -WAIT 11 - -# SC_FUNTOPIA -LOADRCT1 44 -LOCATION 69, 93 -WAIT 17 - -# SC_SPRIGHTLY_PARK -LOADRCT1 51 -ROTATE 3 -LOCATION 97, 72 -WAIT 12 -ROTATE 2 -LOCATION 74, 71 -WAIT 12 -ROTATE 2 -LOCATION 67, 90 -WAIT 12 - -# SC_GIGGLE_DOWNS -LOADRCT1 65 -LOCATION 94, 64 -WAIT 10 - -# SC_SWAMP_COVE -LOADRCT1 59 -LOCATION 96, 22 -WAIT 10 -ROTATE 3 -LOCATION 90, 29 -WAIT 10 - -# SC_FRUIT_FARM -LOADRCT1 53 -LOCATION 47, 52 -WAIT 12 - -# SC_FUTURE_WORLD -LOADRCT1 47 -LOCATION 67, 59 -WAIT 19 - -# SC_THREE_MONKEYS_PARK -LOADRCT1 41 -ROTATE 2 -LOCATION 72, 61 -WAIT 8 -ROTATE 2 -LOCATION 68, 70 -WAIT 8 -LOCATION 58, 56 -WAIT 8 -ROTATE 1 -LOCATION 44, 70 -WAIT 8 -ROTATE 3 -LOCATION 43, 90 -WAIT 10 - -# SC_ROMAN_VILLAGE -LOADRCT1 58 -LOCATION 49, 46 -WAIT 15 - -# SC_ADRENALINE_HEIGHTS -LOADRCT1 60 -ROTATE 3 -LOCATION 38, 57 -WAIT 15 - -############################## -# RollerCoaster Tycoon 1 # -############################## -# SC_DIAMOND_HEIGHTS -LOADRCT1 3 -ROTATE 2 -LOCATION 47, 99 -WAIT 15 -ROTATE 2 -LOCATION 90, 48 -WAIT 15 -ROTATE 1 -LOCATION 86, 43 -WAIT 15 -ROTATE 3 -LOCATION 57, 50 -WAIT 15 -ROTATE 2 -LOCATION 86, 64 -WAIT 15 - -# SC_KATIES_DREAMLAND -LOADRCT1 7 -LOCATION 48, 44 -WAIT 15 -LOCATION 64, 41 -WAIT 15 - -# SC_POKEY_PARK, -LOADRCT1 8 -ROTATE 2 -LOCATION 56, 64 -WAIT 15 - -# SC_WHITE_WATER_PARK -LOADRCT1 9 -ROTATE 3 -LOCATION 96, 88 -WAIT 15 -LOCATION 84, 95 -WAIT 15 - -# SC_MILLENNIUM_MINES -LOADRCT1 10 -ROTATE 1 -ROTATE 1 -LOCATION 64, 37 -WAIT 15 - -# SC_KARTS_COASTERS -LOADRCT1 11 -LOCATION 84, 56 -WAIT 15 -LOCATION 34, 36 -WAIT 15 -LOCATION 33, 65 -WAIT 15 - -# SC_MELS_WORLD -LOADRCT1 12 -ROTATE 3 -LOCATION 50, 50 -WAIT 15 -LOCATION 35, 39 -WAIT 15 -ROTATE 3 -LOCATION 62, 39 -WAIT 15 - -# SC_CRUMBLY_WOODS -LOADRCT1 15 -ROTATE 3 -LOCATION 57, 94 -WAIT 15 -LOCATION 44, 84 -WAIT 15 -ROTATE 1 -LOCATION 76, 59 -WAIT 15 -LOCATION 76, 48 -WAIT 15 - -# SC_LIGHTNING_PEAKS -LOADRCT1 17 -LOCATION 80, 49 -WAIT 15 -LOCATION 60, 62 -WAIT 15 - -# SC_IVORY_TOWERS -LOADRCT1 18 -ROTATE 3 -LOCATION 50, 77 -WAIT 15 - -RESTART diff --git a/data/title/rct1aall/script.txt b/data/title/rct1aall/script.txt deleted file mode 100644 index 63a64545c7..0000000000 --- a/data/title/rct1aall/script.txt +++ /dev/null @@ -1,233 +0,0 @@ -# RollerCoaster Tycoon 1 Title Sequence - -############################## -# Added Attractions (part 1) # -############################## -# SC_HAUNTED_HARBOR -LOADRCT1 45 -LOCATION 62, 53 -WAIT 11 -ROTATE 3 -LOCATION 78, 45 -WAIT 16 - -# SC_CANARY_MINES -LOADRCT1 42 -LOCATION 52, 28 -WAIT 15 - -# SC_GENTLE_GLEN -LOADRCT1 48 -LOCATION 68, 45 -WAIT 11 - -# SC_FUNTOPIA -LOADRCT1 44 -LOCATION 69, 93 -WAIT 17 - -############################## -# Loopy Landscapes # -############################## -# SC_FRIGHTMARE_HILLS -LOADRCT1 86 -LOCATION 46, 47 -WAIT 5 - -# SC_GOOD_KNIGHT_PARK -LOADRCT1 30 -ROTATE 2 -LOCATION 60, 62 -WAIT 5 - -# SC_ICEBERG_ISLANDS -LOADRCT1 22 -ROTATE 3 -LOCATION 36, 52 -WAIT 4 - -# SC_SOUTHERN_SANDS -LOADRCT1 91 -ROTATE 2 -LOCATION 51, 47 -WAIT 4 - -# SC_SUNNY_SWAMPS -LOADRCT1 85 -ROTATE 3 -LOCATION 77, 82 -WAIT 4 - -# SC_VERTIGO_VIEWS -LOADRCT1 27 -LOCATION 22, 56 -WAIT 3 - -# SC_WACKY_WARREN -LOADRCT1 31 -ROTATE 3 -LOCATION 72, 80 -WAIT 4 - -############################## -# Added Attractions (part 2) # -############################## -# SC_SPRIGHTLY_PARK -LOADRCT1 51 -ROTATE 3 -LOCATION 97, 72 -WAIT 12 -ROTATE 2 -LOCATION 74, 71 -WAIT 12 -ROTATE 2 -LOCATION 67, 90 -WAIT 12 - -# SC_GIGGLE_DOWNS -LOADRCT1 65 -LOCATION 94, 64 -WAIT 10 - -# SC_SWAMP_COVE -LOADRCT1 59 -LOCATION 96, 22 -WAIT 10 -ROTATE 3 -LOCATION 90, 29 -WAIT 10 - -# SC_FRUIT_FARM -LOADRCT1 53 -LOCATION 47, 52 -WAIT 12 - -# SC_FUTURE_WORLD -LOADRCT1 47 -LOCATION 67, 59 -WAIT 19 - -# SC_THREE_MONKEYS_PARK -LOADRCT1 41 -ROTATE 2 -LOCATION 72, 61 -WAIT 8 -ROTATE 2 -LOCATION 68, 70 -WAIT 8 -LOCATION 58, 56 -WAIT 8 -ROTATE 1 -LOCATION 44, 70 -WAIT 8 -ROTATE 3 -LOCATION 43, 90 -WAIT 10 - -# SC_ROMAN_VILLAGE -LOADRCT1 58 -LOCATION 49, 46 -WAIT 15 - -# SC_ADRENALINE_HEIGHTS -LOADRCT1 60 -ROTATE 3 -LOCATION 38, 57 -WAIT 15 - -############################## -# RollerCoaster Tycoon 1 # -############################## -# SC_DIAMOND_HEIGHTS -LOADRCT1 3 -ROTATE 2 -LOCATION 47, 99 -WAIT 15 -ROTATE 2 -LOCATION 90, 48 -WAIT 15 -ROTATE 1 -LOCATION 86, 43 -WAIT 15 -ROTATE 3 -LOCATION 57, 50 -WAIT 15 -ROTATE 2 -LOCATION 86, 64 -WAIT 15 - -# SC_KATIES_DREAMLAND -LOADRCT1 7 -LOCATION 48, 44 -WAIT 15 -LOCATION 64, 41 -WAIT 15 - -# SC_POKEY_PARK, -LOADRCT1 8 -ROTATE 2 -LOCATION 56, 64 -WAIT 15 - -# SC_WHITE_WATER_PARK -LOADRCT1 9 -ROTATE 3 -LOCATION 96, 88 -WAIT 15 -LOCATION 84, 95 -WAIT 15 - -# SC_MILLENNIUM_MINES -LOADRCT1 10 -ROTATE 1 -ROTATE 1 -LOCATION 64, 37 -WAIT 15 - -# SC_KARTS_COASTERS -LOADRCT1 11 -LOCATION 84, 56 -WAIT 15 -LOCATION 34, 36 -WAIT 15 -LOCATION 33, 65 -WAIT 15 - -# SC_MELS_WORLD -LOADRCT1 12 -ROTATE 3 -LOCATION 50, 50 -WAIT 15 -LOCATION 35, 39 -WAIT 15 -ROTATE 3 -LOCATION 62, 39 -WAIT 15 - -# SC_CRUMBLY_WOODS -LOADRCT1 15 -ROTATE 3 -LOCATION 57, 94 -WAIT 15 -LOCATION 44, 84 -WAIT 15 -ROTATE 1 -LOCATION 76, 59 -WAIT 15 -LOCATION 76, 48 -WAIT 15 - -# SC_LIGHTNING_PEAKS -LOADRCT1 17 -LOCATION 80, 49 -WAIT 15 -LOCATION 60, 62 -WAIT 15 - -# SC_IVORY_TOWERS -LOADRCT1 18 -ROTATE 3 -LOCATION 50, 77 -WAIT 15 - -RESTART diff --git a/data/title/rct2/script.txt b/data/title/rct2/script.txt deleted file mode 100644 index 3f4e303f7b..0000000000 --- a/data/title/rct2/script.txt +++ /dev/null @@ -1,34 +0,0 @@ -# RollerCoaster Tycoon 2 Title Sequence - -LOADMM - -LOCATION 210 112 -WAIT 13 - -ROTATE 1 -LOCATION 210 112 -WAIT 14 - -ROTATE 3 -LOCATION 167 180 -WAIT 12 - -ROTATE 1 -LOCATION 155 189 -WAIT 12 - -LOCATION 106 39 -WAIT 12 - -LOCATION 182 50 -WAIT 12 - -ROTATE 3 -LOCATION 209 47 -WAIT 12 - -ROTATE 1 -LOCATION 159 93 -WAIT 12 - -RESTART diff --git a/openrct2.proj b/openrct2.proj index d546d1d19a..3946852d7d 100644 --- a/openrct2.proj +++ b/openrct2.proj @@ -62,11 +62,14 @@ + $(RootDir).dependencies https://github.com/OpenRCT2/Dependencies/releases/download/v$(TargetLibsVersion)/openrct2-libs-vs2015.zip - $(RootDir)lib\ - $(LibsPath)libversion + f088adcd12450c2672f78679ea5d1fbffc28fd22 1.8.0 - https://github.com/google/googletest/archive/release-$(GtestVersion).zip + https://github.com/google/googletest/archive/release-1.8.0.zip + 667f873ab7a4d246062565fad32fb6d8e203ee73 + https://github.com/OpenRCT2/title-sequences/releases/download/v0.0.5/title-sequence-v0.0.5.zip + 79ffb2585d12abcbfce205d7696e3472a504b005 @@ -107,45 +110,25 @@ - - - - - 0 - $([System.IO.File]::ReadAllText($(LibsVersionPath)).Trim()) - true - - - - - - - - - $(LibsPath)openrct2-libs-vs2015.zip - $(LibsPath)gtest.zip - - - - - - - - - - - + + - - - - - - - - + + + $(RootDir)lib\googletest-release-$(GtestVersion) + $(RootDir)lib\googletest + + @@ -165,7 +148,7 @@ - + $(GIT_COMMIT_SHA1_SHORT) $(BuildString) ($(GIT_BRANCH)) @@ -221,6 +204,15 @@ StandardOutputImportance="low" /> + + + + + + @@ -123,4 +124,207 @@ + + + + + + + + + + + + + + + + + + + + + + 0) + { + Array.Resize(ref lines, lines.Length + 1); + } + lineIndex = lines.Length - 1; + + // End with new line + Array.Resize(ref lines, lines.Length + 1); + } + lines[lineIndex] = newLine; + File.WriteAllLines(checkFile, lines); + } + catch (Exception ex) + { + Log.LogWarningFromException(ex, showStackTrace: false); + } + } + + private int GetCheckFileLineIndexSha1(string[] lines, string name, out string sha1) + { + for (int i = 0; i < lines.Length; i++) + { + string line = lines[i]; + string[] lineParts = line.Split('='); + if (lineParts.Length == 2) + { + string lineTag = lineParts[0].Trim(); + string lineSha1 = lineParts[1].Trim(); + if (lineTag == name) + { + sha1 = lineSha1; + return i; + } + } + } + sha1 = null; + return -1; + } + + private bool CheckFileSha1(string file, string expectedSha1, out string actualSha1) + { + using (var fs = new FileStream(file, FileMode.Open)) + { + var hasher = System.Security.Cryptography.SHA1.Create(); + byte[] hash = hasher.ComputeHash(fs); + actualSha1 = BytesToHexString(hash); + if (String.Equals(actualSha1, expectedSha1, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + return false; + } + + private string BytesToHexString(byte[] data) + { + var sb = new StringBuilder(); + foreach (byte b in data) + { + sb.Append(b.ToString("x2")); + } + return sb.ToString(); + } + + private static void ExtractZip(string zipPath, string destinationDirectory, bool overwrite) + { + var archive = ZipFile.OpenRead(zipPath); + if (!overwrite) + { + archive.ExtractToDirectory(destinationDirectory); + return; + } + foreach (ZipArchiveEntry file in archive.Entries) + { + string fileName = Path.Combine(destinationDirectory, file.FullName); + if (file.Name == String.Empty) + { + string directory = Path.GetDirectoryName(fileName); + Directory.CreateDirectory(directory); + continue; + } + file.ExtractToFile(fileName, true); + } + } + ]]> + + +