예제 #1
0
    private static float DistBetween(MovementTile current, MovementTile neighbor)
    {
        float x = current.x - neighbor.x;
        float y = current.y - neighbor.y;

        return(x * x + y * y);
    }
예제 #2
0
    public void CreateBoardingPlank()
    {
        if (createdPlank)
        {
            return;
        }

        createdPlank = true;

        Transform plank = Instantiate(plankPrefab, new Vector2(2, .25f), Quaternion.identity).transform;

        MovementTile[,] plankTiles = new MovementTile[2, 1];

        for (int x = 0; x < plankTiles.GetLength(0); x++)
        {
            for (int y = 0; y < plankTiles.GetLength(1); y++)
            {
                plankTiles [x, y]   = plank.GetChild(x * 1 + y).GetComponent <MovementTile> ();
                plankTiles [x, y].x = x;
                plankTiles [x, y].y = y;
            }
        }

        AStar.AddAreaToLayout(plankTiles);

        LevelLayout.Portal portalPlayerPlank = new LevelLayout.Portal(playerBoarding, plankTiles [0, 0]);
        AStar.AddPortalToLayout(portalPlayerPlank);

        LevelLayout.Portal portalPlankShip = new LevelLayout.Portal(plankTiles [1, 0], otherBoarding);
        AStar.AddPortalToLayout(portalPlankShip);
    }
예제 #3
0
    private void RePrioritize(List <CrewMember> priorities, MovementTile tile)
    {
        for (int i = 0; i < priorities.Count; i++)
        {
            if (!priorities [i])
            {
                priorities.RemoveAt(i);
                i--;
            }
        }

        for (int i = priorities.Count - 1; i > 0; i--)
        {
            for (int j = i; j > 0; j--)
            {
                if (CompareCrewMember(priorities [j - 1], priorities [j], tile) > 0)
                {
                    CrewMember c = priorities [j - 1];
                    priorities [j - 1] = priorities [j];
                    priorities [j]     = c;
                }
                else
                {
                    break;
                }
            }
        }
    }
예제 #4
0
    //sort tile lower into heap
    void SortDown(MovementTile item)
    {
        while (true)
        {
            int leftChildIndex  = item.heapIndex * 2 + 1;
            int rightChildIndex = (item.heapIndex * 2) + 2;
            int swapIndex       = 0;

            if (leftChildIndex < itemCount)
            {
                swapIndex = leftChildIndex;

                if (rightChildIndex < itemCount)
                {
                    if (heapTiles [leftChildIndex].CompareTo(heapTiles [rightChildIndex]) < 0)
                    {
                        swapIndex = rightChildIndex;
                    }
                }

                if (item.CompareTo(heapTiles [swapIndex]) < 0)
                {
                    Swap(item, heapTiles [swapIndex]);
                }
                else
                {
                    return;
                }
            }
            else
            {
                return;
            }
        }
    }
예제 #5
0
 //add item into heap and sort it into position
 public void Add(MovementTile item)
 {
     item.heapIndex        = itemCount;
     heapTiles [itemCount] = item;
     SortUp(item);
     itemCount++;
 }
예제 #6
0
    private void RotateTowardsDiagonal(MovementTile t)
    {
        Vector2 targetDir = t.transform.position - transform.position;
        float   angle     = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg - 90 - 45;

        transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
    }
예제 #7
0
    public BailPosition GetClosestFloodedTile(MovementTile tile)
    {
        BailPosition bp = null;
        int          shortestPathCount = int.MaxValue;

        for (int i = 0; i < floodedTiles.Count; i++)
        {
            if (!floodedTiles[i])
            {
                floodedTiles.RemoveAt(i);
                i--;
            }

            if (!floodedTiles[i].isManned)
            {
                int pathCount = AStar.FindPath(tile, floodedTiles[i].tile, true).Count;

                if (shortestPathCount > pathCount)
                {
                    shortestPathCount = pathCount;
                    bp = floodedTiles[i];
                }
            }
        }

        return(bp);
    }
예제 #8
0
    private List <MovementTile> FindAdjacents()
    {
        List <MovementTile> adjacents = new List <MovementTile> ();

        MovementTile temp = AStar.GetTile(tile.x, tile.y + 1, tile.layer);

        if (temp && temp.floodedTile)
        {
            adjacents.Add(temp);
        }

        temp = AStar.GetTile(tile.x + 1, tile.y, tile.layer);
        if (temp && temp.floodedTile)
        {
            adjacents.Add(temp);
        }

        temp = AStar.GetTile(tile.x, tile.y - 1, tile.layer);
        if (temp && temp.floodedTile)
        {
            adjacents.Add(temp);
        }

        temp = AStar.GetTile(tile.x - 1, tile.y, tile.layer);
        if (temp && temp.floodedTile)
        {
            adjacents.Add(temp);
        }

        return(adjacents);
    }
예제 #9
0
 private static void PrintPathRetrace(MovementTile end)
 {
     while (end != null)
     {
         Debug.Log(end.x + ", " + end.y);
         end = end.prev;
     }
 }
예제 #10
0
    private void ChangeCurrentTile(MovementTile newCurrent)
    {
        current.crewMem    = null;
        newCurrent.crewMem = this;
        current            = newCurrent;

        anim.SetInteger("FacingDirection", GetDirectionOfTile(current));
    }
예제 #11
0
 public void Init(MovementTile dest, bool hit, bool shotByPlayer, Ship targetShip, int damage)
 {
     this.hit          = hit;
     destination       = dest;
     this.shotByPlayer = shotByPlayer;
     this.targetShip   = targetShip;
     targetPos         = hit ? dest.transform.position : ((dest.transform.position - transform.position) * 3);
     this.damage       = damage;
 }
예제 #12
0
    public static MovementTile[] GetTileNeighbors(MovementTile tile)
    {
        MovementTile[] neighbors = new MovementTile [4];
        neighbors [0] = RangeCheckTile(tile.x + 1, tile.y, tile.layer);
        neighbors [1] = RangeCheckTile(tile.x, tile.y + 1, tile.layer);
        neighbors [2] = RangeCheckTile(tile.x - 1, tile.y, tile.layer);
        neighbors [3] = RangeCheckTile(tile.x, tile.y - 1, tile.layer);

        return(neighbors);
    }
예제 #13
0
    //swap tiles
    void Swap(MovementTile item1, MovementTile item2)
    {
        heapTiles [item1.heapIndex] = item2;
        heapTiles [item2.heapIndex] = item1;

        int tempIndex = item1.heapIndex;

        item1.heapIndex = item2.heapIndex;
        item2.heapIndex = tempIndex;
    }
예제 #14
0
    //remove first tile and resort heap
    public MovementTile RemoveFirst()
    {
        MovementTile first = heapTiles [0];

        itemCount--;
        heapTiles [0]           = heapTiles [itemCount];
        heapTiles [0].heapIndex = 0;
        SortDown(heapTiles [0]);

        return(first);
    }
예제 #15
0
    protected CrewMember CreateCrewMember(MovementTile tile)
    {
        CrewMember c = Instantiate(crewPrefab, tile.transform.position, Quaternion.identity).GetComponent <CrewMember> ();

        c.current    = tile;
        tile.crewMem = c;

        AssignBaseStats(c);

        return(c);
    }
예제 #16
0
    private void PaintTileBasedOnMovementCost(MovementTile movementTile)
    {
        var movementCostPercentage = 1.1f - (float)movementTile.MovementCost / Movement.MaxCost;

        var uvRect = new Rect2D(new Vector2(movementCostPercentage, 0),
                                new Vector2(movementCostPercentage, 0),
                                new Vector2(movementCostPercentage, 0),
                                new Vector2(movementCostPercentage, 0));

        movementTile.SetUVs(uvRect);
    }
예제 #17
0
    private static MyLinkedList <MovementTile> CreatePath(MovementTile finish)
    {
        MyLinkedList <MovementTile> path = new MyLinkedList <MovementTile> ();

        while (finish != null)
        {
            path.AddFirst(finish);
            finish = finish.prev;
        }

        return(path);
    }
예제 #18
0
    private int IsCloserToThan(CrewMember crew1, CrewMember crew2, MovementTile tile)
    {
        float disToPortal1 = Vector2.SqrMagnitude(crew1.transform.position - tile.transform.position);
        float disToPortal2 = Vector2.SqrMagnitude(crew2.transform.position - tile.transform.position);

        if (disToPortal1 == disToPortal2)
        {
            return(0);
        }

        return(disToPortal1 < disToPortal2 ? -1 : 1);
    }
예제 #19
0
    private List <Vector3Int> RetracePath(MovementTile startTile, MovementTile endTile)
    {
        List <Vector3Int> path        = new List <Vector3Int>();
        MovementTile      currentTile = endTile;

        while (currentTile != startTile)
        {
            path.Add(currentTile.coordinates);
            currentTile = currentTile.parent;
        }
        path.Reverse();
        return(path);
    }
예제 #20
0
    void Awake()
    {
        layers       = new int[areas.Length];
        edgeTiles    = new List <MovementTile> ();
        floodedTiles = new List <BailPosition> ();

        List <MovementTile[, ]> areaTiles = new List <MovementTile[, ]> ();

        for (int i = 0; i < areas.Length; i++)
        {
            Transform  area = areas[i].area;
            Vector2Int dims = areas [i].dimensions;
            MovementTile[,] tiles = new MovementTile [dims.x, dims.y];

            for (int x = 0; x < dims.x; x++)
            {
                for (int y = 0; y < dims.y; y++)
                {
                    tiles [x, y]   = area.GetChild(x * 8 + y).GetComponent <MovementTile> ();
                    tiles [x, y].x = x;
                    tiles [x, y].y = y;

                    if (tiles [x, y].isEdgeTile)
                    {
                        edgeTiles.Add(tiles [x, y]);
                    }

                    if (tiles [x, y].walkable)
                    {
                        maxFloodTiles++;
                        //TODO: testing this (also in plank prefab)
                        tiles[x, y].GetComponent <SpriteRenderer> ().enabled = false;
                    }
                }
            }

            layers [i] = tiles [0, 0].layer;
            areaTiles.Add(tiles);

            AStar.AddAreaToLayout(tiles);
        }

        List <LevelLayout.Portal> portalTiles = new List <LevelLayout.Portal> ();

        for (int i = 0; i < portals.Length; i++)
        {
            portalTiles.Add(portals [i]);
            AStar.AddPortalToLayout(portals [i]);
        }
    }
예제 #21
0
    private int GetHeuristicDistance(MovementTile neighbor, MovementTile endTile)
    {
        int distX = Mathf.Abs(neighbor.coordinates.x - endTile.coordinates.x);
        int distY = Mathf.Abs(neighbor.coordinates.y - endTile.coordinates.y);

        if (distX > distY)
        {
            return(Mathf.RoundToInt(1.4f * distY + (distX - distY)));
        }
        else
        {
            return(Mathf.RoundToInt(1.4f * distX + (distY - distX)));
        }
    }
예제 #22
0
    private BailPosition CreateFloodedTile(MovementTile t)
    {
        BailPosition bp = Instantiate(floodedTilePrefab, t.transform.position,
                                      Quaternion.identity).GetComponent <BailPosition> ();

        bp.transform.parent = transform.parent;
        t.floodedTile       = bp;
        bp.tile             = t;
        bp.isAssignAbleTo   = isAssignAbleTo;

        //TODO: make know which ship
        transform.parent.GetComponent <Ship> ().AddFloodedTile(bp);

        return(bp);
    }
예제 #23
0
    public MyLinkedList <MovementTile> GetShortestPathToEdgeTile(MovementTile tile)
    {
        MyLinkedList <MovementTile> shortestPath = null;

        for (int i = 0; i < edgeTiles.Count; i++)
        {
            MyLinkedList <MovementTile> path = AStar.FindPath(tile, edgeTiles [i], true);

            if (shortestPath == null || shortestPath.Count > path.Count)
            {
                shortestPath = path;
            }
        }

        return(shortestPath);
    }
예제 #24
0
    public void Fire(BattleManager battleManager, bool hit)
    {
        MovementTile t = battleManager.GetRandomTile(!isAssignAbleTo);

        CannonBall cb = Instantiate(cannonBall, spawnLoc.position, Quaternion.identity).GetComponent <CannonBall> ();

        //TODO: maybe fix this reroll system
        while (!t.walkable)
        {
            t = battleManager.GetRandomTile(!isAssignAbleTo);
        }

        Ship target = isAssignAbleTo ? battleManager.otherShip : battleManager.playerShip;
        int  damage = isAssignAbleTo ? battleManager.playerShip.cannonDamage : battleManager.otherShip.cannonDamage;

        cb.Init(t, hit, isAssignAbleTo, target, damage);
    }
예제 #25
0
    private int CompareCrewMember(CrewMember crew1, CrewMember crew2, MovementTile tile)
    {
        if (crew1.role == CrewMember.Role.CANNONEER)
        {
            if (crew2.role == CrewMember.Role.CANNONEER)
            {
                return(IsCloserToThan(crew1, crew2, tile));
            }

            return(-1);
        }
        else if (crew2.role == CrewMember.Role.CANNONEER)
        {
            return(1);
        }
        else
        {
            return(IsCloserToThan(crew1, crew2, tile));
        }
    }
예제 #26
0
    //sort item higher into heap
    void SortUp(MovementTile item)
    {
        int indexOfParent = (item.heapIndex - 1) / 2;

        while (true)
        {
            MovementTile parent = heapTiles [indexOfParent];

            if (item.CompareTo(parent) > 0)
            {
                Swap(item, parent);
            }
            else
            {
                break;
            }

            indexOfParent = (item.heapIndex - 1) / 2;
        }
    }
예제 #27
0
    public DamagedPosition GetClosestDamagedTile(MovementTile tile)
    {
        DamagedPosition dp = null;
        int             shortestPathCount = int.MaxValue;

        for (int i = 0; i < damagedTiles.Count; i++)
        {
            if (damagedTiles[i].IsAvailable())
            {
                int pathCount = AStar.FindPath(tile, damagedTiles[i].tile, true).Count;

                if (shortestPathCount > pathCount)
                {
                    shortestPathCount = pathCount;
                    dp = damagedTiles[i];
                }
            }
        }

        return(dp);
    }
예제 #28
0
    private List <MovementTile> FindDiagonals(List <MovementTile> adjacents)
    {
        List <MovementTile> diagonals = new List <MovementTile> ();

        for (int i = 0; i < adjacents.Count; i++)
        {
            MovementTile t1 = i == 0 ? adjacents[adjacents.Count - 1] : adjacents[i - 1];
            MovementTile t2 = adjacents[i];

            if ((t1.x - t2.x) * (t1.x - t2.x) + (t1.y - t2.y) * (t1.y - t2.y) == 2)
            {
                int          x        = tile.x != t1.x ? t1.x : t2.x;
                int          y        = tile.y != t1.y ? t1.y : t2.y;
                MovementTile diagonal = AStar.GetTile(x, y, tile.layer);

                if (diagonal.floodedTile && !diagonals.Contains(diagonal))
                {
                    diagonals.Add(diagonal);
                }
            }
        }

        return(diagonals);
    }
예제 #29
0
    private int GetDirectionOfTile(MovementTile tile)
    {
        float angle = Vector2.SignedAngle(Vector3.right, tile.transform.position - transform.position);
        int   num   = 0;

        if (angle < 45 && angle > -45)
        {
            num = 0;
        }
        else if (angle > 45 && angle < 135)
        {
            num = 1;
        }
        else if (angle > 135 || angle < -135)
        {
            num = 2;
        }
        else if (angle < -45 && angle > -135)
        {
            num = 3;
        }

        return(num);
    }
예제 #30
0
    public void UpdateTileImage()
    {
        List <MovementTile> adjacents = FindAdjacents();
        List <MovementTile> diagonals = FindDiagonals(adjacents);

        Sprite current = sr.sprite;

        switch (adjacents.Count)
        {
        case 0:
            sr.sprite = none;
            break;

        case 1:
            sr.sprite = one;
            RotateTowardsAdjacent(adjacents[0]);
            break;

        case 2:

            MovementTile t1  = adjacents[0];
            MovementTile t2  = adjacents[1];
            Vector2Int   vec = new Vector2Int(t1.x - t2.x, t1.y - t2.y);

            if (vec.x * vec.x + vec.y * vec.y == 4)
            {
                RotateTowardsAdjacent(adjacents[0]);
                sr.sprite = twoAcross;
            }
            else
            {
                RotateTowardsDiagonal(AStar.GetTile(t1.x - tile.x + t2.x,
                                                    t1.y - tile.y + t2.y, tile.layer));
                sr.sprite = diagonals.Count == 1 ? twoAdjacentDiagonal : twoAdjacent;
            }

            break;

        case 3:

            //find where adjacent isnt
            MovementTile   second    = null;
            MovementTile[] neighbors = AStar.GetTileNeighbors(tile);
            for (int i = 0; i < neighbors.Length; i++)
            {
                if (!neighbors[i] || !neighbors[i].floodedTile)
                {
                    second = neighbors[(i + 2) % 4];
                }
            }

            RotateTowardsAdjacent(second);
            switch (diagonals.Count)
            {
            case 0:
                sr.sprite = three;
                break;

            case 1:

                float angle = Vector2.SignedAngle(second.transform.position - transform.position,
                                                  diagonals[0].transform.position - transform.position);

                sr.sprite = angle > 0 ? threeDiagonalLeft : threeDiagonalRight;
                break;

            case 2:
                sr.sprite = threeTwoDiagonal;
                break;
            }

            break;

        case 4:

            switch (diagonals.Count)
            {
            case 0:
                sr.sprite = four;
                break;

            case 1:

                RotateTowardsDiagonal(diagonals[0]);
                sr.sprite = fourOneDiagonal;
                break;

            case 2:

                MovementTile d1 = diagonals[0];
                MovementTile d2 = diagonals[1];
                if ((d1.x - d2.x) * (d1.x - d2.x) + (d1.y - d2.y) * (d1.y - d2.y) == 4)
                {
                    int          x      = (d1.x + d2.x) / 2;
                    int          y      = (d1.y + d2.y) / 2;
                    MovementTile middle = AStar.GetTile(x, y, tile.layer);

                    RotateTowardsAdjacent(middle);

                    sr.sprite = fourTwoDiagonalAdjacent;
                }
                else
                {
                    RotateTowardsDiagonal(diagonals[0]);
                    sr.sprite = fourTwoDiagonalAcross;
                }

                break;

            case 3:

                int          tx = -(diagonals[0].x + diagonals[1].x + diagonals[2].x - 3 * tile.x) + tile.x;
                int          ty = -(diagonals[0].y + diagonals[1].y + diagonals[2].y - 3 * tile.y) + tile.y;
                MovementTile t  = AStar.GetTile(tx, ty, tile.layer);

                RotateTowardsDiagonal(t);
                sr.sprite = fourThreeDiagonal;
                break;

            case 4:
                sr.sprite = fourFourDiagonal;
                break;
            }

            break;
        }

        if (current != sr.sprite)
        {
            for (int i = 0; i < adjacents.Count; i++)
            {
                if (adjacents[i] && adjacents[i].floodedTile)
                {
                    adjacents[i].floodedTile.UpdateTileImage();
                }
            }
        }
    }