private static void OverpopulationPrevention() { while (tribes.Count > WorldProperties.MaximumTribesAllowedInTheWorld) { Tribe removingTribe = tribes[randomizer.Next(tribes.Count)]; removingTribe.PrepareForMigrationOutsideOfTheScope(); tribes.Remove(removingTribe); } }
public void AttemptCulturalExchangeWith(Tribe tribeTo) { Tribesman man = members[randomizer.Next(members.Count)]; { Tribesman student; student = members[randomizer.Next(members.Count)]; while (student == man) // this cycle is just to make sure he's not trying to teach himself { student = members[randomizer.Next(members.Count)]; } man.TryToTeach(student, true); } }
public Tribe Split() { if (members.Count <= WorldProperties.SplitTribeIfBiggerThen) { return(null); } Tribe newTribe = new Tribe(randomizer.Next(int.MaxValue)); for (int i = 0; i < members.Count * WorldProperties.SplitTribeRatio; i++) { Tribesman member = members[randomizer.Next(members.Count)]; MemberLeaves(member); newTribe.AcceptMember(member); } return(newTribe); }
private static void SplitGroups() { // Тут потенциальный источник невоспроизводимости. Если в один год разделится больше одного лемени они могут оказаться в tribes в произвольном порядке, а порядок используется в некоторых местах например когда племена взаимодействуют между собой. Например при переселении или культурном обмене. ConcurrentDictionary <Tribe, Tribe> newTribes = new ConcurrentDictionary <Tribe, Tribe>(); World.tribes.Parallel((tribe) => { Tribe newTribe = tribe.Split(); if (newTribe != null) { newTribes.TryAdd(tribe, newTribe); } }); if (newTribes.Count > 0) { for (int i = 0; i < tribes.Count; i++) // Эта надстройка фиксирует порядок чтения { if (newTribes.TryGetValue(tribes[i], out var child)) { tribes.Add(child); } } } }
private static void CulturalExchange() { if (tribes.Count < 2) { return; } while (randomizer.Chance(WorldProperties.CulturalExchangeTeachingChance)) { int t1n, t2n; t1n = randomizer.Next(tribes.Count); do { t2n = randomizer.Next(tribes.Count); }while (t1n == t2n); Tribe tribeFrom = tribes[t1n]; Tribe tribeTo = tribes[t2n]; tribeFrom.AttemptCulturalExchangeWith(tribeTo); if (WorldProperties.AllowRepetitiveCulturalExchange < 0.5) { break; } } }
public static void Initialize(Dispatcher d, int randomSeed) { WorldProperties.ResetFeatureDescriptions(); randomizer = new Random(randomSeed); StatisticsCollector.Reset(); Meme.ClearMemePool(); tribes.Clear(); GC.Collect(); GC.WaitForPendingFinalizers(); if (!string.IsNullOrWhiteSpace(baseFolder)) { logFolder = Path.Combine(baseFolder, DateTime.Now.ToString("yyyyMMdd_HHmmss")); } else { baseFolder = Properties.Settings.Default.LogBaseFolder; if (string.IsNullOrWhiteSpace(baseFolder)) { logFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Tribe Sim Results", DateTime.Now.ToString("yyyyMMdd_HHmmss")); } else { logFolder = Path.Combine(baseFolder, DateTime.Now.ToString("yyyyMMdd_HHmmss")); } } Directory.CreateDirectory(logFolder); tribesLogFolder = Path.Combine(logFolder, "Tribes"); memesLogFolder = Path.Combine(logFolder, "Memes"); tribesmanLogFolder = Path.Combine(logFolder, "Tribesmen"); simDataFolder = Path.Combine(logFolder, "Results"); Directory.CreateDirectory(tribesmanLogFolder); Directory.CreateDirectory(tribesLogFolder); Directory.CreateDirectory(memesLogFolder); if (WorldProperties.CollectFilesData > 0.5) { Directory.CreateDirectory(simDataFolder); } Year = 0; int i; for (i = 0; i < WorldProperties.StartingNumberOfTribes; i++) { Tribe t = new Tribe(randomizer.Next(int.MaxValue)); int numberOfTribesmen = (int)Math.Round(randomizer.NormalRandom(WorldProperties.StartingTribePopulationMean, WorldProperties.StartingTribePopulationStdDev)); for (int ii = 0; ii < numberOfTribesmen; ii++) { Tribesman man = Tribesman.GenerateTribesmanFromAStartingSet(randomizer); t.AcceptMember(man); } tribes.Add(t); } int maxReproductionAge = 5000; // Это сломатся если у нас появятся сверхдолгожители if (WorldProperties.MaximumBreedingAge > 0) { maxReproductionAge = (int)WorldProperties.MaximumBreedingAge + 1; } Tribesman.reproductionCostIncrease = new double[maxReproductionAge]; i = 0; for (; i < WorldProperties.BreedingCostsIncreaseAge; i++) { Tribesman.reproductionCostIncrease[i] = 0; } for (; i < maxReproductionAge; i++) { Tribesman.reproductionCostIncrease[i] = (i - WorldProperties.BreedingCostsIncreaseAge) * WorldProperties.BreedingCostsIncreaseCoefficient; } ReportEndOfYearStatistics(); d.Invoke(new Action(delegate() { StatisticsCollector.ConsolidateNewYear(); })); Tribesman.UseGompertzAgeing = WorldProperties.UseGompertzAgeing > 0.5; }