public static BoundsInt CenteredOn(Position center, int range) { int size = 2 * range + 1; return(new BoundsInt(center.x - range, center.y - range, 0, size, size, 1)); }
public void ReplacePosition(Osnowa.Osnowa.Core.Position newPosition) { var index = GameComponentsLookup.Position; var component = (Osnowa.Osnowa.Core.ECS.PositionComponent)CreateComponent(index, typeof(Osnowa.Osnowa.Core.ECS.PositionComponent)); component.Position = newPosition; ReplaceComponent(index, component); }
public void ReplacePositionAfterLastTurn(Osnowa.Osnowa.Core.Position newPosition) { var index = GameComponentsLookup.PositionAfterLastTurn; var component = (Osnowa.Osnowa.Example.ECS.Presence.PositionAfterLastTurnComponent)CreateComponent(index, typeof(Osnowa.Osnowa.Example.ECS.Presence.PositionAfterLastTurnComponent)); component.Position = newPosition; ReplaceComponent(index, component); }
public void ReplacePlayerDecision(GameLogic.GameCore.Decision newDecision, Osnowa.Osnowa.Core.Position newDirection, Osnowa.Osnowa.Core.Position newPosition) { var index = GameComponentsLookup.PlayerDecision; var component = (Osnowa.Osnowa.Core.ECS.Input.PlayerDecisionComponent)CreateComponent(index, typeof(Osnowa.Osnowa.Core.ECS.Input.PlayerDecisionComponent)); component.Decision = newDecision; component.Direction = newDirection; component.Position = newPosition; ReplaceComponent(index, component); }
public void Init(IExampleContext context, InitialHeightIngredientConfig config, WorldGeneratorConfig worldGeneratorConfig, IRandomNumberGenerator rng) { _config = config; _rng = rng; _noiseOffset = new Position(_rng.Next(10000), _rng.Next(10000)); base.Init(context, config, worldGeneratorConfig); Values = new ValueMap(1, worldGeneratorConfig.XSize, worldGeneratorConfig.YSize); }
public GameEntity SetPlayerDecision(GameLogic.GameCore.Decision newDecision, Osnowa.Osnowa.Core.Position newDirection, Osnowa.Osnowa.Core.Position newPosition) { if (hasPlayerDecision) { throw new Entitas.EntitasException("Could not set PlayerDecision!\n" + this + " already has an entity with Osnowa.Osnowa.Core.ECS.Input.PlayerDecisionComponent!", "You should check if the context already has a playerDecisionEntity before setting it or use context.ReplacePlayerDecision()."); } var entity = CreateEntity(); entity.AddPlayerDecision(newDecision, newDirection, newPosition); return(entity); }
public void ReplacePlayerDecision(GameLogic.GameCore.Decision newDecision, Osnowa.Osnowa.Core.Position newDirection, Osnowa.Osnowa.Core.Position newPosition) { var entity = playerDecisionEntity; if (entity == null) { entity = SetPlayerDecision(newDecision, newDirection, newPosition); } else { entity.ReplacePlayerDecision(newDecision, newDirection, newPosition); } }
public override IEnumerator Recalculating() { Position middle = new Position(Values.XSize / 2, Values.YSize / 2); float furthestDistanceToMiddle = Position.Distance(Position.MinValue, middle); float noiseScale = _config.Scale; AnimationCurve toCenterFalloffCurve = _config.MaxFactorDistanceFromCenterToFalloff; Dictionary <int, float> afterNoiseAdjustments = InitializeAfterNoiseAdjustments(_config.Octaves); foreach (Position position in Values.AllCellMiddles()) { Position probedPositionForNoise = position + _noiseOffset; float persistence01 = 0.5f; float heightValue = Perlin.Noise(probedPositionForNoise.x * noiseScale, probedPositionForNoise.y * noiseScale, _config.Octaves, persistence01); int adjustmentKey = (int)Math.Round(persistence01 * 10); heightValue *= afterNoiseAdjustments[adjustmentKey]; float distanceToMiddle = Position.Distance(position, middle); float relativeDistanceToMiddle = distanceToMiddle / furthestDistanceToMiddle; heightValue *= toCenterFalloffCurve.Evaluate(relativeDistanceToMiddle); Values.Set(position, heightValue); } float cutOffValue = CalculateSeaLevelToMatchGroundPercentage(); GameContext.SeaLevel = cutOffValue; bool Qualifier(int x, int y) => Values.Get(x, y) < cutOffValue; var bounds = new FloodBounds(Values.XSize, Values.YSize); var parameters = new FloodParameters(0, 0) { Qualifier = Qualifier, BoundsRestriction = bounds, NeighbourhoodType = NeighbourhoodType.Four }; int[,] closedSeaPositions = new int[bounds.SizeX, bounds.SizeY]; new FloodSpiller().SpillFlood(parameters, closedSeaPositions); BuryDepressions(cutOffValue, closedSeaPositions); yield return(new WaitForSeconds(0.1f)); }
private float CalculateSeaLevelToMatchGroundPercentage() { int randomPointsCount = 100; List <float> allProbedValues = new List <float>(randomPointsCount); for (int i = 0; i < randomPointsCount; i++) { var position = new Position(_rng.Next(Values.XSize), _rng.Next(Values.YSize)); float value = Values.Get(position); allProbedValues.Add(value); } allProbedValues.Sort(); allProbedValues.Reverse(); int cutOffValueIndex = (int)(_config.GroundPercentage * randomPointsCount); float cutOffValue = allProbedValues[cutOffValueIndex]; return(cutOffValue); }
/// <summary> /// Returns source BoundsInt which are stretched so that they contain consideredPosition. Ignores z component of bounds. /// </summary> public static BoundsInt With(BoundsInt source, Position consideredPosition) { if (consideredPosition.x < source.xMin) { source.xMin = consideredPosition.x; } if (consideredPosition.y < source.yMin) { source.yMin = consideredPosition.y; } if (consideredPosition.x >= source.xMax) { source.xMax = consideredPosition.x + 1; } if (consideredPosition.y >= source.yMax) { source.yMax = consideredPosition.y + 1; } return(source); }