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