Esempio n. 1
0
        public override Error Execute()
        {
            ICity city;
            ICity newCity;

            if (!world.TryGetObjects(cityId, out city))
            {
                return(Error.ObjectNotFound);
            }

            if (!CityManager.IsNameValid(cityName))
            {
                return(Error.CityNameInvalid);
            }

            if (!world.Regions.IsValidXandY(x, y))
            {
                return(Error.ActionInvalid);
            }

            // cost requirement uses town center lvl 1 for cost
            int    influencePoints, wagons;
            ushort wagonType = (ushort)objectTypeFactory.GetTypes("Wagon").First();

            formula.GetNewCityCost(city.Owner.GetCityCount(), out influencePoints, out wagons);
            if (city.Owner.Value < influencePoints && !Config.actions_ignore_requirements)
            {
                return(Error.ResourceNotEnough);
            }

            var totalWagons = city.DefaultTroop.Sum(f =>
            {
                if (f.Type != FormationType.Normal && f.Type != FormationType.Garrison)
                {
                    return(0);
                }

                return(f.ContainsKey(wagonType) ? f[wagonType] : 0);
            });

            if (totalWagons < wagons && !Config.actions_ignore_requirements)
            {
                return(Error.ResourceNotEnough);
            }

            var lockedRegions = world.Regions.LockMultitileRegions(x, y, formula.GetInitialCityRadius());

            if (!objectTypeFactory.IsTileType("CityStartTile", world.Regions.GetTileType(x, y)))
            {
                world.Regions.UnlockRegions(lockedRegions);
                return(Error.TileMismatch);
            }

            // check if tile is occupied
            if (world.Regions.GetObjectsInTile(x, y).Any(obj => obj is IStructure))
            {
                world.Regions.UnlockRegions(lockedRegions);
                return(Error.StructureExists);
            }

            // create new city
            lock (world.Lock)
            {
                // Verify city name is unique
                if (world.CityNameTaken(cityName))
                {
                    world.Regions.UnlockRegions(lockedRegions);
                    return(Error.CityNameTaken);
                }

                var cityPosition = new Position(x, y);

                // Creating New City
                procedure.CreateCity(cityFactory, city.Owner, cityName, 0, cityPosition, barbarianTribeManager, out newCity);

                world.Regions.SetTileType(x, y, 0, true);

                var mainBuilding = newCity.MainBuilding;

                // Take resource from the old city
                city.BeginUpdate();
                city.DefaultTroop.BeginUpdate();
                wagons -= city.DefaultTroop.RemoveUnit(FormationType.Normal, wagonType, (ushort)wagons);
                if (wagons > 0)
                {
                    city.DefaultTroop.RemoveUnit(FormationType.Garrison, wagonType, (ushort)wagons);
                }
                city.DefaultTroop.EndUpdate();
                city.EndUpdate();

                callbackProcedure.OnStructureUpgrade(mainBuilding);

                newStructureId = mainBuilding.ObjectId;
            }

            world.Regions.UnlockRegions(lockedRegions);

            newCityId = newCity.Id;

            // add to queue for completion
            int baseBuildTime = structureCsvFactory.GetBaseStats((ushort)objectTypeFactory.GetTypes("MainBuilding")[0], 1).BuildTime;

            EndTime   = DateTime.UtcNow.AddSeconds(CalculateTime(formula.BuildTime(baseBuildTime, city, city.Technologies)));
            BeginTime = DateTime.UtcNow;

            return(Error.Ok);
        }
Esempio n. 2
0
        public override Error Execute()
        {
            ICity      city;
            IStructure structure;
            object     value;

            if (!world.TryGetObjects(cityId, objectId, out city, out structure))
            {
                return(Error.ObjectNotFound);
            }

            city.BeginUpdate();
            city.Resource.BeginUpdate();

            structure.BeginUpdate();

            if (structure.Properties.TryGet("Crop", out value))
            {
                city.Resource.Crop.Add((int)structure["Crop"]);
                structure["Crop"] = 0;
            }

            if (structure.Properties.TryGet("Gold", out value))
            {
                city.Resource.Gold.Add((int)structure["Gold"]);
                structure["Gold"] = 0;
            }

            if (structure.Properties.TryGet("Iron", out value))
            {
                city.Resource.Iron.Add((int)structure["Iron"]);
                structure["Iron"] = 0;
            }

            if (structure.Properties.TryGet("Wood", out value))
            {
                city.Resource.Wood.Add((int)structure["Wood"]);
                structure["Wood"] = 0;
            }

            if (structure.Properties.TryGet("Labor", out value))
            {
                city.Resource.Labor.Add((int)structure["Labor"]);
                structure["Labor"] = 0;
            }

            structure.EndUpdate();

            city.Resource.EndUpdate();
            city.EndUpdate();

            var changeAction = actionFactory.CreateStructureChangePassiveAction(cityId, objectId, 0, (ushort)objectTypeFactory.GetTypes("EmptyField")[0], 1);

            city.Worker.DoPassive(structure, changeAction, true);

            StateChange(ActionState.Completed);
            return(Error.Ok);
        }