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); }