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 void RemoveProminence(PolityProminence prominence) { _prominences.Remove(prominence.Id); RequireNewCensus(true); prominence.Cluster = null; //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (Manager.TracingData.ClusterId == Id) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage("PolityProminenceCluster.RemoveProminence - Cluster:" + Id, // "CurrentDate: " + Polity.World.CurrentDate + // ", Size: " + Size + // ", LastProminenceChangeDate: " + LastProminenceChangeDate + // " [offset: " + (LastProminenceChangeDate - Manager.TracingData.LastSaveDate) + "]" + // ", prominence.Id: " + prominence.Id + // ", prominence.Group.LastUpdateDate: " + prominence.Group.LastUpdateDate + // " [offset: " + (prominence.Group.LastUpdateDate - Manager.TracingData.LastSaveDate) + "]" + // "", Polity.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // LastProminenceChangeDate = Polity.World.CurrentDate; //#endif }
public PolityProminence(PolityProminence polityProminence) { Group = polityProminence.Group; //_isMigratingGroup = true; Set(polityProminence); }
public PolityProminence(CellGroup group, PolityProminence polityProminence) { Group = group; //_isMigratingGroup = false; Set(polityProminence); }
public void Set(PolityProminence polityProminence) { PolityId = polityProminence.PolityId; Polity = polityProminence.Polity; Value = polityProminence.Value; NewValue = Value; AdministrativeCost = 0; }
protected void AddPolityProminenceEffectInternal(CulturalSkill politySkill, PolityProminence polityProminence, long timeSpan, float timeEffectFactor) { float targetValue = politySkill.Value; float prominenceEffect = polityProminence.Value; TerrainCell groupCell = Group.Cell; float randomEffect = groupCell.GetNextLocalRandomFloat(RngOffsets.SKILL_POLITY_PROMINENCE + RngOffset + unchecked ((int)polityProminence.PolityId)); float timeEffect = timeSpan / (timeSpan + timeEffectFactor); // _newvalue should have been set correctly either by the constructor or by the Update function float change = (targetValue - _newValue) * prominenceEffect * timeEffect * randomEffect; //#if DEBUG // if (Manager.RegisterDebugEvent != null) // { // if (Manager.TracingData.Priority <= 0) // { // if (Group.Id == Manager.TracingData.GroupId) // { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "PolityCulturalProminenceInternal - Group:" + groupId, // "CurrentDate: " + Group.World.CurrentDate + // ", Name: " + Name + // ", timeSpan: " + timeSpan + // ", timeEffectFactor: " + timeEffectFactor + // ", randomEffect: " + randomEffect + // ", polity Id: " + polityProminence.PolityId + // ", polityProminence.Value: " + prominenceEffect + // ", politySkill.Value: " + targetValue + // ", Value: " + Value + // ", change: " + change + // "", Group.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // else if (Manager.TracingData.Priority <= 1) // { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "PolityCulturalProminenceInternal - Group:" + groupId, // "CurrentDate: " + Group.World.CurrentDate + // "", Group.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif _newValue = _newValue + change; }
public PolityProminenceCluster(PolityProminence startProminence) { Id = startProminence.Id; Polity = startProminence.Polity; #if DEBUG CreationDate = Polity.World.CurrentDate; #endif AddProminence(startProminence); }
public void FinalizeLoad() { LoadProminences(); foreach (KeyValuePair <long, PolityProminence> pair in _prominences) { PolityProminence p = pair.Value; p.Group = Polity.World.GetGroup(pair.Key); p.Polity = Polity; p.Cluster = this; } }
private void AddCellDataToInfoPanel_PolityCulturalSkill(TerrainCell cell) { InfoText.text += "\n"; InfoText.text += "\n -- Polity Skill Data -- "; InfoText.text += "\n"; if (cell.Group == null) { InfoText.text += "\n\tNo population at location"; return; } int population = cell.Group.Population; if (population <= 0) { InfoText.text += "\n\tNo population at location"; return; } PolityProminence polityProminence = cell.Group.HighestPolityProminence; if (polityProminence == null) { InfoText.text += "\n\tGroup not part of a polity"; return; } bool firstSkill = true; foreach (CulturalSkill skill in polityProminence.Polity.Culture.GetSkills()) { float skillValue = skill.Value; if (skillValue >= 0.001) { if (firstSkill) { InfoText.text += "\nSkills:"; firstSkill = false; } InfoText.text += "\n\t" + skill.Name + " Value: " + skill.Value.ToString("0.000"); } } }
public void AddPolityProminenceEffect(CulturalActivity polityActivity, PolityProminence polityProminence, long timeSpan) { float targetValue = polityActivity.Value; float prominenceEffect = polityProminence.Value; TerrainCell groupCell = Group.Cell; float randomEffect = groupCell.GetNextLocalRandomFloat(RngOffsets.ACTIVITY_POLITY_PROMINENCE + RngOffset + unchecked ((int)polityProminence.PolityId)); float timeEffect = timeSpan / (timeSpan + TimeEffectConstant); // _newvalue should have been set correctly either by the constructor or by the Update function float change = (targetValue - _newValue) * prominenceEffect * timeEffect * randomEffect; _newValue = _newValue + change; }
public override bool CanTrigger() { if (!base.CanTrigger()) { return(false); } PolityProminence sourcePi = Group.GetPolityProminence(Polity); if (sourcePi == null) { return(false); } return(true); }
private void AddCellDataToInfoPanel_PolityCulturalKnowledge(TerrainCell cell) { InfoText.text += "\n"; InfoText.text += "\n -- Polity Knowledge Data -- "; InfoText.text += "\n"; if (cell.Group == null) { InfoText.text += "\n\tNo population at location"; return; } int population = cell.Group.Population; if (population <= 0) { InfoText.text += "\n\tNo population at location"; return; } PolityProminence polityProminence = cell.Group.HighestPolityProminence; if (polityProminence == null) { InfoText.text += "\n\tGroup not part of a polity"; return; } bool firstKnowledge = true; foreach (CulturalKnowledge knowledge in polityProminence.Polity.Culture.GetKnowledges()) { float knowledgeValue = knowledge.ScaledValue; if (firstKnowledge) { InfoText.text += "\nKnowledges:"; firstKnowledge = false; } InfoText.text += "\n\t" + knowledge.Name + " Value: " + knowledgeValue.ToString("0.000"); } }
public void PostUpdatePolityCulturalProminence(PolityProminence polityProminence) { PolityCulture polityCulture = polityProminence.Polity.Culture; if (Group.HighestPolityProminence == null) { throw new System.Exception("HighestPolityProminence is null"); } if (((Language == null) || (polityProminence.Value >= Group.HighestPolityProminence.Value)) && (Language != polityCulture.Language)) { Language = polityCulture.Language; SetLanguageUpdateCells(); } }
private void AddCellDataToInfoPanel_PolityCulturalDiscovery(TerrainCell cell) { InfoText.text += "\n"; InfoText.text += "\n -- Polity Discovery Data -- "; InfoText.text += "\n"; if (cell.Group == null) { InfoText.text += "\n\tNo population at location"; return; } int population = cell.Group.Population; if (population <= 0) { InfoText.text += "\n\tNo population at location"; return; } PolityProminence polityProminence = cell.Group.HighestPolityProminence; if (polityProminence == null) { InfoText.text += "\n\tGroup not part of a polity"; return; } bool firstDiscovery = true; foreach (Discovery discovery in polityProminence.Polity.Culture.Discoveries.Values) { if (firstDiscovery) { InfoText.text += "\nDiscoveries:"; firstDiscovery = false; } InfoText.text += "\n\t" + discovery.Name; } }
private void AddCellDataToInfoPanel_PolityCulturalPreference(TerrainCell cell) { InfoText.text += "\n"; InfoText.text += "\n -- Polity Preference Data -- "; InfoText.text += "\n"; if (cell.Group == null) { InfoText.text += "\n\tNo population at location"; return; } int population = cell.Group.Population; if (population <= 0) { InfoText.text += "\n\tNo population at location"; return; } PolityProminence polityProminence = cell.Group.HighestPolityProminence; if (polityProminence == null) { InfoText.text += "\n\tGroup not part of a polity"; return; } bool firstPreference = true; foreach (CulturalPreference preference in polityProminence.Polity.Culture.GetPreferences()) { if (firstPreference) { InfoText.text += "\nPreferences:"; firstPreference = false; } InfoText.text += "\n\t" + preference.Name + " Preference: " + preference.Value.ToString("P"); } }
private void AddCellDataToInfoPanel_PolityCulturalActivity(TerrainCell cell) { InfoText.text += "\n"; InfoText.text += "\n -- Polity Activity Data -- "; InfoText.text += "\n"; if (cell.Group == null) { InfoText.text += "\n\tNo population at location"; return; } int population = cell.Group.Population; if (population <= 0) { InfoText.text += "\n\tNo population at location"; return; } PolityProminence polityProminence = cell.Group.HighestPolityProminence; if (polityProminence == null) { InfoText.text += "\n\tGroup not part of a polity"; return; } bool firstActivity = true; foreach (CulturalActivity activity in polityProminence.Polity.Culture.GetActivities()) { if (firstActivity) { InfoText.text += "\nActivities:"; firstActivity = false; } InfoText.text += "\n\t" + activity.Name + " Contribution: " + activity.Contribution.ToString("P"); } }
public void AddProminence(PolityProminence prominence) { _prominences.Add(prominence.Id, prominence); prominence.Cluster = this; //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (Manager.TracingData.ClusterId == Id) // { // System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true); // System.Reflection.MethodBase method1 = stackTrace.GetFrame(1).GetMethod(); // string callingMethod1 = method1.Name; // string callingClass1 = method1.DeclaringType.ToString(); // int line1 = stackTrace.GetFrame(1).GetFileLineNumber(); // System.Reflection.MethodBase method2 = stackTrace.GetFrame(2).GetMethod(); // string callingMethod2 = method2.Name; // string callingClass2 = method2.DeclaringType.ToString(); // int line2 = stackTrace.GetFrame(2).GetFileLineNumber(); // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage("PolityProminenceCluster.AddProminence - Cluster:" + Id, // "CurrentDate: " + Polity.World.CurrentDate + // ", Size: " + Size + // ", Polity.Id: " + Polity.Id + // ", LastProminenceChangeDate: " + LastProminenceChangeDate + // " [offset: " + (LastProminenceChangeDate - Manager.TracingData.LastSaveDate) + "]" + // ", prominence.Id: " + prominence.Id + // ", prominence.Group.LastUpdateDate: " + prominence.Group.LastUpdateDate + // " [offset: " + (prominence.Group.LastUpdateDate - Manager.TracingData.LastSaveDate) + "]" + // ", Calling method 1: " + callingClass1 + "." + callingMethod1 + " [line:" + line1 + "]" + // ", Calling method 2: " + callingClass2 + "." + callingMethod2 + " [line:" + line2 + "]" + // "", Polity.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // LastProminenceChangeDate = Polity.World.CurrentDate; //#endif RequireNewCensus(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 override void Trigger() { // #if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) { // if (Group.Id == Manager.TracingData.GroupId) { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "ExpandPolityProminence:Trigger - Group:" + groupId, // "CurrentDate: " + World.CurrentDate + // ", TriggerDate: " + TriggerDate + // ", SpawnDate: " + SpawnDate + // ", PolityId: " + PolityId + // ", TargetGroup Id: " + TargetGroupId + // ""); // // Manager.RegisterDebugEvent ("DebugMessage", debugMessage); // } // } // #endif float randomFactor = Group.Cell.GetNextLocalRandomFloat(RngOffsets.EVENT_TRIGGER + unchecked ((int)Id)); float percentToExpand = Mathf.Pow(randomFactor, 4); float populationFactor = Group.Population / (float)(Group.Population + TargetGroup.Population); percentToExpand *= populationFactor; PolityProminence sourcePi = Group.GetPolityProminence(Polity); TargetGroup.Culture.MergeCulture(Group.Culture, percentToExpand); TargetGroup.MergePolityProminence(sourcePi, percentToExpand); TryMigrateFactionCores(); World.AddGroupToUpdate(Group); World.AddGroupToUpdate(TargetGroup); }
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 abstract void AddPolityProminenceEffect(CulturalKnowledge polityKnowledge, PolityProminence polityProminence, long timeSpan);
public abstract void AddPolityProminenceEffect(CulturalSkill politySkill, PolityProminence polityProminence, long timeSpan);
public override void Split() { int randomOffset = unchecked ((int)(RngOffsets.CLAN_SPLIT + Id)); float randomValue = GetNextLocalRandomFloat(randomOffset++); float splitFactionInfluence = _splitFactionMinInfluence + (randomValue * (_splitFactionMaxInfluence - _splitFactionMinInfluence)); Influence -= splitFactionInfluence; if (_splitFactionCoreGroup == null) { throw new System.Exception("_splitFactionCoreGroup is null - Clan Id: " + Id + ", Event Id: " + _splitFactionEventId); } float polityProminenceValue = _splitFactionCoreGroup.GetPolityProminenceValue(Polity); PolityProminence highestPolityProminence = _splitFactionCoreGroup.HighestPolityProminence; if (highestPolityProminence == null) { throw new System.Exception( "highestPolityProminence is null - Clan Id: " + Id + ", Group Id: " + _splitFactionCoreGroup.Id + ", Event Id: " + _splitFactionEventId); } if (CurrentLeader == null) { throw new System.Exception("CurrentLeader is null - Clan Id: " + Id + ", Event Id: " + _splitFactionEventId); } Tribe parentTribe = Polity as Tribe; if (parentTribe == null) { throw new System.Exception("parentTribe is null - Clan Id: " + Id + ", Event Id: " + _splitFactionEventId); } // If the polity with the highest prominence is different than the source clan's polity and it's value is twice greater switch the new clan's polity to this one. // NOTE: This is sort of a hack to avoid issues with clan/tribe split coincidences (issue #8 github). Try finding a better solution... if (highestPolityProminence.Value > (polityProminenceValue * 2)) { if (highestPolityProminence.Polity is Tribe) { parentTribe = highestPolityProminence.Polity as Tribe; //#if DEBUG // Debug.Log("parent tribe replaced from " + Polity.Id + " to " + parentTribe.Id + " due to low polity prominence value in new core: " + polityProminenceValue); //#endif } else { throw new System.Exception("Failed to replace new parent polity as it is not a Tribe. Id: " + highestPolityProminence.Polity.Id + ", Event Id: " + _splitFactionEventId); } } Clan newClan = new Clan(parentTribe, _splitFactionCoreGroup, splitFactionInfluence, this); if (newClan == null) { throw new System.Exception("newClan is null - Clan Id: " + Id + ", Event Id: " + _splitFactionEventId); } newClan.Initialize(); // We can initialize right away since the containing polity is already initialized // set relationship with parent clan float parentClanRelationshipValue = AvgClanSplitRelationshipValue + (CurrentLeader.Charisma - 10) / ClanSplitRelationshipValueCharismaFactor; randomValue = GetNextLocalRandomFloat(randomOffset++); float relationshipValue = parentClanRelationshipValue + (ClanSplitRelationshipValueSpread * (2f * randomValue - 1f)); SetRelationship(this, newClan, relationshipValue); parentTribe.AddFaction(newClan); parentTribe.UpdateDominantFaction(); World.AddFactionToUpdate(this); World.AddFactionToUpdate(newClan); World.AddPolityToUpdate(Polity); parentTribe.AddEventMessage(new ClanSplitEventMessage(this, newClan, World.CurrentDate)); }
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); }
public void UpdatePolityCulturalProminence(PolityProminence polityProminence, long timeSpan) { PolityCulture polityCulture = polityProminence.Polity.Culture; foreach (CulturalPreference polityPreference in polityCulture.GetPreferences()) { CellCulturalPreference cellPreference = GetAcquiredPreferenceOrToAcquire(polityPreference.Id); if (cellPreference == null) { cellPreference = CellCulturalPreference.CreateCellInstance(Group, polityPreference, 0); AddPreferenceToAcquire(cellPreference); } cellPreference.AddPolityProminenceEffect(polityPreference, polityProminence, timeSpan); } foreach (CulturalActivity polityActivity in polityCulture.GetActivities()) { CellCulturalActivity cellActivity = GetPerformedActivityOrToPerform(polityActivity.Id); if (cellActivity == null) { cellActivity = CellCulturalActivity.CreateCellInstance(Group, polityActivity, 0); AddActivityToPerform(cellActivity); } cellActivity.AddPolityProminenceEffect(polityActivity, polityProminence, timeSpan); } foreach (CulturalSkill politySkill in polityCulture.GetSkills()) { CellCulturalSkill cellSkill = GetLearnedSkillOrToLearn(politySkill.Id); if (cellSkill == null) { cellSkill = CellCulturalSkill.CreateCellInstance(Group, politySkill, 0); AddSkillToLearn(cellSkill); } cellSkill.AddPolityProminenceEffect(politySkill, polityProminence, timeSpan); } foreach (CulturalKnowledge polityKnowledge in polityCulture.GetKnowledges()) { //#if DEBUG // if (Manager.RegisterDebugEvent != null) // { // if (Manager.TracingData.Priority <= 0) // { // if (Group.Id == Manager.TracingData.GroupId) // { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "CellCulture.UpdatePolityCulturalProminence - Group:" + groupId, // "CurrentDate: " + Group.World.CurrentDate + // ", polityCulture.Polity.Id: " + polityCulture.Polity.Id + // ", polityKnowledge.Name: " + polityKnowledge.Name + // "", Group.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // } //#endif CellCulturalKnowledge cellKnowledge = TryAddKnowledgeToLearn(polityKnowledge.Id, 0); cellKnowledge.AddPolityProminenceEffect(polityKnowledge, polityProminence, timeSpan); } foreach (Discovery polityDiscovery in polityCulture.Discoveries.Values) { AddDiscoveryToFind(polityDiscovery); } }
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); }
protected void AddPolityProminenceEffectInternal(CulturalKnowledge polityKnowledge, PolityProminence polityProminence, long timeSpan, float timeEffectFactor) { int rngOffset = RngOffsets.KNOWLEDGE_POLITY_PROMINENCE + InstanceRngOffset + unchecked ((int)polityProminence.PolityId); int targetValue = polityKnowledge.Value; float prominenceEffect = polityProminence.Value; TerrainCell groupCell = Group.Cell; float randomEffect = groupCell.GetNextLocalRandomFloat(rngOffset++); float timeEffect = timeSpan / (float)(timeSpan + timeEffectFactor); int valueDelta = targetValue - _newValue; float d; // _newvalue should have been set correctly either by the constructor or by the Update function int valueChange = (int)MathUtility.MultiplyAndGetDecimals(valueDelta, prominenceEffect * timeEffect * randomEffect, out d); if (d > Group.GetNextLocalRandomFloat(rngOffset++)) { valueChange++; } //#if DEBUG // if (Manager.RegisterDebugEvent != null) // { // if (Manager.TracingData.Priority <= 0) // { // if (Group.Id == Manager.TracingData.GroupId) // { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "CellCulturalKnowledge.PolityCulturalProminenceInternal - Group:" + groupId, // "CurrentDate: " + Group.World.CurrentDate + // ", Name: " + Name + // ", timeSpan: " + timeSpan + // ", timeEffectFactor: " + timeEffectFactor + // ", randomEffect: " + randomEffect + // ", Group.PolityProminences.Count: " + Group.PolityProminences.Count + // ", polity Id: " + polityProminence.PolityId + // ", polityProminence.Value: " + prominenceEffect + // ", politySkill.Value: " + targetValue + // ", Value: " + Value + // ", _newValue: " + _newValue + // ", valueChange: " + valueChange + // "", Group.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // else if (Manager.TracingData.Priority <= 1) // { // string groupId = "Id:" + Group.Id + "|Long:" + Group.Longitude + "|Lat:" + Group.Latitude; // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage( // "CellCulturalKnowledge.PolityCulturalProminenceInternal - Group:" + groupId, // "CurrentDate: " + Group.World.CurrentDate + // "", Group.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } //#endif _newValue = _newValue + valueChange; }
public bool HasPolityProminence(PolityProminence prominence) { return(_prominences.ContainsKey(prominence.Id)); }
public PolityProminenceCluster Split(PolityProminence startProminence) { #if DEBUG int oldSize = Size; #endif //#if DEBUG // if ((Manager.RegisterDebugEvent != null) && (Manager.TracingData.Priority <= 0)) // { // if (Manager.TracingData.ClusterId == Id) // { // SaveLoadTest.DebugMessage debugMessage = new SaveLoadTest.DebugMessage("PolityProminenceCluster.Split - Cluster:" + Id, // "CurrentDate: " + Polity.World.CurrentDate + // ", Size: " + Size + // ", LastProminenceChangeDate: " + LastProminenceChangeDate + // " [offset: " + (LastProminenceChangeDate - Manager.TracingData.LastSaveDate) + "]" + // "", Polity.World.CurrentDate); // Manager.RegisterDebugEvent("DebugMessage", debugMessage); // } // } // LastProminenceChangeDate = Polity.World.CurrentDate; //#endif RemoveProminence(startProminence); PolityProminenceCluster splitCluster = new PolityProminenceCluster(startProminence); HashSet <CellGroup> groupsAlreadyTested = new HashSet <CellGroup> { startProminence.Group }; Queue <PolityProminence> prominencesToExplore = new Queue <PolityProminence>(_prominences.Count + 1); prominencesToExplore.Enqueue(startProminence); bool continueExploring = true; while (continueExploring && (prominencesToExplore.Count > 0)) { PolityProminence prominenceToExplore = prominencesToExplore.Dequeue(); foreach (CellGroup nGroup in prominenceToExplore.Group.NeighborGroups) { if (groupsAlreadyTested.Contains(nGroup)) { continue; } if (HasPolityProminence(nGroup)) { PolityProminence prominenceToAdd = _prominences[nGroup.Id]; RemoveProminence(prominenceToAdd); splitCluster.AddProminence(prominenceToAdd); Manager.AddUpdatedCell(prominenceToAdd.Group.Cell, CellUpdateType.Cluster, CellUpdateSubType.Membership); if (splitCluster.Size >= MinSplitSize) { continueExploring = false; break; } prominencesToExplore.Enqueue(prominenceToAdd); } groupsAlreadyTested.Add(nGroup); } } //#if DEBUG // Debug.Log("Splitted cluster (Id: " + Id + ") of size " + oldSize + " and created new cluster (Id: " + splitCluster.Id + ") of size " + splitCluster.Size); //#endif return(splitCluster); }