208 lines
6.7 KiB
C#
208 lines
6.7 KiB
C#
// // ©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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the displayed gems value
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the visual state of the button based on collection status
|
|
/// </summary>
|
|
private void UpdateState()
|
|
{
|
|
isActive = collectedItems > 0;
|
|
interactable = isActive;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Increments the counter when a special item is collected
|
|
/// </summary>
|
|
public void CollectItem()
|
|
{
|
|
collectedItems++;
|
|
// Save the updated count
|
|
PlayerPrefs.SetInt(SAVE_KEY, collectedItems);
|
|
PlayerPrefs.Save();
|
|
|
|
UpdateCounterDisplay();
|
|
UpdateGemsValueDisplay();
|
|
UpdateState();
|
|
PlayCollectionFeedback();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the counter UI text
|
|
/// </summary>
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// Play visual feedback when item is collected
|
|
/// </summary>
|
|
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();
|
|
}
|
|
}
|
|
} |