NScumm.Sky.Screen.ProcessSequence C# (CSharp) Méthode

ProcessSequence() public méthode

public ProcessSequence ( ) : void
Résultat void
        public void ProcessSequence()
        {
            if (!_seqInfo.Running)
                return;

            if (Environment.TickCount < _seqInfo.NextFrame)
                return;

            _seqInfo.NextFrame += 60;

            Array.Clear(_seqGrid, 0, 12 * 20);

            var screenPos = 0;

            do
            {
                byte nrToSkip;
                do
                {
                    nrToSkip = _seqInfo.SeqData[_seqInfo.SeqDataPos];
                    _seqInfo.SeqDataPos++;
                    screenPos += nrToSkip;
                } while (nrToSkip == 0xFF);

                byte nrToDo;
                do
                {
                    nrToDo = _seqInfo.SeqData[_seqInfo.SeqDataPos];
                    _seqInfo.SeqDataPos++;

                    var gridSta = (byte)(screenPos / (GameScreenWidth * 16) * 20 + ((screenPos % GameScreenWidth) >> 4));
                    var gridEnd =
                        (byte)
                            ((screenPos + nrToDo) / (GameScreenWidth * 16) * 20 +
                             (((screenPos + nrToDo) % GameScreenWidth) >> 4));
                    gridSta = Math.Min(gridSta, (byte)(12 * 20 - 1));
                    gridEnd = Math.Min(gridEnd, (byte)(12 * 20 - 1));
                    byte cnt;
                    if (gridEnd >= gridSta)
                        for (cnt = gridSta; cnt <= gridEnd; cnt++)
                            _seqGrid[cnt] = 1;
                    else
                    {
                        for (cnt = gridSta; cnt < (gridSta / 20 + 1) * 20; cnt++)
                            _seqGrid[cnt] = 1;
                        for (cnt = (byte)(gridEnd / 20 * 20); cnt <= gridEnd; cnt++)
                            _seqGrid[cnt] = 1;
                    }

                    for (cnt = 0; cnt < nrToDo; cnt++)
                    {
                        Current[screenPos] = _seqInfo.SeqData[_seqInfo.SeqDataPos];
                        _seqInfo.SeqDataPos++;
                        screenPos++;
                    }
                } while (nrToDo == 0xFF);
            } while (screenPos < GameScreenWidth * GameScreenHeight);
            var gridPtr = 0;
            var scrPtr = 0;
            var rectPtr = 0;
            byte rectWid = 0, rectX = 0, rectY = 0;
            for (byte cnty = 0; cnty < 12; cnty++)
            {
                for (byte cntx = 0; cntx < 20; cntx++)
                {
                    if (_seqGrid[gridPtr] != 0)
                    {
                        if (rectWid == 0)
                        {
                            rectX = cntx;
                            rectY = cnty;
                            rectPtr = scrPtr;
                        }
                        rectWid++;
                    }
                    else if (rectWid != 0)
                    {
                        _system.GraphicsManager.CopyRectToScreen(Current, rectPtr, GameScreenWidth, rectX << 4,
                            rectY << 4, rectWid << 4, 16);
                        rectWid = 0;
                    }
                    scrPtr += 16;
                    gridPtr++;
                }
                if (rectWid != 0)
                {
                    _system.GraphicsManager.CopyRectToScreen(Current, rectPtr, GameScreenWidth, rectX << 4, rectY << 4,
                        rectWid << 4, 16);
                    rectWid = 0;
                }
                scrPtr += 15 * GameScreenWidth;
            }
            _system.GraphicsManager.UpdateScreen();
            _seqInfo.FramesLeft--;

            if (_seqInfo.FramesLeft == 0)
            {
                _seqInfo.Running = false;
                if (!_seqInfo.RunningItem)
                    _seqInfo.SeqData = null;
                _seqInfo.SeqData = null;
                _seqInfo.SeqDataPos = 0;
            }
        }