void SetPlayer(Player player, bool forceUpdate = false) { currentPlayer = player; var newShroud = player != null ? player.Shroud : null; if (newShroud != shroud) { if (shroud != null) { shroud.OnShroudChanged -= UpdateShroudCell; } if (newShroud != null) { newShroud.OnShroudChanged += UpdateShroudCell; foreach (var puv in world.Map.ProjectedCells) { UpdateShroudCell(puv); } } shroud = newShroud; } var newPlayerRadarTerrain = currentPlayer != null?currentPlayer.PlayerActor.TraitOrDefault <PlayerRadarTerrain>() : null; if (forceUpdate || newPlayerRadarTerrain != playerRadarTerrain) { if (playerRadarTerrain != null) { playerRadarTerrain.CellTerrainColorChanged -= CellTerrainColorChanged; } else { world.Map.Tiles.CellEntryChanged -= CellTerrainColorChanged; foreach (var rtl in radarTerrainLayers) { rtl.CellEntryChanged -= CellTerrainColorChanged; } } if (newPlayerRadarTerrain != null) { newPlayerRadarTerrain.CellTerrainColorChanged += CellTerrainColorChanged; } else { world.Map.Tiles.CellEntryChanged += CellTerrainColorChanged; foreach (var rtl in radarTerrainLayers) { rtl.CellEntryChanged += CellTerrainColorChanged; } } playerRadarTerrain = newPlayerRadarTerrain; } }
void SetPlayer(Player player) { currentPlayer = player; var newRenderShroud = player != null ? player.Shroud : null; if (newRenderShroud != renderShroud) { if (renderShroud != null) { renderShroud.CellsChanged -= MarkShroudDirty; } if (newRenderShroud != null) { // Redraw the full shroud sprite MarkShroudDirty(world.Map.AllCells.MapCoords.Select(uv => (PPos)uv)); // Update the notification binding newRenderShroud.CellsChanged += MarkShroudDirty; } renderShroud = newRenderShroud; } var newPlayerRadarTerrain = currentPlayer != null?currentPlayer.PlayerActor.TraitOrDefault <PlayerRadarTerrain>() : null; if (newPlayerRadarTerrain != playerRadarTerrain) { if (playerRadarTerrain != null) { playerRadarTerrain.CellTerrainColorChanged -= CellTerrainColorChanged; } if (newPlayerRadarTerrain != null) { newPlayerRadarTerrain.CellTerrainColorChanged += CellTerrainColorChanged; } playerRadarTerrain = newPlayerRadarTerrain; } }
void UpdateTerrainColor(MPos uv) { var colorPair = playerRadarTerrain != null && playerRadarTerrain.IsInitialized ? playerRadarTerrain[uv] : PlayerRadarTerrain.GetColor(world.Map, radarTerrainLayers, uv); var leftColor = colorPair.Left; var rightColor = colorPair.Right; var stride = radarSheet.Size.Width; unsafe { fixed(byte *colorBytes = &radarData[0]) { var colors = (int *)colorBytes; if (isRectangularIsometric) { // Odd rows are shifted right by 1px var dx = uv.V & 1; if (uv.U + dx > 0) { colors[uv.V * stride + 2 * uv.U + dx - 1] = leftColor; } if (2 * uv.U + dx < stride) { colors[uv.V * stride + 2 * uv.U + dx] = rightColor; } } else { colors[uv.V * stride + uv.U] = leftColor; } } } }