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