public OrderInvalidReason Validate() { var r = Target.Configuration.UnitClass == UnitClass.MINEFIELD ? Engineer.CanPlaceMinefield() : Engineer.CanPlaceBridge(); if (r != OrderInvalidReason.NONE) { return(r); } r = Target.CanBeEmplaced(); if (r != OrderInvalidReason.NONE) { return(r); } var requirements = EmplacementRequirements.GetEmplacementRequirementsFor(Target); _Interaction = Engineer.HasInteraction <EmplaceInteraction>(i => i.Agent == Engineer && i.Object == Target); _PreExisting = _Interaction != null; if (_PreExisting) { return(_Interaction.Validate()); } if (Target.Interactions.Count(i => i is EmplaceOrder) >= requirements.MaxUnits) { return(OrderInvalidReason.TARGET_INTERACTION_LIMIT); } _Interaction = new EmplaceInteraction(Engineer, Target); return(_Interaction.Validate()); }
bool Finished() { var requirements = EmplacementRequirements.GetEmplacementRequirementsFor(Target); var interactions = Target.Interactions.Where(i => i is EmplaceInteraction).Cast <EmplaceInteraction>(); var count = interactions.Count(); var turns = requirements.PoolTurns ? interactions.Sum(i => i.Turns) : interactions.Min(i => i.Turns); return(count >= requirements.MinUnits && count <= requirements.MaxUnits && turns >= requirements.Turns); }