示例#1
0
        public float DetermineProbability(Location location)
        {
            if (RequireDiscovered && !location.Discovered)
            {
                return(0.0f);
            }
            if (location.IsCriticallyRadiated())
            {
                return(0.0f);
            }
            if (location.LocationTypeChangeCooldown > 0)
            {
                return(0.0f);
            }
            if (location.IsGateBetweenBiomes)
            {
                return(0.0f);
            }

            if (DisallowedAdjacentLocations.Any() &&
                AnyWithinDistance(location, DisallowedProximity, (otherLocation) => { return(DisallowedAdjacentLocations.Contains(otherLocation.Type.Identifier)); }))
            {
                return(0.0f);
            }

            float probability = Probability;

            foreach (Requirement requirement in Requirements)
            {
                if (requirement.AnyWithinDistance(location, requirement.RequiredProximity))
                {
                    if (requirement.Function == Requirement.FunctionType.Add)
                    {
                        probability += requirement.Probability;
                    }
                    else
                    {
                        probability *= requirement.Probability;
                    }
                }

                if (location.ProximityTimer.ContainsKey(requirement))
                {
                    if (requirement.AnyWithinDistance(location, requirement.RequiredProximityForProbabilityIncrease))
                    {
                        if (requirement.Function == Requirement.FunctionType.Add)
                        {
                            probability += requirement.ProximityProbabilityIncrease * location.ProximityTimer[requirement];
                        }
                        else
                        {
                            probability *= requirement.ProximityProbabilityIncrease * location.ProximityTimer[requirement];
                        }
                    }
                }
            }

            return(probability);
        }
示例#2
0
 public bool MatchesLocation(Location location)
 {
     return(RequiredLocations.Contains(location.Type.Identifier) && !location.IsCriticallyRadiated());
 }