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;
        }
    }
Beispiel #9
0
    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);
    }
Beispiel #12
0
    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();
        }
    }
Beispiel #14
0
    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;
        }
    }
Beispiel #15
0
    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");
        }
    }
Beispiel #16
0
    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);
    }
Beispiel #22
0
 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);
    }
Beispiel #28
0
    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);
    }