Ejemplo n.º 1
0
    private TankArmourPiece FindBestPieceTowards(Vector2 direction, SearchFlags flag = SearchFlags.Any, bool wrapAround = false, bool ignoreRequirements = false, bool ignoreReservations = false)
    {
        if (armourPieces.Length < 1)
        {
            return(null);
        }
        TankArmourPiece bestPiece = null;
        float           bestScore = wrapAround ? float.NegativeInfinity : 0;

        for (int i = 0; i < armourPieces.Length; i++)
        {
            bool searchValid = (flag == SearchFlags.Any) || (flag == SearchFlags.EmptyOnly && !armourPieces[i].isActive) || (flag == SearchFlags.FullOnly && armourPieces[i].isActive);
            if ((armourPieces[i].IsRequirementSatisfied() || ignoreRequirements) && searchValid && (!armourPieces[i].reserved || ignoreReservations))
            {
                Vector2 internalDirection = (armourPieces[i].transform.position - transform.position).normalized;
                float   score             = Vector2.Dot(direction.normalized, internalDirection);
                if (score > bestScore)
                {
                    bestPiece = armourPieces[i];
                    bestScore = score;
                }
            }
        }
        if (bestPiece == null || (!bestPiece.IsRequirementSatisfied() && !ignoreRequirements))
        {
            return(null);
        }
        return(bestPiece);
    }
Ejemplo n.º 2
0
    public void AttractArmourPickups()
    {
        List <TankArmourPiece> piecesReserved = new List <TankArmourPiece>();

        List <TankArmourPickup> pickupsDetected = DetectArmourPickups();

        for (int i = 0; i < pickupsDetected.Count; i++)
        {
            Vector2         direction = (pickupsDetected[i].transform.position - transform.position).normalized;
            TankArmourPiece piece     = manager.ReservePieceToward(direction, true);
            if (piece != null)
            {
                piecesReserved.Add(piece);

                float distance = Vector2.Distance(pickupsDetected[i].transform.position, piece.transform.position);
                float speed    = Mathf.SmoothStep(maxSpeed, minSpeed, (distance / pickupRadius) * (distance / pickupRadius)) * Time.deltaTime;

                if (distance < 0.5f)
                {
                    Destroy(pickupsDetected[i].gameObject);
                    manager.TryEnablePiece(piece);
                    continue;
                }
                pickupsDetected[i].GetComponent <Rigidbody2D>().MovePosition(Vector2.MoveTowards(pickupsDetected[i].transform.position, piece.transform.position, speed));
            }
        }
        for (int i = 0; i < piecesReserved.Count; i++)
        {
            piecesReserved[i].reserved = false;
        }
    }
Ejemplo n.º 3
0
    private TankArmourPiece FindBestPieceAtPoint(Vector2 point, SearchFlags flag = SearchFlags.Any, bool ignoreRequirements = false, bool ignoreReservations = false)
    {
        if (armourPieces.Length < 1)
        {
            return(null);
        }
        TankArmourPiece bestPiece    = null;
        float           bestDistance = float.PositiveInfinity;

        for (int i = 0; i < armourPieces.Length; i++)
        {
            bool searchValid = (flag == SearchFlags.Any) || (flag == SearchFlags.EmptyOnly && !armourPieces[i].isActive) || (flag == SearchFlags.FullOnly && armourPieces[i].isActive);
            if ((armourPieces[i].IsRequirementSatisfied() || ignoreRequirements) && searchValid && (!armourPieces[i].reserved || ignoreReservations))
            {
                float distance = Vector2.Distance(point, armourPieces[i].transform.position);
                if (distance < bestDistance)
                {
                    bestPiece    = armourPieces[i];
                    bestDistance = distance;
                }
            }
        }
        if (bestPiece == null || (!bestPiece.IsRequirementSatisfied() && !ignoreRequirements))
        {
            return(null);
        }
        return(bestPiece);
    }
Ejemplo n.º 4
0
 public void AddRequirement(TankArmourPiece piece)
 {
     if (requiredPiecesToBeActive.Contains(piece))
     {
         return;
     }
     requiredPiecesToBeActive.Add(piece);
     piece.AddRequiredBy(this);
 }
Ejemplo n.º 5
0
    public void AddPieceNear(Vector2 point)
    {
        TankArmourPiece bestPiece = FindBestPieceAtPoint(point, SearchFlags.EmptyOnly);

        if (bestPiece != null)
        {
            TryEnablePiece(bestPiece);
        }
    }
Ejemplo n.º 6
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if (GUILayout.Button("Find All Pieces"))
        {
            manager.armourPieces = manager.GetComponentsInChildren <TankArmourPiece>();
        }

        if (GUILayout.Button("Remove Null Pieces"))
        {
            for (int i = 0; i < manager.armourPieces.Length; i++)
            {
                TankArmourPiece piece = manager.armourPieces[i];
                for (int j = piece.requiredPiecesToBeActive.Count - 1; j > -1; j--)
                {
                    if (piece.requiredPiecesToBeActive[j] == null)
                    {
                        piece.requiredPiecesToBeActive.RemoveAt(j);
                    }
                }
                for (int j = piece.piecesRequiriedBy.Count - 1; j > -1; j--)
                {
                    if (piece.piecesRequiriedBy[j] == null)
                    {
                        piece.piecesRequiriedBy.RemoveAt(j);
                    }
                }
            }
        }

        if (GUILayout.Button("Spawn Prefab Pieces"))
        {
            for (int i = 0; i < manager.armourPieces.Length; i++)
            {
                manager.armourPieces[i].CreateRepresentation();
            }
        }

        if (GUILayout.Button("Delete Prefab Pieces"))
        {
            for (int i = 0; i < manager.armourPieces.Length; i++)
            {
                DestroyImmediate(manager.armourPieces[i].tankPieceRepresentation);
            }
        }

        EditorGUILayout.HelpBox(
            "Controls:\n\n" +
            "Hold CTRL to interact with armour system\n\n" +
            "Dragging and clicking creates a dependecy to another armour node\n\n" +
            "Holding CTRL+ALT and clicking dependency lines deletes the dependency\n\n" +
            "Holding CTRL+SHIFT and clicking activates the nearest piece of armour\n\n" +
            "Holding CTRL+ALT+SHIFT and clicking deactivates the nearest piece of armour"
            , MessageType.Info, true);
    }
Ejemplo n.º 7
0
    public void TryRemovePiece(TankArmourPiece piece, ref List <TankArmourPickup> pickups)
    {
        TankArmourPickup pickup;

        if (piece.DisablePiece(out pickup))
        {
            pickup.OnDrop(this);
            pickups.Add(pickup);

            OnPieceAdded(piece, (float)armourCount / armourPieces.Length);
        }
    }
Ejemplo n.º 8
0
    public bool TryEnablePiece(TankArmourPiece piece)
    {
        if (piece.TryEnablePiece())
        {
            if (piece.isTurretHolder)
            {
                tankManager.AddTurret(piece.turret);
            }

            OnPieceAdded(piece, (float)armourCount / armourPieces.Length);
            return(true);
        }
        return(false);
    }
Ejemplo n.º 9
0
    public List <TankArmourPickup> RemovePieceNear(Vector2 point)
    {
        TankArmourPiece bestPiece = FindBestPieceAtPoint(point, SearchFlags.FullOnly, true);

        if (bestPiece != null)
        {
            List <TankArmourPickup> pickups = new List <TankArmourPickup>();

            TryRemovePiece(bestPiece, ref pickups);

            pickups = bestPiece.ReevaulateChildren(pickups);
            return(pickups);
        }
        return(null);
    }
Ejemplo n.º 10
0
    public void ProcessDamage(DamageData hit)
    {
        TankArmourPiece piece = FindBestPieceAtPoint(hit.point, SearchFlags.FullOnly, true);

        if (piece == null)
        {
            Debug.LogWarning("Something weird happened, I got damaged without finding a best");
        }
        piece.maxHealth -= hit.damage;
        List <TankArmourPickup> pickups = new List <TankArmourPickup>();

        if (piece.maxHealth <= 0)
        {
            TryRemovePiece(piece, ref pickups);
            pickups = piece.ReevaulateChildren(pickups);
        }
    }
Ejemplo n.º 11
0
 private void ChangeArmourSpeedModifer(TankArmourPiece piece, float percent)
 {
     tankMovement.SetSpeedModifer(Mathf.SmoothStep(1, armourMinSpeedModifer, tankSpeedModCurve.Evaluate(percent)));
 }
Ejemplo n.º 12
0
 private void RemoveRequiredBy(TankArmourPiece piece)
 {
     piecesRequiriedBy.Remove(piece);
 }
Ejemplo n.º 13
0
 public void RemoveRequirement(TankArmourPiece piece)
 {
     requiredPiecesToBeActive.Remove(piece);
     piece.RemoveRequiredBy(this);
 }
Ejemplo n.º 14
0
 private void AddRequiredBy(TankArmourPiece piece)
 {
     piecesRequiriedBy.Add(piece);
 }
Ejemplo n.º 15
0
 private TankArmourPickup CreateArmourPickupFromPiece(TankArmourPiece piece)
 {
     return(Instantiate(pickupPrefab, piece.transform.position, Quaternion.identity));
 }