using Core; using UnityEngine; namespace Minigames.FortFight.Projectiles { /// /// Trash Bag projectile - splits into multiple smaller pieces on impact. /// Deals AOE damage in a forward cone. /// public class TrashBagProjectile : ProjectileBase { [Header("Trash Bag Specific")] [Tooltip("Number of trash pieces to spawn on impact")] [SerializeField] private int trashPieceCount = 6; [Tooltip("Prefab for individual trash pieces")] [SerializeField] private GameObject trashPiecePrefab; [Tooltip("Force applied to each trash piece")] [SerializeField] private float pieceForce = 8f; [Tooltip("Spread angle for trash pieces (degrees)")] [SerializeField] private float spreadAngle = 30f; [Tooltip("Damage dealt by each trash piece")] [SerializeField] private float pieceDamage = 8f; protected override void OnHit(Collider2D hit) { base.OnHit(hit); Logging.Debug($"[TrashBagProjectile] Splitting into {trashPieceCount} pieces"); SpawnTrashPieces(hit.transform.position); } /// /// Spawn multiple trash pieces in a forward cone /// private void SpawnTrashPieces(Vector2 impactPoint) { if (trashPiecePrefab == null) { Logging.Warning("[TrashBagProjectile] No trash piece prefab assigned!"); return; } // Calculate forward direction from velocity Vector2 forwardDirection = rb2D.linearVelocity.normalized; if (forwardDirection == Vector2.zero) { forwardDirection = LaunchDirection; } // Spawn pieces in a cone for (int i = 0; i < trashPieceCount; i++) { // Calculate angle for this piece float angleOffset = Mathf.Lerp(-spreadAngle, spreadAngle, i / (float)(trashPieceCount - 1)); float angleRadians = Mathf.Atan2(forwardDirection.y, forwardDirection.x) + angleOffset * Mathf.Deg2Rad; Vector2 pieceDirection = new Vector2(Mathf.Cos(angleRadians), Mathf.Sin(angleRadians)); // Spawn trash piece GameObject piece = Instantiate(trashPiecePrefab, impactPoint, Quaternion.identity); // Setup trash piece physics Rigidbody2D pieceRb = piece.GetComponent(); if (pieceRb != null) { pieceRb.AddForce(pieceDirection * pieceForce, ForceMode2D.Impulse); } // Setup trash piece damage (if it has a component) TrashPiece trashPieceComponent = piece.GetComponent(); if (trashPieceComponent != null) { trashPieceComponent.Initialize(pieceDamage); } // Auto-destroy after 3 seconds Destroy(piece, 3f); Logging.Debug($"[TrashBagProjectile] Spawned trash piece {i} in direction {pieceDirection}"); } } } /// /// Component for individual trash pieces spawned by TrashBagProjectile. /// Deals damage on collision. /// public class TrashPiece : MonoBehaviour { private float damage; private bool hasHit = false; public void Initialize(float pieceDamage) { this.damage = pieceDamage; } private void OnCollisionEnter2D(Collision2D collision) { if (hasHit) return; hasHit = true; // Check if hit a fort block var block = collision.gameObject.GetComponent(); if (block != null) { block.TakeDamage(damage); Logging.Debug($"[TrashPiece] Dealt {damage} damage to {block.gameObject.name}"); } // Destroy this piece Destroy(gameObject, 0.1f); } } }