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); }
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); }