Exemplo n.º 1
0
        public static void GetVoteChance(uint citizenID, Citizen citizen, uint homeID)
        {
            //如果即将选举,而且达到投票年龄 if (gonna be election) and (over Voting Age)
            if (Politics.IsOnElection() &&
                Politics.IsOverVotingAge(Citizen.GetAgeGroup(citizen.m_age)))
            {
                ////重置机率
                Politics.cPartyChance = 0;
                Politics.gPartyChance = 0;
                Politics.sPartyChance = 0;
                Politics.lPartyChance = 0;
                Politics.nPartyChance = 0;


                Politics.cPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 0] << 1);
                Politics.gPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 1] << 1);
                Politics.sPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 2] << 1);
                Politics.lPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 3] << 1);
                Politics.nPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 4] << 1);


                int choiceIndex = 14;
                //根据工作地点决定投票策略
                if (RealCityResidentAI.IsGoverment(citizen.m_workBuilding))
                {
                    choiceIndex = 0;
                }
                switch (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_subService)
                {
                case ItemClass.SubService.CommercialLow:
                case ItemClass.SubService.CommercialHigh:
                    if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1)
                    {
                        choiceIndex = 1;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2)
                    {
                        choiceIndex = 2;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3)
                    {
                        choiceIndex = 3;
                    }
                    break;

                case ItemClass.SubService.CommercialTourist:
                case ItemClass.SubService.CommercialLeisure:
                    choiceIndex = 4; break;

                case ItemClass.SubService.CommercialEco:
                    choiceIndex = 5; break;

                case ItemClass.SubService.IndustrialGeneric:
                    if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1)
                    {
                        choiceIndex = 6;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2)
                    {
                        choiceIndex = 7;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3)
                    {
                        choiceIndex = 8;
                    }
                    break;

                case ItemClass.SubService.IndustrialFarming:
                case ItemClass.SubService.IndustrialForestry:
                case ItemClass.SubService.IndustrialOil:
                case ItemClass.SubService.IndustrialOre:
                    choiceIndex = 9; break;

                case ItemClass.SubService.OfficeGeneric:
                    if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1)
                    {
                        choiceIndex = 10;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2)
                    {
                        choiceIndex = 11;
                    }
                    else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3)
                    {
                        choiceIndex = 12;
                    }
                    break;

                case ItemClass.SubService.OfficeHightech:
                    choiceIndex = 13; break;
                }
                if (choiceIndex < 0 || choiceIndex > 14)
                {
                    DebugLog.LogToFileOnly($"Error: GetVoteChance workplace idex {choiceIndex}");
                }
                Politics.cPartyChance += (ushort)(Politics.workplace[choiceIndex, 0] << 1);
                Politics.gPartyChance += (ushort)(Politics.workplace[choiceIndex, 1] << 1);
                Politics.sPartyChance += (ushort)(Politics.workplace[choiceIndex, 2] << 1);
                Politics.lPartyChance += (ushort)(Politics.workplace[choiceIndex, 3] << 1);
                Politics.nPartyChance += (ushort)(Politics.workplace[choiceIndex, 4] << 1);


                if (CitizenUnitData.familyMoney[homeID] < 5000)
                {
                    choiceIndex = 0;
                }
                else if (CitizenUnitData.familyMoney[homeID] >= 20000)
                {
                    choiceIndex = 2;
                }
                else
                {
                    choiceIndex = 1;
                }
                if (choiceIndex < 0 || choiceIndex > 3)
                {
                    DebugLog.LogToFileOnly($"Error: GetVoteChance Invaid money idex = {choiceIndex}");
                }
                Politics.cPartyChance += (ushort)(Politics.money[choiceIndex, 0] << 1);
                Politics.gPartyChance += (ushort)(Politics.money[choiceIndex, 1] << 1);
                Politics.sPartyChance += (ushort)(Politics.money[choiceIndex, 2] << 1);
                Politics.lPartyChance += (ushort)(Politics.money[choiceIndex, 3] << 1);
                Politics.nPartyChance += (ushort)(Politics.money[choiceIndex, 4] << 1);


                int temp = (int)Citizen.GetAgeGroup(citizen.m_age) - 2;
                if (temp < 0)
                {
                    DebugLog.LogToFileOnly($"Error: GetVoteChance temp = {temp} < 0, GetAgeGroup = {Citizen.GetAgeGroup(citizen.m_age)}");
                }
                Politics.cPartyChance += Politics.age[temp, 0];
                Politics.gPartyChance += Politics.age[temp, 1];
                Politics.sPartyChance += Politics.age[temp, 2];
                Politics.lPartyChance += Politics.age[temp, 3];
                Politics.nPartyChance += Politics.age[temp, 4];


                temp = (int)Citizen.GetGender(citizenID);
                Politics.cPartyChance += Politics.gender[temp, 0];
                Politics.gPartyChance += Politics.gender[temp, 1];
                Politics.sPartyChance += Politics.gender[temp, 2];
                Politics.lPartyChance += Politics.gender[temp, 3];
                Politics.nPartyChance += Politics.gender[temp, 4];


                if (RealCityEconomyExtension.partyTrend == 0)
                {
                    Politics.cPartyChance += RealCityEconomyExtension.partyTrendStrength;
                }
                else if (RealCityEconomyExtension.partyTrend == 1)
                {
                    Politics.gPartyChance += RealCityEconomyExtension.partyTrendStrength;
                }
                else if (RealCityEconomyExtension.partyTrend == 2)
                {
                    Politics.sPartyChance += RealCityEconomyExtension.partyTrendStrength;
                }
                else if (RealCityEconomyExtension.partyTrend == 3)
                {
                    Politics.lPartyChance += RealCityEconomyExtension.partyTrendStrength;
                }
                else if (RealCityEconomyExtension.partyTrend == 4)
                {
                    Politics.nPartyChance += RealCityEconomyExtension.partyTrendStrength;
                }
                else
                {
                    DebugLog.LogToFileOnly($"Error: GetVoteChance Invalid partyTrend = {RealCityEconomyExtension.partyTrend}");
                }
                GetVoteTickets();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 处理市民
        /// </summary>
        /// <param name="homeID"></param>
        /// <param name="data"></param>
        /// <param name="isPre"></param>
        public static void ProcessCitizen(uint homeID, ref CitizenUnit data, bool isPre)
        {
            FieldInfo fieldInfo;

            if (isPre)
            {
                CitizenUnitData.familyMoney[homeID] = 0;
                for (int i = 0; i <= 4; i++)
                {
                    fieldInfo = data.GetType().GetField($"m_citizen{i}");
                    uint m_citizenI = (uint)fieldInfo.GetValue(data);
                    if (m_citizenI != 0)
                    {
                        Citizen citizenData = Singleton <CitizenManager> .instance.m_citizens.m_buffer[m_citizenI];
                        if ((citizenData.m_flags & Citizen.Flags.MovingIn) == Citizen.Flags.None)
                        {
                            if (citizenData.Dead == false)
                            {
                                RealCityResidentAI.citizenCount++;
                                CitizenUnitData.familyMoney[homeID] += CitizenData.citizenMoney[m_citizenI];
                            }
                        }
                    }
                }
            }
            else
            {
                // post-process
                if (CitizenUnitData.familyMoney[homeID] < MainDataStore.lowWealth)
                {
                    RealCityResidentAI.familyWeightStableLow++;
                }
                else if (CitizenUnitData.familyMoney[homeID] >= MainDataStore.highWealth)
                {
                    RealCityResidentAI.familyWeightStableHigh++;
                }

                int temp = 0;
                for (int i = 0; i <= 4; i++)
                {
                    fieldInfo = data.GetType().GetField($"m_citizen{i}");
                    uint m_citizenI = (uint)fieldInfo.GetValue(data);

                    if (m_citizenI != 0)
                    {
                        Citizen citizenData = Singleton <CitizenManager> .instance.m_citizens.m_buffer[m_citizenI];
                        if (((citizenData.m_flags & Citizen.Flags.MovingIn) == Citizen.Flags.None) && (citizenData.Dead == false))
                        {
                            ++temp;
#if FASTRUN
#else
                            //add a party.chancce by its citizen data
                            //GetVoteChance(m_citizenI, citizenData, homeID);
                            if (Politics.IsOnElection() && Politics.IsOverVotingAge(Citizen.GetAgeGroup(citizenData.m_age)))
                            {
                                ElectionVoter v = new ElectionVoter(m_citizenI, ref citizenData, homeID, Election.CurrentElectionInfo);
                                v.VoteTicket();
                            }
#endif
                        }
                    }
                }

                if (temp != 0)
                {
                    for (int i = 0; i <= 4; i++)
                    {
                        fieldInfo = data.GetType().GetField($"m_citizen{i}");
                        uint m_citizenI = (uint)fieldInfo.GetValue(data);

                        if (m_citizenI != 0)
                        {
                            Citizen citizenData = Singleton <CitizenManager> .instance.m_citizens.m_buffer[m_citizenI];
                            if (((citizenData.m_flags & Citizen.Flags.MovingIn) == Citizen.Flags.None) && (citizenData.Dead == false))
                            {
                                CitizenData.citizenMoney[m_citizenI] = CitizenUnitData.familyMoney[homeID] / temp;
                            }
                        }
                    }
                }
            }
        }