Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }