2022-10-05 16:02:11 -06:00

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