public GangLevelUpReport ProcessExperience(BattleReport battleReport) { var gang = _gangFactory.GetGang(battleReport.GangId); var underdogBonus = GetUnderdogBonus(gang.GangRating, battleReport.OpponentGangRating, battleReport.HasWon); var advancements = new List <GangerLevelUpReport>(); foreach (var gangerStats in battleReport.GangBattleStats) { var ganger = _gangerFactory.GetGanger(gangerStats.GangerId); var experience = 0; experience += GetLeaderBonus(ganger, battleReport.GameType, battleReport.HasWon, battleReport.IsAttacker); experience += GetWoundingHitBonus(gangerStats.Kills); experience += GetObjectivesBonus(gangerStats.Objectives, battleReport.GameType); experience += GetWinningBonus(battleReport.HasWon, battleReport.GameType); experience += GetSurvivalBonus(); var advanceRolls = GetNumberOfAdvanceRolls(ganger, experience); while (advanceRolls > 0) { advancements.Add(DoAdvanceRoll(ganger, gang.GangHouse)); advanceRolls--; } ganger.Experience += experience; _gangerFactory.UpdateGanger(ganger); } return(new GangLevelUpReport() { GangerAdvancements = advancements }); }
public IncomeReport ProcessIncome(BattleReport battleReport, int deaths) { var gang = _gangFactory.GetGang(battleReport.GangId); var territories = _territoryFactory.GetTerritoriesByGangId(battleReport.GangId).ToList(); territories.Sort(); var gangers = GetGangers(battleReport.GangId).ToList(); var gross = new List <TerritoryIncomeReport>(); for (int i = 0; i < gangers.Count(); i++) { var status = new TerritoryWorkStatus() { Deaths = deaths, Ganger = gangers[i], GangId = battleReport.GangId, Objectives = battleReport.GangBattleStats.Select(stats => stats.Objectives).Sum(), PreviousBattleType = battleReport.GameType, Roll = DiceRoller.ParseDiceString(territories[i].Territory.Income) }; gross.Add(territories[i].Territory.WorkTerritory(status)); } int territoryGross = gross.Select(territoryReport => territoryReport.Income).Sum(); int giantKillerBonus = GetGiantKillerBonus(gang.GangRating, battleReport.OpponentGangRating); int incomeAfterUpkeep = GetGangUpkeep(GetNumberOfGangMembers(battleReport.GangId), territoryGross + giantKillerBonus); var report = new IncomeReport() { Gross = gross, GiantKillerBonus = giantKillerBonus, Income = incomeAfterUpkeep }; gang.Credits += report.Income; _gangFactory.UpdateGang(gang); return(report); }