@@ -238,10 +238,12 @@ getBinaries = do
238
238
binary <- getSegAt offset (BC. unpack desc) (getBS length )
239
239
return (desc, binary)
240
240
241
- getAudios :: SGet ([B. ByteString ], Bool , Word8 )
242
- getAudios = do
241
+ getAudios :: Word32 -> SGet ([B. ByteString ], Bool , Word8 )
242
+ getAudios rawXor = do
243
243
until <- lookAhead getWord32
244
- x <- lookAhead $ jumpTo until >> getXor
244
+ x <- case () of
245
+ () | rawXor == knownRawXOR -> return knownXOR
246
+ | otherwise -> lookAhead $ jumpTo until >> getXor
245
247
offset <- bytesRead
246
248
let n_entries = fromIntegral ((until - offset) `div` 8 )
247
249
at_doubled <- lookAhead $ do
@@ -359,13 +361,14 @@ getSpecials = (,) <$> getWord16 <*> getWord16
359
361
getTipToiFile :: SGet TipToiFile
360
362
getTipToiFile = getSegAt 0x00 " Header" $ do
361
363
ttScripts <- indirection " Scripts" getScripts
362
- (ttAudioFiles, ttAudioFilesDoubles, ttAudioXor) <- indirection " Media" getAudios
364
+ ttRawXor <- getAt 0x001C getWord32
365
+ (ttAudioFiles, ttAudioFilesDoubles, ttAudioXor) <- indirection " Media" (getAudios ttRawXor)
363
366
_ <- getWord32 -- Usually 0x0000238b
364
367
_ <- indirection " Additional script" getScript
365
368
ttGames <- indirection " Games" $ indirections getWord32 " " getGame
366
369
ttProductId <- getWord32
367
370
ttInitialRegs <- indirection " Initial registers" getInitialRegs
368
- ttRawXor <- getWord32
371
+ _ <- getWord32 -- raw Xor
369
372
(ttComment, ttDate) <- do
370
373
l <- getWord8
371
374
c <- getBS (fromIntegral l)
0 commit comments