public override int Execute(LogicLevel level)
        {
            if (level.GetVillageType() == 0)
            {
                LogicUnitProduction unitProduction = null;

                switch (this.m_index)
                {
                case 1:
                    unitProduction = level.GetGameObjectManagerAt(0).GetUnitProduction();
                    break;

                case 2:
                    unitProduction = level.GetGameObjectManagerAt(0).GetSpellProduction();
                    break;
                }

                if (unitProduction == null)
                {
                    return(-1);
                }

                unitProduction.SetLocked(this.m_disabled);

                return(0);
            }

            return(-32);
        }
Пример #2
0
        public override int Execute(LogicLevel level)
        {
            if (this.m_villageType <= 1 && level.GetGameObjectManagerAt(this.m_villageType) != null)
            {
                LogicGameObject gameObject = level.GetGameObjectManagerAt(this.m_villageType).GetGameObjectByID(this.m_gameObjectId);

                if (gameObject != null)
                {
                    LogicGameObjectType gameObjectType = gameObject.GetGameObjectType();

                    if (gameObjectType == LogicGameObjectType.BUILDING)
                    {
                        return(((LogicBuilding)gameObject).SpeedUpConstruction() ? 0 : -1);
                    }

                    if (gameObjectType == LogicGameObjectType.TRAP)
                    {
                        return(((LogicTrap)gameObject).SpeedUpConstruction() ? 0 : -2);
                    }

                    if (gameObjectType == LogicGameObjectType.VILLAGE_OBJECT)
                    {
                        return(((LogicVillageObject)gameObject).SpeedUpCostruction() ? 0 : -1);
                    }
                }
            }

            return(-3);
        }
        /// <summary>
        ///     Executes this command.
        /// </summary>
        public override int Execute(LogicLevel level)
        {
            if (this._villageType <= 1)
            {
                if (level.GetGameObjectManagerAt(this._villageType) != null)
                {
                    LogicGameObject gameObject = level.GetGameObjectManagerAt(this._villageType).GetGameObjectByID(this._gameObjectId);

                    if (gameObject != null)
                    {
                        if (gameObject.GetGameObjectType() == 0)
                        {
                            return(((LogicBuilding)gameObject).SpeedUpConstruction() ? 0 : -1);
                        }
                        if (gameObject.GetGameObjectType() == 4)
                        {
                            return(((LogicTrap)gameObject).SpeedUpConstruction() ? 0 : -1);
                        }
                        if (gameObject.GetGameObjectType() == 8)
                        {
                            return(-1);
                        }
                    }
                }

                return(-3);
            }

            return(-3);
        }
Пример #4
0
        public int ChangeVillage(LogicLevel level, bool force)
        {
            if (this.m_villageType != 0 && !force)
            {
                LogicVillageObject ship = level.GetGameObjectManagerAt(0).GetShipyard();

                if (ship == null || ship.GetUpgradeLevel() <= 0)
                {
                    return(-23);
                }
            }

            if (level.GetGameObjectManagerAt(1).GetTownHall() != null)
            {
                level.SetVillageType(this.m_villageType);

                if (level.GetState() == 1)
                {
                    level.GetPlayerAvatar().SetVariableByName("VillageToGoTo", this.m_villageType);
                }

                level.GetGameObjectManager().RespawnObstacles();
            }

            return(0);
        }
Пример #5
0
        public override int Execute(LogicLevel level)
        {
            LogicAvatarAllianceRole allianceRole = level.GetHomeOwnerAvatar().GetAllianceRole();

            if (allianceRole == LogicAvatarAllianceRole.LEADER || allianceRole == LogicAvatarAllianceRole.CO_LEADER)
            {
                LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

                if (allianceCastle != null)
                {
                    LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                    if (bunkerComponent != null && bunkerComponent.GetClanMailCooldownTime() == 0)
                    {
                        bunkerComponent.StartClanMailCooldownTime();
                        level.GetHomeOwnerAvatar().GetChangeListener().SendClanMail(this.m_message);

                        return(0);
                    }
                }

                return(-2);
            }

            return(-1);
        }
Пример #6
0
        public override int Execute(LogicLevel level)
        {
            LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

            if (allianceCastle != null)
            {
                LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                if (bunkerComponent != null && bunkerComponent.GetRequestCooldownTime() == 0)
                {
                    LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar();

                    homeOwnerAvatar.GetChangeListener().RequestAllianceUnits(allianceCastle.GetUpgradeLevel(),
                                                                             bunkerComponent.GetUsedCapacity(),
                                                                             bunkerComponent.GetMaxCapacity(),
                                                                             homeOwnerAvatar.GetAllianceCastleUsedSpellCapacity(),
                                                                             homeOwnerAvatar.GetAllianceCastleTotalSpellCapacity(),
                                                                             this.m_message);

                    bunkerComponent.StartRequestCooldownTime();

                    return(0);
                }
            }

            return(-1);
        }
        public override int Execute(LogicLevel level)
        {
            LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

            if (allianceCastle != null)
            {
                LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                if (bunkerComponent != null)
                {
                    if (bunkerComponent.GetReplayShareCooldownTime() == 0)
                    {
                        bunkerComponent.StartReplayShareCooldownTime();

                        if (this.m_duelReplay)
                        {
                            level.GetGameListener().DuelReplayShared(this.m_battleEntryId);
                            level.GetHomeOwnerAvatar().GetChangeListener().ShareDuelReplay(this.m_battleEntryId, this.m_message);
                        }
                        else
                        {
                            level.GetHomeOwnerAvatar().GetChangeListener().ShareReplay(this.m_battleEntryId, this.m_message);
                        }

                        return(0);
                    }
                }
            }

            return(-1);
        }
Пример #8
0
        public override int Execute(LogicLevel level)
        {
            LogicAvatar             homeOwnerAvatar = level.GetHomeOwnerAvatar();
            LogicAvatarAllianceRole allianceRole    = homeOwnerAvatar.GetAllianceRole();

            if (allianceRole != LogicAvatarAllianceRole.MEMBER)
            {
                if (allianceRole == LogicAvatarAllianceRole.LEADER || allianceRole == LogicAvatarAllianceRole.CO_LEADER)
                {
                    level.GetHomeOwnerAvatar().GetChangeListener().KickPlayer(this.m_playerId, this.m_message);
                    return(0);
                }

                LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

                if (allianceCastle != null)
                {
                    LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                    if (bunkerComponent != null)
                    {
                        if (bunkerComponent.GetElderCooldownTime() == 0)
                        {
                            bunkerComponent.StartElderKickCooldownTime();
                            level.GetHomeOwnerAvatar().GetChangeListener().KickPlayer(this.m_playerId, this.m_message);
                            return(0);
                        }
                    }
                }

                return(-2);
            }

            return(-1);
        }
        private static LogicGameObject CreateGameObjectIfAnyPlaceExist(LogicGameObjectData data, LogicLevel level, int width, int height, int villageType, int x = 0, int y = 0)
        {
            int levelEndX = level.GetPlayArea().GetEndX();
            int levelEndY = level.GetPlayArea().GetEndY();

            if (x == 0 && y == 0)
            {
                x = level.GetPlayArea().GetStartX();
                y = level.GetPlayArea().GetStartY();
            }

            while (true)
            {
                if (level.IsValidPlaceForBuilding(x, y, width, height, null))
                {
                    LogicGameObject gameObject = LogicGameObjectFactory.CreateGameObject(data, level, villageType);
                    gameObject.SetInitialPosition(x << 9, y << 9);
                    level.GetGameObjectManagerAt(villageType).AddGameObject(gameObject, -1);
                    return(gameObject);
                }

                if (++x + width > levelEndX)
                {
                    if (++y + height > levelEndY)
                    {
                        break;
                    }
                    x = level.GetPlayArea().GetStartX();
                }
            }

            return(null);
        }
Пример #10
0
        public override int Execute(LogicLevel level)
        {
            LogicGameObject gameObject = this.m_villageType <= 1 && level.GetGameObjectManagerAt(this.m_villageType) != null
                ? level.GetGameObjectManagerAt(this.m_villageType).GetGameObjectByID(this.m_gameObjectId)
                : level.GetGameObjectManager().GetGameObjectByID(this.m_gameObjectId);

            if (gameObject != null && gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
            {
                LogicBuilding          building          = (LogicBuilding)gameObject;
                LogicHeroBaseComponent heroBaseComponent = building.GetHeroBaseComponent();

                if (heroBaseComponent != null)
                {
                    return(heroBaseComponent.SpeedUp() ? 0 : -2);
                }
            }

            return(-1);
        }
Пример #11
0
        public override int Execute(LogicLevel level)
        {
            if (level.GetVillageType() == 1)
            {
                if (this.m_gameObjectId != 0)
                {
                    LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(1);
                    LogicGameObject        gameObject        = gameObjectManager.GetGameObjectByID(this.m_gameObjectId);

                    if (gameObject != null && gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
                    {
                        LogicBuilding building = (LogicBuilding)gameObject;

                        if (this.m_unitData != null && level.GetGameMode().GetCalendar().IsProductionEnabled(this.m_unitData))
                        {
                            if (this.m_unitData.GetVillageType() == 1)
                            {
                                LogicVillage2UnitComponent village2UnitComponent = building.GetVillage2UnitComponent();

                                if (village2UnitComponent != null)
                                {
                                    if (this.m_unitData.IsUnlockedForProductionHouseLevel(gameObjectManager.GetHighestBuildingLevel(this.m_unitData.GetProductionHouseData(), true))
                                        )
                                    {
                                        LogicClientAvatar playerAvatar  = level.GetPlayerAvatar();
                                        LogicResourceData trainResource = this.m_unitData.GetTrainingResource();
                                        int trainCost = this.m_unitData.GetTrainingCost(playerAvatar.GetUnitUpgradeLevel(this.m_unitData));

                                        if (playerAvatar.HasEnoughResources(trainResource, trainCost, true, this, false))
                                        {
                                            village2UnitComponent.TrainUnit(this.m_unitData);
                                            playerAvatar.CommodityCountChangeHelper(0, trainResource, -trainCost);
                                        }

                                        return(0);
                                    }

                                    return(-7);
                                }

                                return(-4);
                            }

                            return(-8);
                        }
                    }

                    return(-5);
                }

                return(-1);
            }

            return(-10);
        }
        public static void LoadDebugJSONArray(LogicLevel level, LogicJSONArray jsonArray, LogicGameObjectType gameObjectType, int villageType)
        {
            if (jsonArray != null)
            {
                LogicGameObjectManager           gameObjectManager = level.GetGameObjectManagerAt(villageType);
                LogicArrayList <LogicGameObject> prevGameObjects   = new LogicArrayList <LogicGameObject>();

                prevGameObjects.AddAll(gameObjectManager.GetGameObjects(gameObjectType));

                for (int i = 0; i < prevGameObjects.Size(); i++)
                {
                    gameObjectManager.RemoveGameObject(prevGameObjects[i]);
                }

                for (int i = 0; i < jsonArray.Size(); i++)
                {
                    LogicJSONObject  jsonObject    = jsonArray.GetJSONObject(i);
                    LogicJSONNumber  dataNumber    = jsonObject.GetJSONNumber("data");
                    LogicJSONNumber  lvlNumber     = jsonObject.GetJSONNumber("lvl");
                    LogicJSONBoolean lockedBoolean = jsonObject.GetJSONBoolean("locked");
                    LogicJSONNumber  xNumber       = jsonObject.GetJSONNumber("x");
                    LogicJSONNumber  yNumber       = jsonObject.GetJSONNumber("y");

                    if (dataNumber != null && xNumber != null && yNumber != null)
                    {
                        LogicGameObjectData data = (LogicGameObjectData)LogicDataTables.GetDataById(dataNumber.GetIntValue());

                        if (data != null)
                        {
                            LogicGameObject gameObject = LogicGameObjectFactory.CreateGameObject(data, level, villageType);

                            if (gameObjectType == LogicGameObjectType.BUILDING)
                            {
                                ((LogicBuilding)gameObject).StartConstructing(true);
                            }

                            if (lockedBoolean != null && lockedBoolean.IsTrue())
                            {
                                ((LogicBuilding)gameObject).Lock();
                            }

                            gameObject.Load(jsonObject);
                            gameObjectManager.AddGameObject(gameObject, -1);

                            if (lvlNumber != null)
                            {
                                LogicDebugUtil.SetBuildingUpgradeLevel(level, gameObject.GetGlobalID(), lvlNumber.GetIntValue(), villageType);
                            }
                        }
                    }
                }
            }
        }
Пример #13
0
        public override int Execute(LogicLevel level)
        {
            if (LogicDataTables.GetGlobals().UseNewTraining())
            {
                if (level.GetVillageType() == 0)
                {
                    LogicClientAvatar   playerAvatar   = level.GetPlayerAvatar();
                    LogicUnitProduction unitProduction = this.m_productionType == 1
                        ? level.GetGameObjectManagerAt(0).GetSpellProduction()
                        : level.GetGameObjectManagerAt(0).GetUnitProduction();

                    if (unitProduction.CanBeBoosted())
                    {
                        int cost = unitProduction.GetBoostCost();

                        if (playerAvatar.HasEnoughDiamonds(cost, true, level))
                        {
                            playerAvatar.UseDiamonds(cost);
                            playerAvatar.GetChangeListener().DiamondPurchaseMade(15, 0, 0, cost, level.GetVillageType());

                            unitProduction.Boost();

                            return(0);
                        }

                        return(-2);
                    }

                    return(-1);
                }

                return(-32);
            }

            return(-99);
        }
Пример #14
0
        /// <summary>
        ///     Gets the troop housing build time village 2.
        /// </summary>
        public int GetTroopHousingBuildTimeVillage2(LogicLevel level, int ignoreBuildingCnt)
        {
            LogicBuildingData data = LogicDataTables.GetBuildingByName("Troop Housing2");

            if (data != null)
            {
                return(this._village2TroopHousingBuildTimeSecs[LogicMath.Clamp(level.GetGameObjectManagerAt(1).GetGameObjectCountByData(data) - ignoreBuildingCnt,
                                                                               0,
                                                                               this._village2TroopHousingBuildTimeSecs.Length - 1)]);
            }
            else
            {
                Debugger.Error("Could not find Troop Housing2 data");
            }

            return(0);
        }
Пример #15
0
        public byte[] CreateChallengeSnapshot()
        {
            if (this.m_logicGameMode.GetState() != 1)
            {
                throw new Exception("GameMode.createChallengeSnapshot called in invalid logic state.");
            }

            LogicLevel      logicLevel = this.m_logicGameMode.GetLevel();
            LogicJSONObject jsonObject = new LogicJSONObject(64);

            jsonObject.Put("exp_ver", new LogicJSONNumber(logicLevel.GetExperienceVersion()));
            logicLevel.GetGameObjectManagerAt(0).SaveToSnapshot(jsonObject, 6);

            this.m_logicGameMode.GetLevel().GetHomeOwnerAvatar().SaveToDirect(jsonObject);

            ZLibHelper.CompressInZLibFormat(LogicStringUtil.GetBytes(LogicJSONParser.CreateJSONString(jsonObject, 1536)), out byte[] homeJSON);

            return(homeJSON);
        }
        public override int Execute(LogicLevel level)
        {
            if (this.m_excludeMemberList == null || this.m_excludeMemberList.Size() <= LogicDataTables.GetGlobals().GetWarMaxExcludeMembers())
            {
                if (this.m_enemyAllianceId != null)
                {
                    LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar();

                    if (homeOwnerAvatar.IsInAlliance())
                    {
                        if (homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.LEADER || homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.CO_LEADER)
                        {
                            LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

                            if (allianceCastle != null)
                            {
                                LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                                if (bunkerComponent != null && bunkerComponent.GetArrangedWarCooldownTime() == 0)
                                {
                                    bunkerComponent.StartArrangedWarCooldownTime();
                                    homeOwnerAvatar.GetChangeListener().StartArrangedWar(this.m_excludeMemberList, this.m_enemyAllianceId, 0, 0, 0);

                                    return(0);
                                }

                                return(-5);
                            }

                            return(-4);
                        }

                        return(-3);
                    }

                    return(-2);
                }

                return(-3);
            }

            return(-1);
        }
Пример #17
0
        public override int Execute(LogicLevel level)
        {
            if (LogicDataTables.GetGlobals().UseTroopRequestSpeedUp())
            {
                LogicClientAvatar      playerAvatar      = level.GetPlayerAvatar();
                LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);
                LogicBuilding          allianceCastle    = gameObjectManager.GetAllianceCastle();

                if (allianceCastle != null)
                {
                    LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                    if (bunkerComponent != null)
                    {
                        if (playerAvatar.GetAllianceCastleUsedCapacity() < playerAvatar.GetAllianceCastleTotalCapacity() ||
                            playerAvatar.GetAllianceCastleUsedSpellCapacity() < playerAvatar.GetAllianceCastleTotalSpellCapacity())
                        {
                            int speedUpCost = LogicGamePlayUtil.GetSpeedUpCost(bunkerComponent.GetRequestCooldownTime(), 3, 0);

                            if (playerAvatar.HasEnoughDiamonds(speedUpCost, true, level))
                            {
                                playerAvatar.UseDiamonds(speedUpCost);
                                playerAvatar.GetChangeListener().DiamondPurchaseMade(11, 0, 0, speedUpCost, level.GetVillageType());
                                bunkerComponent.StopRequestCooldownTime();

                                return(0);
                            }

                            return(-6);
                        }

                        return(-5);
                    }

                    return(-4);
                }

                return(-3);
            }

            return(-1);
        }
        public override int Execute(LogicLevel level)
        {
            LogicArrayList <LogicGameObject> gameObjects = level.GetGameObjectManagerAt(0).GetGameObjects(LogicGameObjectType.BUILDING);

            for (int i = 0; i < gameObjects.Size(); i++)
            {
                LogicBuilding building = (LogicBuilding)gameObjects[i];

                if (building.GetData() == LogicDataTables.GetAllianceCastleData())
                {
                    LogicWarResourceStorageComponent warResourceStorageComponent = building.GetWarResourceStorageComponent();

                    if (warResourceStorageComponent.IsNotEmpty())
                    {
                        warResourceStorageComponent.CollectResources();
                    }
                }
            }

            return(0);
        }
        private static LogicGameObject CreateAndPlaceRandomlyGameObject(LogicGameObjectData data, LogicLevel level, int width, int height, int villageType)
        {
            int levelEndX = level.GetPlayArea().GetEndX();
            int levelEndY = level.GetPlayArea().GetEndY();
            int midX      = levelEndX / 2;
            int midY      = levelEndY / 2;

            int passCount = 1;

            while (true)
            {
                int startX = LogicMath.Max(midX - passCount, 0);
                int startY = LogicMath.Max(midY - passCount, 0);
                int endX   = LogicMath.Min(midX + passCount, levelEndX);
                int endY   = LogicMath.Min(midY + passCount, levelEndY);

                int possibility = LogicMath.Min((endX - startX) * (endY - startY), 20);

                for (int i = 0; i < possibility; i++)
                {
                    int x = startX + GameBaseGenerator.m_random.Rand(endX - startX);
                    int y = startY + GameBaseGenerator.m_random.Rand(endY - startY);

                    if (level.IsValidPlaceForBuilding(x, y, width, height, null))
                    {
                        LogicGameObject gameObject = LogicGameObjectFactory.CreateGameObject(data, level, villageType);
                        gameObject.SetInitialPosition(x << 9, y << 9);
                        level.GetGameObjectManagerAt(villageType).AddGameObject(gameObject, -1);
                        return(gameObject);
                    }
                }

                if (startX == 0 && startY == 0)
                {
                    return(null);
                }

                passCount += 2;
            }
        }
        public void LoadGameObjectsJsonArray(LogicLevel level, LogicJSONArray array, int villageType)
        {
            if (array != null)
            {
                for (int i = 0; i < array.Size(); i++)
                {
                    LogicJSONObject jsonObject = array.GetJSONObject(i);

                    if (jsonObject != null)
                    {
                        LogicGameObjectData data = (LogicGameObjectData)LogicDataTables.GetDataById(jsonObject.GetJSONNumber("data").GetIntValue());

                        if (data != null)
                        {
                            LogicGameObject gameObject = LogicGameObjectFactory.CreateGameObject(data, level, villageType);
                            gameObject.Load(jsonObject);
                            level.GetGameObjectManagerAt(1).AddGameObject(gameObject, -1);
                        }
                    }
                }
            }
        }
        public override int Execute(LogicLevel level)
        {
            LogicClientAvatar playerAvatar = level.GetPlayerAvatar();

            if (playerAvatar != null)
            {
                LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(1);

                if (gameObjectManager.GetTownHall() == null)
                {
                    LogicJSONObject jsonObject = level.GetGameListener().ParseCompressedHomeJSON(this.m_compressedHomeJSON, this.m_compressedHomeJSON.Length);

                    level.SetLoadingVillageType(1);

                    this.LoadGameObjectsJsonArray(level, jsonObject.GetJSONArray("buildings2"), 1);
                    this.LoadGameObjectsJsonArray(level, jsonObject.GetJSONArray("obstacles2"), 1);
                    this.LoadGameObjectsJsonArray(level, jsonObject.GetJSONArray("traps2"), 1);
                    this.LoadGameObjectsJsonArray(level, jsonObject.GetJSONArray("decos2"), 1);

                    level.SetLoadingVillageType(-1);

                    if (playerAvatar.GetResourceCount(LogicDataTables.GetGold2Data()) == 0)
                    {
                        playerAvatar.CommodityCountChangeHelper(0, LogicDataTables.GetGold2Data(), LogicDataTables.GetGlobals().GetStartingGold2());
                    }

                    if (playerAvatar.GetResourceCount(LogicDataTables.GetElixir2Data()) == 0)
                    {
                        playerAvatar.CommodityCountChangeHelper(0, LogicDataTables.GetElixir2Data(), LogicDataTables.GetGlobals().GetStartingElixir2());
                    }
                }

                return(0);
            }

            return(-1);
        }
Пример #22
0
        public override int Execute(LogicLevel level)
        {
            if (this.m_villageType >= 0)
            {
                if (this.m_villageType <= 1)
                {
                    if (this.m_villageType != level.GetVillageType())
                    {
                        if (level.GetGameObjectManagerAt(1).GetTownHall() == null)
                        {
                            // ship was not found!.
                        }

                        return(this.ChangeVillage(level, false));
                    }

                    return(-3);
                }

                return(-2);
            }

            return(-1);
        }
Пример #23
0
        /// <summary>
        ///     Gets the unit training time.
        /// </summary>
        public int GetTrainingTime(int index, LogicLevel level, int additionalBarrackCount)
        {
            int trainingTime = this._trainingTime[index];

            if (this.GetVillageType() != 1 &&
                LogicDataTables.GetGlobals().UseNewTraining() &&
                this.GetCombatItemType() == 0)
            {
                if (level != null)
                {
                    LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);

                    if (this._unitType != 0)
                    {
                        if (this._unitType == 1)
                        {
                            int barrackCount = gameObjectManager.GetBarrackCount();
                            int barrackFound = 0;

                            if (barrackCount > 0)
                            {
                                int productionLevel = this.GetRequiredProductionHouseLevel();
                                int idx             = 0;

                                do
                                {
                                    LogicBuilding barrack = (LogicBuilding)gameObjectManager.GetBarrack(idx);

                                    if (barrack != null)
                                    {
                                        if (barrack.GetBuildingData().GetProducesUnitsOfType() == this.GetUnitOfType())
                                        {
                                            if (barrack.GetUpgradeLevel() >= productionLevel)
                                            {
                                                if (!barrack.IsConstructing())
                                                {
                                                    barrackFound += 1;
                                                }
                                            }
                                        }
                                    }
                                } while (++idx != barrackCount);
                            }

                            if (barrackFound + additionalBarrackCount <= 0)
                            {
                                return(trainingTime);
                            }

                            int[] barrackDivisor = LogicDataTables.GetGlobals().GetBarrackReduceTrainingDevisor();
                            int   divisor        = barrackDivisor[LogicMath.Min(barrackDivisor.Length - 1, barrackFound + additionalBarrackCount - 1)];

                            if (divisor > 0)
                            {
                                return(trainingTime / divisor);
                            }

                            return(trainingTime);
                        }

                        if (this.GetUnitOfType() == 2)
                        {
                            int barrackCount = gameObjectManager.GetDarkBarrackCount();
                            int barrackFound = 0;

                            if (barrackCount > 0)
                            {
                                int productionLevel = this.GetRequiredProductionHouseLevel();
                                int idx             = 0;

                                do
                                {
                                    LogicBuilding barrack = (LogicBuilding)gameObjectManager.GetDarkBarrack(idx);

                                    if (barrack != null)
                                    {
                                        if (barrack.GetBuildingData().GetProducesUnitsOfType() == this.GetCombatItemType())
                                        {
                                            if (barrack.GetUpgradeLevel() >= productionLevel)
                                            {
                                                if (!barrack.IsConstructing())
                                                {
                                                    barrackFound += 1;
                                                }
                                            }
                                        }
                                    }
                                } while (++idx != barrackCount);
                            }

                            if (barrackCount + additionalBarrackCount <= 0)
                            {
                                return(trainingTime);
                            }

                            int[] barrackDivisor = LogicDataTables.GetGlobals().GetDarkBarrackReduceTrainingDevisor();
                            int   divisor        = barrackDivisor[LogicMath.Min(barrackDivisor.Length - 1, barrackCount + additionalBarrackCount - 1)];

                            if (divisor > 0)
                            {
                                return(trainingTime / divisor);
                            }

                            return(trainingTime);
                        }
                    }

                    Debugger.Error("invalid type for unit");
                }
                else
                {
                    Debugger.Error("level was null in getTrainingTime()");
                }
            }

            return(trainingTime);
        }
        public int GetTrainingTime(int index, LogicLevel level, int additionalBarrackCount)
        {
            int trainingTime = this.m_trainingTime[index];

            if (LogicDataTables.GetGlobals().UseNewTraining() &&
                this.GetVillageType() != 1 &&
                this.GetCombatItemType() == LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER)
            {
                if (level != null)
                {
                    LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);

                    switch (this.m_unitType)
                    {
                    case 1:
                        int barrackCount    = gameObjectManager.GetBarrackCount();
                        int productionLevel = this.GetRequiredProductionHouseLevel();
                        int barrackFound    = 0;

                        for (int i = 0; i < barrackCount; i++)
                        {
                            LogicBuilding barrack = (LogicBuilding)gameObjectManager.GetBarrack(i);

                            if (barrack != null)
                            {
                                if (barrack.GetBuildingData().GetProducesUnitsOfType() == this.GetUnitOfType())
                                {
                                    if (barrack.GetUpgradeLevel() >= productionLevel)
                                    {
                                        if (!barrack.IsConstructing())
                                        {
                                            barrackFound += 1;
                                        }
                                    }
                                }
                            }
                        }

                        if (barrackFound + additionalBarrackCount <= 0)
                        {
                            return(trainingTime);
                        }

                        int[] barrackDivisor = LogicDataTables.GetGlobals().GetBarrackReduceTrainingDevisor();
                        int   divisor        = barrackDivisor[LogicMath.Min(barrackDivisor.Length - 1, barrackFound + additionalBarrackCount - 1)];

                        if (divisor > 0)
                        {
                            return(trainingTime / divisor);
                        }

                        return(trainingTime);

                    case 2:
                        barrackCount    = gameObjectManager.GetDarkBarrackCount();
                        productionLevel = this.GetRequiredProductionHouseLevel();
                        barrackFound    = 0;

                        for (int i = 0; i < barrackCount; i++)
                        {
                            LogicBuilding barrack = (LogicBuilding)gameObjectManager.GetDarkBarrack(i);

                            if (barrack != null)
                            {
                                if (barrack.GetBuildingData().GetProducesUnitsOfType() == this.GetUnitOfType())
                                {
                                    if (barrack.GetUpgradeLevel() >= productionLevel)
                                    {
                                        if (!barrack.IsConstructing())
                                        {
                                            barrackFound += 1;
                                        }
                                    }
                                }
                            }
                        }

                        if (barrackFound + additionalBarrackCount <= 0)
                        {
                            return(trainingTime);
                        }

                        barrackDivisor = LogicDataTables.GetGlobals().GetDarkBarrackReduceTrainingDevisor();
                        divisor        = barrackDivisor[LogicMath.Min(barrackDivisor.Length - 1, barrackFound + additionalBarrackCount - 1)];

                        if (divisor > 0)
                        {
                            return(trainingTime / divisor);
                        }

                        return(trainingTime);

                    default:
                        Debugger.Error("invalid type for unit");
                        break;
                    }
                }
                else
                {
                    Debugger.Error("level was null in getTrainingTime()");
                }
            }

            return(trainingTime);
        }
        public override int Execute(LogicLevel level)
        {
            if (this.m_layoutId == 7)
            {
                return(-21);
            }

            if (this.m_village2)
            {
                if (this.m_layoutId != 0 && this.m_layoutId != 2 && this.m_layoutId != 3)
                {
                    return(-22);
                }
            }

            if (LogicDataTables.GetGlobals().UseVersusBattle())
            {
                int villageType = this.m_village2 ? 1 : 0;

                if (level.GetTownHallLevel(villageType) < level.GetRequiredTownHallLevelForLayout(this.m_layoutId, villageType))
                {
                    return(-3);
                }

                if (level.GetPlayerAvatar() == null)
                {
                    return(-10);
                }

                LogicArrayList <LogicGameObject> gameObjects = new LogicArrayList <LogicGameObject>(500);
                LogicGameObjectFilter            filter      = new LogicGameObjectFilter();

                filter.AddGameObjectType(LogicGameObjectType.BUILDING);
                filter.AddGameObjectType(LogicGameObjectType.TRAP);
                filter.AddGameObjectType(LogicGameObjectType.DECO);

                level.GetGameObjectManagerAt(this.m_village2 ? 1 : 0).GetGameObjects(gameObjects, filter);

                for (int i = 0; i < gameObjects.Size(); i++)
                {
                    LogicVector2 position = gameObjects[i].GetPositionLayout(this.m_layoutId, false);

                    if ((this.m_layoutId & 0xFFFFFFFE) != 6 && (position.m_x == -1 || position.m_y == -1))
                    {
                        return(-5);
                    }
                }

                gameObjects.Destruct();
                filter.Destruct();

                if (!this.m_village2)
                {
                    LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar();

                    if (homeOwnerAvatar == null || homeOwnerAvatar.IsChallengeStarted())
                    {
                        if (level.GetLayoutCooldown(this.m_layoutId) > 0)
                        {
                            return(-7);
                        }
                    }
                }

                LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

                if (allianceCastle != null)
                {
                    LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();

                    if (bunkerComponent == null || bunkerComponent.GetChallengeCooldownTime() != 0)
                    {
                        return(-6);
                    }

                    LogicClientAvatar playerAvatar = level.GetPlayerAvatar();

                    if (!this.m_challenge)
                    {
                        if (playerAvatar.GetChallengeId() != null)
                        {
                            int challengeState = playerAvatar.GetChallengeState();

                            if (challengeState != 2 && challengeState != 4)
                            {
                                Debugger.Warning("chal state: " + challengeState);
                                return(-8);
                            }
                        }
                    }

                    int friendlyCost = LogicDataTables.GetGlobals().GetFriendlyBattleCost(playerAvatar.GetTownHallLevel());

                    if (friendlyCost != 0)
                    {
                        if (!playerAvatar.HasEnoughResources(LogicDataTables.GetGoldData(), friendlyCost, true, this, false))
                        {
                            return(0);
                        }

                        if (friendlyCost > 0)
                        {
                            playerAvatar.CommodityCountChangeHelper(0, LogicDataTables.GetGoldData(), friendlyCost);
                        }
                    }

                    bunkerComponent.StartChallengeCooldownTime();

                    bool warLayout = this.m_layoutId == 1 || this.m_layoutId == 4 || this.m_layoutId == 5;

                    if (this.m_village2)
                    {
                        if (this.m_challenge)
                        {
                            playerAvatar.GetChangeListener().SendChallengeRequest(this.m_message, this.m_layoutId, warLayout, villageType);
                        }
                        else
                        {
                            playerAvatar.GetChangeListener().SendFriendlyBattleRequest(this.m_message, this.m_battleId, this.m_layoutId, warLayout, villageType);
                        }
                    }
                    else
                    {
                        this.SaveChallengeLayout(level, warLayout);

                        if (this.m_challenge)
                        {
                            playerAvatar.GetChangeListener().SendChallengeRequest(this.m_message, this.m_layoutId, warLayout, villageType);
                        }
                        else
                        {
                            playerAvatar.GetChangeListener().SendFriendlyBattleRequest(this.m_message, this.m_battleId, this.m_layoutId, warLayout, villageType);
                        }

                        playerAvatar.SetVariableByName("ChallengeStarted", 1);
                    }

                    return(0);
                }

                return(-3);
            }

            return(2);
        }
        public int NewTrainingUnit(LogicLevel level)
        {
            if (LogicDataTables.GetGlobals().UseNewTraining())
            {
                if (this.m_trainCount <= 100)
                {
                    LogicUnitProduction unitProduction = this.m_unitType == 1
                        ? level.GetGameObjectManagerAt(0).GetSpellProduction()
                        : level.GetGameObjectManagerAt(0).GetUnitProduction();

                    if (this.m_trainCount > 0)
                    {
                        if (this.m_unitData != null)
                        {
                            LogicClientAvatar playerAvatar = level.GetPlayerAvatar();

                            bool firstLoopExecuted = false;
                            int  trainingCost      = level.GetGameMode().GetCalendar().GetTrainingCost(this.m_unitData, playerAvatar.GetUnitUpgradeLevel(this.m_unitData));

                            for (int i = 0; i < this.m_trainCount; i++)
                            {
                                if (!unitProduction.CanAddUnitToQueue(this.m_unitData, false))
                                {
                                    if (firstLoopExecuted)
                                    {
                                        break;
                                    }

                                    return(-40);
                                }

                                if (!playerAvatar.HasEnoughResources(this.m_unitData.GetTrainingResource(), trainingCost, true, this, false))
                                {
                                    if (firstLoopExecuted)
                                    {
                                        break;
                                    }

                                    return(-30);
                                }

                                playerAvatar.CommodityCountChangeHelper(0, this.m_unitData.GetTrainingResource(), -trainingCost);

                                if (this.m_slotId == -1)
                                {
                                    this.m_slotId = unitProduction.GetSlotCount();
                                }

                                unitProduction.AddUnitToQueue(this.m_unitData, this.m_slotId, false);
                                firstLoopExecuted = true;
                            }

                            return(0);
                        }
                    }

                    return(-50);
                }

                Debugger.Error("LogicTraingUnitCommand - Count is too high");

                return(-20);
            }

            return(-99);
        }
Пример #27
0
        public override int Execute(LogicLevel level)
        {
            LogicGameObject gameObject = level.GetGameObjectManager().GetGameObjectByID(this.m_gameObjectId);

            if (gameObject != null && gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
            {
                LogicBuilding     building     = (LogicBuilding)gameObject;
                LogicBuildingData buildingData = building.GetBuildingData();

                if (buildingData.GetVillageType() == level.GetVillageType())
                {
                    if (!level.IsBuildingGearUpCapReached(buildingData, true))
                    {
                        if (building.GetGearLevel() == 0)
                        {
                            int upgLevel   = building.GetUpgradeLevel();
                            int gearUpCost = buildingData.GetGearUpCost(upgLevel);

                            if (gearUpCost > 0)
                            {
                                if (upgLevel >= buildingData.GetMinUpgradeLevelForGearUp())
                                {
                                    if (level.GetGameObjectManagerAt(1).GetHighestBuildingLevel(buildingData.GetGearUpBuildingData()) <
                                        buildingData.GetGearUpLevelRequirement())
                                    {
                                        return(-1);
                                    }

                                    LogicResourceData gearUpResource = buildingData.GetGearUpResource();

                                    if (gearUpResource != null)
                                    {
                                        LogicClientAvatar playerAvatar = level.GetPlayerAvatar();

                                        if (playerAvatar.HasEnoughResources(gearUpResource, gearUpCost, true, this, false))
                                        {
                                            if (level.HasFreeWorkers(this, 1))
                                            {
                                                playerAvatar.CommodityCountChangeHelper(0, gearUpResource, -gearUpCost);
                                                building.StartUpgrading(true, true);

                                                return(0);
                                            }
                                        }
                                    }

                                    return(-1);
                                }

                                return(-37);
                            }

                            return(-36);
                        }

                        return(-35);
                    }

                    return(-31);
                }

                return(-32);
            }

            return(-1);
        }
Пример #28
0
        public override int Execute(LogicLevel level)
        {
            LogicClientAvatar playerAvatar = level.GetPlayerAvatar();

            if (playerAvatar != null)
            {
                if (this.m_unitData != null)
                {
                    if (this.m_unitData.GetVillageType() == 0)
                    {
                        if (!this.m_unitData.IsDonationDisabled())
                        {
                            bool containsUnit = false;
                            int  upgLevel     = playerAvatar.GetUnitUpgradeLevel(this.m_unitData);

                            LogicUnitProductionComponent unitProductionComponent = null;

                            if (this.m_quickDonate)
                            {
                                int cost = this.m_unitData.GetDonateCost();

                                if (!playerAvatar.HasEnoughDiamonds(cost, true, level) || !LogicDataTables.GetGlobals().EnableQuickDonateWar())
                                {
                                    playerAvatar.GetChangeListener().WarDonateFailed(this.m_unitData, upgLevel, this.m_streamId, this.m_quickDonate);
                                    return(0);
                                }
                            }
                            else
                            {
                                LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);

                                if (LogicDataTables.GetGlobals().UseNewTraining())
                                {
                                    LogicUnitProduction unitProduction  = gameObjectManager.GetUnitProduction();
                                    LogicUnitProduction spellProduction = gameObjectManager.GetSpellProduction();

                                    if (unitProduction.GetWaitingForSpaceUnitCount(this.m_unitData) > 0)
                                    {
                                        if (unitProduction.GetUnitProductionType() == this.m_unitData.GetDataType())
                                        {
                                            containsUnit = true;
                                        }
                                    }

                                    if (spellProduction.GetWaitingForSpaceUnitCount(this.m_unitData) > 0)
                                    {
                                        if (spellProduction.GetUnitProductionType() == this.m_unitData.GetDataType())
                                        {
                                            containsUnit = true;
                                        }
                                    }
                                }
                                else
                                {
                                    for (int i = 0, c = gameObjectManager.GetNumGameObjects(); i < c; i++)
                                    {
                                        LogicGameObject gameObject = gameObjectManager.GetGameObjectByIndex(i);

                                        if (gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
                                        {
                                            LogicBuilding building = (LogicBuilding)gameObject;
                                            LogicUnitProductionComponent component = building.GetUnitProductionComponent();

                                            if (component != null)
                                            {
                                                unitProductionComponent = component;

                                                if (component.ContainsUnit(this.m_unitData))
                                                {
                                                    if (component.GetRemainingSeconds() == 0 && component.GetCurrentlyTrainedUnit() == this.m_unitData)
                                                    {
                                                        containsUnit = true;
                                                    }
                                                }
                                                else
                                                {
                                                    unitProductionComponent = null;
                                                }
                                            }
                                        }
                                    }
                                }

                                if (!containsUnit)
                                {
                                    if (playerAvatar.GetUnitCount(this.m_unitData) <= 0)
                                    {
                                        playerAvatar.GetChangeListener().WarDonateFailed(this.m_unitData, upgLevel, this.m_streamId, this.m_quickDonate);
                                        return(0);
                                    }
                                }
                            }

                            if (this.m_unitData.GetCombatItemType() != LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER)
                            {
                                playerAvatar.XpGainHelper(this.m_unitData.GetHousingSpace() * LogicDataTables.GetGlobals().GetDarkSpellDonationXP());
                                level.GetAchievementManager().AlianceSpellDonated((LogicSpellData)this.m_unitData);
                            }
                            else
                            {
                                playerAvatar.XpGainHelper(((LogicCharacterData)this.m_unitData).GetDonateXP());
                                level.GetAchievementManager().AlianceUnitDonated((LogicCharacterData)this.m_unitData);
                            }

                            playerAvatar.GetChangeListener().WarDonateOk(this.m_unitData, upgLevel, this.m_streamId, this.m_quickDonate);

                            if (this.m_quickDonate)
                            {
                                int cost = this.m_unitData.GetDonateCost();

                                playerAvatar.UseDiamonds(cost);
                                playerAvatar.GetChangeListener().DiamondPurchaseMade(12, this.m_unitData.GetGlobalID(), 0, cost, level.GetVillageType());

                                if (level.GetState() == 1 || level.GetState() == 3 &&
                                    this.m_unitData.GetCombatItemType() == LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER)
                                {
                                    // TODO: Finish this.
                                }
                            }
                            else
                            {
                                if (!containsUnit)
                                {
                                    playerAvatar.CommodityCountChangeHelper(0, this.m_unitData, -1);
                                }

                                LogicResourceData trainingResource = this.m_unitData.GetTrainingResource();
                                int trainingCost = level.GetGameMode().GetCalendar().GetTrainingCost(this.m_unitData, upgLevel);
                                int refund       = playerAvatar.GetTroopDonationRefund() * trainingCost / 100;

                                playerAvatar.CommodityCountChangeHelper(0, trainingResource, LogicMath.Max(refund, 0));

                                if (level.GetState() == 1 || level.GetState() == 3)
                                {
                                    if (containsUnit)
                                    {
                                        if (LogicDataTables.GetGlobals().UseNewTraining())
                                        {
                                            LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);
                                            LogicUnitProduction    unitProduction    = this.m_unitData.GetCombatItemType() != LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER
                                                ? gameObjectManager.GetSpellProduction()
                                                : gameObjectManager.GetUnitProduction();

                                            unitProduction.RemoveTrainedUnit(this.m_unitData);
                                        }

                                        if (this.m_unitData.GetCombatItemType() == LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER)
                                        {
                                            LogicBuilding productionHouse = null;

                                            if (unitProductionComponent != null)
                                            {
                                                productionHouse = (LogicBuilding)unitProductionComponent.GetParent();
                                            }
                                            else
                                            {
                                                if (LogicDataTables.GetGlobals().UseTroopWalksOutFromTraining())
                                                {
                                                    LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);
                                                    int gameObjectCount = gameObjectManager.GetNumGameObjects();

                                                    for (int i = 0; i < gameObjectCount; i++)
                                                    {
                                                        LogicGameObject gameObject = gameObjectManager.GetGameObjectByIndex(i);

                                                        if (gameObject != null && gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
                                                        {
                                                            LogicBuilding tmpBuilding = (LogicBuilding)gameObject;
                                                            LogicUnitProductionComponent tmpComponent = tmpBuilding.GetUnitProductionComponent();

                                                            if (tmpComponent != null)
                                                            {
                                                                if (tmpComponent.GetProductionType() == this.m_unitData.GetCombatItemType())
                                                                {
                                                                    if (tmpBuilding.GetBuildingData().GetProducesUnitsOfType() == this.m_unitData.GetUnitOfType() &&
                                                                        !tmpBuilding.IsUpgrading() &&
                                                                        !tmpBuilding.IsConstructing())
                                                                    {
                                                                        if (this.m_unitData.IsUnlockedForProductionHouseLevel(tmpBuilding.GetUpgradeLevel()))
                                                                        {
                                                                            if (productionHouse != null)
                                                                            {
                                                                                int seed = playerAvatar.GetExpPoints();

                                                                                if (tmpBuilding.Rand(seed) % 1000 > 750)
                                                                                {
                                                                                    productionHouse = tmpBuilding;
                                                                                }
                                                                            }
                                                                            else
                                                                            {
                                                                                productionHouse = tmpBuilding;
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }

                                            if (productionHouse != null)
                                            {
                                                // TODO: Implement listener.
                                            }
                                        }
                                    }
                                    else
                                    {
                                        LogicArrayList <LogicComponent> components = level.GetComponentManagerAt(0).GetComponents(LogicComponentType.UNIT_STORAGE);

                                        for (int i = 0; i < components.Size(); i++)
                                        {
                                            LogicUnitStorageComponent unitStorageComponent = (LogicUnitStorageComponent)components[i];
                                            int idx = unitStorageComponent.GetUnitTypeIndex(this.m_unitData);

                                            if (idx != -1)
                                            {
                                                if (unitStorageComponent.GetUnitCount(idx) > 0)
                                                {
                                                    unitStorageComponent.RemoveUnits(this.m_unitData, 1);

                                                    if (LogicDataTables.GetGlobals().UseNewTraining())
                                                    {
                                                        LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0);
                                                        LogicUnitProduction    unitProduction    = this.m_unitData.GetCombatItemType() != LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER
                                                            ? gameObjectManager.GetSpellProduction()
                                                            : gameObjectManager.GetUnitProduction();

                                                        unitProduction.MergeSlots();
                                                        unitProduction.UnitRemoved();
                                                    }

                                                    break;
                                                }
                                            }
                                        }
                                    }

                                    // TODO: Finish this.
                                }
                            }

                            return(0);
                        }

                        return(-91);
                    }

                    return(-45);
                }
            }

            return(0);
        }
Пример #29
0
        /// <summary>
        ///     Executes this instance.
        /// </summary>
        public override int Execute(LogicLevel level)
        {
            for (int i = 0; i < this._unitsCount.Count; i++)
            {
                if (this._unitsCount[i] < 0)
                {
                    return(-1);
                }
            }

            if (LogicDataTables.GetGlobals().EnableTroopDeletion() && level.GetState() == 1 && this._unitsData.Count > 0)
            {
                LogicClientAvatar playerAvatar = level.GetPlayerAvatar();
                Int32             removedUnits = 0;

                for (int i = 0; i < this._unitsData.Count; i++)
                {
                    LogicCombatItemData data = this._unitsData[i];
                    Int32 unitCount          = this._unitsCount[i];

                    if (this._removeType[i] != 0)
                    {
                        Int32 upgLevel = this._unitsUpgLevel[i];

                        if (data.GetCombatItemType() != 0)
                        {
                            if (data.GetCombatItemType() == 1)
                            {
                                playerAvatar.SetAllianceUnitCount(data, upgLevel, LogicMath.Max(0, playerAvatar.GetAllianceUnitCount(data, upgLevel) - unitCount));

                                if (unitCount > 0)
                                {
                                    do
                                    {
                                        playerAvatar.GetChangeListener().AllianceUnitRemoved(data, upgLevel);
                                    } while (--unitCount != 0);
                                }

                                removedUnits |= 2;
                            }
                        }
                        else
                        {
                            LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle();

                            if (allianceCastle != null)
                            {
                                LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent();
                                Int32 unitTypeIndex = bunkerComponent.GetUnitTypeIndex(data);

                                if (unitTypeIndex != -1)
                                {
                                    Int32 cnt = bunkerComponent.GetUnitCount(unitTypeIndex);

                                    if (cnt > 0)
                                    {
                                        bunkerComponent.RemoveUnits(data, upgLevel, cnt);
                                        playerAvatar.SetAllianceUnitCount(data, upgLevel, LogicMath.Max(0, playerAvatar.GetAllianceUnitCount(data, upgLevel) - unitCount));

                                        removedUnits |= 1;

                                        if (unitCount > 0)
                                        {
                                            do
                                            {
                                                playerAvatar.GetChangeListener().AllianceUnitRemoved(data, upgLevel);
                                            } while (--unitCount != 0);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (playerAvatar != null && data != null)
                        {
                            playerAvatar.CommodityCountChangeHelper(0, data, -unitCount);
                        }

                        LogicArrayList <LogicComponent> components = level.GetComponentManager().GetComponents(0);

                        for (int j = 0; j < components.Count; j++)
                        {
                            if (unitCount > 0)
                            {
                                LogicUnitStorageComponent storageComponent = (LogicUnitStorageComponent)components[j];
                                Int32 unitTypeIndex = storageComponent.GetUnitTypeIndex(data);

                                if (unitTypeIndex != -1)
                                {
                                    Int32 cnt = storageComponent.GetUnitCount(unitTypeIndex);

                                    if (cnt > 0)
                                    {
                                        cnt = LogicMath.Min(cnt, unitCount);
                                        storageComponent.RemoveUnits(data, cnt);

                                        int type = 2;

                                        if (data.GetCombatItemType() == 0)
                                        {
                                            if (storageComponent.GetParentListener() != null)
                                            {
                                                LogicGameObjectListener listener = storageComponent.GetParentListener();

                                                for (int k = 0; k < cnt; k++)
                                                {
                                                    listener.UnitRemoved(data);
                                                }
                                            }

                                            type = 1;
                                        }

                                        unitCount    -= cnt;
                                        removedUnits |= type;
                                    }
                                }
                            }
                        }
                    }
                }

                switch (removedUnits)
                {
                case 3:
                    if (LogicDataTables.GetGlobals().UseNewTraining())
                    {
                        level.GetGameObjectManager().GetUnitProduction().MergeSlots();
                        level.GetGameObjectManager().GetSpellProduction().MergeSlots();
                    }
                    break;

                case 2:
                    if (LogicDataTables.GetGlobals().UseNewTraining())
                    {
                        level.GetGameObjectManager().GetSpellProduction().MergeSlots();
                    }
                    break;

                case 1:
                    if (LogicDataTables.GetGlobals().UseNewTraining())
                    {
                        level.GetGameObjectManager().GetUnitProduction().MergeSlots();
                    }
                    break;

                default:
                    Debugger.Print("WTF: " + removedUnits);
                    break;
                }
            }

            return(0);
        }
        public static void SetBuildingUpgradeLevel(LogicLevel level, int gameObjectId, int upgLevel, int villageType)
        {
            LogicGameObject gameObject = level.GetGameObjectManagerAt(villageType).GetGameObjectByID(gameObjectId);

            if (gameObject != null)
            {
                if (gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING)
                {
                    LogicBuilding     building     = (LogicBuilding)gameObject;
                    LogicBuildingData buildingData = building.GetBuildingData();

                    if (building.GetGearLevel() > 0 || building.IsGearing())
                    {
                        if (buildingData.GetMinUpgradeLevelForGearUp() > upgLevel)
                        {
                            Debugger.HudPrint("Can't downgrade geared up building below gear up limit!");
                            upgLevel = buildingData.GetMinUpgradeLevelForGearUp();
                        }
                    }

                    if (buildingData.IsTownHall())
                    {
                        level.GetPlayerAvatar().SetTownHallLevel(upgLevel);
                    }

                    building.SetUpgradeLevel(LogicMath.Max(upgLevel - 1, 0));
                    building.FinishConstruction(false, true);
                    building.SetUpgradeLevel(upgLevel);

                    if (building.GetListener() != null)
                    {
                        building.GetListener().RefreshState();
                    }
                    if (buildingData.IsTownHall() || buildingData.IsTownHallVillage2())
                    {
                        level.RefreshNewShopUnlocks(buildingData.GetVillageType());
                    }
                }
                else if (gameObject.GetGameObjectType() == LogicGameObjectType.TRAP)
                {
                    LogicTrap trap = (LogicTrap)gameObject;

                    trap.SetUpgradeLevel(LogicMath.Max(upgLevel - 1, 0));
                    trap.FinishConstruction(false);
                    trap.SetUpgradeLevel(upgLevel);
                    trap.RepairTrap();

                    if (trap.GetListener() != null)
                    {
                        trap.GetListener().RefreshState();
                    }
                }
                else if (gameObject.GetGameObjectType() == LogicGameObjectType.VILLAGE_OBJECT)
                {
                    LogicVillageObject villageObject = (LogicVillageObject)gameObject;

                    villageObject.SetUpgradeLevel(LogicMath.Max(upgLevel - 1, 0));
                    villageObject.SetUpgradeLevel(upgLevel);

                    if (villageObject.GetListener() != null)
                    {
                        villageObject.GetListener().RefreshState();
                    }
                }
            }
        }