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;
}