Esempio n. 1
0
        private InMemoryBlockCollection ReadBlocks(EndianReader reader, XmlNode node, InMemoryBlockCollection parent, int parentBlockIndex)
        {
            var result = new InMemoryBlockCollection(this, reader, node, parent, parentBlockIndex);

            var lastBlock   = AllBlocks.LastOrDefault();
            var nextAddress = (lastBlock?.VirtualAddress + lastBlock?.AllocatedSize) ?? 0;
            var nextSize    = PageSize;

            while (nextSize < result.VirtualSize)
            {
                nextSize += PageSize;
            }

            result.Allocate(nextAddress, nextSize);
            AllBlocks.Add(result);

            var blockAddress = parent == null
                ? SourceItem.MetaPointer.Address
                : result.BlockRef.Pointer.Address;

            for (int i = 0; i < result.EntryCount; i++)
            {
                var indexAddress = blockAddress + result.EntrySize * i;
                foreach (var childNode in node.SelectNodes("tagblock").OfType <XmlNode>())
                {
                    reader.Seek(indexAddress + childNode.GetIntAttribute("offset").Value, SeekOrigin.Begin);
                    ReadBlocks(reader, childNode, result, i);
                }
            }

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// Aggregate current index with next block
        /// </summary>
        /// <param name="nextBlock">nextBlock arg should be validated before</param>
        /// <returns></returns>
        public BlocksIndex Add(Block nextBlock)
        {
            if (IsEmpty)
            {
                throw new InvalidOperationException("Index in empty");
            }

            var allBlocks    = AllBlocks.Add(nextBlock);
            var blocksByHash = BlocksByHash.Add(nextBlock.Signature, nextBlock);

            return(new BlocksIndex(allBlocks, BlocksByHash));
        }
Esempio n. 3
0
        public override void Rotate(TetrisGrid tetris)
        {
            int[][] grid = tetris.GetGrid();
            int     maxRight = grid[0].Length - 1, maxTop = grid.Length - 1;

            if (BottomedOut(tetris))
            {
                return;
            }
            UnDraw(tetris);
            switch (DegreesRotated)
            {
            case 0:
                if (PivotBlock.X + 1 > maxTop)
                {
                    PivotBlock.X -= 3;
                }
                else if (PivotBlock.X + 2 > maxTop)
                {
                    PivotBlock.X -= 2;
                }
                else if (PivotBlock.X + 3 > maxTop)
                {
                    PivotBlock.X -= 1;
                }
                AllBlocks.Clear();
                AllBlocks.Add(PivotBlock);
                AllBlocks.Add(new Block(PivotBlock.X + 1, PivotBlock.Y));
                AllBlocks.Add(new Block(PivotBlock.X + 2, PivotBlock.Y));
                AllBlocks.Add(new Block(PivotBlock.X + 3, PivotBlock.Y));
                LowestPoint          = PivotBlock.X + 3;
                this.DegreesRotated += 90;
                break;

            case 90:
                if (PivotBlock.Y - 1 < 0)
                {
                    PivotBlock.Y += 3;
                }
                else if (PivotBlock.Y - 2 < 0)
                {
                    PivotBlock.Y += 2;
                }
                else if (PivotBlock.Y - 3 < 0)
                {
                    PivotBlock.Y += 1;
                }
                AllBlocks.Clear();
                AllBlocks.Add(PivotBlock);
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 1));
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 2));
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 3));
                LowestPoint          = PivotBlock.X;
                this.DegreesRotated += 90;
                break;

            case 180:
                if (PivotBlock.X - 1 < 0)
                {
                    PivotBlock.X += 3;
                }
                else if (PivotBlock.X - 2 < 0)
                {
                    PivotBlock.X += 2;
                }
                else if (PivotBlock.X - 3 < 0)
                {
                    PivotBlock.X += 1;
                }
                AllBlocks.Clear();
                AllBlocks.Add(PivotBlock);
                AllBlocks.Add(new Block(PivotBlock.X - 1, PivotBlock.Y));
                AllBlocks.Add(new Block(PivotBlock.X - 2, PivotBlock.Y));
                AllBlocks.Add(new Block(PivotBlock.X - 3, PivotBlock.Y));
                LowestPoint          = PivotBlock.X;
                this.DegreesRotated += 90;
                break;

            case 270:
                if (PivotBlock.Y + 1 > maxRight)
                {
                    PivotBlock.Y -= 3;
                }
                else if (PivotBlock.Y + 2 > maxRight)
                {
                    PivotBlock.Y -= 2;
                }
                else if (PivotBlock.Y + 3 > maxRight)
                {
                    PivotBlock.Y -= 1;
                }
                AllBlocks.Clear();
                AllBlocks.Add(PivotBlock);
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 1));
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 2));
                AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 3));
                LowestPoint         = PivotBlock.X;
                this.DegreesRotated = 0;
                break;
            }
            Draw(tetris);
        }