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

SortSprites() private méthode

private SortSprites ( ) : void
Résultat void
        private void SortSprites()
        {
            var sortList = new StSortList[30];
            int currDrawList = Logic.DRAW_LIST_NO;

            while (Logic.ScriptVariables[currDrawList] != 0)
            {
                // big_sort_loop
                uint spriteCnt = 0;
                var loadDrawList = Logic.ScriptVariables[currDrawList];
                currDrawList++;

                bool nextDrawList;
                do
                {
                    // a_new_draw_list:
                    var drawListData = new UShortAccess(_skyCompact.FetchCptRaw((ushort)loadDrawList), 0);
                    nextDrawList = false;
                    while (!nextDrawList && (drawListData[0] != 0))
                    {
                        if (drawListData[0] == 0xFFFF)
                        {
                            loadDrawList = drawListData[1];
                            nextDrawList = true;
                        }
                        else
                        {
                            // process_this_id:
                            var spriteComp = _skyCompact.FetchCpt(drawListData[0]);
                            if (((spriteComp.Core.status & 4) != 0) && // is it sortable playfield?(!?!)
                                (spriteComp.Core.screen == Logic.ScriptVariables[Logic.SCREEN]))
                            {
                                // on current screen
                                var spriteData = SkyEngine.ItemList[spriteComp.Core.frame >> 6];
                                if (spriteData == null)
                                {
                                    // TODO: debug(9, "Missing file %d", spriteComp.frame >> 6);
                                    spriteComp.Core.status = 0;
                                }
                                else
                                {
                                    sortList[spriteCnt].YCood =
                                        (uint)
                                            (spriteComp.Core.ycood + spriteData.ToUInt16(18) + spriteData.ToUInt16(8));
                                    sortList[spriteCnt].Compact = spriteComp;
                                    sortList[spriteCnt].Sprite = spriteData;
                                    spriteCnt++;
                                }
                            }
                            drawListData.Offset += 2;
                        }
                    }
                } while (nextDrawList);
                // made_list:
                if (spriteCnt > 1)
                {
                    // bubble sort
                    for (var cnt1 = 0; cnt1 < spriteCnt - 1; cnt1++)
                        for (var cnt2 = cnt1 + 1; cnt2 < spriteCnt; cnt2++)
                            if (sortList[cnt1].YCood > sortList[cnt2].YCood)
                            {
                                StSortList tmp;
                                tmp.YCood = sortList[cnt1].YCood;
                                tmp.Sprite = sortList[cnt1].Sprite;
                                tmp.Compact = sortList[cnt1].Compact;
                                sortList[cnt1].YCood = sortList[cnt2].YCood;
                                sortList[cnt1].Sprite = sortList[cnt2].Sprite;
                                sortList[cnt1].Compact = sortList[cnt2].Compact;
                                sortList[cnt2].YCood = tmp.YCood;
                                sortList[cnt2].Sprite = tmp.Sprite;
                                sortList[cnt2].Compact = tmp.Compact;
                            }
                }
                for (var cnt = 0; cnt < spriteCnt; cnt++)
                {
                    DrawSprite(sortList[cnt].Sprite, sortList[cnt].Compact);
                    if ((sortList[cnt].Compact.Core.status & 8) != 0)
                        VectorToGame(0x81);
                    else
                        VectorToGame(1);
                    if ((sortList[cnt].Compact.Core.status & 0x200) == 0)
                        VerticalMask();
                }
            }
        }