예제 #1
0
        // 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);
        }
예제 #2
0
        // 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);
            }
        }