public int CompareTo(IGameMapMovementRoute other) { // Routes are sorted by movement cost, the impedence //var costCompare = this.RouteCost. throw new NotImplementedException(); }
public MovingUnitState(IGameBattle gameBattle, IGameMap gameMap, IGameUnit unit, IGameMapMovementRoute route, IInputStateFactory inputStateFactory) { _gameBattle = gameBattle; _gameMap = gameMap; _unit = unit; _route = route; _inputStateFactory = inputStateFactory; }
//public async Task MoveUnitAsync(IGameUnit unit, IGameMapMovementRoute route) //{ // await MoveUnitCoroutine(unit, route); //} /// <summary> /// /// </summary> /// <param name="unit"></param> /// <param name="route"></param> /// <returns></returns> public IEnumerator MoveUnitCoroutine(IGameUnit unit, IGameMapMovementRoute route) { // Create a container for our move unit var moveUnitChangeContainer = new MoveUnitChangeContainer(unit); // Quick pre-calculation if we need to do walking damage var hasWalkingDamage = unit.GetAttribute(UnitAttribute.WalkingDamage) > 0; // Move the unit each step in the given route, excluding None direction steps foreach (var routeStep in route.Route.Where(x => x != Direction.None)) { var startPosition = unit.WorldPosition; var directionVector = DirectionHelper.GetDirectionVector(routeStep); var targetPosition = unit.WorldPosition + directionVector; // Animate the unit moving this step var duration = 0.15f; // 0.15f seconds var stepTime = 0f; while (stepTime < duration) { stepTime += Time.deltaTime; unit.WorldPosition = Vector3.Lerp(startPosition, targetPosition, stepTime / duration); yield return(null); } // Animation complete, set the unit position to be the end location unit.WorldPosition = targetPosition; var newX = unit.MapX; var newY = unit.MapY; DirectionHelper.ApplyDirection(routeStep, ref newX, ref newY); unit.MapX = newX; unit.MapY = newY; // Apply walking damage to the tiles the unit now occupies if (hasWalkingDamage) { ApplyWalkingDamage(unit, newX, newY, unit.TileWidth, unit.TileHeight, moveUnitChangeContainer); } } // Final snap the unit to their end map & unity location unit.MapX = route.EndX; unit.MapY = route.EndY; unit.WorldPosition = TranslateMapXYToUnityXY(unit.MapX, unit.MapY); // And tell them to consume movement for this route unit.AddRouteCost(route); // Trigger the MoveCompleted event now that we're done animating the move OnUnitMoveCompleted(moveUnitChangeContainer); }
public GameMapMovementRoute(IGameMapMovementRoute toCopy, Direction addedDirection, MovementCost addedCost) { StartX = toCopy.StartX; StartY = toCopy.StartY; _route.AddRange(toCopy.Route); _route.Add(addedDirection); RouteCost = toCopy.RouteCost + addedCost; EndX = toCopy.EndX; EndY = toCopy.EndY; switch (addedDirection) { case Direction.East: EndX++; break; case Direction.West: EndX--; break; case Direction.North: EndY++; break; case Direction.South: EndY--; break; } }
public RouteSelectedEventArgs(IGameMapMovementRoute route) { Route = route; }
public IInputState ResolveMovingUnitState(IGameUnit unit, IGameMapMovementRoute route) { return(new MovingUnitState(_gameBattle, _gameMap, unit, route, this)); }
public void MoveUnit(IGameUnit unit, IGameMapMovementRoute route) { StartCoroutine(MoveUnitCoroutine(unit, route)); }
public void OnSelectedRoute(IGameMapMovementRoute route) { PlayerSelectedRoute?.Invoke(this, new RouteSelectedEventArgs(route)); }
public GetRouteSearchParams(IGameMapMovementRoute baseRoute, Direction direction) { BaseRoute = baseRoute; Direction = direction; }
public void GetRoutesForLocationBreadthSearch(Dictionary <int, IGameMapMovementRoute> routesFound, IGameMapMovementRoute baseRoute, IGameUnit unit, int availableMovement) { var searchQueue = new Queue <GetRouteSearchParams>(); // Queue up our initial directions searchQueue.Enqueue(new GetRouteSearchParams(baseRoute, Direction.North)); searchQueue.Enqueue(new GetRouteSearchParams(baseRoute, Direction.East)); searchQueue.Enqueue(new GetRouteSearchParams(baseRoute, Direction.South)); searchQueue.Enqueue(new GetRouteSearchParams(baseRoute, Direction.West)); while (searchQueue.Any()) { var searchItem = searchQueue.Dequeue(); ProcessBreadthSearchQueueItem(searchQueue, searchItem, routesFound, unit, availableMovement); } // Now that we've found all of our routes we need to see which routes have a valid ending point foreach (var route in routesFound.Values) { // Determine if the route can end here route.CanStopHere = CanUnitEndMoveHere(unit, route.EndX, route.EndY); } }
public void AddRouteCost(IGameMapMovementRoute route) { // Units can only move once for now SpentMovement = 0; MovementActionConsumed = true; }