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);
    }
Exemplo n.º 7
0
    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);
    }