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();
}
}
}