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); }
public bool MatchesLocation(Location location) { return(RequiredLocations.Contains(location.Type.Identifier) && !location.IsCriticallyRadiated()); }