public WaterRegionLink LinkFrom(EdgeSpan span) { ulong key = span.UniqueHashCode(); WaterRegionLink regionLink; if (!this.links.TryGetValue(key, out regionLink)) { regionLink = new WaterRegionLink(); regionLink.span = span; this.links.Add(key, regionLink); } return(regionLink); }
public void BreadthFirstTraverseWork(WaterRegion root, WaterRegionEntryPredicate entryCondition, WaterRegionProcessor regionProcessor, int maxRegions, RegionType traversableRegionTypes) { if ((root.type & traversableRegionTypes) == RegionType.None) { return; } this.closedIndex += 1u; this.open.Clear(); this.numRegionsProcessed = 0; this.QueueNewOpenRegion(root); while (this.open.Count > 0) { WaterRegion region = this.open.Dequeue(); if (ShipHarmony.debug) { region.Debug_Notify_Traversed(); } if (!(regionProcessor is null) && regionProcessor(region)) { this.FinalizeSearch(); return; } if (WaterRegionTraverser.ShouldCountRegion(region)) { this.numRegionsProcessed++; } if (this.numRegionsProcessed >= maxRegions) { this.FinalizeSearch(); return; } for (int i = 0; i < region.links.Count; i++) { WaterRegionLink regionLink = region.links[i]; for (int j = 0; j < 2; j++) { WaterRegion region2 = regionLink.regions[j]; if (!(region2 is null) && region2.closedIndex[this.closedArrayPos] != this.closedIndex && (region2.type & traversableRegionTypes) != RegionType.None && (entryCondition is null || entryCondition(region, region2))) { this.QueueNewOpenRegion(region2); } } } } this.FinalizeSearch(); }
private void SweepInTwoDirectionsAndTryToCreateLink(Rot4 potentialOtherRegionDir, IntVec3 c) { if (!potentialOtherRegionDir.IsValid) { return; } HashSet <IntVec3> hashSet = this.linksProcessedAt[potentialOtherRegionDir.AsInt]; if (hashSet.Contains(c)) { return; } IntVec3 c2 = c + potentialOtherRegionDir.FacingCell; if (c2.InBoundsShip(this.map) && this.regionGrid.GetRegionAt_NoRebuild_InvalidAllowed(c2) == this.newReg) { return; } RegionType expectedRegionType = WaterRegionTypeUtility.GetExpectedRegionType(c2, this.map); if (expectedRegionType == RegionType.None) { return; } Rot4 rot = potentialOtherRegionDir; rot.Rotate(RotationDirection.Clockwise); int num = 0; int num2 = 0; hashSet.Add(c); if (!WaterRegionTypeUtility.IsOneCellRegion(expectedRegionType)) { for (;;) { IntVec3 intVec = c + rot.FacingCell * (num + 1); if (!intVec.InBoundsShip(this.map) || this.regionGrid.GetRegionAt_NoRebuild_InvalidAllowed(intVec) != this.newReg || WaterRegionTypeUtility.GetExpectedRegionType(intVec + potentialOtherRegionDir.FacingCell, this.map) != expectedRegionType) { break; } if (!hashSet.Add(intVec)) { Log.Error("We've processed the same cell twice.", false); } num++; } for (; ;) { IntVec3 intVec2 = c - rot.FacingCell * (num2 + 1); if (!intVec2.InBoundsShip(this.map) || this.regionGrid.GetRegionAt_NoRebuild_InvalidAllowed(intVec2) != this.newReg || WaterRegionTypeUtility.GetExpectedRegionType(intVec2 + potentialOtherRegionDir.FacingCell, this.map) != expectedRegionType) { break; } if (!hashSet.Add(intVec2)) { Log.Error("We've processed the same cell twice.", false); } num2++; } } int length = num + num2 + 1; SpanDirection dir; IntVec3 root; if (potentialOtherRegionDir == Rot4.North) { dir = SpanDirection.East; root = c - rot.FacingCell * num2; root.z++; } else if (potentialOtherRegionDir == Rot4.South) { dir = SpanDirection.East; root = c + rot.FacingCell * num; } else if (potentialOtherRegionDir == Rot4.East) { dir = SpanDirection.North; root = c + rot.FacingCell * num; root.x++; } else { dir = SpanDirection.North; root = c - rot.FacingCell * num2; } EdgeSpan span = new EdgeSpan(root, dir, length); WaterRegionLink regionLink = MapExtensionUtility.GetExtensionToMap(this.map).getWaterRegionLinkDatabase.LinkFrom(span); regionLink.Register(this.newReg); this.newReg.links.Add(regionLink); }
public void Notify_LinkHasNoRegions(WaterRegionLink link) { this.links.Remove(link.UniqueHashCode()); }