Ejemplo n.º 1
0
        public int CompareTo(IGameMapMovementRoute other)
        {
            // Routes are sorted by movement cost, the impedence
            //var costCompare = this.RouteCost.

            throw new NotImplementedException();
        }
Ejemplo n.º 2
0
        public MovingUnitState(IGameBattle gameBattle, IGameMap gameMap, IGameUnit unit, IGameMapMovementRoute route, IInputStateFactory inputStateFactory)
        {
            _gameBattle = gameBattle;
            _gameMap    = gameMap;
            _unit       = unit;
            _route      = route;

            _inputStateFactory = inputStateFactory;
        }
Ejemplo n.º 3
0
        //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);
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
 public RouteSelectedEventArgs(IGameMapMovementRoute route)
 {
     Route = route;
 }
Ejemplo n.º 6
0
 public IInputState ResolveMovingUnitState(IGameUnit unit, IGameMapMovementRoute route)
 {
     return(new MovingUnitState(_gameBattle, _gameMap, unit, route, this));
 }
Ejemplo n.º 7
0
 public void MoveUnit(IGameUnit unit, IGameMapMovementRoute route)
 {
     StartCoroutine(MoveUnitCoroutine(unit, route));
 }
Ejemplo n.º 8
0
 public void OnSelectedRoute(IGameMapMovementRoute route)
 {
     PlayerSelectedRoute?.Invoke(this, new RouteSelectedEventArgs(route));
 }
Ejemplo n.º 9
0
 public GetRouteSearchParams(IGameMapMovementRoute baseRoute, Direction direction)
 {
     BaseRoute = baseRoute;
     Direction = direction;
 }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 11
0
 public void AddRouteCost(IGameMapMovementRoute route)
 {
     // Units can only move once for now
     SpentMovement          = 0;
     MovementActionConsumed = true;
 }