Пример #1
0
        //  Octant data
        //
        //    \ 1 | 2 /
        //   8 \  |  / 3
        //   -----+-----
        //   7 /  |  \ 4
        //    / 6 | 5 \
        //
        //  1 = NNW, 2 =NNE, 3=ENE, 4=ESE, 5=SSE, 6=SSW, 7=WSW, 8 = WNW
        /// <summary>
        /// Start here: go through all the octants which surround the player to determine which open cells are visible
        /// </summary>
        public static List<Coord> GetVisibleCells(Level level, Coord playerPosition, ObjectHeight playerHeight)
        {
            MapSize = level.Size;
            Map = level.Map;
            PlayerPos = playerPosition;
            PlayerHeight = playerHeight;

            VisiblePoints = new List<Coord>{ PlayerPos };
            foreach (var octant in VisibleOctants)
                ScanOctant(1, octant, 1.0, 0.0);

            return VisiblePoints;
        }
Пример #2
0
 public TileType(int id, string name, TileRole role, 
     char character, Color foreColor, Color backColor,
     ObjectSize size, ObjectHeight height,
     bool isPassable, bool isDestructible = false, int durability = 0)
 {
     Id				= id;
     Name			= name;
     Character		= character;
     ForeColor		= foreColor;
     BackColor		= backColor;
     Role			= role;
     Size			= size;
     Height			= height;
     IsPassable		= isPassable;
     IsDestructible	= isDestructible;
     Durability		= durability;
 }
Пример #3
0
 private bool IsTileShadowedAfterObstacle(
     ObjectHeight targetHeight, ObjectHeight heightLimit, int fullDistance, int xPassed, int yPassed)
 {
     var halfHeightDistance = (xPassed*xPassed + yPassed*yPassed);
     var factor = Math.Sqrt(fullDistance) / Math.Sqrt(halfHeightDistance);
     return targetHeight == heightLimit  &&  (factor < 1.7
                                              ||  (fullDistance == 4  &&  halfHeightDistance == 1)
                                              ||  (fullDistance == 8  &&  halfHeightDistance == 2));
 }
Пример #4
0
        private Visibility IsRayPossible(
            Level level, Position unit, int x, int y, ObjectHeight targetHeight, ObjectHeight heightLimit)
        {
            var playerX = unit.X;
            var playerY = unit.Y;
            var unitHeight = unit.IsSitting ? ObjectHeight.Half : ObjectHeight.Full;
            var result = Visibility.Full;

            var steep = Math.Abs(y - playerY) > Math.Abs(x - playerX);
            if (steep)
            {
                Utils.Swap(ref playerX, ref playerY);
                Utils.Swap(ref x, ref y);
            }

            var dX = Math.Abs(x - playerX);
            var dY = Math.Abs(y - playerY);
            var fullDistance = dX*dX + dY*dY;
            var xPassed = 0;
            var yPassed = 0;
            var err = (dX/2);
            var xStep = playerX > x ? -1 : 1;
            var yStep = playerY > y ? -1 : 1;
            var cy = playerY;

            for (var cx = playerX; cx != x; cx += xStep)
            {
                var tile = !steep ? level.Map[cy, cx] : level.Map[cx, cy];
                var tileHeight = tile.Type.Height;

                if (tileHeight == ObjectHeight.Half  &&  IsTileShadowedAfterObstacle(targetHeight, heightLimit, fullDistance, xPassed, yPassed))
                {
                    result = Visibility.Shadow;
                }

                if (tileHeight >= unitHeight  &&  cx != playerX)
                    return Visibility.None;

                xPassed++;
                err = err - dY;
                if (err < 0)
                {
                    cy += yStep;
                    yPassed++;
                    err += dX;
                }
            }

            return result;
        }