// 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; }
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; }
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)); }
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; }