public IMyVoxelFillProperties CreateRandom(int index, MaterialSelectionModel defaultMaterial, IEnumerable <MaterialSelectionModel> materialsCollection, IEnumerable <GenerateVoxelDetailModel> voxelCollection) { int idx; var randomModel = new AsteroidByteFillProperties { Index = index, MainMaterial = defaultMaterial, SecondMaterial = defaultMaterial, ThirdMaterial = defaultMaterial, FourthMaterial = defaultMaterial, FifthMaterial = defaultMaterial, SixthMaterial = defaultMaterial, SeventhMaterial = defaultMaterial, }; // Must be by reference, not value. var largeVoxelFileList = voxelCollection.Where(v => v.FileSize > 100000).ToList(); var smallVoxelFileList = voxelCollection.Where(v => v.FileSize > 0 && v.FileSize < 100000).ToList(); // Random Asteroid. var d = RandomUtil.GetDouble(1, 100); var islarge = false; if (largeVoxelFileList.Count == 0 && smallVoxelFileList.Count == 0) { // no asteroids? You are so screwed. throw new Exception("No valid asteroids found. Re-validate your game cache."); } if (largeVoxelFileList.Count == 0) // empty last list? Force to small list. { d = 1; } if (smallVoxelFileList.Count == 0) // empty small list? Force to large list. { d = 100; } if (d > 70) { idx = RandomUtil.GetInt(largeVoxelFileList.Count); randomModel.VoxelFile = largeVoxelFileList[idx]; islarge = true; } else { idx = RandomUtil.GetInt(smallVoxelFileList.Count); randomModel.VoxelFile = smallVoxelFileList[idx]; } // Random Main Material non-Rare. var nonRare = materialsCollection.Where(m => m.IsRare == false).ToArray(); idx = RandomUtil.GetInt(nonRare.Length); randomModel.MainMaterial = nonRare[idx]; int percent; var rare = materialsCollection.Where(m => m.IsRare && m.MinedRatio >= 1).ToList(); var superRare = materialsCollection.Where(m => m.IsRare && m.MinedRatio < 1).ToList(); if (islarge) { // Random 1. Rare. if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); percent = RandomUtil.GetInt(40, 60); randomModel.SecondMaterial = rare[idx]; randomModel.SecondPercent = percent; rare.RemoveAt(idx); } // Random 2. Rare. if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); percent = RandomUtil.GetInt(6, 12); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdPercent = percent; rare.RemoveAt(idx); } // Random 3. Rare. if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); percent = RandomUtil.GetInt(6, 12); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdPercent = percent; rare.RemoveAt(idx); } // Random 4. Super Rare. if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); percent = RandomUtil.GetInt(2, 4); randomModel.FourthMaterial = superRare[idx]; randomModel.FourthPercent = percent; superRare.RemoveAt(idx); } // Random 5. Super Rare. if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); percent = RandomUtil.GetInt(1, 3); randomModel.FifthMaterial = superRare[idx]; randomModel.FifthPercent = percent; superRare.RemoveAt(idx); } // Random 6. Super Rare. if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); percent = RandomUtil.GetInt(1, 3); randomModel.SixthMaterial = superRare[idx]; randomModel.SixthPercent = percent; superRare.RemoveAt(idx); } // Random 7. Super Rare. if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); percent = RandomUtil.GetInt(1, 3); randomModel.SeventhMaterial = superRare[idx]; randomModel.SeventhPercent = percent; superRare.RemoveAt(idx); } } else // Small Asteroid. { // Random 1. Rare. idx = RandomUtil.GetInt(rare.Count); percent = RandomUtil.GetInt(6, 13); randomModel.SecondMaterial = rare[idx]; randomModel.SecondPercent = percent; // Random 2. Super Rare. idx = RandomUtil.GetInt(superRare.Count); percent = RandomUtil.GetInt(2, 4); randomModel.ThirdMaterial = superRare[idx]; randomModel.ThirdPercent = percent; superRare.RemoveAt(idx); } return(randomModel); }
public IMyVoxelFillProperties CreateRandom(int index, MaterialSelectionModel defaultMaterial, IEnumerable<MaterialSelectionModel> materialsCollection, IEnumerable<GenerateVoxelDetailModel> voxelCollection) { int idx; var randomModel = new AsteroidSeedFillProperties { Index = index, MainMaterial = defaultMaterial, FirstMaterial = defaultMaterial, SecondMaterial = defaultMaterial, ThirdMaterial = defaultMaterial, FourthMaterial = defaultMaterial, FifthMaterial = defaultMaterial, SixthMaterial = defaultMaterial, SeventhMaterial = defaultMaterial, }; // Must be by reference, not value. var largeVoxelFileList = voxelCollection.Where(v => v.FileSize > 100000).ToList(); var smallVoxelFileList = voxelCollection.Where(v => v.FileSize > 0 && v.FileSize < 100000).ToList(); // Random Asteroid. var d = RandomUtil.GetDouble(1, 100); var islarge = false; if (largeVoxelFileList.Count == 0 && smallVoxelFileList.Count == 0) { // no asteroids? You are so screwed. throw new Exception("No valid asteroids found. Re-validate your game cache."); } if (largeVoxelFileList.Count == 0) // empty last list? Force to small list. d = 1; if (smallVoxelFileList.Count == 0) // empty small list? Force to large list. d = 100; if (d > 70) { idx = RandomUtil.GetInt(largeVoxelFileList.Count); randomModel.VoxelFile = largeVoxelFileList[idx]; islarge = true; } else { idx = RandomUtil.GetInt(smallVoxelFileList.Count); randomModel.VoxelFile = smallVoxelFileList[idx]; } // Random Main Material non-Rare. var nonRare = materialsCollection.Where(m => m.IsRare == false).ToArray(); idx = RandomUtil.GetInt(nonRare.Length); randomModel.MainMaterial = nonRare[idx]; int chunks, chunkSize; double multiplier = 1.0; var rare = materialsCollection.Where(m => m.IsRare && m.MinedRatio >= 1).ToList(); var superRare = materialsCollection.Where(m => m.IsRare && m.MinedRatio < 1).ToList(); if (islarge) { // Random 1-4 are rare. chunks = 20; chunkSize = 5; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FirstMaterial = rare[idx]; randomModel.FirstVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FirstRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.SecondMaterial = rare[idx]; randomModel.SecondVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SecondRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.ThirdRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FourthMaterial = rare[idx]; randomModel.FourthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FourthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } // Random 5-7 are super-rare multiplier = 1.0; chunks = 50; chunkSize = 2; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FifthMaterial = superRare[idx]; randomModel.FifthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FifthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.SixthMaterial = superRare[idx]; randomModel.SixthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SixthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.SeventhMaterial = superRare[idx]; randomModel.SeventhVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SeventhRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; } else // Small Asteroid. { // Random 1-3 are rare. chunks = 10; chunkSize = 2; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FirstMaterial = rare[idx]; randomModel.FirstVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FirstRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.75; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.SecondMaterial = rare[idx]; randomModel.SecondVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SecondRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.75; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.ThirdRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } // Random 4-5 is super-rare multiplier = 1.0; chunks = 15; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FourthMaterial = superRare[idx]; randomModel.FourthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FourthRadius = 0; superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FifthMaterial = superRare[idx]; randomModel.FifthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FifthRadius = 0; superRare.RemoveAt(idx); } } return randomModel; }
public IMyVoxelFillProperties CreateRandom(int index, MaterialSelectionModel defaultMaterial, IEnumerable <MaterialSelectionModel> materialsCollection, IEnumerable <GenerateVoxelDetailModel> voxelCollection) { int idx; var randomModel = new AsteroidSeedFillProperties { Index = index, MainMaterial = defaultMaterial, FirstMaterial = defaultMaterial, SecondMaterial = defaultMaterial, ThirdMaterial = defaultMaterial, FourthMaterial = defaultMaterial, FifthMaterial = defaultMaterial, SixthMaterial = defaultMaterial, SeventhMaterial = defaultMaterial, }; // Must be by reference, not value. var largeVoxelFileList = voxelCollection.Where(v => v.FileSize > 100000).ToList(); var smallVoxelFileList = voxelCollection.Where(v => v.FileSize > 0 && v.FileSize < 100000).ToList(); // Random Asteroid. var d = RandomUtil.GetDouble(1, 100); var islarge = false; if (largeVoxelFileList.Count == 0 && smallVoxelFileList.Count == 0) { // no asteroids? You are so screwed. throw new Exception("No valid asteroids found. Re-validate your game cache."); } if (largeVoxelFileList.Count == 0) // empty last list? Force to small list. { d = 1; } if (smallVoxelFileList.Count == 0) // empty small list? Force to large list. { d = 100; } if (d > 70) { idx = RandomUtil.GetInt(largeVoxelFileList.Count); randomModel.VoxelFile = largeVoxelFileList[idx]; islarge = true; } else { idx = RandomUtil.GetInt(smallVoxelFileList.Count); randomModel.VoxelFile = smallVoxelFileList[idx]; } // Random Main Material non-Rare. var nonRare = materialsCollection.Where(m => m.IsRare == false).ToArray(); idx = RandomUtil.GetInt(nonRare.Length); randomModel.MainMaterial = nonRare[idx]; int chunks, chunkSize; double multiplier = 1.0; var rare = materialsCollection.Where(m => m.IsRare && m.MinedRatio >= 2).ToList(); var superRare = materialsCollection.Where(m => m.IsRare && m.MinedRatio < 2).ToList(); if (islarge) { // Random 1-4 are rare. chunks = 20; chunkSize = 5; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FirstMaterial = rare[idx]; randomModel.FirstVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FirstRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.SecondMaterial = rare[idx]; randomModel.SecondVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SecondRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.ThirdRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.85; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FourthMaterial = rare[idx]; randomModel.FourthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FourthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } // Random 5-7 are super-rare multiplier = 1.0; chunks = 50; chunkSize = 2; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FifthMaterial = superRare[idx]; randomModel.FifthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FifthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.SixthMaterial = superRare[idx]; randomModel.SixthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SixthRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.SeventhMaterial = superRare[idx]; randomModel.SeventhVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SeventhRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); superRare.RemoveAt(idx); } multiplier *= 0.5; } else // Small Asteroid. { // Random 1-3 are rare. chunks = 10; chunkSize = 2; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.FirstMaterial = rare[idx]; randomModel.FirstVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FirstRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.75; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.SecondMaterial = rare[idx]; randomModel.SecondVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.SecondRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } multiplier *= 0.75; if (rare.Count > 0) { idx = RandomUtil.GetInt(rare.Count); randomModel.ThirdMaterial = rare[idx]; randomModel.ThirdVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.ThirdRadius = RandomUtil.GetInt((int)(chunkSize * multiplier), (int)(chunkSize * 1.5 * multiplier)); rare.RemoveAt(idx); } // Random 4-5 is super-rare multiplier = 1.0; chunks = 15; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FourthMaterial = superRare[idx]; randomModel.FourthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FourthRadius = 0; superRare.RemoveAt(idx); } multiplier *= 0.5; if (superRare.Count > 0) { idx = RandomUtil.GetInt(superRare.Count); randomModel.FifthMaterial = superRare[idx]; randomModel.FifthVeins = RandomUtil.GetInt((int)(chunks * multiplier), (int)(chunks * 1.5 * multiplier)); randomModel.FifthRadius = 0; superRare.RemoveAt(idx); } } return(randomModel); }