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); }
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; } }
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); }
public void AddRequirement(TankArmourPiece piece) { if (requiredPiecesToBeActive.Contains(piece)) { return; } requiredPiecesToBeActive.Add(piece); piece.AddRequiredBy(this); }
public void AddPieceNear(Vector2 point) { TankArmourPiece bestPiece = FindBestPieceAtPoint(point, SearchFlags.EmptyOnly); if (bestPiece != null) { TryEnablePiece(bestPiece); } }
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); }
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); } }
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); }
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); }
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); } }
private void ChangeArmourSpeedModifer(TankArmourPiece piece, float percent) { tankMovement.SetSpeedModifer(Mathf.SmoothStep(1, armourMinSpeedModifer, tankSpeedModCurve.Evaluate(percent))); }
private void RemoveRequiredBy(TankArmourPiece piece) { piecesRequiriedBy.Remove(piece); }
public void RemoveRequirement(TankArmourPiece piece) { requiredPiecesToBeActive.Remove(piece); piece.RemoveRequiredBy(this); }
private void AddRequiredBy(TankArmourPiece piece) { piecesRequiriedBy.Add(piece); }
private TankArmourPickup CreateArmourPickupFromPiece(TankArmourPiece piece) { return(Instantiate(pickupPrefab, piece.transform.position, Quaternion.identity)); }