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);
+ }
+ }
+ ]]>
+
+
+