public virtual ExplainedNumber GetScore(Kingdom kingdom, Kingdom otherKingdom, StatExplainer explanation = null)
        {
            ExplainedNumber explainedNumber = new ExplainedNumber(Scores.Base, explanation, null);

            // weak faction bonus
            if (!kingdom.IsStrong())
            {
                explainedNumber.Add(Scores.BelowMedianStrength, _weakFaction);
            }

            // common enemies
            IEnumerable <Kingdom> commonEnemies = FactionManager.GetEnemyKingdoms(kingdom).Intersect(FactionManager.GetEnemyKingdoms(otherKingdom));

            foreach (Kingdom commonEnemy in commonEnemies)
            {
                TextObject textObject = null;
                if (explanation != null)
                {
                    textObject = new TextObject("{=RqQ4oqvl}War with {ENEMY_KINGDOM}");
                    textObject.SetTextVariable("ENEMY_KINGDOM", commonEnemy.Name);
                }
                explainedNumber.Add(Scores.HasCommonEnemy, textObject);
            }

            IEnumerable <Kingdom> alliedEnemies  = Kingdom.All.Except(new[] { kingdom, otherKingdom }).Where(curKingdom => FactionManager.IsAlliedWithFaction(otherKingdom, curKingdom) && FactionManager.IsAtWarAgainstFaction(kingdom, curKingdom));
            IEnumerable <Kingdom> alliedNeutrals = Kingdom.All.Except(new[] { kingdom, otherKingdom }).Where(curKingdom => FactionManager.IsAlliedWithFaction(otherKingdom, curKingdom) && !FactionManager.IsAtWarAgainstFaction(kingdom, curKingdom));

            foreach (Kingdom alliedEnemy in alliedEnemies)
            {
                TextObject textObject = null;
                if (explanation != null)
                {
                    textObject = new TextObject("{=cmOSpfyW}Alliance with {ALLIED_KINGDOM}");
                    textObject.SetTextVariable("ALLIED_KINGDOM", alliedEnemy.Name);
                }
                explainedNumber.Add(Scores.ExistingAllianceWithEnemy, textObject);
            }
            foreach (Kingdom alliedNeutral in alliedNeutrals)
            {
                TextObject textObject = null;
                if (explanation != null)
                {
                    textObject = new TextObject("{=cmOSpfyW}Alliance with {ALLIED_KINGDOM}");
                    textObject.SetTextVariable("ALLIED_KINGDOM", alliedNeutral.Name);
                }
                explainedNumber.Add(Scores.ExistingAllianceWithNeutral, textObject);
            }

            // relation modifier
            float relationModifier = MBMath.ClampFloat((float)Math.Log((kingdom.Leader.GetRelation(otherKingdom.Leader) + 100f) / 100f, 1.5), -1, 1);

            explainedNumber.Add(Scores.Relationship * relationModifier, _relationship);

            // expansionism modifier
            if (otherKingdom.GetExpansionismDiplomaticPenalty() < 0)
            {
                TextObject textObject = null;
                if (explanation != null)
                {
                    textObject = new TextObject("{=CxdpR6w4}Expansionism");
                }
                explainedNumber.Add(otherKingdom.GetExpansionismDiplomaticPenalty(), textObject);
            }
            return(explainedNumber);
        }