using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections; public class DragDropItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public int itemID; public float snapDistance = 100f; private RectTransform rectTransform; private CanvasGroup canvasGroup; private Transform originalCardBackground; private Vector3 startWorldPos; private DragDropManager manager; private bool isLocked = false; public void Setup(Sprite sp, int id, DragDropManager mgr) { rectTransform = GetComponent(); canvasGroup = GetComponent(); if (canvasGroup == null) canvasGroup = gameObject.AddComponent(); GetComponent().sprite = sp; itemID = id; manager = mgr; } public void OnBeginDrag(PointerEventData eventData) { if (isLocked) return; originalCardBackground = transform.parent; startWorldPos = transform.position; transform.SetParent(transform.root); transform.SetAsLastSibling(); canvasGroup.blocksRaycasts = false; canvasGroup.alpha = 0.8f; } public void OnDrag(PointerEventData eventData) { if (isLocked) return; transform.position = eventData.position; } public void OnEndDrag(PointerEventData eventData) { if (isLocked) return; canvasGroup.blocksRaycasts = true; canvasGroup.alpha = 1f; ShadowSlot[] slots = FindObjectsOfType(); ShadowSlot closest = null; float minDist = snapDistance; foreach (ShadowSlot s in slots) { float d = Vector2.Distance(transform.position, s.transform.position); if (d < minDist && s.slotID == itemID && !s.isOccupied) { minDist = d; closest = s; } } if (closest != null) StartCoroutine(CorrectAnim(closest)); else StartCoroutine(WrongAnim()); } // --- FITUR BARU: ANIMASI KETIKA BENAR --- IEnumerator CorrectAnim(ShadowSlot s) { isLocked = true; transform.position = s.transform.position; // Animasi "Pulse" (Membesar sedikit lalu pas) float t = 0; while (t < 1) { t += Time.deltaTime * 8; transform.localScale = Vector3.Lerp(Vector3.one, new Vector3(1.2f, 1.2f, 1.2f), t); yield return null; } s.CompleteSlot(); manager.CheckWin(); Destroy(gameObject); } // --- FITUR BARU: ANIMASI SALAH + HUKUMAN --- IEnumerator WrongAnim() { isLocked = true; // Panggil Hukuman Waktu dari Manager! manager.BerikanHukumanWaktu(); // Animasi "Shake" (Bergetar Kiri-Kanan tanda salah) Vector3 curPos = transform.position; for (int i = 0; i < 4; i++) { transform.position = curPos + new Vector3((i % 2 == 0 ? 15f : -15f), 0, 0); yield return new WaitForSeconds(0.04f); } transform.position = curPos; // Kembalikan ke titik asalnya sebelum terbang balik // Meluncur balik ke bingkai aslinya float time = 0; while (time < 1) { time += Time.deltaTime * 8; transform.position = Vector3.Lerp(curPos, startWorldPos, time); yield return null; } transform.SetParent(originalCardBackground); rectTransform.anchoredPosition = Vector2.zero; isLocked = false; } }