public override void DecideWhatToDo() { // don't replace, we want to keep this move attack at the base bool isAttacking = findTargetGoal.TryAssignAttack(replace: false); if (isAttacking) { walkGoal = null; } if (!isAttacking) { bool isWalking = Owner.ImmediateGoal?.Path?.Count > 0; if (!isWalking) { if (walkGoal == null) { walkGoal = new WalkToHighLevelGoal(); walkGoal.Owner = Owner; walkGoal.TargetPosition = new Microsoft.Xna.Framework.Vector3(TargetX, TargetY, 0); walkGoal.DecideWhatToDo(); } else { hasReachedTarget = true; } } } }
public WalkToHighLevelGoal GetResourceReturnWalkGoal() { ResourceReturnBuildingTile = GetSingleTile(ResourceReturnBuilding.Position); Vector3 pointSlightlySkewedTowardOwner = DeterminePositionWithinTileSlightlyCloserToOwner(ResourceReturnBuildingTile.Position, ResourceReturnBuildingTile.Width); var walkGoal = new WalkToHighLevelGoal() { Owner = Owner, TargetPosition = pointSlightlySkewedTowardOwner, ForceAttemptToGetToExactTarget = true, }; return(walkGoal); }
public WalkToHighLevelGoal GetResourceReturnWalkGoal() { WalkToHighLevelGoal walkGoal = null; // Set up to return resource // Find "closest" building by position comparison. // FUTURE: Get building with shorted node path (in case closest is a long winding path). ResourceReturnBuilding = AllBuildings .Where(building => building.BuildingData.Name == BuildingData.TownHall && building.IsConstructionComplete) .OrderBy(building => (building.Position - Owner.Position).Length()) .FirstOrDefault(); if (ResourceReturnBuilding != null) { walkGoal = new WalkToHighLevelGoal(); ResourceReturnBuildingTile = GetSingleTile(ResourceReturnBuilding.Position); Vector3 pointSlightlySkewedTowardOwner = DeterminePositionWithinTileSlightlyCloserToOwner(ResourceReturnBuildingTile.Position, ResourceReturnBuildingTile.Width); walkGoal = new WalkToHighLevelGoal(); walkGoal.Owner = Owner; walkGoal.TargetPosition = pointSlightlySkewedTowardOwner; walkGoal.ForceAttemptToGetToExactTarget = true; } return(walkGoal); }
public override void DecideWhatToDo() { if (IsInRangeToReturnResource()) { // We're close enough to our target return destination: unload! StopMoving(); // If we are trying to return a resource, but the building is a smoldering pile of ashes, stop walking. bool areWeReturningResourcesToDestroyedBuilding = Owner.HasResourceToReturn && ResourceReturnBuilding.CurrentHealth <= 0; if (areWeReturningResourcesToDestroyedBuilding) { currentWalkGoal = null; shouldWeGiveUpCollecting = true; return; } var screen = FlatRedBall.Screens.ScreenManager.CurrentScreen as GameScreen; // Increment appropriate resource. switch (Owner.ResourceTypeToReturn) { case ResourceType.Gold: screen.Gold += Owner.UnitData.ResourceHarvestAmount; break; case ResourceType.Lumber: screen.Lumber += Owner.UnitData.ResourceHarvestAmount; break; case ResourceType.Stone: screen.Stone += Owner.UnitData.ResourceHarvestAmount; break; } //Try to play the collect sound. screen.TryPlayResourceCollectSound(Owner.ResourceTypeToReturn.Value, Owner.Position); // Update UI screen.UpdateResourceDisplay(); ClearResourceState(); // Default to !isWalking later to set up return-to-resource trip. } else if (IsInRangeToCollect()) { // We're close enough to our target resource: harvest! StopMoving(); var screen = FlatRedBall.Screens.ScreenManager.CurrentScreen as GameScreen; // Delay resource pick-up once arrived. if (arrivedAtResourceTime == 0) { arrivedAtResourceTime = screen.PauseAdjustedCurrentTime; } //Try to play gather sfx Unit.TryToPlayResourceGatheringSfx(Owner.Position, this.TargetResourceType); bool canCollect = screen.PauseAdjustedSecondsSince(arrivedAtResourceTime) >= CollectFrequencyInSeconds; if (canCollect) { Owner.SetResourceToReturn(TargetResourceType); arrivedAtResourceTime = 0; // Default to !isWalking later to set up return-to-resource trip. } } else { bool isWalking = Owner?.ImmediateGoal?.Path?.Count > 0; if (!isWalking) { if (currentWalkGoal == null) { // Do we already have a resource we should be returning but aren't currently gathering? if (Owner.HasResourceToReturn) { currentWalkGoal = GetResourceReturnWalkGoal(); if (currentWalkGoal == null) { // Couldn't get a walk goal back from resource collection. Time to call it quits here. shouldWeGiveUpCollecting = true; } else { // Start hiking, unit! currentWalkGoal.DecideWhatToDo(); } } else { Vector3 pointSlightlySkewedTowardOwner = DeterminePositionWithinTileSlightlyCloserToOwner(SingleTargetResourceTileCenter, SingleTargetResourceTile.Width); currentWalkGoal = new WalkToHighLevelGoal(); currentWalkGoal.Owner = Owner; currentWalkGoal.TargetPosition = pointSlightlySkewedTowardOwner; currentWalkGoal.ForceAttemptToGetToExactTarget = true; currentWalkGoal.DecideWhatToDo(); } } } } }
void StopMoving() { currentWalkGoal = null; Owner?.ImmediateGoal?.Path?.Clear(); Owner.Velocity = Vector3.Zero; }
public override void DecideWhatToDo() { if (IsInRangeToReturnResource()) { // We're close enough to our target return destination: unload! StopMoving(); var screen = FlatRedBall.Screens.ScreenManager.CurrentScreen as GameScreen; // If we are trying to return a resource, but the building is a smoldering pile of ashes, stop walking. bool areWeReturningResourcesToDestroyedBuilding = Owner.HasResourceToReturn && ResourceReturnBuilding.CurrentHealth <= 0; if (areWeReturningResourcesToDestroyedBuilding) { currentWalkGoal = null; shouldWeGiveUpReturning = true; return; } // Increment appropriate resource. switch (TargetResourceType) { case ResourceType.Gold: screen.Gold += Owner.UnitData.ResourceHarvestAmount; break; case ResourceType.Lumber: screen.Lumber += Owner.UnitData.ResourceHarvestAmount; break; case ResourceType.Stone: screen.Stone += Owner.UnitData.ResourceHarvestAmount; break; } //Try to play the collect sound. screen.TryPlayResourceCollectSound(TargetResourceType, Owner.Position); // Update UI screen.UpdateResourceDisplay(); ClearResourceState(); shouldWeGiveUpReturning = true; } else { bool isWalking = Owner?.ImmediateGoal?.Path?.Count > 0; if (!isWalking) { if (currentWalkGoal == null) { currentWalkGoal = GetResourceReturnWalkGoal(); if (currentWalkGoal == null) { // Couldn't get a walk goal back from resource collection. Time to call it quits here. shouldWeGiveUpReturning = true; } else { // Start hiking, unit! currentWalkGoal.DecideWhatToDo(); } } } } }