Beispiel #1
0
 public void Refresh(Vinteger pos)
 {
     for (var octant = 0; octant < 8; octant++)
     {
         RefreshOctant(pos, octant);
     }
 }
Beispiel #2
0
 public Shadow(float shadowStart, float shadowEnd, Vinteger startPosition, Vinteger endPosition)
 {
     Start    = shadowStart;
     End      = shadowEnd;
     StartPos = startPosition;
     EndPos   = endPosition;
 }
Beispiel #3
0
    private void Init()
    {
        AreaReady     = false;
        AreaMapHolder = new GameObject("AreaMapHolder");

        if (FovHolder == null)
        {
            FovHolder = GameObject.Find("Fov");
        }

        Fov = FovHolder.GetComponent <Fov>();

        if (_player == null || _player != GameManager.Instance.Player)
        {
            _player = GameManager.Instance.Player;
            InstantiatePlayerSprite();
        }

        _areaMapHolderTransform = AreaMapHolder.transform;

        _currentArea           = GameManager.Instance.CurrentArea;
        _currentArea.TurnOrder = new Queue <Entity>();
        _currentArea.TurnOrder.Enqueue(_player);
        _currentArea.Build();

//        if (_currentArea.ParentCell.Rivers.Count > 0)
//        {
//            PlaceWaterTiles();
//        }

        DrawArea();
        PlaceBuildings();
        PlacePlayer();

        if (_currentArea.PresentEntities.Count > 1)
        {
            PlaceNpcs();
            MarkCustomers();
        }

        CreateAStarGraph();
        AstarPath.active.Scan();

        Fov.Init(_currentArea);
        var v = new Vinteger(_player.CurrentTile.X, _player.CurrentTile.Y);

        Fov.Refresh(v);

        Messenger.Instance.LoadOnScreenMessages();

        AreaReady = true;
    }
Beispiel #4
0
    public void RefreshOctant(Vinteger start, int octant, int maxRows = 999)
    {
        var line = new ShadowLine();

        var fullShadow = false;

        for (var row = 1; row < maxRows; row++)
        {
            var bounds = start.Add(TransformOctant(row, 0, octant));
            if (!InBoundsAndClose(bounds.X, bounds.Y))
            {
                break;
            }

            for (var col = 0; col <= row; col++)
            {
                var pos = start.Add(TransformOctant(row, col, octant));

                if (!InBoundsAndClose(pos.X, pos.Y))
                {
                    break;
                }

                if (fullShadow)
                {
                    var tile = _grid[pos.X, pos.Y];
                    tile.Visibility = Visibilities.Invisible;
                }
                else
                {
                    var projection = ProjectTile(row, col);

                    var visible = !line.IsInShadow(projection);

                    var tile = _grid[pos.X, pos.Y];

                    var blocksLight = tile.GetBlocksLight();

                    if (!visible)
                    {
                        tile.Visibility = Visibilities.Invisible;
                    }
                    else
                    {
                        if (tile.Visibility != Visibilities.Visible && tile.GetPresentEntity() != null)
                        {
                            tile.GetPresentEntity().PositionRevealed();
                        }

                        tile.Visibility = Visibilities.Visible;
                        tile.Revealed   = true;
                    }

                    if (visible && blocksLight)
                    {
                        line.Add(projection);
                        fullShadow = line.IsFullShadow();
                    }
                }
            }
        }
    }
Beispiel #5
0
 public float Distance(Vinteger other)
 {
     return(Mathf.Sqrt(Mathf.Pow(this.X - other.X, 2) + Mathf.Pow(this.Y - other.Y, 2)));
 }
Beispiel #6
0
 public Vinteger Add(Vinteger other)
 {
     return(new Vinteger(X + other.X, Y + other.Y));
 }