private MapEventState(MapEvent mapEvent) { StageRounds = (int)MapEvent__mapEventUpdateCount.GetValue(mapEvent); IsSiege = mapEvent.IsSiegeAssault; if (SubModule.Settings.Battle_SendAllTroops_DetailedCombatModel) { if (IsSiege && mapEvent.MapEventSettlement != null && mapEvent.MapEventSettlement.SiegeEvent != null && mapEvent.MapEventSettlement.IsFortification) { BattleScale = 4; WallLevel = mapEvent.MapEventSettlement.Town.GetWallLevel(); int Ram = 0; int SiegeTower = 0; int Other = 0; foreach (SiegeEvent.SiegeEngineConstructionProgress allSiegeEngine in mapEvent.MapEventSettlement.SiegeEvent.GetSiegeEventSide(BattleSideEnum.Attacker).SiegeEngines.AllSiegeEngines()) { if (allSiegeEngine.IsConstructed) { if (allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.Ram) { Ram += 1; } else if (allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.SiegeTower) { SiegeTower += 1; } else if (allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.Trebuchet || allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.Onager || allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.Ballista) { Other += 1; } else if (allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.FireOnager || allSiegeEngine.SiegeEngine == DefaultSiegeEngineTypes.FireBallista) { Other += 1; } } } if (mapEvent.MapEventSettlement.SettlementTotalWallHitPoints < 1e-5) { NumberOfRoundsBeforeGateBreach = 5 + BattleScale; MeleePenaltyForAttacker = WallLevel * 0.15f - SiegeTower * 0.05f; } else { NumberOfRoundsBeforeGateBreach = Math.Max(WallLevel * 10 - Ram * 15 - SiegeTower * 5 - Other * 3, 0) + 10 + BattleScale; MeleePenaltyForAttacker = WallLevel * 0.3f - SiegeTower * 0.10f; } } else { if (mapEvent.GetNumberOfInvolvedMen() > 100) { BattleScale = 3; } else { BattleScale = mapEvent.GetNumberOfInvolvedMen() > 50 ? 2 : 1; } } } else { if (IsSiege) { SettlementPenalty = 1.0f / BattleAdvantageModel.GetSettlementAdvantage(mapEvent.MapEventSettlement); } } }