public void PlayerAIWork() { if (this.HasPerson()) { int num; this.StopAllWork(); this.ReSortAllWeighingList(); bool isFundAbundant = this.IsFundAbundant; if (this.Fund < ((100 * this.AreaCount) + ((30 - base.Scenario.Date.Day) * this.FacilityMaintenanceCost))) { MilitaryList trainingMilitaryList = this.GetTrainingMilitaryList(); if (trainingMilitaryList.Count > 0) { trainingMilitaryList.IsNumber = true; trainingMilitaryList.PropertyName = "Weighing"; trainingMilitaryList.ReSort(); GameObjectList maxObjects = this.trainingPersons.GetMaxObjects(trainingMilitaryList.Count); for (num = 0; num < maxObjects.Count; num++) { this.AddPersonToTrainingWork(maxObjects[num] as Person, trainingMilitaryList[num] as Military); } } int num2 = 0; if (this.Kind.HasDomination && (this.Domination < (this.DominationCeiling * 0.8))) { num2++; } if (this.Kind.HasEndurance && (this.Endurance < (this.EnduranceCeiling * 0.2f))) { num2++; } if (this.Kind.HasMorale && (this.Morale < Parameters.RecruitmentMorale)) { num2++; } if (num2 > 0) { for (num = 0; num < (this.Persons.Count - trainingMilitaryList.Count); num += num2) { foreach (Person person in this.dominationPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToDominationWorkingList(person); break; } } foreach (Person person in this.endurancePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToEnduranceWorkingList(person); break; } } foreach (Person person in this.moralePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToMoraleWorkingList(person); break; } } } } } else if ((GameObject.Chance(20) || !this.HasBuildingRouteway) || this.IsFundEnough) { float num3; bool flag2 = this.HasHostileTroopsInView(); WorkRateList list3 = new WorkRateList(); if (flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) { if (!flag2 || !GameObject.Chance(80)) { if (this.Kind.HasAgriculture && (this.Agriculture < this.AgricultureCeiling)) { list3.AddWorkRate(new WorkRate(((float) this.Agriculture) / ((float) this.AgricultureCeiling), ArchitectureWorkKind.农业)); } if (this.Kind.HasCommerce && (this.Commerce < this.CommerceCeiling)) { list3.AddWorkRate(new WorkRate(((float) this.Commerce) / ((float) this.CommerceCeiling), ArchitectureWorkKind.商业)); } if (this.Kind.HasTechnology && (this.Technology < this.TechnologyCeiling)) { list3.AddWorkRate(new WorkRate(((float) this.Technology) / ((float) this.TechnologyCeiling), ArchitectureWorkKind.技术)); } } if (this.Kind.HasDomination && (this.Domination < this.DominationCeiling)) { list3.AddWorkRate(new WorkRate((((float) this.Domination) / 5f) / ((float) this.DominationCeiling), ArchitectureWorkKind.统治)); } if (this.Kind.HasMorale && (this.Morale < this.MoraleCeiling)) { list3.AddWorkRate(new WorkRate(((float) this.Morale) / ((float) this.MoraleCeiling), ArchitectureWorkKind.民心)); } if (this.Kind.HasEndurance && (this.Endurance < this.EnduranceCeiling)) { list3.AddWorkRate(new WorkRate(((float) this.Endurance) / ((float) this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } } MilitaryList list4 = this.GetTrainingMilitaryList(); if (list4.Count > 0) { if (flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.训练)); } else { num3 = 0f; foreach (Military military in list4) { num3 += ((float) military.TrainingWeighing) / ((float) military.MaxTrainingWeighing); } num3 /= (float) list4.Count; list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.训练)); } } MilitaryList recruitmentMilitaryList = null; if (((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) && (this.Kind.HasPopulation && (!GlobalVariables.PopulationRecruitmentLimit || (this.ArmyQuantity <= this.Population)))) && this.RecruitmentAvail()) { recruitmentMilitaryList = this.GetRecruitmentMilitaryList(); if ((this.ArmyScale < this.FewArmyScale) && flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if (((this.ArmyScale < this.FewArmyScale) && GameObject.Chance(5)) && this.IsFoodAbundant) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if ((((GameObject.Chance(1) && (this.ArmyScale >= this.LargeArmyScale)) && this.IsFoodAbundant) || ((((this.ArmyScale < this.LargeArmyScale) && this.IsFoodEnough) && (((this.IsImportant || (this.AreaCount > 2)) && (this.Population > this.Kind.PopulationBoundary)) || (((this.AreaCount <= 2) && !this.IsImportant) && (this.Population > (this.RecruitmentPopulationBoundary / 2))))) && GameObject.Chance(15))) && (GameObject.Random(Enum.GetNames(typeof(PersonStrategyTendency)).Length) >=(int) this.BelongedFaction.Leader.StrategyTendency)) { num3 = 0f; foreach (Military military in recruitmentMilitaryList) { num3 += ((float) military.RecruitmentWeighing) / ((float) military.MaxRecruitmentWeighing); } num3 /= (float) recruitmentMilitaryList.Count; list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.补充)); } } if (list3.Count > 0) { for (num = 0; num < this.Persons.Count; num += list3.Count) { foreach (WorkRate rate in list3.RateList) { switch (rate.workKind) { case ArchitectureWorkKind.农业: foreach (Person person in this.agriculturePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.AgricultureAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToAgricultureWorkingList(person); break; } } break; case ArchitectureWorkKind.商业: foreach (Person person in this.commercePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.CommerceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToCommerceWorkingList(person); break; } } break; case ArchitectureWorkKind.技术: foreach (Person person in this.technologyPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.TechnologyAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToTechnologyWorkingList(person); break; } } break; case ArchitectureWorkKind.统治: foreach (Person person in this.dominationPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.DominationAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToDominationWorkingList(person); break; } } break; case ArchitectureWorkKind.民心: foreach (Person person in this.moralePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.MoraleAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToMoraleWorkingList(person); break; } } break; case ArchitectureWorkKind.耐久: foreach (Person person in this.endurancePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.EnduranceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToEnduranceWorkingList(person); break; } } break; case ArchitectureWorkKind.训练: foreach (Person person in this.trainingPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { foreach (Military military in list4.GetRandomList()) { if (military.RecruitmentPersonID < 0) { this.AddPersonToTrainingWork(person, military); break; } } break; } } break; case ArchitectureWorkKind.补充: foreach (Person person in this.recruitmentPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.RecruitmentAbility >= 120))) { if (recruitmentMilitaryList != null) { foreach (Military military in recruitmentMilitaryList.GetRandomList()) { if (military.TrainingPersonID < 0) { this.AddPersonToRecuitmentWork(person, military); break; } } } break; } } break; } } } } } } }
private void AIWork(bool forPlayer) { if (!forPlayer) { this.AIAutoHire(); } this.StopAllWork(); //if (this.HasBuildingRouteway) return; PersonList zhenzaiPersons = new PersonList(); PersonList agriculturePersons = new PersonList(); PersonList commercePersons = new PersonList(); PersonList technologyPersons = new PersonList(); PersonList dominationPersons = new PersonList(); PersonList moralePersons = new PersonList(); PersonList endurancePersons = new PersonList(); PersonList trainingPersons = new PersonList(); PersonList recruitmentPersons = new PersonList(); MilitaryList weighingMilitaries = new MilitaryList(); //if ((forPlayer || ((this.PlanArchitecture == null) || GameObject.Chance(10))) && this.HasPerson()) if (this.HasPerson()) { int num; this.ReSortAllWeighingList(zhenzaiPersons, agriculturePersons, commercePersons, technologyPersons, dominationPersons, moralePersons, endurancePersons, recruitmentPersons, trainingPersons, weighingMilitaries); bool isFundAbundant = this.IsFundAbundant; float num3; bool recentlyAttacked = this.RecentlyAttacked > 0; WorkRateList rates = new WorkRateList(); if (this.Fund < Parameters.InternalFundCost) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.训练)); } if (rates.Count <= 0) { if (this.Endurance < 30 && !this.HasHostileTroopsInArchitecture()) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.耐久)); } } if (rates.Count <= 0) { if (this.IsNetLosingPopulation) { if (this.Domination < this.DominationCeiling) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.统治)); } if (this.Morale < this.MoraleCeiling) { rates.AddWorkRate(new WorkRate(1, ArchitectureWorkKind.民心)); } if (this.kezhenzai() && this.IsFoodEnough && this.IsFundEnough) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.赈灾)); } } } if (rates.Count <= 0) { if (this.kezhenzai() && this.IsFoodEnough && this.IsFundEnough) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.赈灾)); } if (!this.IsFundIncomeEnough && this.Commerce < this.CommerceCeiling) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.商业)); } if (!this.IsFoodIncomeEnough && this.Agriculture < this.AgricultureCeiling) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.农业)); } } MilitaryList trainingMilitary = this.GetTrainingMilitaryList(); MilitaryList recruitmentMilitaryList = null; if (rates.Count <= 0) { if ((recentlyAttacked || (this.BelongedFaction.PlanTechniqueArchitecture != this)) || GameObject.Chance(20)) { if (!recentlyAttacked || !GameObject.Chance(80)) { if (this.kezhenzai() && this.IsFundEnough && this.IsFoodEnough) { rates.AddWorkRate(new WorkRate(0, ArchitectureWorkKind.赈灾)); } if (this.Kind.HasAgriculture && (this.Agriculture < this.AgricultureCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueAgriculture) { rates.AddWorkRate(new WorkRate((((float)this.Agriculture) / 4f) / ((float)this.AgricultureCeiling), ArchitectureWorkKind.农业)); } else { rates.AddWorkRate(new WorkRate(((float)this.Agriculture) / ((float)this.AgricultureCeiling), ArchitectureWorkKind.农业)); } } if (this.Kind.HasCommerce && (this.Commerce < this.CommerceCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueCommerce) { rates.AddWorkRate(new WorkRate((((float)this.Commerce) / 4f) / ((float)this.CommerceCeiling), ArchitectureWorkKind.商业)); } else { rates.AddWorkRate(new WorkRate(((float)this.Commerce) / ((float)this.CommerceCeiling), ArchitectureWorkKind.商业)); } } if (this.Kind.HasTechnology && (this.Technology < this.TechnologyCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueTechnology || (GameObject.Chance(50) && (this.IsStateAdmin || this.IsRegionCore))) { rates.AddWorkRate(new WorkRate((((float)this.Technology) / 4f) / ((float)this.TechnologyCeiling), ArchitectureWorkKind.技术)); } else { rates.AddWorkRate(new WorkRate(((float)this.Technology) / ((float)this.TechnologyCeiling), ArchitectureWorkKind.技术)); } } } if (this.Kind.HasDomination && (this.Domination < this.DominationCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueDomination) { rates.AddWorkRate(new WorkRate(((((float)this.Domination) / 5f) / 4f) / ((float)this.DominationCeiling), ArchitectureWorkKind.统治)); } else { rates.AddWorkRate(new WorkRate((((float)this.Domination) / 5f) / ((float)this.DominationCeiling), ArchitectureWorkKind.统治)); } } if (this.Kind.HasMorale && (this.Morale < this.MoraleCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueMorale) { rates.AddWorkRate(new WorkRate((((float)this.Morale) / 4f) / ((float)this.MoraleCeiling), ArchitectureWorkKind.民心)); } else { rates.AddWorkRate(new WorkRate(((float)this.Morale) / ((float)this.MoraleCeiling), ArchitectureWorkKind.民心)); } } if (this.Kind.HasEndurance && (this.Endurance < this.EnduranceCeiling) && !this.HasHostileTroopsInArchitecture()) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueEndurance) { rates.AddWorkRate(new WorkRate((((float)this.Endurance) / 4f) / ((float)this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } else { rates.AddWorkRate(new WorkRate(((float)this.Endurance) / ((float)this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } } } if (trainingMilitary.Count > 0) { if (recentlyAttacked || !this.IsFundEnough) { rates.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.训练)); } else { num3 = 0f; foreach (Military military in trainingMilitary) { num3 += ((float)military.TrainingWeighing) / ((float)military.MaxTrainingWeighing); } num3 /= (float)trainingMilitary.Count; if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueTraining) { rates.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.训练)); } else { rates.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.训练)); } } } if (!this.IsNetLosingPopulation && this.IsFundEnough) { if (((recentlyAttacked || (this.BelongedFaction.PlanTechniqueArchitecture != this)) && this.Kind.HasPopulation) && ((recentlyAttacked || (GameObject.Random(GameObject.Square(((int)this.BelongedFaction.Leader.StrategyTendency) + 1)) == 0)) && this.RecruitmentAvail())) { bool lotsOfPopulation = GameObject.Chance((int)((((((float)this.Population) / ((float)this.PopulationCeiling)) * 100f) - 50f) * 2.5)); recruitmentMilitaryList = this.GetRecruitmentMilitaryList(); if (this.ArmyScale < this.FewArmyScale) { rates.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if ((((this.IsFoodEnough && (((this.IsImportant || (this.AreaCount > 2)) && (this.Population > this.Kind.PopulationBoundary)) || (((this.AreaCount <= 2) && !this.IsImportant) && (this.Population > (this.RecruitmentPopulationBoundary / 2))) || (this.ValueWater && this.HasShuijunMilitaryKind() && this.Population > 10000)) ) && (/*((this.BelongedSection != null && this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(60)) || GameObject.Chance(15)) &&*/ (GameObject.Random(Enum.GetNames(typeof(PersonStrategyTendency)).Length) >= (int)this.BelongedFaction.Leader.StrategyTendency))) || lotsOfPopulation) ) { bool nearFrontline = this.FrontLine || this.HostileLine || this.noFactionFrontline; if (!nearFrontline) { foreach (LinkNode a in this.AIAllLinkNodes.Values) { if (a.Level <= 1 && (a.A.FrontLine || a.A.HostileLine || a.A.noFactionFrontline) && !a.A.Kind.HasPopulation) { nearFrontline = true; break; } } } if ((this.ExpectedMilitaryPopulation - this.MilitaryPopulation <= this.PopulationDevelopingRate * this.PopulationCeiling * Parameters.AIRecruitPopulationCapMultiply * (nearFrontline ? 1.0 : Parameters.AIRecruitPopulationCapBackendMultiply) * (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueRecruitment ? 1.5 : 1) * (((Enum.GetNames(typeof(PersonStrategyTendency)).Length - (int)this.BelongedFaction.Leader.StrategyTendency)) * Parameters.AIRecruitPopulationCapStrategyTendencyMulitply + Parameters.AIRecruitPopulationCapStrategyTendencyAdd) * (this.HostileLine ? Parameters.AIRecruitPopulationCapHostilelineMultiply : 1)) || lotsOfPopulation) { num3 = 0f; foreach (Military military in recruitmentMilitaryList) { num3 += ((float)military.RecruitmentWeighing) / ((float)military.MaxRecruitmentWeighing); } num3 /= (float)recruitmentMilitaryList.Count; if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueRecruitment) { rates.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.补充)); } else { rates.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.补充)); } } } } } } if (rates.Count > 0) { for (num = 0; num < this.Persons.Count; num += rates.Count) { foreach (WorkRate rate in rates.RateList) { switch (rate.workKind) { case ArchitectureWorkKind.农业: foreach (Person person in agriculturePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.AgricultureAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.农业; break; } } break; case ArchitectureWorkKind.商业: foreach (Person person in commercePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.CommerceAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.商业; break; } } break; case ArchitectureWorkKind.技术: foreach (Person person in technologyPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.TechnologyAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.技术; break; } } break; case ArchitectureWorkKind.统治: foreach (Person person in dominationPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.DominationAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.统治; break; } } break; case ArchitectureWorkKind.民心: foreach (Person person in moralePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.MoraleAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.民心; break; } } break; case ArchitectureWorkKind.耐久: foreach (Person person in endurancePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.EnduranceAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.耐久; break; } } break; case ArchitectureWorkKind.赈灾: foreach (Person person in zhenzaiPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.zhenzaiAbility >= (120 + (this.AreaCount * 5))))) { person.WorkKind = ArchitectureWorkKind.赈灾; break; } } break; case ArchitectureWorkKind.训练: foreach (Person person in trainingPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { trainingMilitary.PropertyName = "Merit"; trainingMilitary.IsNumber = true; trainingMilitary.SmallToBig = false; trainingMilitary.ReSort(); foreach (Military military in trainingMilitary) { if (military.RecruitmentPerson == null) { person.WorkKind = ArchitectureWorkKind.训练; break; } } break; } } break; case ArchitectureWorkKind.补充: foreach (Person person in recruitmentPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.RecruitmentAbility >= 120))) { if (recruitmentMilitaryList != null) { //recruit transports first bool recruited = false; foreach (Military military in recruitmentMilitaryList) { if (military.IsTransport) { person.RecruitMilitary(military); recruited = true; break; } } if (!recruited) { //if no transports, recruit other kind recruitmentMilitaryList.PropertyName = "Merit"; recruitmentMilitaryList.IsNumber = true; recruitmentMilitaryList.SmallToBig = false; recruitmentMilitaryList.ReSort(); foreach (Military military in recruitmentMilitaryList) { if (military.RecruitmentPerson == null) { person.RecruitMilitary(military); break; } } } } break; } } break; } } } } if (!forPlayer) { this.AIRecruitMilitary(); } } }
private void AIWork() { this.AIAutoHire(); this.StopAllWork(); if (((this.PlanArchitecture == null) || GameObject.Chance(10)) && this.HasPerson()) { int num; this.ReSortAllWeighingList(); bool isFundAbundant = this.IsFundAbundant; if (this.Fund < ((100 * this.AreaCount) + ((30 - base.Scenario.Date.Day) * this.FacilityMaintenanceCost))) { MilitaryList trainingMilitaryList = this.GetTrainingMilitaryList(); if (trainingMilitaryList.Count > 0) { trainingMilitaryList.IsNumber = true; trainingMilitaryList.PropertyName = "Weighing"; trainingMilitaryList.ReSort(); GameObjectList maxObjects = this.trainingPersons.GetMaxObjects(trainingMilitaryList.Count); for (num = 0; num < maxObjects.Count; num++) { this.AddPersonToTrainingWork(maxObjects[num] as Person, trainingMilitaryList[num] as Military); } } int num2 = 0; if ((GameObject.Chance(50) && this.Kind.HasDomination) && (this.Domination < (this.DominationCeiling * 0.8))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasEndurance) && (this.Endurance < (this.EnduranceCeiling * 0.2f))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasMorale) && (this.Morale < Parameters.RecruitmentMorale)) { num2++; } if (num2 > 0) { for (num = 0; num < (this.Persons.Count - trainingMilitaryList.Count); num += num2) { foreach (Person person in this.dominationPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToDominationWorkingList(person); break; } } foreach (Person person in this.endurancePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToEnduranceWorkingList(person); break; } } foreach (Person person in this.moralePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToMoraleWorkingList(person); break; } } } } } else if ((GameObject.Chance(20) || !this.HasBuildingRouteway) || this.IsFundEnough) { float num3; bool flag2 = this.RecentlyAttacked > 0; WorkRateList list3 = new WorkRateList(); if ((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) || GameObject.Chance(20)) { if (!flag2 || !GameObject.Chance(80)) { if (this.Kind.HasAgriculture && (this.Agriculture < this.AgricultureCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueAgriculture) { list3.AddWorkRate(new WorkRate((((float)this.Agriculture) / 4f) / ((float)this.AgricultureCeiling), ArchitectureWorkKind.农业)); } else { list3.AddWorkRate(new WorkRate(((float)this.Agriculture) / ((float)this.AgricultureCeiling), ArchitectureWorkKind.农业)); } } if (this.Kind.HasCommerce && (this.Commerce < this.CommerceCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueCommerce) { list3.AddWorkRate(new WorkRate((((float)this.Commerce) / 4f) / ((float)this.CommerceCeiling), ArchitectureWorkKind.商业)); } else { list3.AddWorkRate(new WorkRate(((float)this.Commerce) / ((float)this.CommerceCeiling), ArchitectureWorkKind.商业)); } } if (this.Kind.HasTechnology && (this.Technology < this.TechnologyCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueTechnology || (GameObject.Chance(50) && (this.IsStateAdmin || this.IsRegionCore))) { list3.AddWorkRate(new WorkRate((((float)this.Technology) / 4f) / ((float)this.TechnologyCeiling), ArchitectureWorkKind.技术)); } else { list3.AddWorkRate(new WorkRate(((float)this.Technology) / ((float)this.TechnologyCeiling), ArchitectureWorkKind.技术)); } } } if (this.Kind.HasDomination && (this.Domination < this.DominationCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueDomination) { list3.AddWorkRate(new WorkRate(((((float)this.Domination) / 5f) / 4f) / ((float)this.DominationCeiling), ArchitectureWorkKind.统治)); } else { list3.AddWorkRate(new WorkRate((((float)this.Domination) / 5f) / ((float)this.DominationCeiling), ArchitectureWorkKind.统治)); } } if (this.Kind.HasMorale && (this.Morale < this.MoraleCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueMorale) { list3.AddWorkRate(new WorkRate((((float)this.Morale) / 4f) / ((float)this.MoraleCeiling), ArchitectureWorkKind.民心)); } else { list3.AddWorkRate(new WorkRate(((float)this.Morale) / ((float)this.MoraleCeiling), ArchitectureWorkKind.民心)); } } if (this.Kind.HasEndurance && (this.Endurance < this.EnduranceCeiling)) { if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueEndurance) { list3.AddWorkRate(new WorkRate((((float)this.Endurance) / 4f) / ((float)this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } else { list3.AddWorkRate(new WorkRate(((float)this.Endurance) / ((float)this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } } } MilitaryList list4 = this.GetTrainingMilitaryList(); if (list4.Count > 0) { if (flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.训练)); } else { num3 = 0f; foreach (Military military in list4) { num3 += ((float)military.TrainingWeighing) / ((float)military.MaxTrainingWeighing); } num3 /= (float)list4.Count; if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueTraining) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.训练)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.训练)); } } } MilitaryList recruitmentMilitaryList = null; if (((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) && this.Kind.HasPopulation) && ((flag2 || (GameObject.Random(GameObject.Square(((int)this.BelongedFaction.Leader.StrategyTendency) + 1)) == 0)) && this.RecruitmentAvail())) { recruitmentMilitaryList = this.GetRecruitmentMilitaryList(); if (this.ArmyScale < this.FewArmyScale) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if (((this.IsFoodEnough && (((this.IsImportant || (this.AreaCount > 2)) && (this.Population > this.Kind.PopulationBoundary)) || (((this.AreaCount <= 2) && !this.IsImportant) && (this.Population > (this.RecruitmentPopulationBoundary / 2))))) && (((this.BelongedSection != null && this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(60)) || GameObject.Chance(15)) && (GameObject.Random(Enum.GetNames(typeof(PersonStrategyTendency)).Length) >= (int)this.BelongedFaction.Leader.StrategyTendency))) || GameObject.Chance(((int)(((((float)this.Population) / ((float)this.PopulationCeiling)) * 100f) - 50f)) * 2)) { num3 = 0f; foreach (Military military in recruitmentMilitaryList) { num3 += ((float)military.RecruitmentWeighing) / ((float)military.MaxRecruitmentWeighing); } num3 /= (float)recruitmentMilitaryList.Count; if (this.BelongedSection != null && this.BelongedSection.AIDetail.ValueRecruitment) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.补充)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.补充)); } } } if (list3.Count > 0) { for (num = 0; num < this.Persons.Count; num += list3.Count) { foreach (WorkRate rate in list3.RateList) { switch (rate.workKind) { case ArchitectureWorkKind.农业: foreach (Person person in this.agriculturePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.AgricultureAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToAgricultureWorkingList(person); break; } } break; case ArchitectureWorkKind.商业: foreach (Person person in this.commercePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.CommerceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToCommerceWorkingList(person); break; } } break; case ArchitectureWorkKind.技术: foreach (Person person in this.technologyPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.TechnologyAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToTechnologyWorkingList(person); break; } } break; case ArchitectureWorkKind.统治: foreach (Person person in this.dominationPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.DominationAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToDominationWorkingList(person); break; } } break; case ArchitectureWorkKind.民心: foreach (Person person in this.moralePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.MoraleAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToMoraleWorkingList(person); break; } } break; case ArchitectureWorkKind.耐久: foreach (Person person in this.endurancePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.EnduranceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToEnduranceWorkingList(person); break; } } break; case ArchitectureWorkKind.训练: foreach (Person person in this.trainingPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { foreach (Military military in list4.GetRandomList()) { if (military.RecruitmentPersonID < 0) { this.AddPersonToTrainingWork(person, military); break; } } break; } } break; case ArchitectureWorkKind.补充: foreach (Person person in this.recruitmentPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.RecruitmentAbility >= 120))) { if (recruitmentMilitaryList != null) { foreach (Military military in recruitmentMilitaryList.GetRandomList()) { if (military.TrainingPersonID < 0) { this.AddPersonToRecuitmentWork(person, military); break; } } } break; } } break; } } } } if ((this.Kind.HasPopulation && (flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this))) && (flag2 || (this.Population > ((this.RecruitmentPopulationBoundary * (0.5f + ((Enum.GetNames(typeof(PersonStrategyTendency)).Length - (int)this.BelongedFaction.Leader.StrategyTendency) * 0.5f))) + GameObject.Random(this.RecruitmentPopulationBoundary))))) { int unfullArmyCount = 0; foreach (Military military in this.Militaries) { if (military.Scales < ((((float)military.Kind.MaxScale) / ((float)military.Kind.MinScale)) * 0.75f)) { unfullArmyCount++; } } int unfullArmyCountThreshold; if (this.IsFoodAbundant && this.IsFundAbundant) { unfullArmyCountThreshold = Math.Min(Math.Max(0, this.Population / 2 / this.RecruitmentPopulationBoundary) + 1, this.PersonCount / 5 + 1); } else { unfullArmyCountThreshold = 1; } if (unfullArmyCount < unfullArmyCountThreshold) { this.AIRecruitment(false); } if ((this.ValueWater && !this.HasShuijun()) && this.HasShuijunMilitaryKind()) { this.AIRecruitment(true); } } if (this.TransferFoodArchitecture != null) { //find the military team Military transportTeam = null; foreach (Military m in Militaries) { if (m.Kind.ID == 29 && (transportTeam == null || transportTeam.Quantity <= m.Quantity) && m.Quantity <= m.Kind.MaxScale) { transportTeam = m; } } if (transportTeam != null) { //select an idle person to do the recruit Person recruitTransportPerson = null; foreach (Person p in this.Persons) { if (p.WorkKind == ArchitectureWorkKind.无) { recruitTransportPerson = p; } } //if no idling person, select the lowest work ability if (recruitTransportPerson == null) { int min = int.MaxValue; foreach (Person p in this.Persons) { if (p.WorkAbility < min) { recruitTransportPerson = p; min = p.WorkAbility; } } } if ((((this.Population != 0) && (!GlobalVariables.PopulationRecruitmentLimit || (this.ArmyQuantity <= this.Population))) && ((this.Fund >= (Parameters.RecruitmentFundCost * this.AreaCount)) && (this.Domination >= Parameters.RecruitmentDomination))) && (((this.Morale >= Parameters.RecruitmentMorale) && ((transportTeam.RecruitmentPerson != null) && (transportTeam.RecruitmentPerson.BelongedFaction != null))) && (transportTeam.Quantity < transportTeam.Kind.MaxScale))) { this.AddPersonToRecuitmentWork(recruitTransportPerson, transportTeam); } } } else { //disband unused transports except one MilitaryList ml = new MilitaryList(); foreach (Military m in Militaries) { if (m.Kind.ID == 29) { ml.Add(m); } } if (ml.Count > 1) { Military minTroop = null; int min = int.MaxValue; foreach (Military m in ml) { if (m.Quantity < min) { min = m.Quantity; minTroop = m; } } this.DisbandMilitary(minTroop); } } } } }
private void AIWork() { this.AIAutoHire(); this.StopAllWork(); if (((this.PlanArchitecture == null) || GameObject.Chance(10)) && this.HasPerson()) { int num; this.ReSortAllWeighingList(); bool isFundAbundant = this.IsFundAbundant; if (this.Fund < ((100 * this.AreaCount) + ((30 - base.Scenario.Date.Day) * this.FacilityMaintenanceCost))) { MilitaryList trainingMilitaryList = this.GetTrainingMilitaryList(); if (trainingMilitaryList.Count > 0) { trainingMilitaryList.IsNumber = true; trainingMilitaryList.PropertyName = "Weighing"; trainingMilitaryList.ReSort(); GameObjectList maxObjects = this.trainingPersons.GetMaxObjects(trainingMilitaryList.Count); for (num = 0; num < maxObjects.Count; num++) { this.AddPersonToTrainingWork(maxObjects[num] as Person, trainingMilitaryList[num] as Military); } } int num2 = 0; if ((GameObject.Chance(50) && this.Kind.HasDomination) && (this.Domination < (this.DominationCeiling * 0.8))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasEndurance) && (this.Endurance < (this.EnduranceCeiling * 0.2f))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasMorale) && (this.Morale < Parameters.RecruitmentMorale)) { num2++; } if (num2 > 0) { for (num = 0; num < (this.Persons.Count - trainingMilitaryList.Count); num += num2) { foreach (Person person in this.dominationPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToDominationWorkingList(person); break; } } foreach (Person person in this.endurancePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToEnduranceWorkingList(person); break; } } foreach (Person person in this.moralePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToMoraleWorkingList(person); break; } } } } } else if ((GameObject.Chance(20) || !this.HasBuildingRouteway) || this.IsFundEnough) { float num3; bool flag2 = this.RecentlyAttacked > 0; WorkRateList list3 = new WorkRateList(); if ((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) || GameObject.Chance(20)) { if (!flag2 || !GameObject.Chance(80)) { if (this.Kind.HasAgriculture && (this.Agriculture < this.AgricultureCeiling)) { if (this.BelongedSection.AIDetail.ValueAgriculture) { list3.AddWorkRate(new WorkRate((((float) this.Agriculture) / 4f) / ((float) this.AgricultureCeiling), ArchitectureWorkKind.农业)); } else { list3.AddWorkRate(new WorkRate(((float) this.Agriculture) / ((float) this.AgricultureCeiling), ArchitectureWorkKind.农业)); } } if (this.Kind.HasCommerce && (this.Commerce < this.CommerceCeiling)) { if (this.BelongedSection.AIDetail.ValueCommerce) { list3.AddWorkRate(new WorkRate((((float) this.Commerce) / 4f) / ((float) this.CommerceCeiling), ArchitectureWorkKind.商业)); } else { list3.AddWorkRate(new WorkRate(((float) this.Commerce) / ((float) this.CommerceCeiling), ArchitectureWorkKind.商业)); } } if (this.Kind.HasTechnology && (this.Technology < this.TechnologyCeiling)) { if (this.BelongedSection.AIDetail.ValueTechnology || (GameObject.Chance(50) && (this.IsStateAdmin || this.IsRegionCore))) { list3.AddWorkRate(new WorkRate((((float) this.Technology) / 4f) / ((float) this.TechnologyCeiling), ArchitectureWorkKind.技术)); } else { list3.AddWorkRate(new WorkRate(((float) this.Technology) / ((float) this.TechnologyCeiling), ArchitectureWorkKind.技术)); } } } if (this.Kind.HasDomination && (this.Domination < this.DominationCeiling)) { if (this.BelongedSection.AIDetail.ValueDomination) { list3.AddWorkRate(new WorkRate(((((float) this.Domination) / 5f) / 4f) / ((float) this.DominationCeiling), ArchitectureWorkKind.统治)); } else { list3.AddWorkRate(new WorkRate((((float) this.Domination) / 5f) / ((float) this.DominationCeiling), ArchitectureWorkKind.统治)); } } if (this.Kind.HasMorale && (this.Morale < this.MoraleCeiling)) { if (this.BelongedSection.AIDetail.ValueMorale) { list3.AddWorkRate(new WorkRate((((float) this.Morale) / 4f) / ((float) this.MoraleCeiling), ArchitectureWorkKind.民心)); } else { list3.AddWorkRate(new WorkRate(((float) this.Morale) / ((float) this.MoraleCeiling), ArchitectureWorkKind.民心)); } } if (this.Kind.HasEndurance && (this.Endurance < this.EnduranceCeiling)) { if (this.BelongedSection.AIDetail.ValueEndurance) { list3.AddWorkRate(new WorkRate((((float) this.Endurance) / 4f) / ((float) this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } else { list3.AddWorkRate(new WorkRate(((float) this.Endurance) / ((float) this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } } } MilitaryList list4 = this.GetTrainingMilitaryList(); if (list4.Count > 0) { if (flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.训练)); } else { num3 = 0f; foreach (Military military in list4) { num3 += ((float) military.TrainingWeighing) / ((float) military.MaxTrainingWeighing); } num3 /= (float) list4.Count; if (this.BelongedSection.AIDetail.ValueTraining) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.训练)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.训练)); } } } MilitaryList recruitmentMilitaryList = null; if (((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) && this.Kind.HasPopulation) && ((flag2 || (GameObject.Random(GameObject.Square(((int) this.BelongedFaction.Leader.StrategyTendency) + 1)) == 0)) && this.RecruitmentAvail())) { recruitmentMilitaryList = this.GetRecruitmentMilitaryList(); if ((this.ArmyScale < this.FewArmyScale) && flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if (((this.ArmyScale < this.FewArmyScale) && ((this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(20)) || GameObject.Chance(5))) && this.IsFoodAbundant) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } else if ((((GameObject.Chance(1) || (this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(5))) && ((this.ArmyScale >= this.LargeArmyScale) && this.IsFoodAbundant)) || ((((this.ArmyScale < this.LargeArmyScale) && this.IsFoodEnough) && (((this.IsImportant || (this.AreaCount > 2)) && (this.Population > this.Kind.PopulationBoundary)) || (((this.AreaCount <= 2) && !this.IsImportant) && (this.Population > (this.RecruitmentPopulationBoundary / 2))))) && ((this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(60)) || GameObject.Chance(15)))) && (GameObject.Random(Enum.GetNames(typeof(PersonStrategyTendency)).Length) >=(int) this.BelongedFaction.Leader.StrategyTendency)) { num3 = 0f; foreach (Military military in recruitmentMilitaryList) { num3 += ((float) military.RecruitmentWeighing) / ((float) military.MaxRecruitmentWeighing); } num3 /= (float) recruitmentMilitaryList.Count; if (this.BelongedSection.AIDetail.ValueRecruitment) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.补充)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.补充)); } } } if (list3.Count > 0) { for (num = 0; num < this.Persons.Count; num += list3.Count) { foreach (WorkRate rate in list3.RateList) { switch (rate.workKind) { case ArchitectureWorkKind.农业: foreach (Person person in this.agriculturePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.AgricultureAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToAgricultureWorkingList(person); break; } } break; case ArchitectureWorkKind.商业: foreach (Person person in this.commercePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.CommerceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToCommerceWorkingList(person); break; } } break; case ArchitectureWorkKind.技术: foreach (Person person in this.technologyPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.TechnologyAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToTechnologyWorkingList(person); break; } } break; case ArchitectureWorkKind.统治: foreach (Person person in this.dominationPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.DominationAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToDominationWorkingList(person); break; } } break; case ArchitectureWorkKind.民心: foreach (Person person in this.moralePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.MoraleAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToMoraleWorkingList(person); break; } } break; case ArchitectureWorkKind.耐久: foreach (Person person in this.endurancePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.EnduranceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToEnduranceWorkingList(person); break; } } break; case ArchitectureWorkKind.训练: foreach (Person person in this.trainingPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { foreach (Military military in list4.GetRandomList()) { if (military.RecruitmentPersonID < 0) { this.AddPersonToTrainingWork(person, military); break; } } break; } } break; case ArchitectureWorkKind.补充: foreach (Person person in this.recruitmentPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.RecruitmentAbility >= 120))) { if (recruitmentMilitaryList != null) { foreach (Military military in recruitmentMilitaryList.GetRandomList()) { if (military.TrainingPersonID < 0) { this.AddPersonToRecuitmentWork(person, military); break; } } } break; } } break; } } } } if (this.Kind.HasPopulation && (flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this))) { if (((!flag2 && !this.BelongedSection.AIDetail.ValueNewMilitary) && !GameObject.Chance(10)) || (this.ArmyScale >= this.LargeArmyScale)) { MilitaryList list6 = new MilitaryList(); foreach (Military military in this.Militaries) { if ((((military.Scales < 15) && (military.Quantity > 0)) && (military.Morale < (military.MoraleCeiling / 2))) && ((military.Kind.PointsPerSoldier <= 1) && (this.BelongedFaction.TechniquePoint > (military.Quantity * (military.Kind.PointsPerSoldier + 1))))) { list6.Add(military); } } foreach (Military military in list6) { this.DisbandMilitary(military); } } else if (((this.Population > this.RecruitmentPopulationBoundary) || flag2) || ((this.Population >= 10000) && GameObject.Chance(5))) { bool flag3 = true; foreach (Military military in this.Militaries) { if (military.Scales < 15) { flag3 = false; break; } } if (flag3) { this.AIRecruitment(false); } else if ((this.ValueWater && !this.HasShuijun()) && this.HasShuijunMilitaryKind()) { this.AIRecruitment(true); } } } } } }
private void AIWork() { this.AIAutoHire(); //reset all work this.StopAllWork(); if (((this.PlanArchitecture == null) || GameObject.Chance(10)) && this.HasPerson()) { int num; this.ReSortAllWeighingList(); bool isFundAbundant = this.IsFundAbundant; //if not enough fund, if (this.Fund < ((100 * this.AreaCount) + ((30 - base.Scenario.Date.Day) * this.FacilityMaintenanceCost))) { //do training MilitaryList trainingMilitaryList = this.GetTrainingMilitaryList(); if (trainingMilitaryList.Count > 0) { trainingMilitaryList.IsNumber = true; trainingMilitaryList.PropertyName = "Weighing"; trainingMilitaryList.ReSort(); GameObjectList maxObjects = this.trainingPersons.GetMaxObjects(trainingMilitaryList.Count); for (num = 0; num < maxObjects.Count; num++) { this.AddPersonToTrainingWork(maxObjects[num] as Person, trainingMilitaryList[num] as Military); } } //and for some chance, do domination, endurance and morale only int num2 = 0; if ((GameObject.Chance(50) && this.Kind.HasDomination) && (this.Domination < (this.DominationCeiling * 0.8))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasEndurance) && (this.Endurance < (this.EnduranceCeiling * 0.2f))) { num2++; } if ((GameObject.Chance(50) && this.Kind.HasMorale) && (this.Morale < Parameters.RecruitmentMorale)) { num2++; } if (num2 > 0) { for (num = 0; num < (this.Persons.Count - trainingMilitaryList.Count); num += num2) { foreach (Person person in this.dominationPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToDominationWorkingList(person); break; } } foreach (Person person in this.endurancePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToEnduranceWorkingList(person); break; } } foreach (Person person in this.moralePersons) { if (person.WorkKind == ArchitectureWorkKind.无) { this.AddPersonToMoraleWorkingList(person); break; } } } } } //routeway is not going on and with 20% chance, or has enough fund else if ((GameObject.Chance(20) || !this.HasBuildingRouteway) || this.IsFundEnough) { float num3; bool flag2 = this.RecentlyAttacked > 0; WorkRateList list3 = new WorkRateList(); //recently attacked, or not planned to start architecture here, or 20% chance => do some internal work if ((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) || GameObject.Chance(20)) { //at 80% chance and or not recently attacked => do agriculture, commerce and technology if (!flag2 || !GameObject.Chance(80)) { //define weighting for each work, according to weightings(?) and respective value compared to its ceiling //WorkRate = the smaller the higher priority if (this.Kind.HasAgriculture && (this.Agriculture < this.AgricultureCeiling)) { if (this.BelongedSection.AIDetail.ValueAgriculture) { list3.AddWorkRate(new WorkRate((((float) this.Agriculture) / 4f) / ((float) this.AgricultureCeiling), ArchitectureWorkKind.农业)); } else { list3.AddWorkRate(new WorkRate(((float) this.Agriculture) / ((float) this.AgricultureCeiling), ArchitectureWorkKind.农业)); } } if (this.Kind.HasCommerce && (this.Commerce < this.CommerceCeiling)) { if (this.BelongedSection.AIDetail.ValueCommerce) { list3.AddWorkRate(new WorkRate((((float) this.Commerce) / 4f) / ((float) this.CommerceCeiling), ArchitectureWorkKind.商业)); } else { list3.AddWorkRate(new WorkRate(((float) this.Commerce) / ((float) this.CommerceCeiling), ArchitectureWorkKind.商业)); } } if (this.Kind.HasTechnology && (this.Technology < this.TechnologyCeiling)) { if (this.BelongedSection.AIDetail.ValueTechnology || (GameObject.Chance(50) && (this.IsStateAdmin || this.IsRegionCore))) { list3.AddWorkRate(new WorkRate((((float) this.Technology) / 4f) / ((float) this.TechnologyCeiling), ArchitectureWorkKind.技术)); } else { list3.AddWorkRate(new WorkRate(((float) this.Technology) / ((float) this.TechnologyCeiling), ArchitectureWorkKind.技术)); } } } //define weightings for each work if (this.Kind.HasDomination && (this.Domination < this.DominationCeiling)) { if (this.BelongedSection.AIDetail.ValueDomination) { list3.AddWorkRate(new WorkRate(((((float) this.Domination) / 5f) / 4f) / ((float) this.DominationCeiling), ArchitectureWorkKind.统治)); } else { list3.AddWorkRate(new WorkRate((((float) this.Domination) / 5f) / ((float) this.DominationCeiling), ArchitectureWorkKind.统治)); } } if (this.Kind.HasMorale && (this.Morale < this.MoraleCeiling)) { if (this.BelongedSection.AIDetail.ValueMorale) { list3.AddWorkRate(new WorkRate((((float) this.Morale) / 4f) / ((float) this.MoraleCeiling), ArchitectureWorkKind.民心)); } else { list3.AddWorkRate(new WorkRate(((float) this.Morale) / ((float) this.MoraleCeiling), ArchitectureWorkKind.民心)); } } if (this.Kind.HasEndurance && (this.Endurance < this.EnduranceCeiling)) { if (this.BelongedSection.AIDetail.ValueEndurance) { list3.AddWorkRate(new WorkRate((((float) this.Endurance) / 4f) / ((float) this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } else { list3.AddWorkRate(new WorkRate(((float) this.Endurance) / ((float) this.EnduranceCeiling), ArchitectureWorkKind.耐久)); } } } MilitaryList list4 = this.GetTrainingMilitaryList(); //if has military if (list4.Count > 0) { //if recently attacked, do training at the highest priority if (flag2) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.训练)); } else { //do training at priority the average of the training weightings of militaries num3 = 0f; foreach (Military military in list4) { num3 += ((float) military.TrainingWeighing) / ((float) military.MaxTrainingWeighing); } num3 /= (float) list4.Count; if (this.BelongedSection.AIDetail.ValueTraining) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.训练)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.训练)); } } } MilitaryList recruitmentMilitaryList = null; //condition of recruiting military //1. has population //2. the arch is recently attacked or has no planned technique //3. at 1/(leader stretagy tendency + 1)^2 chance, or recently attacked //4. can actually recruit (i.e. bound by game rules) if (((flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this)) && this.Kind.HasPopulation) && ((flag2 || (GameObject.Random(GameObject.Square(((int) this.BelongedFaction.Leader.StrategyTendency) + 1)) == 0)) && this.RecruitmentAvail())) { recruitmentMilitaryList = this.GetRecruitmentMilitaryList(); //if //1. arch has little troop (scale < 20) and recently attacked, or //2. arch has little troop (scale < 20) and (has high priority of recruitment with 20% chance, or another 5% chance), and food is abundant // => do recruit at highest priority //lgs-patch: As long as arch has little troop, recruit! if ((this.ArmyScale < this.FewArmyScale) /*&& flag2*/) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); } /*else if (((this.ArmyScale < this.FewArmyScale) && ((this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(20)) || GameObject.Chance(5))) && this.IsFoodAbundant) { list3.AddWorkRate(new WorkRate(0f, ArchitectureWorkKind.补充)); }*/ //otherwise, if //1. At 1-(leader stretagy tendency)/(total stretagy tendency counts i.e. 4) chance //2. If food is abundant and has army scale > 50 (the main issue preventing troop recruitment) // => 1% chance of recruit, or 5% if put at priority (1% is really very small!!) //3. otherwise, if food is enough and army scale <= 50 // => 15% chance of recruit, or 60% chance if put at priority (section AI), and // if base is important, population > population boundary defined by arch type (40k by default) // otherwise, population > 2x population boundary defined by arch type (80k by default) //then do recruit //lgs-patch: remove condition 2, forget about army scale and do recruit. //lgs-patch: extra disjunction: if population > 50%, ((population / populationCeil * 100 - 50) * 2)% chance of recruit, bound to condition 1 // s.t. AI will recruit when population is hitting the ceiling else if ( ( /*((GameObject.Chance(1) || (this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(5))) && ((this.ArmyScale >= this.LargeArmyScale) && this.IsFoodAbundant)) || */ (((/*(this.ArmyScale < this.LargeArmyScale) &&*/ this.IsFoodEnough) && (((this.IsImportant || (this.AreaCount > 2)) && (this.Population > this.Kind.PopulationBoundary)) || (((this.AreaCount <= 2) && !this.IsImportant) && (this.Population > (this.RecruitmentPopulationBoundary / 2))))) && ((this.BelongedSection.AIDetail.ValueRecruitment && GameObject.Chance(60)) || GameObject.Chance(15))) || (GameObject.Chance((int) ((float) this.Population / this.PopulationCeiling * 100 - 50) * 2)) ) && (GameObject.Random(Enum.GetNames(typeof(PersonStrategyTendency)).Length) >=(int) this.BelongedFaction.Leader.StrategyTendency)) { //with recruitment priority average of military weightings num3 = 0f; foreach (Military military in recruitmentMilitaryList) { num3 += ((float) military.RecruitmentWeighing) / ((float) military.MaxRecruitmentWeighing); } num3 /= (float) recruitmentMilitaryList.Count; if (this.BelongedSection.AIDetail.ValueRecruitment) { list3.AddWorkRate(new WorkRate(num3 / 4f, ArchitectureWorkKind.补充)); } else { list3.AddWorkRate(new WorkRate(num3, ArchitectureWorkKind.补充)); } } } //with work rate mapping, really assign tasks. //Algo: according to rating, assign one person to each task, and iterate until no more person can be assigned //Besides, it won't give task if the person has respective ability < 120 unless fund is abundant. //This way seems to work pretty well though... if (list3.Count > 0) { for (num = 0; num < this.Persons.Count; num += list3.Count) { foreach (WorkRate rate in list3.RateList) { switch (rate.workKind) { case ArchitectureWorkKind.农业: foreach (Person person in this.agriculturePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.AgricultureAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToAgricultureWorkingList(person); break; } } break; case ArchitectureWorkKind.商业: foreach (Person person in this.commercePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.CommerceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToCommerceWorkingList(person); break; } } break; case ArchitectureWorkKind.技术: foreach (Person person in this.technologyPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.TechnologyAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToTechnologyWorkingList(person); break; } } break; case ArchitectureWorkKind.统治: foreach (Person person in this.dominationPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.DominationAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToDominationWorkingList(person); break; } } break; case ArchitectureWorkKind.民心: foreach (Person person in this.moralePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.MoraleAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToMoraleWorkingList(person); break; } } break; case ArchitectureWorkKind.耐久: foreach (Person person in this.endurancePersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.EnduranceAbility >= (120 + (this.AreaCount * 5))))) { this.AddPersonToEnduranceWorkingList(person); break; } } break; case ArchitectureWorkKind.训练: foreach (Person person in this.trainingPersons) { if (person.WorkKind == ArchitectureWorkKind.无) { foreach (Military military in list4.GetRandomList()) { if (military.RecruitmentPersonID < 0) { this.AddPersonToTrainingWork(person, military); break; } } break; } } break; case ArchitectureWorkKind.补充: foreach (Person person in this.recruitmentPersons) { if ((person.WorkKind == ArchitectureWorkKind.无) && (isFundAbundant || (person.RecruitmentAbility >= 120))) { if (recruitmentMilitaryList != null) { foreach (Military military in recruitmentMilitaryList.GetRandomList()) { if (military.TrainingPersonID < 0) { this.AddPersonToRecuitmentWork(person, military); break; } } } break; } } break; } } } } //and finally, define when to create/disband militaries //condition: //1. has population //2. recently attacked or not having planned technique if (this.Kind.HasPopulation && (flag2 || (this.BelongedFaction.PlanTechniqueArchitecture != this))) { //if //1. not recently attacked and not told to create new army, and 90% chance, or //2. army scale > 50 (main issue!) //find military to disband, and don't create new army //lgs-patch: never disband armies! Allow army scale > 50 to create army /*if (((!flag2 && !this.BelongedSection.AIDetail.ValueNewMilitary) && !GameObject.Chance(10)) || (this.ArmyScale >= this.LargeArmyScale)) { MilitaryList list6 = new MilitaryList(); //if //1. scale < 15 //2. quantity > 0 //3. morale < morale ceiling / 2 (i.e. 50) //4. military kind's points per soldier <= 1 (Don't disband worthy armies!) //5. faction technique point > quantity * (points per soldier + 1) //disband this army foreach (Military military in this.Militaries) { if ((((military.Scales < 15) && (military.Quantity > 0)) && (military.Morale < (military.MoraleCeiling / 2))) && ((military.Kind.PointsPerSoldier <= 1) && (this.BelongedFaction.TechniquePoint > (military.Quantity * (military.Kind.PointsPerSoldier + 1))))) { list6.Add(military); } } foreach (Military military in list6) { this.DisbandMilitary(military); } } //if //1. recently attacked, or //2. population > popluation boundary (i.e. 40k), or //3. population > 10000 and 5% chance, and //4. there has no army whose scale < 15 //=> create army //lgs-patch: some military kind could never reach scale of 15 which would then totally prevent army creation. // change it to no creation of new army if its scale is less than 75% of its max scale //lgs-patch: extra disjunction: if population > 50%, ((population / populationCeil * 100 - 50) * 2)% chance of recruit, // s.t. AI will recruit when population is hitting the ceiling //lgs-patch: AI tends to over-recruit with new algorithm, and causes little population. Remove population >= 10000 disjunction // and increase recruitment population boundary (and add variation to it) else */ //if (((this.Population > this.RecruitmentPopulationBoundary * 2.0f) || flag2) /*|| ((this.Population >= 10000) && GameObject.Chance(5))*/) if (flag2 || this.Population > this.RecruitmentPopulationBoundary * (0.5f + (Enum.GetNames(typeof(PersonStrategyTendency)).Length - (int) this.BelongedFaction.Leader.StrategyTendency) * 0.5f) + GameObject.Random(this.RecruitmentPopulationBoundary)) { bool flag3 = true; foreach (Military military in this.Militaries) { //if (military.Scales < 15) if (military.Scales < (float) military.Kind.MaxScale / military.Kind.MinScale * 0.75f) { flag3 = false; break; } } if ((GameObject.Chance((int)((float)this.Population / this.PopulationCeiling * 100 - 50) * 2))) { flag3 = true; } if (flag3) { this.AIRecruitment(false); } else if ((this.ValueWater && !this.HasShuijun()) && this.HasShuijunMilitaryKind()) { this.AIRecruitment(true); } } } } } }