public void UndoPolicy(MainGame game) { var policy = game.Orders[this.Owner].Policies[this.Site as StellarisAdmin]; var comparer = new ConstructionComparer(); foreach (var colony in game.States.Colonies.AtStar[this.Location, this.Owner]) { var toRemove = new HashSet <IConstructionProject>(); foreach (var project in game.Orders[this.Owner].ConstructionPlans[colony].Queue) { if (policy.Queue.Any(x => !comparer.Compare(project, game.Statics.Constructables.First(p => p.IdCode == x)))) { toRemove.Add(project); } } game.Orders[this.Owner].ConstructionPlans[colony].Queue.RemoveAll(toRemove.Contains); } }
public void ApplyPolicy(MainGame game, SystemPolicy policy) { //TODO(v0.8) remove previous policy buildings var playerProc = game.Derivates[this.Owner]; var playerTechs = game.States.DevelopmentAdvances.Of[this.Owner].ToDictionary(x => x.Topic.IdCode, x => (double)x.Level); var comparer = new ConstructionComparer(); foreach (var colony in game.States.Colonies.AtStar[this.Location, this.Owner]) { var plan = game.Orders[this.Owner].ConstructionPlans[colony]; plan.SpendingRatio = policy.SpendingRatio; var colonyProc = game.Derivates[colony]; var colonyVars = colonyProc.LocalEffects(game.Statics). UnionWith(playerProc.TechLevels).Get; //TODO(0.8) conver Statics.Constructables to dictionary foreach (var project in policy.Queue.Select(x => game.Statics.Constructables.First(p => p.IdCode == x))) { if (plan.Queue.All(x => !comparer.Compare(x, project)) && Prerequisite.AreSatisfied(project.Prerequisites, 0, playerTechs) && project.Condition.Evaluate(colonyVars) >= 0) { plan.Queue.Add(new StaticProject(project)); } } colonyProc.CalculateSpending(game, playerProc); } this.CalculateSpending(game); foreach (var colony in game.States.Colonies.AtStar[this.Location, this.Owner]) { game.Derivates[colony].CalculateDerivedEffects(game.Statics, playerProc); } }