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); }
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)); }
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>(); }
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); }
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); }
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; }
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; }
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 )); }
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); }
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); }
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)); }