Example #1
0
        public void HandleCommandOnUnit(AbilityCommandRequest command, IUnit unit)
        {
            if (!CanHandleCommandOnUnit(command, unit))
            {
                throw new InvalidOperationException("Cannot handle command");
            }

            if (CanHandleWithExistingSite(command, unit))
            {
                var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

                unit.LockIntoConstruction();

                var improvementOnCell = ImprovementLocationCanon.GetPossessionsOfOwner(unitLocation).FirstOrDefault();

                improvementOnCell.WorkInvested += ImprovementWorkLogic.GetWorkOfUnitOnImprovement(unit, improvementOnCell);

                if (improvementOnCell.IsReadyToConstruct)
                {
                    improvementOnCell.Construct();
                }
            }
            else
            {
                var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

                var templateOfName        = GetTemplateOfName(command.ArgsToPass.FirstOrDefault());
                var improvementAtLocation = ImprovementLocationCanon.GetPossessionsOfOwner(unitLocation).FirstOrDefault();

                if (improvementAtLocation != null)
                {
                    ImprovementLocationCanon.ChangeOwnerOfPossession(improvementAtLocation, null);
                    improvementAtLocation.Destroy();
                }

                var newImprovement = ImprovementFactory.BuildImprovement(templateOfName, unitLocation);

                unit.LockIntoConstruction();

                newImprovement.WorkInvested += ImprovementWorkLogic.GetWorkOfUnitOnImprovement(unit, newImprovement);

                if (newImprovement.IsReadyToConstruct)
                {
                    newImprovement.Construct();
                }
            }
        }
        public void PerformImprovementConstruction(IUnit unit)
        {
            if (unit.LockedIntoConstruction && unit.CurrentMovement > 0)
            {
                var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

                var improvementAtLocation = ImprovementLocationCanon.GetPossessionsOfOwner(unitLocation).FirstOrDefault();

                if (improvementAtLocation != null && !improvementAtLocation.IsConstructed)
                {
                    improvementAtLocation.WorkInvested += ImprovementWorkLogic.GetWorkOfUnitOnImprovement(unit, improvementAtLocation);
                    unit.CurrentMovement = 0f;

                    if (improvementAtLocation.IsReadyToConstruct)
                    {
                        improvementAtLocation.Construct();
                    }
                }
            }
        }