public (bool complete, IEnumerable <IRewardSource> rewardSources, AccessRequirement requirements, MapChange changes) Crawl(IVictoryConditionFlags victoryConditions) { Stopwatch w = Stopwatch.StartNew(); immediateAreas = new HashSet <short>(256); processedAreas = new HashSet <short>(2048); processedDungeons = new HashSet <OverworldTeleportIndex>(32); deferredAreas = new HashSet <SCDeferredAreaQueueEntry>(64, new SCDeferredAreaQueueEntryEqualityComparer()); deferredPointOfInterests = new Queue <SCPointOfInterest>(); rewardSources = new HashSet <IRewardSource>(256, new RewardSourceEqualityComparer()); shipDockAreaIndex = -1; slabTranslated = false; herbCheckedIn = false; princessRescued = false; vampireAccessible = false; airShipLiftOff = false; BuildInitialRequirements(victoryConditions); SetAirShipPoi(); short areaIndex = Main.Overworld.Tiles[locations.StartingLocation.X, locations.StartingLocation.Y].Area; SCOwArea area = Main.Overworld.Areas[areaIndex]; CrawlOwArea(area); ProcessImmediateAreas(); while (ProcessDeferredAreas()) { ProcessImmediateAreas(); } //that for just means, that there's a fault in the function. Actually the mere existence of the call is a fault in the above functions for (int i = 0; i < 10; i++) { ProcessDeferredPointsOfInterest(); } w.Stop(); var requiredAccess = AccessRequirement.All; var requiredMapChanges = MapChange.All; if ((bool)victoryConditions.IsFloaterRemoved) { requiredMapChanges &= ~MapChange.Airship; } bool complete = changes.HasFlag(requiredMapChanges) && requirements.HasFlag(requiredAccess); return(complete, rewardSources, requirements, changes); }
public SCRequirementsSet(AccessRequirement accessRequirement) { var requirement = SCRequirements.None; if (accessRequirement.HasFlag(AccessRequirement.Key)) { requirement |= SCRequirements.Key; } if (accessRequirement.HasFlag(AccessRequirement.Rod)) { requirement |= SCRequirements.Rod; } if (accessRequirement.HasFlag(AccessRequirement.Oxyale)) { requirement |= SCRequirements.Oxyale; } if (accessRequirement.HasFlag(AccessRequirement.Cube)) { requirement |= SCRequirements.Cube; } if (accessRequirement.HasFlag(AccessRequirement.Bottle)) { requirement |= SCRequirements.Bottle; } if (accessRequirement.HasFlag(AccessRequirement.Lute)) { requirement |= SCRequirements.Lute; } if (accessRequirement.HasFlag(AccessRequirement.Crown)) { requirement |= SCRequirements.Crown; } if (accessRequirement.HasFlag(AccessRequirement.Crystal)) { requirement |= SCRequirements.Crystal; } if (accessRequirement.HasFlag(AccessRequirement.Herb)) { requirement |= SCRequirements.Herb; } if (accessRequirement.HasFlag(AccessRequirement.Tnt)) { requirement |= SCRequirements.Tnt; } if (accessRequirement.HasFlag(AccessRequirement.Adamant)) { requirement |= SCRequirements.Adamant; } if (accessRequirement.HasFlag(AccessRequirement.Slab)) { requirement |= SCRequirements.Slab; } if (accessRequirement.HasFlag(AccessRequirement.Ruby)) { requirement |= SCRequirements.Ruby; } Add(requirement); }
public static IEnumerable <MapLocation> AccessibleMapLocations( AccessRequirement currentAccess, MapChange currentMapChanges, Dictionary <MapLocation, Tuple <List <MapChange>, AccessRequirement> > fullLocationRequirements) { return(fullLocationRequirements.Where(x => x.Value.Item1.Any(y => currentMapChanges.HasFlag(y) && currentAccess.HasFlag(x.Value.Item2))).Select(x => x.Key)); }
public bool IsAccessible(AccessRequirement req, MapChange chg) { SCBitFlags v2req = SCBitFlags.None; if (req.HasFlag(AccessRequirement.Key)) { v2req |= SCBitFlags.Key; } if (req.HasFlag(AccessRequirement.Rod)) { v2req |= SCBitFlags.Rod; } if (req.HasFlag(AccessRequirement.Oxyale)) { v2req |= SCBitFlags.Oxyale; } if (req.HasFlag(AccessRequirement.Cube)) { v2req |= SCBitFlags.Cube; } if (req.HasFlag(AccessRequirement.Lute)) { v2req |= SCBitFlags.Lute; } if (req.HasFlag(AccessRequirement.Crown)) { v2req |= SCBitFlags.Crown; } if (req.HasFlag(AccessRequirement.Ruby)) { v2req |= SCBitFlags.Ruby; } if (req.HasFlag(AccessRequirement.BlackOrb)) { v2req |= SCBitFlags.Orbs; } if (req.HasFlag(AccessRequirement.Tnt)) { v2req |= SCBitFlags.Tnt; } if (chg.HasFlag(MapChange.Chime)) { v2req |= SCBitFlags.Chime; } if (chg.HasFlag(MapChange.Canoe)) { v2req |= SCBitFlags.Canoe; } if (chg.HasFlag(MapChange.Airship)) { v2req |= SCBitFlags.Floater; } foreach (var flag in this) { if (v2req.IsSupersetOf(flag)) { return(true); } } return(false); }
public bool IsRewardSourceAccessible(IRewardSource source, AccessRequirement currentAccess, List <MapLocation> locations) { return(locations.Contains(source.MapLocation) && currentAccess.HasFlag(source.AccessRequirement) && locations.Contains((source as MapObject)?.SecondLocation ?? MapLocation.StartingLocation)); }