Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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));
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 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));
 }