コード例 #1
0
        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);
                }
            }
        }