// // ©2015 - 2025 Candy Smith // // All rights reserved // // Redistribution of this software is strictly not allowed. // // Copy of this software can be obtained from unity asset store only. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // // THE SOFTWARE. using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.UI; using VContainer; using WordsToolkit.Scripts.Data; using WordsToolkit.Scripts.Enums; using WordsToolkit.Scripts.Popups; using WordsToolkit.Scripts.Settings; using WordsToolkit.Scripts.System; namespace WordsToolkit.Scripts.GUI.Buttons { public class GiftButton : BaseGUIButton { private const string SAVE_KEY = "GiftButton_CollectedItems"; [Header("Counter Settings")] [SerializeField] private TextMeshProUGUI counterText; [SerializeField] private GameObject counterContainer; [SerializeField] private int collectedItems = 0; [Header("Visual Feedback")] [SerializeField] private float pulseScale = 1.2f; [SerializeField] private float pulseDuration = 0.3f; [Header("Resources")] [SerializeField] private ResourceObject resource; [Tooltip("Optional override for gems awarded per gift (if not set, uses value from GameSettings)")] [SerializeField] private int gemsPerGift = 0; [SerializeField] private TextMeshProUGUI gemsValueText; [SerializeField] private GameObject gemsLabelObject; [Header("Visual Appearance")] [SerializeField] private Image mainBoxSprite; [SerializeField] private Sprite lightModeSprite; [SerializeField] private Sprite darkModeSprite; [Inject] private MenuManager menuManager; [SerializeField] private Popup giftPopup; [Inject] private GameManager gameManager; private bool isActive; protected override void OnEnable() { base.OnEnable(); EventManager.GetEvent(EGameEvent.SpecialItemCollected).Subscribe(OnSpecialItemCollected); onClick.AddListener(ConsumeResource); } protected override void OnDisable() { base.OnDisable(); EventManager.GetEvent(EGameEvent.SpecialItemCollected).Unsubscribe(OnSpecialItemCollected); onClick.RemoveListener(ConsumeResource); } protected override void Start() { base.Start(); if(!Application.isPlaying) { return; } // Load saved collected items collectedItems = PlayerPrefs.GetInt(SAVE_KEY, 0); UpdateCounterDisplay(); UpdateGemsValueDisplay(); UpdateState(); } /// /// Updates the displayed gems value /// private void UpdateGemsValueDisplay() { if (gemsValueText != null) { int gemsAmount = gemsPerGift > 0 ? gemsPerGift : gameSettings.gemsForGift; gemsValueText.text = gemsAmount.ToString(); } // Update visibility of gems label if (gemsLabelObject != null) { gemsLabelObject.SetActive(collectedItems > 0); } else if (gemsValueText != null) { // If no specific label object is assigned, control the text object directly gemsValueText.gameObject.SetActive(collectedItems > 0); } } /// /// Updates the visual state of the button based on collection status /// private void UpdateState() { isActive = collectedItems > 0; interactable = isActive; } /// /// Increments the counter when a special item is collected /// public void CollectItem() { collectedItems++; // Save the updated count PlayerPrefs.SetInt(SAVE_KEY, collectedItems); PlayerPrefs.Save(); UpdateCounterDisplay(); UpdateGemsValueDisplay(); UpdateState(); PlayCollectionFeedback(); } /// /// Updates the counter UI text /// private void UpdateCounterDisplay() { if (counterText != null) { counterText.text = collectedItems.ToString(); } // Show counter only if we've collected items if (counterContainer != null) { counterContainer.SetActive(collectedItems > 0); } } private void ConsumeResource() { // Get the gems amount from GameSettings or use the override if set int gemsAmount = gemsPerGift > 0 ? gemsPerGift : gameSettings.gemsForGift; // Attempt to consume the resource and add gems if (resource != null && resourceManager.ConsumeWithEffects(resource,gemsAmount)) { // Decrease the counter collectedItems--; // Save the updated count PlayerPrefs.SetInt(SAVE_KEY, collectedItems); PlayerPrefs.Save(); // Update the display UpdateCounterDisplay(); UpdateGemsValueDisplay(); UpdateState(); menuManager.ShowPopup(giftPopup); } } /// /// Play visual feedback when item is collected /// private void PlayCollectionFeedback() { // Simple pulse animation mainBoxSprite.transform.DOScale(pulseScale, pulseDuration / 2) .SetEase(Ease.OutQuad) .OnComplete(() => { mainBoxSprite.transform.DOScale(1f, pulseDuration / 2).SetEase(Ease.InQuad); }); } // Event handler for when a special item is collected private void OnSpecialItemCollected() { CollectItem(); } } }