public bool IsGroupValidCore(CellGroup group) { if (!CanBeClanCore(group)) { return(false); } if (!group.HasProperty(Polity.CanFormPolityAttribute + "tribe")) { return(false); } PolityProminence pi = group.GetPolityProminence(Polity); if (pi == null) { return(false); } if (pi.Value < MinCorePolityProminence) { return(false); } if (group.Population < MinCorePopulation) { return(false); } return(true); }
public override bool ShouldMigrateFactionCore(CellGroup sourceGroup, CellGroup targetGroup) { if (!CanBeClanCore(targetGroup)) { return(false); } PolityProminence piTarget = targetGroup.GetPolityProminence(Polity); if (piTarget != null) { int targetGroupPopulation = targetGroup.Population; float targetGroupProminence = piTarget.Value; return(ShouldMigrateFactionCore(sourceGroup, targetGroup.Cell, targetGroupProminence, targetGroupPopulation)); } return(false); }
private PolityProminence GetProminenceOrThrow(long id) { CellGroup group = Polity.World.GetGroup(id); if (group == null) { string message = "Missing Group with Id " + id + " in PolityProminenceCluster of Polity with Id " + Polity.Id; throw new System.Exception(message); } PolityProminence prominence = group.GetPolityProminence(Polity); if (prominence == null) { string message = "Missing polity prominence with Id " + id + " in PolityProminenceCluster of Polity with Id " + Polity.Id; throw new System.Exception(message); } return(prominence); }
public float GetGroupWeight(CellGroup group) { if (group == _clan.CoreGroup) { return(0); } PolityProminence pi = group.GetPolityProminence(_clan.Polity); if (group.HighestPolityProminence != pi) { return(0); } if (!Clan.CanBeClanCore(group)) { return(0); } if (group.Population < Clan.MinCorePopulation) { return(0); } float coreDistance = pi.FactionCoreDistance - MinCoreDistance; if (coreDistance <= 0) { return(0); } float coreDistanceFactor = MinCoreDistance / (MinCoreDistance + coreDistance); float minCoreProminenceValue = Mathf.Max(coreDistanceFactor, Clan.MinCorePolityProminence); return(pi.Value - minCoreProminenceValue); }
public override bool ShouldMigrateFactionCore(CellGroup sourceGroup, TerrainCell targetCell, float targetProminence, int targetPopulation) { //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (sourceGroup.Id == Manager.TracingData.GroupId) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "ShouldMigrateFactionCore - Clan:" + Id + ", sourceGroup:" + sourceGroup.Id, // "CurrentDate: " + World.CurrentDate + // ", targetPopulation: " + targetPopulation + // ", targetProminence: " + targetProminence + // ""); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif float targetProminenceFactor = Mathf.Max(0, targetProminence - MinCorePolityProminence); if (targetProminenceFactor <= 0) { return(false); } float targetPopulationFactor = Mathf.Max(0, targetPopulation - MinCorePopulation); if (targetPopulationFactor <= 0) { return(false); } int sourcePopulation = sourceGroup.Population; PolityProminence pi = sourceGroup.GetPolityProminence(Polity); if (pi == null) { Debug.LogError("Unable to find Polity with Id: " + Polity.Id); } float sourceProminence = pi.Value; float sourceProminenceFactor = Mathf.Max(0, sourceProminence - MinCorePolityProminence); float sourcePopulationFactor = Mathf.Max(0, sourcePopulation - MinCorePopulation); float sourceFactor = sourceProminenceFactor * sourcePopulationFactor; //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (sourceGroup.Id == Manager.TracingData.GroupId) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "ShouldMigrateFactionCore - Clan:" + Id + ", sourceGroup:" + sourceGroup.Id, // "CurrentDate: " + World.CurrentDate + // ", sourceProminence: " + sourceProminence + // ", sourcePopulation: " + sourcePopulation + // ""); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif if (sourceFactor <= 0) { return(true); } float targetFactor = targetProminenceFactor * targetPopulationFactor; float migrateCoreFactor = sourceFactor / (sourceFactor + targetFactor); float randomValue = sourceGroup.GetNextLocalRandomFloat(RngOffsets.MIGRATING_GROUP_MOVE_FACTION_CORE + unchecked ((int)Id)); //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (sourceGroup.Id == Manager.TracingData.GroupId) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "ShouldMigrateFactionCore - Clan:" + Id + ", sourceGroup:" + sourceGroup.Id, // "CurrentDate: " + World.CurrentDate + // ", randomValue: " + randomValue + // ", migrateCoreFactor: " + migrateCoreFactor + // ""); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif return(randomValue > migrateCoreFactor); }
private void SwitchCellProminences(Polity sourcePolity, Clan triggerClan) { float targetPolityInfluence = triggerClan.Influence; float sourcePolityInfluence = 1 - targetPolityInfluence; if (targetPolityInfluence <= 0) { throw new System.Exception("Pulling clan influence equal or less than zero."); } int maxGroupCount = sourcePolity.Groups.Count; Dictionary <CellGroup, float> groupDistances = new Dictionary <CellGroup, float>(maxGroupCount); Queue <CellGroup> sourceGroups = new Queue <CellGroup>(maxGroupCount); sourceGroups.Enqueue(CoreGroup); int reviewedCells = 0; int switchedCells = 0; HashSet <Faction> factionsToTransfer = new HashSet <Faction>(); while (sourceGroups.Count > 0) { CellGroup group = sourceGroups.Dequeue(); if (groupDistances.ContainsKey(group)) { continue; } PolityProminence pi = group.GetPolityProminence(sourcePolity); if (pi == null) { continue; } reviewedCells++; float distanceToTargetPolityCore = CalculateShortestCoreDistance(group, groupDistances); if (distanceToTargetPolityCore >= CellGroup.MaxCoreDistance) { continue; } groupDistances.Add(group, distanceToTargetPolityCore); float distanceToSourcePolityCore = pi.PolityCoreDistance; float percentProminence = 1f; if (distanceToSourcePolityCore < CellGroup.MaxCoreDistance) { float ditanceToCoresSum = distanceToTargetPolityCore + distanceToSourcePolityCore; float distanceFactor = distanceToSourcePolityCore / ditanceToCoresSum; distanceFactor = Mathf.Clamp01((distanceFactor * 3f) - 1f); float targetDistanceFactor = distanceFactor; float sourceDistanceFactor = 1 - distanceFactor; float targetPolityWeight = targetPolityInfluence * targetDistanceFactor; float sourcePolityWeight = sourcePolityInfluence * sourceDistanceFactor; percentProminence = targetPolityWeight / (targetPolityWeight + sourcePolityWeight); } if (percentProminence <= 0) { continue; } if (percentProminence > 0.5f) { switchedCells++; foreach (Faction faction in group.GetFactionCores()) { // Do not transfer factions that belong to polities other than the source one if (faction.Polity != sourcePolity) { continue; } if (sourcePolity.DominantFaction == faction) { new System.Exception("Dominant Faction getting switched..."); } // #if DEBUG // if (sourcePolity.FactionCount == 1) { // throw new System.Exception ("Number of factions in Polity " + Id + " will be equal or less than zero. Current Date: " + World.CurrentDate); // } // #endif factionsToTransfer.Add(faction); } } float prominenceValue = pi.Value; group.SetPolityProminence(sourcePolity, prominenceValue * (1 - percentProminence)); group.SetPolityProminence(this, prominenceValue * percentProminence, distanceToTargetPolityCore, distanceToTargetPolityCore); World.AddGroupToUpdate(group); foreach (CellGroup neighborGroup in group.NeighborGroups) { if (groupDistances.ContainsKey(neighborGroup)) { continue; } sourceGroups.Enqueue(neighborGroup); } } float highestInfluence = triggerClan.Influence; Clan dominantClan = triggerClan; foreach (Faction faction in factionsToTransfer) { if (faction is Clan clan) { if (clan.Influence > highestInfluence) { highestInfluence = clan.Influence; dominantClan = clan; } } faction.ChangePolity(this, faction.Influence); } SetDominantFaction(dominantClan); // Debug.Log ("SwitchCellProminences: source polity cells: " + maxGroupCount + ", reviewed cells: " + reviewedCells + ", switched cells: " + switchedCells); }
private void TryMigrateFactionCores() { int targetPopulation = 0; int targetNewPopulation = Population; CellGroup targetGroup = TargetCell.Group; if (targetGroup != null) { targetPopulation = targetGroup.Population; targetNewPopulation += targetPopulation; } FactionCoresToMigrate.Clear(); foreach (Faction faction in SourceGroup.GetFactionCores()) { PolityProminence pi = SourceGroup.GetPolityProminence(faction.Polity); if (pi == null) { Debug.LogError("Unable to find Polity with Id: " + faction.Polity.Id); } float sourceGroupProminence = pi.Value; float targetGroupProminence = sourceGroupProminence; if (targetGroup != null) { PolityProminence piTarget = targetGroup.GetPolityProminence(faction.Polity); if (piTarget != null) { targetGroupProminence = piTarget.Value; } else { targetGroupProminence = 0f; } } float targetNewGroupProminence = ((sourceGroupProminence * Population) + (targetGroupProminence * targetPopulation)) / targetNewPopulation; if (faction.ShouldMigrateFactionCore(SourceGroup, TargetCell, targetNewGroupProminence, targetNewPopulation)) { FactionCoresToMigrate.Add(faction); } } //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (SourceGroupId == Manager.TracingData.GroupId) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "TryMigrateFactionCores - SourceGroup:" + SourceGroupId, // "CurrentDate: " + World.CurrentDate + // "SourceGroup.GetFactionCores().Count: " + SourceGroup.GetFactionCores().Count + // ", FactionCoresToMigrate.Count: " + FactionCoresToMigrate.Count + // ""); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif }
public override bool CanTrigger() { //#if DEBUG // if ((Id == 160349336613603015L) || (Id == 160349354613603010L)) // { // string logMsg = "Event Id: " + Id + " CanTrigger. base.CanTrigger(): " + base.CanTrigger() + // ", _splitClan.Polity == OriginalPolity: " + (_splitClan.Polity == OriginalPolity) + // ", !_splitClan.IsDominant: " + (!_splitClan.IsDominant); // if (base.CanTrigger() && (_splitClan.Polity == OriginalPolity) && !_splitClan.IsDominant) // { // _dominantClan = _originalTribe.DominantFaction as Clan; // // We should use the latest cultural attribute values before calculating chances // _splitClan.PreUpdate(); // _dominantClan.PreUpdate(); // _tribeChanceOfSplitting = CalculateChanceOfSplittingForTribe(); // _splitClanChanceOfSplitting = CalculateChanceOfSplittingForSplitClan(); // logMsg += ", _tribeChanceOfSplitting: " + _tribeChanceOfSplitting + ", _splitClanChanceOfSplitting: " + _splitClanChanceOfSplitting; // } // logMsg += ", current date: " + World.CurrentDate + ", loaded world: " + Manager.Debug_IsLoadedWorld; // Debug.LogWarning(logMsg); // } //#endif if (!base.CanTrigger()) { return(false); } if (_splitClan.Polity != OriginalPolity) { return(false); } if (_splitClan.IsDominant) { return(false); } _dominantClan = _originalTribe.DominantFaction as Clan; // We should use the latest cultural attribute values before calculating chances _splitClan.PreUpdate(); _dominantClan.PreUpdate(); CellGroup clanCoreGroup = _splitClan.CoreGroup; PolityProminence polityProminence = clanCoreGroup.GetPolityProminence(OriginalPolity); if (clanCoreGroup.HighestPolityProminence != polityProminence) { return(false); } float influence = _splitClan.Influence; float polityCoreDistance = (polityProminence.PolityCoreDistance * influence) - MinCoreDistance; if (polityCoreDistance <= 0) { return(false); } _tribeChanceOfSplitting = CalculateChanceOfSplittingForTribe(); _splitClanChanceOfSplitting = CalculateChanceOfSplittingForSplitClan(); // if (_splitClan.IsUnderPlayerGuidance && _splitClanChanceOfSplitting < 0.5f) { // // return false; // } if (_tribeChanceOfSplitting <= 0) { return(false); } if (_splitClanChanceOfSplitting <= 0) { return(false); } return(true); }