示例#1
0
        /// <summary>
        /// Destination for a movement. Ignores all robots on the map but does take into account walls, conveyor belts and gears. Returns
        /// every step of the move.
        /// </summary>
        /// <param name="map">The game map.</param>
        /// <param name="startLocation">Where the unit starts.</param>
        /// <param name="cards">The cards to apply.</param>
        /// <returns>Every step of the move.</returns>
        public static List<MovePoint> CardPath(GameMap map, BoardLocation startLocation, IEnumerable<Card> cards)
        {
            // if we can't move, we end up where we started
            List<MovePoint> points = new List<MovePoint> {new MovePoint(startLocation)};

            foreach (Card cardOn in cards)
            {
                // move robot
                MovePoint endLocation = Move(map, startLocation, cardOn.Move);
                if (endLocation.Dead)
                {
                    points.Add(endLocation);
                    return points;
                }
                if (! endLocation.Location.Equals(startLocation))
                {
                    startLocation = endLocation.Location;
                    points.Add(new MovePoint(startLocation));
                }

                // conveyor belt - may cause a 1/4 turn.
                MapSquare sq = map.GetSquare(startLocation.MapPosition);
                for (int speed=1; (sq.Conveyor != null) && (speed <= sq.Conveyor.Speed); speed++)
                {
                    endLocation = Move(map, startLocation.MapPosition, sq.Conveyor.Direction);
                    BoardLocation locMove = new BoardLocation(endLocation.Location.MapPosition, startLocation.Direction);
                    sq = map.GetSquare(endLocation.Location.MapPosition);
                    if (sq.Conveyor != null)
                    {
                        MapSquare.DIRECTION dirEnter = MoveDirection(startLocation.MapPosition, endLocation.Location.MapPosition);
                        locMove = locMove.Rotate((int)sq.Conveyor.Direction - (int)dirEnter);
                    }
                    startLocation = locMove;
                    points.Add(new MovePoint(startLocation));
                }

                // gears
                if (sq.Type == MapSquare.TYPE.ROTATE_CLOCKWISE)
                {
                    startLocation = startLocation.Rotate(1);
                    points.Add(new MovePoint(startLocation));
                }
                if (sq.Type == MapSquare.TYPE.ROTATE_COUNTERCLOCKWISE)
                {
                    startLocation = startLocation.Rotate(-1);
                    points.Add(new MovePoint(startLocation));
                }

                // damage
                int damage = CalcLaserDamage(map, startLocation);
                if (damage != 0)
                    points[points.Count - 1].Damage = damage;
            }

            return points;
        }
示例#2
0
        /// <summary>
        /// Move a unit one card move. Ignores all robots on the map but does take into account walls, conveyor belts and gears.
        /// </summary>
        /// <param name="map">The game map.</param>
        /// <param name="startLocation">Where the unit starts.</param>
        /// <param name="move">The move to apply.</param>
        /// <returns>The final location of the move.</returns>
        public static MovePoint Move(GameMap map, BoardLocation startLocation, Card.ROBOT_MOVE move)
        {
            int steps = 0;
            switch (move)
            {
                case Card.ROBOT_MOVE.BACKWARD_ONE:
                    steps = -1;
                    break;
                case Card.ROBOT_MOVE.FORWARD_ONE:
                    steps = 1;
                    break;
                case Card.ROBOT_MOVE.FORWARD_TWO:
                    steps = 2;
                    break;
                case Card.ROBOT_MOVE.FORWARD_THREE:
                    steps = 3;
                    break;
                case Card.ROBOT_MOVE.ROTATE_LEFT:
                    return new MovePoint(startLocation.Rotate(-1));
                case Card.ROBOT_MOVE.ROTATE_RIGHT:
                    return new MovePoint(startLocation.Rotate(1));
                case Card.ROBOT_MOVE.ROTATE_UTURN:
                    return new MovePoint(startLocation.Rotate(2));
            }

            MapSquare.DIRECTION dir = steps >= 0 ? startLocation.Direction : startLocation.Rotate(2).Direction;
            Point position = startLocation.MapPosition;
            while (steps != 0)
            {
                MovePoint mp = Move(map, position, dir);
                if (mp.Dead)
                    return new MovePoint(new BoardLocation(mp.Location.MapPosition, startLocation.Direction), true);
                position = mp.Location.MapPosition;
                int singleStep = Math.Max(-1, Math.Min(1, steps));
                steps -= singleStep;
            }
            return new MovePoint(new BoardLocation(position, startLocation.Direction));
        }