示例#1
0
    public void CancelBuildingUpgrade(BuildingIdentity id)
    {
        BuildingLogicData data = this.GetBuildingObject(id);

        this.m_BuildingModule.CancelBuildingUpgrade(id);
        this.ReturnResource(data.UpgradeGold, data.UpgradeFood, data.UpgradeOil, data.UpgradeGem);
    }
示例#2
0
    public void FinishBuildingUpgrade(BuildingIdentity id)
    {
        BuildingLogicData building = this.m_BuildingModule.GetBuildingObject(id);

        BuildingConfigData oldData = ConfigInterface.Instance.BuildingConfigHelper.GetBuildingData(id.buildingType, building.Level);
        BuildingConfigData newData = ConfigInterface.Instance.BuildingConfigHelper.GetBuildingData(id.buildingType, building.Level + oldData.UpgradeStep);

        if (!newData.CanProduceGold)
        {
            this.m_PlayerModule.AddGoldCapacity(newData.StoreGoldCapacity, oldData.StoreGoldCapacity);
        }
        if (!newData.CanProduceFood)
        {
            this.m_PlayerModule.AddFoodCapacity(newData.StoreFoodCapacity, oldData.StoreFoodCapacity);
        }
        if (!newData.CanProduceOil)
        {
            this.m_PlayerModule.AddOilCapacity(newData.StoreOilCapacity, oldData.StoreOilCapacity);
        }
        if (newData.CanStoreProps)
        {
            this.m_PlayerModule.AddPropsCapacity(newData.StorePropsCapacity, oldData.StorePropsCapacity);
        }
        this.m_BuildingModule.FinishBuildingUpgrade(id);

        this.RewardResource(oldData.UpgradeRewardGold, oldData.UpgradeRewardFood, oldData.UpgradeRewardOil, oldData.UpgradeRewardGem,
                            oldData.UpgradeRewardExp);

        this.TaskManager.OnUpgradeBuilding(id.buildingType, this.m_BuildingModule.GetBuildingObject(id).Level);
    }
示例#3
0
    public void UpgradeBuilding(BuildingIdentity id, int builderBuildingNO)
    {
        BuildingLogicData data = this.GetBuildingObject(id);

        this.ConsumeResource(data.UpgradeGold, data.UpgradeFood, data.UpgradeOil, data.UpgradeGem);
        this.m_BuildingModule.UpgradeBuilding(id, builderBuildingNO);
        //ActorDirector.Instance.SendBuilderToBuild(builderBuildingNO, this.GetBuildingObject(id));
    }
    public void RecalculateStorage()
    {
        this.m_MaxCapacity = new Dictionary <ResourceType, int>()
        {
            { ResourceType.Gold, LogicController.Instance.PlayerData.GoldMaxCapacity },
            { ResourceType.Food, LogicController.Instance.PlayerData.FoodMaxCapacity },
            { ResourceType.Oil, LogicController.Instance.PlayerData.OilMaxCapacity }
        };

        this.m_CapacityDict = new Dictionary <ResourceType, Dictionary <BuildingIdentity, int> >()
        {
            { ResourceType.Gold, new Dictionary <BuildingIdentity, int>() },
            { ResourceType.Food, new Dictionary <BuildingIdentity, int>() },
            { ResourceType.Oil, new Dictionary <BuildingIdentity, int>() }
        };

        foreach (KeyValuePair <ResourceType, List <BuildingIdentity> > storage in this.m_StorageDict)
        {
            foreach (BuildingIdentity id in storage.Value)
            {
                BuildingLogicData building = this.m_BuildingModule.GetBuildingObject(id);
                int capacity = storage.Key == ResourceType.Gold ? building.StoreGoldCapacity :
                               storage.Key == ResourceType.Food ? building.StoreFoodCapacity : building.StoreOilCapacity;
                this.m_CapacityDict[storage.Key][id] = capacity;
            }
        }

        Dictionary <ResourceType, Dictionary <BuildingIdentity, int> > result = this.CalculateStorage(LogicController.Instance.PlayerData.CurrentStoreGold,
                                                                                                      LogicController.Instance.PlayerData.CurrentStoreFood, LogicController.Instance.PlayerData.CurrentStoreOil);

        foreach (KeyValuePair <ResourceType, Dictionary <BuildingIdentity, int> > storage in result)
        {
            foreach (KeyValuePair <BuildingIdentity, int> calculatedStorage in storage.Value)
            {
                BuildingLogicData building = this.m_BuildingModule.GetBuildingObject(calculatedStorage.Key);

                int?newGold = null;
                if (storage.Key == ResourceType.Gold)
                {
                    newGold = calculatedStorage.Value;
                }
                int?newFood = null;
                if (storage.Key == ResourceType.Food)
                {
                    newFood = calculatedStorage.Value;
                }
                int?newOil = null;
                if (storage.Key == ResourceType.Oil)
                {
                    newOil = calculatedStorage.Value;
                }

                this.m_BuildingModule.ModifyResourceStoreage(building.BuildingIdentity, newGold, newFood, newOil);
            }
        }
    }
示例#5
0
    public void FinishBuild()
    {
        BuildingLogicData logicData = LogicController.Instance.GetBuildingObject(
            new BuildingIdentity(BuildingType.BuilderHut, this.BuilderNO));
        TilePosition targetPosition = BorderPointHelper.FindValidInflateOneBorderPoint(logicData);

        BuilderReturnState returnState = new BuilderReturnState(this.MapData, targetPosition, this, logicData);

        this.ChangeState(returnState);
    }
示例#6
0
    public void SendBuilder(int builderNO, IObstacleInfo targetInfo)
    {
        BuildingLogicData builderHutData = LogicController.Instance.GetBuildingObject(
            new BuildingIdentity(ConfigUtilities.Enums.BuildingType.BuilderHut, builderNO));
        int builderLevel = builderHutData.Level;

        BuildingSceneDirector.Instance.SendBuilderToBuild(builderNO, builderLevel, builderHutData.BuildingPosition,
                                                          targetInfo, SceneManager.Instance);

        this.AddBusyBuilder(builderNO, targetInfo);
    }
示例#7
0
    public Nullable <bool> FindNeighourWallNotNull(BuildingObstacleDirection wallDirection, int index)
    {
        TilePosition      tilePosition      = null;
        BuildingLogicData buildingLogicData = null;

        switch (wallDirection)
        {
        case BuildingObstacleDirection.Top:
            tilePosition = new TilePosition(this.BuildingLogicData.BuildingPosition.Column, this.BuildingLogicData.BuildingPosition.Row + index);

            break;

        case BuildingObstacleDirection.Bottom:
            tilePosition = new TilePosition(this.BuildingLogicData.BuildingPosition.Column, this.BuildingLogicData.BuildingPosition.Row - index);

            break;

        case BuildingObstacleDirection.Left:
            tilePosition = new TilePosition(this.BuildingLogicData.BuildingPosition.Column - index, this.BuildingLogicData.BuildingPosition.Row);

            break;

        case BuildingObstacleDirection.Right:
            tilePosition = new TilePosition(this.BuildingLogicData.BuildingPosition.Column + index, this.BuildingLogicData.BuildingPosition.Row);
            break;
        }

        IObstacleInfo obstacleInfo = SceneManager.Instance.GetBuildingInfoFormBuildingObstacleMap(tilePosition.Row, tilePosition.Column);

        if (obstacleInfo == null)
        {
            return(null);
        }
        else
        {
            buildingLogicData = obstacleInfo as BuildingLogicData;
            if (buildingLogicData != null)
            {
                if (buildingLogicData.BuildingIdentity.buildingType == BuildingType.Wall)
                {
                    return(true);
                }
                else
                {
                    return(null);
                }
            }
            return(null);
        }
    }
示例#8
0
    protected override void Initialize()
    {
        this.m_MapData     = SceneManager.Instance;
        this.m_SceneHelper = this.GetComponent <BuildingSceneHelper>();

        List <BuildingLogicData>        buildings = LogicController.Instance.AllBuildings;
        List <RemovableObjectLogicData> objects   = LogicController.Instance.AllRemovableObjects;

        foreach (RemovableObjectLogicData removableObject in objects)
        {
            if (removableObject.CurrentAttachedBuilderNO >= 0)
            {
                int builderNO    = removableObject.CurrentAttachedBuilderNO;
                int builderLevel = LogicController.Instance.GetBuildingObject
                                       (new BuildingIdentity(BuildingType.BuilderHut, builderNO)).Level;
                this.SendBuilderBuild(builderNO, builderLevel, removableObject, this.m_MapData);
            }
        }

        foreach (BuildingLogicData building in buildings)
        {
            ArmyIdentity[] armies = building.Armies;
            if (armies != null)
            {
                foreach (ArmyIdentity army in armies)
                {
                    this.GenerateArmyInCamp(army.armyType, LogicController.Instance.GetArmyLevel(army.armyType), building);
                }
            }
            MercenaryIdentity[] mercenaries = building.Mercenaries;
            if (mercenaries != null)
            {
                foreach (MercenaryIdentity mercenary in mercenaries)
                {
                    BuildingIdentity  campID = LogicController.Instance.GetMercenaryData(mercenary).CampID;
                    BuildingLogicData camp   = LogicController.Instance.GetBuildingObject(campID);
                    this.GenerateMercenaryInCamp(mercenary.mercenaryType, camp);
                }
            }
            int builderNO = building.CurrentAttachedBuilderNO;
            if (builderNO >= 0)
            {
                int builderLevel = LogicController.Instance.GetBuildingObject
                                       (new BuildingIdentity(BuildingType.BuilderHut, builderNO)).Level;
                this.SendBuilderBuild(building.CurrentAttachedBuilderNO, builderLevel, building, this.m_MapData);
            }
        }
    }
示例#9
0
    protected override Nullable <ArmyIdentity> GetFinishedHeadProduct(BuildingIdentity id)
    {
        BuildingLogicData factory = LogicController.Instance.GetBuildingObject(id);

        if (factory.ArmyProducts == null || factory.ArmyProducts.Count == 0)
        {
            return(null);
        }
        ArmyLogicData army = LogicController.Instance.GetArmyObjectData(factory.ArmyProducts[0].Value[0]);

        if (!army.LogicProduceRemainingWorkload.IsZero())
        {
            return(null);
        }
        return(army.Identity);
    }
示例#10
0
    protected override Nullable <ItemIdentity> GetFinishedHeadProduct(BuildingIdentity id)
    {
        BuildingLogicData factory = LogicController.Instance.GetBuildingObject(id);

        if (factory.ItemProducts == null)
        {
            return(null);
        }
        ItemLogicObject item = LogicController.Instance.GetItemObject(factory.ItemProducts[0].Value[0]);

        if (!item.LogicProduceRemainingWorkload.IsZero())
        {
            return(null);
        }
        return(item.Identity);
    }
示例#11
0
    public void BuyUpgradeWall(int wallNO)
    {
        BuildingIdentity  id           = new BuildingIdentity(BuildingType.Wall, wallNO);
        BuildingLogicData buildingData = this.GetBuildingObject(id);
        RewardConfigData  rewardData   = new RewardConfigData()
        {
            RewardGold = buildingData.UpgradeRewardGold,
            RewardFood = buildingData.UpgradeRewardFood, RewardOil = buildingData.UpgradeRewardOil,
            RewardGem  = buildingData.UpgradeRewardGem, RewardExp = buildingData.UpgradeRewardExp
        };

        this.ConsumeResource(buildingData.UpgradeGold, buildingData.UpgradeFood, buildingData.UpgradeOil, buildingData.UpgradeGem);
        this.m_BuildingModule.BuyWallUpgrade(wallNO);
        this.m_ShopModule.BuyWallUpgrade(wallNO);
        this.RewardResource(rewardData.RewardGold, rewardData.RewardFood, rewardData.RewardOil, rewardData.RewardGem, rewardData.RewardExp);
        this.m_TaskModule.OnUpgradeBuilding(BuildingType.Wall, buildingData.Level);
    }
示例#12
0
    public void FinishUpgradeArmyInstantly(BuildingIdentity laboratoryID)
    {
        BuildingLogicData data = this.GetBuildingObject(laboratoryID);

        if (data.ArmyUpgrade.HasValue)
        {
            ArmyType armyType      = data.ArmyUpgrade.Value;
            int      remainingTime = data.ArmyUpgradeRemainingTime;
            int      costGem       = MarketCalculator.GetUpdateTimeCost(remainingTime);
            this.m_PlayerModule.Consume(0, 0, 0, costGem);
            this.m_BuildingModule.FinishArmyUpgradeInstantly(laboratoryID);
            this.m_ArmyModule.FinishUpgrade(armyType);
            this.m_PlayerModule.UpgradeArmy(armyType);

            this.m_TaskModule.OnUpgradeArmy(armyType, this.m_PlayerModule.Data.GetArmyLevel(armyType));
        }
    }
示例#13
0
    public BuildingIdentity?FindCamp(T type)
    {
        int capacityCost = this.GetCapacityCost(type);

        if (capacityCost + this.CampsTotalAlreadyCapacity > this.CampsTotalCapacity)
        {
            return(null);
        }

        foreach (BuildingIdentity id in this.m_Camps)
        {
            BuildingLogicData building = LogicController.Instance.GetBuildingObject(id);
            if (this.GetAlreadyCapacity(building) < this.GetTotalCapacity(building))
            {
                return(id);
            }
        }
        return(null);
    }
示例#14
0
    public BuildingIdentity?FindMercenaryCamp(MercenaryType type)
    {
        int capacityCost = ConfigInterface.Instance.MercenaryConfigHelper.GetMercenaryData(type).CapcityCost;

        if (capacityCost + this.CampsTotalAlreadyCapacity > this.CampsTotalCapacity)
        {
            return(null);
        }

        foreach (BuildingIdentity id in this.m_Camps)
        {
            BuildingLogicData building = LogicController.Instance.GetBuildingObject(id);
            if (this.GetAlreadyCapacity(building) < this.GetTotalCapacity(building))
            {
                return(id);
            }
        }
        return(null);
    }
示例#15
0
    public void FinishBuildingUpgradeInstantly(BuildingIdentity id)
    {
        BuildingLogicData data = this.GetBuildingObject(id);

        if (data.AttachedBuilderEfficiency > 0)
        {
            int remainingTime = Mathf.CeilToInt(data.UpgradeRemainingWorkload / data.AttachedBuilderEfficiency);
            int costGem       = MarketCalculator.GetUpdateTimeCost(remainingTime);

            this.m_PlayerModule.Consume(0, 0, 0, costGem);
            this.m_BuildingModule.FinishBuildingUpgradeInstantly(id, costGem);

            if (data.Level == 0)
            {
                this.FinishBuildingConstruct(id);
            }
            else
            {
                this.FinishBuildingUpgrade(id);
            }
        }
    }
示例#16
0
 protected abstract int GetTotalCapacity(BuildingLogicData building);
示例#17
0
 protected override int GetTotalCapacity(BuildingLogicData building)
 {
     return(building.ItemProduceCapacity);
 }
示例#18
0
 protected override int GetAlreadyCapacity(BuildingLogicData building)
 {
     return(building.AlreadyProduceItemCapacity);
 }
示例#19
0
    private void FreeBuilder(BuildingIdentity id)
    {
        BuildingLogicData building = this.m_Buildings[id.buildingType][id.buildingNO].BuildingLogicData;

        this.m_BuilderManager.RecycleBuilder(building.CurrentAttachedBuilderNO);
    }
示例#20
0
    public void IntializeBuilding(List <BuildingData> buildings)
    {
        this.m_Buildings = new Dictionary <BuildingType, Dictionary <int, BuildingLogicObject> >();
        List <int> alreadyWorkingBuilder      = new List <int>();
        List <BuildingIdentity> buildBuilding = new List <BuildingIdentity>();

        foreach (BuildingData building in buildings)
        {
            if (!this.m_Buildings.ContainsKey(building.BuildingID.buildingType))
            {
                this.m_Buildings.Add(building.BuildingID.buildingType, new Dictionary <int, BuildingLogicObject>());
            }

            BuildingLogicObject buildingObject = this.ConstructBuildingLogicObject(building);
            this.m_Buildings[building.BuildingID.buildingType].Add(building.BuildingID.buildingNO, buildingObject);

            if (building.ConfigData.CanStoreArmy && building.Level > 0)
            {
                this.m_ArmyCampManager.AddCamp(building.BuildingID);
            }
            if (building.ConfigData.CanProduceArmy && building.Level > 0)
            {
                this.m_ArmyFactoryManager.AddFactory(building.BuildingID);
            }

            if (building.ConfigData.CanStoreItem && building.Level > 0)
            {
                this.m_ItemCampManager.AddCamp(building.BuildingID);
            }
            if (building.ConfigData.CanProduceItem && building.Level > 0)
            {
                this.m_ItemFactoryManager.AddFactory(building.BuildingID);
            }

            if (building.ConfigData.CanStoreGold && building.ConfigData.ProduceGoldEfficiency == 0 && building.Level > 0)
            {
                this.m_ResourceManager.AddStorage(ResourceType.Gold, building.BuildingID,
                                                  building.ConfigData.StoreGoldCapacity);
            }
            if (building.ConfigData.CanStoreFood && building.ConfigData.ProduceFoodEfficiency == 0 && building.Level > 0)
            {
                this.m_ResourceManager.AddStorage(ResourceType.Food, building.BuildingID,
                                                  building.ConfigData.StoreFoodCapacity);
            }
            if (building.ConfigData.CanStoreOil && building.ConfigData.ProduceOilEfficiency == 0 && building.Level > 0)
            {
                this.m_ResourceManager.AddStorage(ResourceType.Oil, building.BuildingID,
                                                  building.ConfigData.StoreOilCapacity);
            }

            if (building.BuildingID.buildingType == BuildingType.BuilderHut && !building.BuilderBuildingNO.HasValue)
            {
                this.m_BuilderManager.AddBuilder(building.BuildingID.buildingNO);
            }
            if (building.BuilderBuildingNO.HasValue)
            {
                alreadyWorkingBuilder.Add(building.BuilderBuildingNO.Value);
                buildBuilding.Add(building.BuildingID);
            }

            /*
             * if(building.AvailableArmy != null)
             * {
             *      foreach (ArmyIdentity army in building.AvailableArmy)
             *      {
             *              BuildingSceneDirector.Instance.GenerateArmyInCamp(army.armyType,
             *                      LogicController.Instance.GetArmyLevel(army.armyType), buildingObject.BuildingLogicData);
             *      }
             * }
             */
        }

        for (int i = 0; i < alreadyWorkingBuilder.Count; i++)
        {
            int builderNO = alreadyWorkingBuilder[i];
            BuildingIdentity  buildingID = buildBuilding[i];
            BuildingLogicData targetInfo = this.m_Buildings[buildingID.buildingType][buildingID.buildingNO].BuildingLogicData;
            this.m_BuilderManager.AddBusyBuilder(builderNO, targetInfo);
        }

        this.m_ResourceManager.RecalculateStorage();
    }
示例#21
0
 protected abstract int GetAlreadyCapacity(BuildingLogicData building);
示例#22
0
 protected override int GetTotalCapacity(BuildingLogicData building)
 {
     return(building.ArmyCapacity);
 }
示例#23
0
    public BuildingLogicObject(BuildingData data, int functionMask, bool isNeedCommunicate)
    {
        this.m_CommunicationHelper = isNeedCommunicate ?
                                     new BuildingObjectCommunicationHelper() : null;
        this.m_Data = data;
        this.m_BuildingLogicData = new BuildingLogicData(data, this);
        if (data.AvailableArmy != null && (functionMask & ((int)BuildingFunction.StoreArmy)) != 0)
        {
            foreach (ArmyIdentity army in data.AvailableArmy)
            {
                this.m_AlreadyArmyCapacity += LogicController.Instance.GetArmyObjectData(army).CapacityCost;
            }
        }
        if (data.AvailableMercenary != null && (functionMask & ((int)BuildingFunction.StoreArmy)) != 0)
        {
            foreach (MercenaryIdentity mercenary in data.AvailableMercenary)
            {
                this.m_AlreadyArmyCapacity += LogicController.Instance.GetMercenaryData(mercenary).CapacityCost;
            }
        }
        if (data.ProduceArmy != null && (functionMask & ((int)BuildingFunction.ProduceArmy)) != 0)
        {
            foreach (KeyValuePair <ArmyType, List <ArmyIdentity> > product in data.ProduceArmy)
            {
                foreach (ArmyIdentity id in product.Value)
                {
                    this.m_AlreadyProduceArmyCapacity += LogicController.Instance.GetArmyObjectData(id).CapacityCost;
                }
            }
        }
        if (data.AvailableItem != null && (functionMask & ((int)BuildingFunction.StoreItem)) != 0)
        {
            this.m_AlreadyItemCapacity = data.AvailableItem.Count;
        }
        if (data.ProduceItem != null && (functionMask & ((int)BuildingFunction.ProduceItem)) != 0)
        {
            foreach (KeyValuePair <ItemType, List <ItemIdentity> > product in data.ProduceItem)
            {
                this.m_AlreadyProduceArmyCapacity += product.Value.Count;
            }
        }

        if ((functionMask & ((int)BuildingFunction.Update)) != 0)
        {
            BuildingUpgradeLogicComponent upgradeComponent = new BuildingUpgradeLogicComponent();
            this.InitialComponent(upgradeComponent);
            upgradeComponent.UpgradeTimeUp += this.BuildingUpgradeTimeUp;
        }

        this.AddComponentAccordingToConfigData(data.ConfigData, functionMask);

        if (data.RemainResourceAccelerateTime.HasValue && (functionMask & ((int)BuildingFunction.AccelerateResource)) != 0)
        {
            this.AddResourceAccelerateWithoutCommunication();
        }
        if (data.RemainArmyAccelerateTime.HasValue && (functionMask & ((int)BuildingFunction.AccelerateArmy)) != 0)
        {
            this.AddArmyAccelerateWithoutCommunication();
        }
        if (data.RemainItemAccelerateTime.HasValue && (functionMask & ((int)BuildingFunction.AccelerateItem)) != 0)
        {
            this.AddItemAccelerateWithoutCommunication();
        }
    }