public static void GiveAdvance(this Game game, int advanceIndex, Civilization civilization) { var research = _researched[advanceIndex]; if (civilization.Advances[advanceIndex]) { return; } if (civilization.AllowedAdvanceGroups[game.Rules.Advances[advanceIndex].AdvanceGroup] == AdvanceGroupAccess.Prohibited) { return; } var targetCiv = civilization.Id; //TODO: here we'd look for a lua script to check for effeccts //TODO: check for default effect if (!research.Discovered) { research.DiscoveredBy = targetCiv; game.History.AdvanceDiscovered(advanceIndex, targetCiv); } if (civilization.ReseachingAdvance == advanceIndex) { civilization.ReseachingAdvance = AdvancesConstants.No; } civilization.Advances[advanceIndex] = true; ProductionPossibilities.AddItems(targetCiv, game.Rules.ProductionItems.Where(i => i.RequiredTech == advanceIndex && i.CanBuild(civilization))); ProductionPossibilities.RemoveItems(targetCiv, game.Rules.ProductionItems.Where(o => o.ExpiresTech == advanceIndex)); }
public static void BuildCity(Tile tile, Unit unit, Game game, string name) { var city = new City { Location = tile, Name = name, X = tile.X, Y = tile.Y, Owner = unit.Owner, Size = 1, ItemInProduction = game.Rules.ProductionItems.OrderBy(i => i.Cost).First() }; tile.WorkedBy = city; tile.CityHere = city; game.AllCities.Add(tile.CityHere); unit.Owner.Cities.Add(tile.CityHere); game.SetImprovementsForCity(city); if (unit.Owner.Cities.Count == 1) { var capitalImprovement = ProductionPossibilities.FindByEffect(city.Owner.Id, Effects.Capital) ?? game.Rules.Improvements.Where(i => i.Effects.ContainsKey(Effects.Capital) && city.Owner.AllowedAdvanceGroups[ game.Rules.Advances[i.Prerequisite].AdvanceGroup] != AdvanceGroupAccess.Prohibited).OrderBy(i => i.Cost).FirstOrDefault(); if (capitalImprovement != null) { city.AddImprovement(capitalImprovement); } } game.History.CityBuilt(tile.CityHere); city.AutoAddDistributionWorkers(); city.CalculateOutput(city.Owner.Government, game); unit.Dead = true; unit.MovePointsLost = unit.MovePoints; if (tile.Fertility != -2) { game.CurrentMap.AdjustFertilityForCity(tile); } game.TriggerMapEvent(MapEventType.UpdateMap, new List <Tile> { tile }); game.ChooseNextUnit(); }
public static void SetupTech(this Game game) { _researched = game.Rules.Advances.OrderBy(a => a.Index).Select(a => new AdvanceResearch()).ToArray(); foreach (var civilization in game.AllCivilizations) { for (var index = 0; index < civilization.Advances.Length; index++) { if (civilization.Advances[index]) { _researched[index].DiscoveredBy = civilization.Id; } } } _MapSizeAdjustment = game.TotalMapArea / 1000; ProductionPossibilities.InitializeProductionLists(game.AllCivilizations, game.Rules.ProductionItems); }
// Update stats of all cities private void CitiesTurn(IPlayer player) { var currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv); var foodRows = Rules.Cosmic.RowsFoodBox; var shieldRows = Rules.Cosmic.RowsShieldBox; foreach (var city in _activeCiv.Cities) { city.ImprovementSold = false; // Change food in storage city.FoodInStorage += city.SurplusHunger; var shields = city.Production; var tax = city.Tax; var science = city.Science; // Change city size if (city.FoodInStorage < 0) { city.FoodInStorage = 0; city.Size -= 1; AutoRemoveWorkersDistribution(city); city.CalculateOutput(city.Owner.Government, this); } else { var maxFood = (city.Size + 1) * foodRows; if (city.FoodInStorage > maxFood) { city.FoodInStorage = 0; city.Size += 1; var storageBuildings = city.Improvements .Where(i => i.Effects.ContainsKey(ImprovementEffect.FoodStorage)).Select(b => b.Effects[ImprovementEffect.FoodStorage]).ToList(); if (storageBuildings.Count > 0) { var totalStorage = storageBuildings.Sum(); if (totalStorage is > 100 or < 0) { totalStorage = storageBuildings.Where(v => v is >= 0 and <= 100).Max(); } if (totalStorage != 0) { city.FoodInStorage += maxFood * totalStorage / 100; } } AutoAddDistributionWorkers(city); // Automatically add a workers on a tile city.CalculateOutput(city.Owner.Government, this); } } if (city.UnhappyCitizens > 0) { if (city.WeLoveKingDay) { player.WeLoveTheKingCanceled(city); city.WeLoveKingDay = false; } if (city.UnhappyCitizens > city.HappyCitizens) { player.CivilDisorder(city); city.CivilDisorder = true; continue; } if (city.CivilDisorder) { city.CivilDisorder = false; player.OrderRestored(city); } } else { if (city.CivilDisorder) { city.CivilDisorder = false; player.OrderRestored(city); } if (city.HappyCitizens >= city.Size - city.UnhappyCitizens - city.HappyCitizens) { if (!city.WeLoveKingDay) { player.WeLoveTheKingStarted(city); } city.WeLoveKingDay = true; } } if (!ProductionPossibilities.ProductionValid(city)) { var newItem = ProductionPossibilities.AutoNext(city); player.CantProduce(city, newItem); if (newItem != null) { city.ItemInProduction = newItem; } } city.ShieldsProgress += shields; if (city.ShieldsProgress >= city.ItemInProduction.Cost * shieldRows) { if (city.ItemInProduction.CompleteProduction(city, Rules)) { city.ShieldsProgress = 0; player.CityProductionComplete(city); } } _activeCiv.Money += tax; foreach (var cityImprovement in city.Improvements) { if (cityImprovement.Upkeep > 0) { if (_activeCiv.Money >= cityImprovement.Upkeep) { _activeCiv.Money -= cityImprovement.Upkeep; } else { //Sell it !! city.SellImprovement(cityImprovement); player.CantMaintain(city, cityImprovement); } } } if (science > 0) { _activeCiv.Science += science; if (_activeCiv.ReseachingAdvance < 0) { var researchPossibilities = AdvanceFunctions.CalculateAvailableResearch(this, _activeCiv); player.SelectNewAdvance(this, researchPossibilities); currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv); } else if (currentScienceCost <= _activeCiv.Science) { this.GiveAdvance(_activeCiv.ReseachingAdvance, _activeCiv); _activeCiv.Science -= currentScienceCost; } } } }
public static void GiveAdvance(this Game game, int advanceIndex, Civilization civilization) { var research = _researched[advanceIndex]; if (civilization.Advances[advanceIndex]) { return; } if (civilization.AllowedAdvanceGroups[game.Rules.Advances[advanceIndex].AdvanceGroup] == AdvanceGroupAccess.Prohibited) { return; } var targetCiv = civilization.Id; if (!research.Discovered) { research.DiscoveredBy = targetCiv; game.History.AdvanceDiscovered(advanceIndex, targetCiv); } if (civilization.ReseachingAdvance == advanceIndex) { civilization.ReseachingAdvance = AdvancesConstants.No; } foreach (var effect in game.Rules.Advances[advanceIndex].Effects) { civilization.GlobalEffects[effect.Key] += effect.Value; } foreach (var improvement in game.TerrainImprovements.Values) { for (var level = 0; level < improvement.Levels.Count; level++) { if (improvement.Levels[level].RequiredTech != advanceIndex) { continue; } game.Players[civilization.Id].NotifyImprovementEnabled(improvement, level); if (!improvement.AllCitys) { continue; } var locations = civilization.Cities .Select(c => c.Location) .Select(tile => new { tile, terrain = improvement.AllowedTerrains[tile.Z] .FirstOrDefault(t => t.TerrainType == (int)tile.Type) }) .Where(t => t.terrain is not null) .Select(loc => { loc.tile.AddImprovement(improvement, loc.terrain, level, game.Rules.Terrains[loc.tile.Z]); return(loc.tile); }).ToList(); game.TriggerMapEvent(MapEventType.UpdateMap, improvement.HasMultiTile ? locations.Concat(locations.SelectMany(l => l.Neighbours())).ToList() : locations); } } civilization.Advances[advanceIndex] = true; ProductionPossibilities.AddItems(targetCiv, game.Rules.ProductionItems.Where(i => i.RequiredTech == advanceIndex && i.CanBuild(civilization))); ProductionPossibilities.RemoveItems(targetCiv, game.Rules.ProductionItems.Where(o => o.ExpiresTech == advanceIndex)); }
// Update stats of all cities private void CitiesTurn(IPlayer player) { var currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv); var foodRows = Rules.Cosmic.RowsFoodBox; var shieldRows = Rules.Cosmic.RowsShieldBox; foreach (var city in _activeCiv.Cities) { city.ImprovementSold = false; // Change food in storage city.FoodInStorage += city.SurplusHunger; var shields = city.Production; var tax = city.Tax; var science = city.Science; // Change city size if (city.FoodInStorage < 0) { city.FoodInStorage = 0; city.ShrinkCity(this); } else { var maxFood = (city.Size + 1) * foodRows; if (city.FoodInStorage > maxFood) { city.GrowCity(this); city.ResetFoodStorage(foodRows); } } if (city.UnhappyCitizens > 0) { if (city.WeLoveKingDay) { player.WeLoveTheKingCanceled(city); city.WeLoveKingDay = false; } if (city.UnhappyCitizens > city.HappyCitizens) { player.CivilDisorder(city); city.CivilDisorder = true; continue; } if (city.CivilDisorder) { city.CivilDisorder = false; player.OrderRestored(city); } } else { if (city.CivilDisorder) { city.CivilDisorder = false; player.OrderRestored(city); } if (city.HappyCitizens >= city.Size - city.UnhappyCitizens - city.HappyCitizens) { if (!city.WeLoveKingDay) { player.WeLoveTheKingStarted(city); } city.WeLoveKingDay = true; } } if (!ProductionPossibilities.ProductionValid(city)) { var newItem = ProductionPossibilities.AutoNext(city); player.CantProduce(city, newItem); if (newItem != null) { city.ItemInProduction = newItem; } } city.ShieldsProgress += shields; if (city.ShieldsProgress >= city.ItemInProduction.Cost * shieldRows) { if (city.ItemInProduction.CompleteProduction(city, Rules)) { city.ShieldsProgress = 0; player.CityProductionComplete(city); } } _activeCiv.Money += tax; foreach (var cityImprovement in city.Improvements) { if (cityImprovement.Upkeep > 0) { if (_activeCiv.Money >= cityImprovement.Upkeep) { _activeCiv.Money -= cityImprovement.Upkeep; } else { //Sell it !! city.SellImprovement(cityImprovement); player.CantMaintain(city, cityImprovement); } } } if (science > 0) { _activeCiv.Science += science; if (_activeCiv.ReseachingAdvance < 0) { var researchPossibilities = AdvanceFunctions.CalculateAvailableResearch(this, _activeCiv); player.SelectNewAdvance(this, researchPossibilities); currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv); } else if (currentScienceCost <= _activeCiv.Science) { this.GiveAdvance(_activeCiv.ReseachingAdvance, _activeCiv); _activeCiv.Science -= currentScienceCost; } } } }