static uint CalculateUniquePuzzles(WaveInformation wi) { List <ulong> keys = new List <ulong>(wi.dupPuzzles.Keys); uint count = 0; while (keys.Count > 0) { ulong firstKey = keys[0]; DuplicatePuzzles dup = wi.dupPuzzles[firstKey]; keys.Remove(dup.oppositeHash); keys.RemoveAt(0); ++count; } return(count); }
static public void DecompWavePuzzles(WaveInformation wi, byte[] puzzles, List <int> puzzPos) { int width = wi.puzWidth; int height = wi.puzHeight; int totalCubes = height * width; byte[] buffer = new byte[32]; byte[] cleanBuffer = new byte[32]; int lastPuzzle = wi.startingPuzzlePosOffset + wi.numPuzzles; List <int> trnList = wi.trns = new List <int>(wi.numPuzzles); List <byte[]> decompList = wi.decompPuzzles = new List <byte[]>(wi.numPuzzles); uint puzzleNumber = 0; for (int i = wi.startingPuzzlePosOffset; i < lastPuzzle; ++i, ++puzzleNumber) { byte[] decompPuzzle = new byte[totalCubes]; Buffer.BlockCopy(cleanBuffer, 0, buffer, 0, cleanBuffer.Length); int puzzOff = puzzPos[i]; int numBytes = puzzles[puzzOff] - 1; Buffer.BlockCopy(puzzles, puzzOff + 1, buffer, 0, numBytes); int trn = DecompressPuzzle(buffer, totalCubes) + 1; int revPuzIter = totalCubes - 1; while (revPuzIter >= 0) { byte rem = DecompressPuzzle(buffer, 3); decompPuzzle[revPuzIter] = rem; --revPuzIter; } decompList.Add(decompPuzzle); trnList.Add(trn); ulong puzzleHash = SimpleHash(decompPuzzle); DuplicatePuzzles dupPuzzleList = null; if (wi.dupPuzzles.TryGetValue(puzzleHash, out dupPuzzleList)) { dupPuzzleList.identicalPuzzles.Add(puzzleNumber); } else { ulong revHash = ReverseSimpleHash(decompPuzzle, wi.puzHeight, wi.puzWidth); dupPuzzleList = new DuplicatePuzzles(); // don't bother with mirrors dupPuzzleList.oppositeHash = (revHash != puzzleHash) ? revHash : 0; dupPuzzleList.identicalPuzzles.Add(puzzleNumber); wi.dupPuzzles.Add(puzzleHash, dupPuzzleList); } } }