Exemple #1
0
        /// <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);
                        }
                    }
                }
            }
        }
Exemple #2
0
 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);
 }
Exemple #3
0
        /// <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;
            }
        }