Пример #1
0
 private static void OverpopulationPrevention()
 {
     while (tribes.Count > WorldProperties.MaximumTribesAllowedInTheWorld)
     {
         Tribe removingTribe = tribes[randomizer.Next(tribes.Count)];
         removingTribe.PrepareForMigrationOutsideOfTheScope();
         tribes.Remove(removingTribe);
     }
 }
Пример #2
0
 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);
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
                    }
                }
            }
        }
Пример #5
0
        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;
                }
            }
        }
Пример #6
0
        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;
        }