From dd6707d5ef2c19830b5339beb8260f4d0453762a Mon Sep 17 00:00:00 2001 From: Li Date: Sun, 30 Apr 2023 22:13:23 +1200 Subject: [PATCH] Fix LC1 games! --- GameBuilder/Pops/DiscCompressor.cs | 3 +-- GameBuilder/Pops/LibCrypt/MagicWord.cs | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/GameBuilder/Pops/DiscCompressor.cs b/GameBuilder/Pops/DiscCompressor.cs index 17a064e..24100bd 100644 --- a/GameBuilder/Pops/DiscCompressor.cs +++ b/GameBuilder/Pops/DiscCompressor.cs @@ -146,8 +146,7 @@ namespace GameBuilder.Pops private void writeLibCryptData() { // obfuscated libcrypt magic word - int obfuscatedMagicWord = obfuscateMagicWord(); - isoHeaderUtil.WriteInt32(obfuscatedMagicWord); + isoHeaderUtil.WriteInt32(obfuscateMagicWord()); isoHeaderUtil.WriteInt32(0); isoHeaderUtil.WriteInt32(0); isoHeaderUtil.WriteInt32(0); diff --git a/GameBuilder/Pops/LibCrypt/MagicWord.cs b/GameBuilder/Pops/LibCrypt/MagicWord.cs index 06c92ee..e749518 100644 --- a/GameBuilder/Pops/LibCrypt/MagicWord.cs +++ b/GameBuilder/Pops/LibCrypt/MagicWord.cs @@ -30,20 +30,22 @@ namespace GameBuilder.Pops.LibCrypt public static int GenMagicWord(SbiEntry[] Sbi) { bool[] bits = new bool[16]; - int sbiI = 0; - if (Sbi.Length % 2 != 0) return 0; + HashSet sbiSectors = new HashSet(); + foreach(SbiEntry sbiEntry in Sbi) + sbiSectors.Add(sbiEntry.Sector); + + for (int i = 0; i < bits.Length; i++) + bits[i] = (sbiSectors.Contains(LIBCRYPT_PAIRS[i][0]) && sbiSectors.Contains(LIBCRYPT_PAIRS[i][1])); + int magicWord = 0; for (int i = 0; i < bits.Length; i++) { - bool isSet = (Sbi[sbiI].Sector == LIBCRYPT_PAIRS[i][0] && Sbi[sbiI + 1].Sector == LIBCRYPT_PAIRS[i][1]); - if (isSet) sbiI += 2; - bits[i] = isSet; - - if (isSet) magicWord |= 1; - if (i + 1 < bits.Length) + if (bits[i]) magicWord |= 1; + + if(i+1 < bits.Length) magicWord <<= 1; }