/// <summary> /// Generates the entities to be placed into a chunk /// </summary> /// <param name="chunkX"></param> /// <param name="chunkY"></param> /// <param name="surface"></param> public void GenerateEntities(int chunkX, int chunkY, SurfaceContainer surface) { Vector2 chunkPos = new Vector2(chunkX * Props.chunkSize * Props.tileSize, chunkY * Props.chunkSize * Props.tileSize); for (int i = 0; i < entitiesGenerated.Count; i++) { Vector2[] poissonDiscDistribution = PoissonDiscDistribution.GetDistribution(entitiesGenerated[i].density, (chunkX * (surfaceSize / Props.chunkSize) + chunkY) + seed, 10); for (int j = 0; j < poissonDiscDistribution.Length; j++) { Vector2 curPos = poissonDiscDistribution[j].VAdd(chunkPos); int nx = (int)(curPos.x) / Props.tileSize; int ny = (int)(curPos.y) / Props.tileSize; double elevation = 0.5 * elevationNoise.GetNoise(1 * nx, 1 * ny) + 0.25 * elevationNoise.GetNoise(2 * nx, 2 * ny) + 0.25 * elevationNoise.GetNoise(4 * nx, 4 * ny); double moisture = 0.5 * moistureNoise.GetNoise(1 * nx, 1 * ny) + 0.25 * moistureNoise.GetNoise(2 * nx, 2 * ny) + 0.25 * moistureNoise.GetNoise(4 * nx, 4 * ny); double temperature = 0.5 * temperatureNoise.GetNoise(1 * nx, 1 * ny) + 0.25 * temperatureNoise.GetNoise(2 * nx, 2 * ny) + 0.25 * temperatureNoise.GetNoise(4 * nx, 4 * ny); elevation = 3 * Math.Pow(elevation, elevationFactor); moisture = 3 * Math.Pow(moisture, moistureFactor); temperature = 3 * Math.Pow(temperature, temperatureFactor); float lowestAffinity = 2; int lowestPrototype = 0; for (int k = 0; k < entitiesGenerated[i].prototypeVars.Length; k++) { float entityProb = (float)(Math.Abs(entitiesGenerated[i].elevationAffinities[k] - elevation) + Math.Abs(entitiesGenerated[i].moistureAffinities[k] - moisture) + Math.Abs(entitiesGenerated[i].temperatureAffinities[k] - temperature)); if (entityProb < lowestAffinity) { lowestAffinity = entityProb; lowestPrototype = k; } } float moistureDiff = (float)(Math.Abs(entitiesGenerated[i].moistureAffinities[lowestPrototype] - moisture)); float elevationDiff = (float)(Math.Abs(entitiesGenerated[i].elevationAffinities[lowestPrototype] - elevation)); float temperatureDiff = (float)(Math.Abs(entitiesGenerated[i].temperatureAffinities[lowestPrototype] - temperature)); if (entitiesGenerated[i].moistureRange[lowestPrototype % entitiesGenerated[i].prototypeCount] > elevationDiff && entitiesGenerated[i].temperatureRange[lowestPrototype % entitiesGenerated[i].prototypeCount] > temperatureDiff && entitiesGenerated[i].elevationRange[lowestPrototype % entitiesGenerated[i].prototypeCount] > moistureDiff) { Entity prototype = entityCollection.GetPrototype(entitiesGenerated[i].prototypeVars[lowestPrototype]); if (prototype.tileAligned) { curPos = new Vector2(curPos.x - curPos.x % 32 + 16, curPos.y - curPos.y % 32 + 16); } if (prototype != null && !BoundingBox.CheckForPlacementCollision(prototype.collisionBox, curPos, surface, entitiesGenerated[i].placementMask)) { entityCollection.InstantiatePrototype(prototype.name, curPos, surface); } } } } }
public void InitializeGame() { //Pop all menus menuContainer.RemoveAllMenus(); //Game systems intialization surfaceContainer = new SurfaceContainer(tileCollection, surfaceGenerator); renderer.InitializeForGame(tileCollection); #region test entities surfaceContainer.GenerateStartingArea(); player = entityCollection.InstantiatePrototype("player", surfaceContainer.spawnPoint, surfaceContainer); IInputSubscriber playerSubscriber = player as IInputSubscriber; if (playerSubscriber != null) { playerSubscriber.SubscribeToInput(input); } #endregion //Attaching the camera to something! camera.SetFocusedEntity(player, menuFactory); this.SubscribeToInput(input); renderer.SubscribeToInput(input); }
/// <summary> /// TODO: Add inheritance structure /// </summary> public override void Update(EntityCollection entityCollection, ItemCollection itemCollection) { for (int i = 0; i < dropItems.Count; i++) { for (int j = 0; j < dropItems[i].count; j++) { entityCollection.InstantiatePrototype(dropItems[i].item.name + "Item", position.Copy(), surface); } } dropItems.Clear(); if (playerState == PlayerState.Mining) { if (selectedEntity != null && selectedEntity.minable == true) { if (miningProgress % miningSoundFrequency == 0) { StaticSoundManager.PlaySound(selectedEntity.position, selectedEntity.miningSounds); } miningProgress += 1; if (miningProgress > selectedEntity.miningProps.miningTime) { StaticSoundManager.PlaySound(position, new string[] { "Pickup" }); selectedEntity.OnMined(this, itemCollection, entityCollection); selectedEntity = null; miningProgress = 0; playerState = PlayerState.Idle; } } else { playerState = PlayerState.Idle; } } if (playerState == PlayerState.Moving) { BoundingBox.ApplyPhysicalCollision(this, velocity); if (velocity.x != 0 || velocity.y != 0) { rotation = velocity.GetRotation() + 180.0f; } walking.SetRotation(rotation); walking.Update(); walking.animationSpeed = 60 / velocity.GetMagnitude(); velocity.Set(0, 0); radialLight.Update(); directionalLight.Update(); directionalLight.SetDirection(270 + rotation); } //Light logic if (surface.timeOfDay > surface.timeOfMidday / 2 - surface.lengthOfNight) { radialLight.on = true; directionalLight.on = true; } if (surface.timeOfDay > surface.timeOfMidday / 2 + surface.lengthOfNight) { radialLight.on = false; directionalLight.on = false; } }