Пример #1
0
        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;
            }
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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;
                    }
                }
            }
        }