107 lines
2.4 KiB
C#
107 lines
2.4 KiB
C#
// Handles highlighting and de-highlighting large groups of bricks.
|
|
// -------------------------------------------------------------------
|
|
|
|
//Highlight group data $NDH::*
|
|
// $NDH::LastId : The id of the last created highlight group
|
|
// $NDH::Count : Total number of active highlight groups
|
|
//
|
|
// $NDHN[brick] : Number of groups a brick is in
|
|
// $NDHF[brick] : Original color fx of the brick
|
|
//
|
|
// $NDH[group] : Count of bricks in a group
|
|
// $NDH[group, i] : Brick in group at position i
|
|
|
|
//Reserve a highlight group id
|
|
function ndNewHighlightGroup()
|
|
{
|
|
//Increase group number
|
|
$NDH::LastId++;
|
|
$NDH::Count++;
|
|
|
|
//Set initial count
|
|
$NDH[$NDH::LastId] = 0;
|
|
|
|
//Assign free id
|
|
return $NDH::LastId;
|
|
}
|
|
|
|
//Remove highlight group and clean up garbage variables
|
|
function ndRemoveHighlightGroup(%group)
|
|
{
|
|
//Don't delete groups that don't exist
|
|
if($NDH[%group] $= "")
|
|
return;
|
|
|
|
//Lower group number
|
|
$NDH::Count--;
|
|
|
|
//Clear count to allow reuse of index
|
|
$NDH[%group] = "";
|
|
|
|
//Cancel schedules
|
|
cancel($NDHS[%group]);
|
|
|
|
//If this is the most recently created group, pretend it never existed
|
|
if($NDH::LastId == %group)
|
|
$NDH::LastId--;
|
|
|
|
//If this is the last highlight group, just delete ALL highlight variables
|
|
if($NDH::Count < 1)
|
|
deleteVariables("$NDH*");
|
|
}
|
|
|
|
//Add a brick to a highlight group
|
|
function ndHighlightBrick(%group, %brick)
|
|
{
|
|
//If brick is not highlighted, do that
|
|
if(!$NDHN[%brick])
|
|
{
|
|
$NDHF[%brick] = %brick.colorFxID;
|
|
%brick.setColorFx(3);
|
|
}
|
|
|
|
//Increase group number of this brick
|
|
$NDHN[%brick]++;
|
|
|
|
//Add brick to highlight group
|
|
$NDH[%group, ($NDH[%group]++) - 1] = %brick;
|
|
}
|
|
|
|
//Start de-highlighting bricks
|
|
function ndStartDeHighlight(%group)
|
|
{
|
|
//Don't do this if already de-highlighting
|
|
%t = getTimeRemaining($NDHS[%group]);
|
|
|
|
if(%t > 66 || %t == 0)
|
|
{
|
|
cancel($NDHS[%group]);
|
|
ndTickDeHighlight(%group, 0);
|
|
}
|
|
}
|
|
|
|
//Tick de-highlighting bricks
|
|
function ndTickDeHighlight(%group, %start)
|
|
{
|
|
%end = $NDH[%group];
|
|
|
|
if(%end - %start > $Pref::Server::ND::ProcessPerTick)
|
|
%end = %start + $Pref::Server::ND::ProcessPerTick;
|
|
else
|
|
%lastTick = true;
|
|
|
|
for(%i = %start; %i < %end; %i++)
|
|
{
|
|
%brick = $NDH[%group, %i];
|
|
|
|
//If the brick is in no more groups, de-highlight it
|
|
if(isObject(%brick) && !($NDHN[%brick]--))
|
|
%brick.setColorFx($NDHF[%brick]);
|
|
}
|
|
|
|
if(!%lastTick)
|
|
$NDHS[%group] = schedule(30, 0, ndTickDeHighlight, %group, %end);
|
|
else
|
|
ndRemoveHighlightGroup(%group);
|
|
}
|