private static Tuple <float, float> CalculateWarScore(CampaignWar campaignWar, MBReadOnlyList <IFaction> kingdomSide, MBReadOnlyList <IFaction> oppositionSide) { var kingdomWarScore = CalculateWarScoreForSideAgainst(campaignWar, kingdomSide, oppositionSide); var oppositionWarScore = CalculateWarScoreForSideAgainst(campaignWar, oppositionSide, kingdomSide); return(Tuple.Create(kingdomWarScore, oppositionWarScore)); }
private static void FindSides(CampaignWar campaignWar, Kingdom kingdom, out MBReadOnlyList <IFaction> kingdomSide, out MBReadOnlyList <IFaction> oppositionSide) { if (campaignWar.Side1.Contains(kingdom)) { kingdomSide = campaignWar.Side1; oppositionSide = campaignWar.Side2; } else { kingdomSide = campaignWar.Side2; oppositionSide = campaignWar.Side1; } }
private static float CalculateWarScoreForSideAgainst(CampaignWar campaignWar, MBReadOnlyList <IFaction> kingdomSide, MBReadOnlyList <IFaction> oppositionSide) { var warScore = 0.0f; var factionCasualties = 0; foreach (var faction in kingdomSide) { // Each point of renown is 1 point. var factionRenown = campaignWar.GetWarScoreOfFaction(faction); warScore += factionRenown * 1f; // Each raid counts as 50 points. var factionRaids = campaignWar.GetSuccessfulRaidsOfFaction(faction); warScore += factionRaids * 50f; // Each siege counts as 300 points. var factionSieges = campaignWar.GetSuccessfulSiegesOfFaction(faction); warScore += factionSieges * 300f; // Track, but do not add, the number of allies killed. factionCasualties += campaignWar.GetCasualtiesOfFaction(faction); } // Each enemy casualty is 1 point. var oppositionCasualties = 0; foreach (var faction in oppositionSide) { oppositionCasualties += campaignWar.GetCasualtiesOfFaction(faction); } warScore += oppositionCasualties * 1f; // Scale the score by the a multiplier reflecting how many // of the total losses are on the opponent's side. var totalCasualties = factionCasualties + oppositionCasualties; var casualtyMult = (totalCasualties > 0) ? (oppositionCasualties / (float)totalCasualties) : 1; warScore *= casualtyMult; return(warScore); }