// Updates the stability of a block and returns false if the block has just been destroyed private bool UpdateStability(BuildingBlock block, bool propagate = true) { ++currentStats.blocksUpdated; if (block.isDestroyed) { #if DEBUG Log("Skipped " + BuildingBlockHelpers.Name(block) + ": Already destroyed"); #endif return(true); } // Log("Updating stability on " + block.Name()); // Exclude foundations from stability updates. if (BuildingBlockHelpers.IsFoundation(block)) { #if DEBUG Log("Skipped " + BuildingBlockHelpers.Name(block) + ": Is foundation"); #endif return(true); } List <BuildingBlock> supports; List <BuildingBlock> supported; BuildingBlockHelpers.GetAdjacentBlocks(block, out supports, out supported); if (supports.Count > 0) { #if DEBUG Log("Skipped " + BuildingBlockHelpers.Name(block) + ": Still has " + supports.Count + " supports"); #endif return(true); } // If this block has no more supports, destroy it. #if DEBUG Log(BuildingBlockHelpers.Name(block) + " has no (more) supports, killing (supported " + supported.Count + ")" + (propagate ? " - propagating" : " - not propagating")); #endif DemolishBlock(block); var deployables = BuildingBlockHelpers.GetOrphanedDeployables(block); foreach (var deployable in deployables) { if (!deployable.isDestroyed) { DemolishDeployable(deployable); } } if (propagate) { foreach (var supportedBlock in supported) { EnqueueUpdate(supportedBlock); } } return(false); }
// Updates supported blocks once a block has been demolished private void OnDemolish(BuildingBlock block) { ++currentStats.blocksDemolished; List <BuildingBlock> supports; List <BuildingBlock> supported; BuildingBlockHelpers.GetAdjacentBlocks(block, out supports, out supported); #if DEBUG Log("OnDemolish called for " + BuildingBlockHelpers.Name(block) + " (support for " + supported.Count + " blocks)"); #endif foreach (var supportedBlock in supported) { EnqueueUpdate(supportedBlock); // Must be queued as this block is still alive } var deployables = BuildingBlockHelpers.GetOrphanedDeployables(block); foreach (var entity in deployables) { DemolishDeployable(entity); } }