Exemple #1
0
        private List <ChunkFacade> SpawnChunkFacades(SprintRequest sprintRequest)
        {
            List <ChunkFacade> chunkFacades = new List <ChunkFacade>();

            int chunkNum    = sprintRequest.startChunkNum;
            int endChunkNum = chunkNum - sprintRequest.chunkCount;

            int offset = sprintRequest.checkpointOverride ? 0 : 1;

            for (; chunkNum > endChunkNum + offset; --chunkNum)
            {
                ChunkRequest chunkRequest = new ChunkRequest()
                {
                    chunkNum          = chunkNum,
                    chunkCount        = sprintRequest.totalChunkCount,
                    sprintEndChunkNum = endChunkNum + 1,
                    biome             = biomePickingStrategy.Pick(biomes, altitude),
                };

                ChunkFacade chunkFacade = chunkFacadeFactory.Create(chunkRequest);
                altitude = chunkFacade.Position.y;

                chunkFacades.Add(chunkFacade);
            }

            return(chunkFacades);
        }
Exemple #2
0
        private Vector3 BirdseyePosition(ChunkView chunkView, ChunkRequest chunkRequest, ChunkFeature chunkFeature, ChunkFeatureView chunkFeatureView)
        {
            int depth = ChunkMath.Depth(chunkRequest);
            int side  = ChunkMath.Side(chunkRequest);
            int depthStartChunkNum = ChunkMath.DepthStartChunkNum(chunkRequest);
            int sideStartChunkNum  = ChunkMath.SideStartChunkNum(chunkRequest);
            int sideChunkNum       = ChunkMath.SideChunkNum(chunkRequest);

            switch (side)
            {
            case 0:
                return(Position(chunkRequest, chunkReference.Northeast, chunkReference.Northwest, sideChunkNum, depth, chunkFeature, chunkFeatureView));

            case 1:
                return(Position(chunkRequest, chunkReference.East, chunkReference.Northeast, sideChunkNum, depth, chunkFeature, chunkFeatureView));

            case 2:
                return(Position(chunkRequest, chunkReference.Southeast, chunkReference.East, sideChunkNum, depth, chunkFeature, chunkFeatureView));

            case 3:
                return(Position(chunkRequest, chunkReference.Southwest, chunkReference.Southeast, sideChunkNum, depth, chunkFeature, chunkFeatureView));

            case 4:
                return(Position(chunkRequest, chunkReference.West, chunkReference.Southwest, sideChunkNum, depth, chunkFeature, chunkFeatureView));

            case 5:
                return(Position(chunkRequest, chunkReference.Northwest, chunkReference.West, sideChunkNum, depth, chunkFeature, chunkFeatureView));
            }

            Debug.LogError("Failed to compute spiral chunk position");
            return(Vector3.zero);
        }
        public static int SideStartChunkNum(ChunkRequest chunkRequest)
        {
            int depth = Depth(chunkRequest);
            int side  = Side(chunkRequest);

            return(DepthStartChunkNum(chunkRequest) + (depth * side));
        }
Exemple #4
0
        public ChunkFeature Pick(ChunkRequest chunkRequest)
        {
            IBiome biome = chunkRequest.biome;
            List <ChunkFeature> chunkFeatures = biome.ChunkFeatures();
            int randomIndex = generator.Random.Next(chunkFeatures.Count);

            return(chunkFeatures[randomIndex]);
        }
        private void InstallChunkFacade(DiContainer subContainer, ChunkRequest chunkRequest)
        {
            subContainer.BindInstance(chunkRequest);

            subContainer.Bind <ChunkView>().ToSinglePrefab(settings.chunk.chunkPrefab);
            subContainer.Bind <ChunkBaseView>().ToSinglePrefab(settings.chunk.chunkBasePrefab);

            subContainer.Bind <Chunk>().ToSingle();
            subContainer.BindAllInterfacesToSingle <Chunk>();

            subContainer.Bind <ChunkBase>().ToSingle();
            subContainer.BindAllInterfacesToSingle <ChunkBase>();
        }
Exemple #6
0
        private ChunkFacade SpawnStartingChunkFacade()
        {
            ChunkRequest chunkRequest = new ChunkRequest()
            {
                chunkNum          = chunkCount,
                chunkCount        = chunkCount,
                sprintEndChunkNum = chunkCount,
                biome             = settings.startingZoneBiome,
            };

            ChunkFacade chunkFacade = chunkFacadeFactory.Create(chunkRequest);

            chunkFacade.Name = "Starting Zone";

            return(chunkFacade);
        }
Exemple #7
0
        private Checkpoint SpawnCheckpoint(SprintRequest sprintRequest)
        {
            ChunkRequest checkpointRequest = new ChunkRequest()
            {
                chunkNum   = sprintRequest.startChunkNum - sprintRequest.chunkCount + 1,
                chunkCount = sprintRequest.totalChunkCount,
            };

            Checkpoint checkpoint = checkpointFactory.Create(checkpointRequest, altitude);

            altitude = checkpoint.Position.y;

            checkpointManager.AddCheckpoint(checkpoint);

            return(checkpoint);
        }
        private List <ChunkFeature> GetUnfittedChunkIndices(ChunkRequest chunkRequest, List <ChunkFeature> chunkFeatures)
        {
            List <ChunkFeature> unfittedChunkIndices = new List <ChunkFeature>();

            for (int index = 0; index < chunkFeatures.Count; ++index)
            {
                ChunkFeature chunkFeature        = chunkFeatures[index];
                ChunkFeature chunkChainedFeature = chunkFeature;

                int  chunkNumOffset = 0;
                bool chained        = false;
                while (chunkChainedFeature != null)
                {
                    ChunkRequest nextChunkRequest = new ChunkRequest()
                    {
                        chunkNum = chunkRequest.chunkNum - chunkNumOffset,
                    };


                    if (chained && nextChunkRequest.chunkNum != 0 && nextChunkRequest.chunkNum == chunkRequest.sprintEndChunkNum)
                    {
                        unfittedChunkIndices.Add(chunkFeature);
                        break;
                    }

                    int nextDepth = ChunkMath.Depth(nextChunkRequest);
                    int nextDepthStartChunkNum = ChunkMath.DepthStartChunkNum(nextChunkRequest);
                    int nextDepthEndChunkNum   = ChunkMath.DepthEndChunkNum(nextChunkRequest);
                    int nextSideChunkNum       = ChunkMath.SideChunkNum(nextChunkRequest);

                    // Mark chunk feature to be removed if it hits a corner and it is supposed to skip corners
                    if (chunkChainedFeature.SkipCorners && (chained || nextChunkRequest.chunkNum != nextDepthEndChunkNum) &&
                        (nextSideChunkNum == nextDepth - 1 ||
                         nextChunkRequest.chunkNum == nextDepthStartChunkNum))
                    {
                        unfittedChunkIndices.Add(chunkFeature);
                        break;
                    }

                    chunkChainedFeature = chunkChainedFeature.ChunkChainNext;
                    chunkNumOffset++;
                    chained = true;
                }
            }

            return(unfittedChunkIndices);
        }
Exemple #9
0
        public void Place(ChunkView chunkView, ChunkRequest chunkRequest, ChunkFeature chunkFeature, ChunkFeatureView chunkFeatureView)
        {
            if (chunkRequest.chunkNum == 0)
            {
                chunkView.Rotation *= Quaternion.AngleAxis(
                    120,
                    chunkView.Up
                    );
                chunkView.Position = Vector3.zero + Altitude(chunkRequest, chunkFeature, chunkFeatureView);
                return;
            }

            chunkView.Rotation *= BirdseyeRotation(chunkView, chunkRequest);
            chunkView.Position  = BirdseyePosition(chunkView, chunkRequest, chunkFeature, chunkFeatureView);

            previousChunkView = chunkView;
        }
Exemple #10
0
 public Chunk(
     DiContainer container,
     Settings settings,
     ChunkRequest chunkRequest,
     ChunkView chunkView,
     ChunkFeature chunkFeature,
     ChunkFeatureView chunkFeatureView,
     IChunkPlacingStrategy chunkPlacingStrategy)
 {
     this.container            = container;
     this.settings             = settings;
     this.chunkRequest         = chunkRequest;
     this.chunkView            = chunkView;
     this.chunkFeature         = chunkFeature;
     this.chunkFeatureView     = chunkFeatureView;
     this.chunkPlacingStrategy = chunkPlacingStrategy;
 }
Exemple #11
0
        private Quaternion BirdseyeRotation(ChunkView chunkView, ChunkRequest chunkRequest)
        {
            int side = ChunkMath.Side(chunkRequest);
            int depthStartChunkNum = ChunkMath.DepthStartChunkNum(chunkRequest);
            int depthEndChunkNum   = ChunkMath.DepthEndChunkNum(chunkRequest);

            if (chunkRequest.chunkNum == depthStartChunkNum || chunkRequest.chunkNum == depthEndChunkNum)
            {
                side = 5;
            }

            side = (side + 4) % 6;

            return(Quaternion.AngleAxis(
                       side * 60,
                       chunkView.Up
                       ));
        }
Exemple #12
0
        private Vector3 Altitude(ChunkRequest chunkRequest, ChunkFeature chunkFeature, ChunkFeatureView chunkFeatureView)
        {
            if (previousChunkView == null)
            {
                return(settings.mountainOffset * Vector3.up);
            }

            float previousAltitude = previousChunkView.Position.y + previousChunkView.ChunkFeatureView.ExitAltitude;

            if (chunkFeature.MatchChainHeight)
            {
                return((previousAltitude - chunkFeatureView.EntryAltitude) * Vector3.up);
            }

            float variability = UnityEngine.Random.value * settings.altitudeRange;

            return((variability + previousAltitude - chunkFeatureView.EntryAltitude) * Vector3.up);
        }
        public Checkpoint Create(ChunkRequest chunkRequest, float altitude)
        {
            ChunkRequest checkpointRequest = new ChunkRequest()
            {
                chunkNum          = chunkRequest.chunkNum,
                chunkCount        = chunkRequest.chunkCount,
                sprintEndChunkNum = chunkRequest.sprintEndChunkNum,
                biome             = biomePickingStrategy.Pick(biomes, altitude),
            };

            ChunkFacade chunkFacade = chunkFacadeFactory.Create(checkpointRequest);
            Checkpoint  checkpoint  = container.Instantiate <Checkpoint>(checkpointNum, chunkFacade);

            checkpointNum++;

            checkpoint.Initialize();

            return(checkpoint);
        }
Exemple #14
0
        private List <ChunkFacade> SpawnPeakChunkFacades()
        {
            List <ChunkFacade> peakChunkFacades = new List <ChunkFacade>();

            for (int chunkNum = settings.peakChunkCount - 1; chunkNum >= 0; --chunkNum)
            {
                ChunkRequest chunkRequest = new ChunkRequest()
                {
                    chunkNum          = chunkNum,
                    chunkCount        = chunkCount,
                    sprintEndChunkNum = 0,
                    biome             = settings.peakBiome,
                };

                ChunkFacade chunkFacade = chunkFacadeFactory.Create(chunkRequest);
                chunkFacade.Name = "Peak";

                peakChunkFacades.Add(chunkFacade);
            }

            return(peakChunkFacades);
        }
        public ChunkFeature Pick(ChunkRequest chunkRequest)
        {
            if (chunkChain != null)
            {
                ChunkFeature chunkChainedFeature = chunkChain;
                chunkChain = chunkChain.ChunkChainNext;

                return(chunkChainedFeature);
            }

            IBiome biome = chunkRequest.biome;
            List <ChunkFeature> chunkFeatures = biome.ChunkFeatures();

            chunkFeatures = chunkFeatures
                            .Where(chunkFeature => !chunkFeature.IsUnique || (chunkFeature.IsUnique && !pickedUniqueChunkFeatures.Contains(chunkFeature)))
                            .ToList();

            List <ChunkFeature> unfittedChunkIndices = GetUnfittedChunkIndices(chunkRequest, chunkFeatures);

            foreach (ChunkFeature chunkFeature in unfittedChunkIndices)
            {
                chunkFeatures.Remove(chunkFeature);
            }

            List <int>   cdf                = CreateCDF(chunkFeatures);
            int          randomIndex        = GetRandomIndex(cdf, chunkFeatures);
            ChunkFeature pickedChunkFeature = chunkFeatures[randomIndex];

            if (pickedChunkFeature.IsUnique)
            {
                pickedUniqueChunkFeatures.Add(pickedChunkFeature);
            }

            chunkChain = pickedChunkFeature.ChunkChainNext;

            return(pickedChunkFeature);
        }
        public static int DepthStartChunkNum(ChunkRequest chunkRequest)
        {
            int depth = Depth(chunkRequest);

            return((3 * depth * (depth - 1)) + 1);
        }
Exemple #17
0
 private Vector3 Position(ChunkRequest chunkRequest, Vector3 sideDirection, Vector3 depthDirection, int sideChunkNum, int depth, ChunkFeature chunkFeature, ChunkFeatureView chunkFeatureView)
 {
     return(((sideChunkNum + 1) * sideDirection) + ((depth - sideChunkNum - 1) * depthDirection) + Altitude(chunkRequest, chunkFeature, chunkFeatureView));
 }
        public static int Side(ChunkRequest chunkRequest)
        {
            int depth = Depth(chunkRequest);

            return(Mathf.CeilToInt((float)chunkRequest.chunkNum / depth) - (3 * depth) + 2);
        }
        public static int DepthEndChunkNum(ChunkRequest chunkRequest)
        {
            int depth = Depth(chunkRequest);

            return(3 * depth * (depth + 1));
        }
 public static int Depth(ChunkRequest chunkRequest)
 {
     return(Mathf.FloorToInt((3 + Mathf.Sqrt((12 * chunkRequest.chunkNum) - 3)) / 6));
 }
 public static int SideChunkNum(ChunkRequest chunkRequest)
 {
     return(chunkRequest.chunkNum - SideStartChunkNum(chunkRequest));
 }