private void UpdatePlayerView() { // Find out what the player can see map.ComputeFov(player.Position.X, player.Position.Y, 20, true); // Mark all render points as visible or not for (int i = 0; i < this.textSurface.Cells.Length; i++) { var point = SadConsole.Consoles.TextSurface.GetPointFromIndex(i, Width); var currentCell = map.GetCell(point.X, point.Y); if (currentCell.IsInFov) { if (this[i].Effect != null) { explored.Clear(this[i]); this[i].Effect = null; } this[i].IsVisible = true; map.SetCellProperties(point.X, point.Y, currentCell.IsTransparent, currentCell.IsWalkable, true); } else if (currentCell.IsExplored) { this[i].IsVisible = true; this[i].Effect = explored; explored.Apply(this[i]); } else { this[i].IsVisible = false; } } // Calculate the view area and sync it with our player location textSurface.RenderArea = new Microsoft.Xna.Framework.Rectangle(player.Position.X - 15, player.Position.Y - 15, 30, 30); player.RenderOffset = this.Position - textSurface.RenderArea.Location; // Check for entities. foreach (var entity in entities) { if (entity != player) { entity.IsVisible = map.IsInFov(entity.Position.X, entity.Position.Y); // Entity is in our view, but it may not be within the viewport. if (entity.IsVisible) { entity.RenderOffset = this.Position - textSurface.RenderArea.Location; // If the entity is not in our view area we don't want to show it. if (!textSurface.RenderArea.Contains(entity.Position)) { entity.IsVisible = false; } } } } }