private void CreateNewFaction(Person leader) { if (leader.Status != PersonStatus.NoFaction) return; if (leader.LocationArchitecture.BelongedFaction != null) return; Faction newFaction = new Faction(); newFaction.Scenario = this; newFaction.ID = this.Factions.GetFreeGameObjectID(); this.Factions.AddFactionWithEvent(newFaction); foreach (Faction faction2 in this.Factions) { if (faction2 != newFaction) { this.DiplomaticRelations.AddDiplomaticRelation(this, newFaction.ID, faction2.ID, 0); } } newFaction.Leader = leader; leader.Loyalty = 100; newFaction.Reputation = leader.Reputation; newFaction.Name = leader.Name; if (leader.PersonBiography != null) { foreach (MilitaryKind kind in leader.PersonBiography.MilitaryKinds.MilitaryKinds.Values) { newFaction.BaseMilitaryKinds.AddMilitaryKind(kind); } newFaction.ColorIndex = leader.PersonBiography.FactionColor; } else { newFaction.BaseMilitaryKinds.AddBasicMilitaryKinds(this); newFaction.ColorIndex = -1; } List<int> allUnusedColors = new List<int>(); for (int i = 0; i < this.GameCommonData.AllColors.Count; ++i) { allUnusedColors.Add(i); } foreach (Faction f in this.Factions) { allUnusedColors.Remove(f.ColorIndex); } if (allUnusedColors.Count == 0) { newFaction.ColorIndex = GameObject.Random(this.GameCommonData.AllColors.Count); } else { if (!allUnusedColors.Contains(newFaction.ColorIndex)) { newFaction.ColorIndex = allUnusedColors[GameObject.Random(allUnusedColors.Count)]; } } newFaction.FactionColor = this.GameCommonData.AllColors[newFaction.ColorIndex]; Architecture newFactionCapital = leader.LocationArchitecture; Faction oldFaction = newFactionCapital.BelongedFaction; newFaction.Capital = newFactionCapital; if (leader.BelongedFaction == null) { leader.Status = PersonStatus.Normal; } else { this.ChangeDiplomaticRelation(newFaction.ID, newFactionCapital.BelongedFaction.ID, -500); } newFaction.PrepareData(); newFactionCapital.ResetFaction(newFaction); newFaction.AddArchitectureKnownData(newFactionCapital); newFaction.FirstSection.AddArchitecture(newFactionCapital); if (oldFaction != null && !GameObject.Chance((int)oldFaction.Leader.PersonalLoyalty * 10)) { oldFaction.Leader.AddHated(leader); } foreach (Person p in this.AvailablePersons) { if ((p.BelongedFaction == null || p.BelongedFaction == oldFaction) && !p.IsCaptive && p.Status != PersonStatus.Princess && p != leader) { if (p.HasCloseStrainTo(leader) || p.IsVeryCloseTo(leader) || (GameObject.Chance(100 - (Person.GetIdealOffset(leader, p)) * 20))) { if (p.BelongedFaction == null || (GameObject.Chance(100 - ((int)p.PersonalLoyalty) * 25) && GameObject.Chance(220 - p.Loyalty * 2))) { if (p.BelongedFaction != null) { p.ChangeFaction(newFaction); } p.InitialLoyalty(); p.MoveToArchitecture(newFactionCapital); } } } } ExtensionInterface.call("CreateNewFaction", new Object[]{this, oldFaction, newFaction, newFactionCapital}); this.YearTable.addNewFactionEntry(this.Date, oldFaction, newFaction, newFactionCapital); if (this.OnNewFactionAppear != null) { this.OnNewFactionAppear(newFaction); } }