Exemplo n.º 1
0
    private void DetermineMigrationLocation(Pops pop, Civilization civ)
    {
        float      topPlanetValue = 0f;
        PlanetData topPlanet      = null;

        foreach (PlanetData pData in civ.PlanetList) // determine the top value of each planet and choose the best one
        {
            if (pData != pop.PlanetLocated)
            {
                float currentPlanetValue = MigrationValueOfPlanet(pData, pop);
                if (currentPlanetValue > topPlanetValue)
                {
                    topPlanetValue = currentPlanetValue;
                    topPlanet      = pData;
                }
            }
        }

        if (topPlanetValue > Constants.Constants.StellarMigrationThreshold + UnityEngine.Random.Range(0, 200)) // if the best value is above a certain threshold
        {
            List <Region> eligibleRegionList = new List <Region>();
            foreach (Region rData in topPlanet.RegionList.ToArray())
            {
                if (rData.IsHabitable)
                {
                    eligibleRegionList.Add(rData);
                }
            }

            if (eligibleRegionList.Count > 0)
            {
                int regionChoice = UnityEngine.Random.Range(0, eligibleRegionList.Count); // find an eligible region

                // move the pop from one region on a planet to another planet and a suitable region
                string oldPlanetName = pop.PlanetLocated.Name;
                pop.IsMigratingOffPlanet = false; // reset the flag
                pop.RegionLocated.PopsInTile.Remove(pop);
                pop.RegionLocated.EmigratedLastTurn += 1;
                pop.RegionLocated.PopsInTile.TrimExcess();
                pop.RegionLocationID = eligibleRegionList[regionChoice].ID;
                pop.RegionLocated.PopsInTile.Add(pop);
                pop.RegionLocated.ImmigratedLastTurn += 1;
                pop.PlanetHappinessLevel              = 50; // reset planet happiness since they just moved
                Debug.Log("In " + gDataRef.GameDate.ToString("N1") + ", a " + pop.PopClass.ToString() + " migrated from " + oldPlanetName + " to " + topPlanet.Name + ".");
                topPlanet.MigratePopsBetweenRegions();      // rerun migration to move the pop to a more suitable region
            }
            else
            {
                pop.UnrestLevel += .05f; // can't leave
                pop.PopSupport  -= .05f; // and is pissed
            }
        }

        else
        {
            pop.UnrestLevel += .05f; // can't leave
            pop.PopSupport  -= .05f; // and is pissed
        }
    }
Exemplo n.º 2
0
 public PdxSublist GetPopData()
 {
     //if(Eu4Provinces.Count == 0)
     //{
     //	return null;
     //}
     return(Pops.GetData(this));
 }
Exemplo n.º 3
0
 private void InitializePops(IRace race, int num)
 {
     Pops.Clear();
     for (var i = 0; i < num; i++)
     {
         Pops.Add(new Pop(race));
     }
 }
Exemplo n.º 4
0
        [Fact] public void PopsDefaultToEmpty()
        {
            var reader = new BufferedReader("= { }");
            var pops   = new Pops();

            pops.LoadPops(reader);
            Assert.Empty(pops.StoredPops);
        }
Exemplo n.º 5
0
        public Pops CalcPopsFor2ChTypes(Icon icon, Dictionary <string, double> pbties)
        {
            Pops pops = new Pops();

            foreach (var pbty0 in pbties)
            {
                if (pbty0.Key.Contains(chTypes[0]))
                {
                    foreach (var pbty1 in pbties)
                    {
                        if (pbty1.Key.Contains(chTypes[1]))
                        {
                            stringBuilder.Clear();
                            stringBuilder.Append(pbty0.Key).Append(":").Append(pbty1.Key);

                            pops.Add(stringBuilder.ToString(), Convert.ToInt32(icon.Personnel * pbty0.Value * pbty1.Value));
                        }
                    }
                }
            }

            double pbtiesSum0 = 0;
            double pbtiesSum1 = 0;

            foreach (var pbty in pbties)
            {
                if (pbty.Key.Contains(chTypes[0]))
                {
                    pbtiesSum0 += pbty.Value;
                }
            }
            foreach (var pbty in pbties)
            {
                if (pbty.Key.Contains(chTypes[1]))
                {
                    pbtiesSum1 += pbty.Value;
                }
            }

            foreach (var pbty in pbties)
            {
                if (pbty.Key.Contains(chTypes[0]))
                {
                    pops.Add(pbty.Key, Convert.ToInt32(icon.Personnel * pbty.Value * (1 - pbtiesSum1)));
                }
            }

            foreach (var pbty in pbties)
            {
                if (pbty.Key.Contains(chTypes[1]))
                {
                    pops.Add(pbty.Key, Convert.ToInt32(icon.Personnel * pbty.Value * (1 - pbtiesSum0)));
                }
            }

            return(pops);
        }
Exemplo n.º 6
0
 private void CalcPopEffects(Dictionary <string, float> effects, Eu4ProvinceBase fromProvince)
 {
     foreach (PopType popType in Enum.GetValues(typeof(PopType)))
     {
         var name = Enum.GetName(typeof(PopType), popType);
         if (effects.ContainsKey(name))
         {
             Pops.AddPop(fromProvince, popType, (int)effects[name]);
         }
     }
 }
Exemplo n.º 7
0
 private void CalcRelativePopEffects(Dictionary <string, float> effects, Eu4ProvinceBase fromProvince)
 {
     foreach (PopType popType in Enum.GetValues(typeof(PopType)))
     {
         var name = Enum.GetName(typeof(PopType), popType);
         if (effects.ContainsKey("relative_" + name))
         {
             Pops.IncreaseJob(popType, effects["relative_" + name]);
         }
     }
 }
Exemplo n.º 8
0
        public Pops CalcPopsFor1ChTypes(Icon icon, Dictionary <string, double> pbties)
        {
            Pops pops = new Pops();

            foreach (var pbty in pbties)
            {
                pops.Add(pbty.Key, Convert.ToInt32(pbty.Value * icon.Personnel));
            }

            return(pops);
        }
Exemplo n.º 9
0
        public void PopsCanBeLoaded()
        {
            var reader = new BufferedReader("= {\n 42={}\n 43 = {}\n }");
            var pops   = new Pops();

            pops.LoadPops(reader);
            var pop1 = pops.StoredPops[42];
            var pop2 = pops.StoredPops[43];

            Assert.Equal(2, pops.StoredPops.Count);
            Assert.Equal((ulong)42, pop1.ID);
            Assert.Equal((ulong)43, pop2.ID);
        }
Exemplo n.º 10
0
        public void LiteralNonePopsAreNotLoaded()
        {
            var reader = new BufferedReader("= {\n 42=none\n 43={}\n 44=none\n }");
            var pops   = new Pops();

            pops.LoadPops(reader);
            Assert.Equal(1, pops.StoredPops.Count);
            Assert.False(pops.StoredPops.ContainsKey(42));
            Assert.True(pops.StoredPops.ContainsKey(43));
            Assert.False(pops.StoredPops.ContainsKey(44));
            var pop2 = pops.StoredPops[43];

            Assert.Equal((ulong)43, pop2.ID);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Gets a list of all cultures in the pool that have at least the threshhold as a proportion of the total population
        /// </summary>
        /// <param name="threshhold"></param>
        /// <returns></returns>
        public List <string> GetLargeCultures(float threshhold)
        {
            var cultures = new Dictionary <string, int>();

            foreach (var pop in pops)
            {
                if (!cultures.ContainsKey(pop.Value.Culture))
                {
                    cultures[pop.Value.Culture] = 0;
                }
                cultures[pop.Value.Culture] += pop.Value.Size;
            }
            var total = Pops.Sum(p => p.Size);

            return(cultures.Where(c => c.Value / (float)total >= threshhold).Select(c => c.Key).ToList());
        }
Exemplo n.º 12
0
        public void PostInitialise()
        {
            if (Eu4Provinces.Count > 0)
            {
                CalcEffects(World, SiblingProvinces, Eu4Provinces);

                var largeCultures = Pops.GetLargeCultures(0.4f);
                // TODO: dynamically create countries that don't have a primary nation in vic2
                foreach (var cul in largeCultures)
                {
                    World.CultureNations.KeyValuePairs.ForEach(cul, tag =>
                    {
                        Cores.Add(World.Vic2Countries.Find(c => c.CountryTag == tag) ?? new Vic2Country(World, tag, World.Cultures[cul]));
                    });
                    // add neoculture as accepted culture
                    if (World.V2Mapper.NeoCultures.ContainsKey(cul) && World.V2Mapper.NeoCultures[cul] == Owner?.PrimaryCulture)
                    {
                        if (!Owner.AcceptedCultures.Contains(cul))
                        {
                            Owner.AcceptedCultures.Add(cul);
                        }
                    }
                    if (World.Cultures[cul].PrimaryNation == null)
                    {
                        if (World.Cultures[cul].Group.Union == null)
                        {
                        }
                    }
                    else
                    {
                        Cores.Add(World.Cultures[cul].PrimaryNation);
                    }
                    if (World.Cultures[cul].Group.Union != null)
                    {
                        Cores.Add(World.Cultures[cul].Group.Union);
                    }
                }
            }
            //effects on owner
            if (Owner != null)
            {
                IterateEffects(World, World.CountryEffects.Sublists["province"], 1, Eu4Provinces, (effects, fromProvince) =>
                {
                    Owner.FromProvinceEffect(effects);
                });
            }
        }
Exemplo n.º 13
0
 private void Produce()
 {
     CarryIn(Pops.Select(pop => pop.Produce()).SelectMany(product => product));
 }
Exemplo n.º 14
0
    private float MigrationValueOfPlanet(PlanetData pData, Pops pop)
    {
        float planetValue = 0f;

        float FarmerJobsOnPlanet        = 0f;
        float MinerJobsOnPlanet         = 0f;
        float EngineerJobsOnPlanet      = 0f;
        float FluxmenJobsOnPlanet       = 0f;
        float AdministratorJobsOnPlanet = 0f;
        float ScientistJobsOnPlanet     = 0f;

        float releventJobsOnPlanet = 0f;

        foreach (Region rData in pData.RegionList)
        {
            FarmerJobsOnPlanet        += rData.FarmingLevel - rData.FarmsStaffed;
            MinerJobsOnPlanet         += rData.MiningLevel - rData.MinesStaffed;
            EngineerJobsOnPlanet      += rData.ManufacturingLevel - rData.FactoriesStaffed;
            FluxmenJobsOnPlanet       += rData.HighTechLevel - rData.HighTechFacilitiesStaffed;
            AdministratorJobsOnPlanet += rData.GovernmentLevel - rData.GovernmentFacilitiesStaffed;
            ScientistJobsOnPlanet     += rData.ScienceLevel - rData.LabsStaffed;
        }

        switch (pop.PopClass)
        {
        case Pops.ePopClass.Scientist:
            releventJobsOnPlanet = ScientistJobsOnPlanet;
            break;

        case Pops.ePopClass.Farmer:
            releventJobsOnPlanet = FarmerJobsOnPlanet;
            break;

        case Pops.ePopClass.Miner:
            releventJobsOnPlanet = MinerJobsOnPlanet;
            break;

        case Pops.ePopClass.Engineer:
            releventJobsOnPlanet = EngineerJobsOnPlanet;
            break;

        case Pops.ePopClass.Fluxmen:
            releventJobsOnPlanet = FluxmenJobsOnPlanet;
            break;

        case Pops.ePopClass.Merchants:
            break;

        case Pops.ePopClass.Administrators:
            releventJobsOnPlanet = AdministratorJobsOnPlanet;
            break;

        case Pops.ePopClass.None:
            break;

        default:
            break;
        }

        planetValue += (2500 - HelperFunctions.Formulas.MeasureDistanceBetweenSystems(pData.System, pop.PlanetLocated.System)) + pData.AdjustedBio + pData.BasePlanetValue + (releventJobsOnPlanet * 50);
        return(planetValue);
    }
Exemplo n.º 15
0
 private List <Pop> GetUnemployed()
 {
     return(Pops.Where(pop => pop.Workplace == null).ToList());
 }
Exemplo n.º 16
0
 public float CollectFaith()
 {
     return(Pops.Sum(pop => pop.Faith()));
 }
Exemplo n.º 17
0
        public void IncreaseJob(PopType popType, float relativeAmount)
        {
            var pops = SplitPops((int)(Pops.Sum(p => p.Size) * relativeAmount), Pops, c => c, r => r);

            pops.ForEach(AddPop);
        }
Exemplo n.º 18
0
 private List <Workplace> GetVacantWorkplaces()
 {
     return(GetWorkplaces().Where(ws => !Pops.Select(pop => pop.Workplace).Contains(ws)).ToList());
 }