using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using DG.Tweening;
using NaughtyAttributes;
public class WeaponInfoCanvas : MonoBehaviour
{
[BoxGroup("Particle Boarder")] [SerializeField] private ParticleSystem mainSystem;
[BoxGroup("Particle Boarder")] [SerializeField] private ParticleSystem subSystem;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponName;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponDamage;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponCritMultiplier;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponSpread;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponReloadSpeed;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponFireRate;
[BoxGroup("Value Assignments")] [SerializeField] private TMP_Text weaponMagSize;
[BoxGroup("Tween Objects")] [SerializeField] private Transform[] childrenToTween;
[BoxGroup("Statistic Arrows")] [SerializeField] Sprite arrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Sprite line;
[BoxGroup("Statistic Arrows")] [SerializeField] Image damageArrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Image critArrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Image spreadArrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Image reloadSpeedArrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Image fireRateArrow;
[BoxGroup("Statistic Arrows")] [SerializeField] Image magSizeArrow;
private Color32 blueRarity = new Color(0, 125, 1, 50f);
private Color32 purpleRarity = new Color(255f, 0f, 255f, 50f);
private Color32 redRarity = new Color(255f, 0f, 0f, 50f);
private Color32 goldRarity = new Color(255f, 255f, 0f, 50f);
private void OnEnable()
{
transform.DOScale(1.5f, 0.2f).SetEase(Ease.InSine);
float delay = 0.1f;
foreach (Transform t in childrenToTween) { t.localScale = Vector3.zero; }
for (int i = 0; i < childrenToTween.Length; i++)
{
delay += 0.05f;
Transform t = childrenToTween[i];
t.DOScale(1, 0.15f).SetDelay(delay).SetUpdate(true);
}
}
private void OnDisable() => transform.localScale = Vector3.zero;
public void DisableGameObject()
{
transform.DOScale(0, 0.1f).OnComplete(() => gameObject.SetActive(false));
}
public void SetWeaponCanvasStats(WeaponUpgradeConfig currentWeaponConfig, Weapon weaponData, int powerLevel, Rarity rarity)
{
WeaponUpgradeConfig config = weaponData.UpgradeLevels[powerLevel];
float damage = config.Damage;
float critDamage = config.HeadShotDamage;
float critMultiplier = (critDamage / damage) * 100;
float reloadMultiplier = 1f / config.ReloadTime;
float fireRate = 1f / config.FireRate;
float RPM = fireRate * 60;
float consumptionRate = config.consumptionRate / weaponData.bulletsPerTap;
SetOuterGlow(rarity);
Debug.LogError($"currentWeapon:{currentWeaponConfig}, newWeapon:{weaponData}");
weaponName.SetText(weaponData.weaponName);
weaponDamage.SetText($"{damage}");
weaponCritMultiplier.SetText($"{critMultiplier:F2}%");
weaponSpread.SetText($"{config.BulletSpread}");
weaponReloadSpeed.SetText($"{reloadMultiplier:F2}x");
weaponFireRate.SetText($"{RPM:F0}RPM");
weaponMagSize.SetText($"{consumptionRate:F2}/Ps");
float currentWeaponCrit = (float)currentWeaponConfig.HeadShotDamage / (float)currentWeaponConfig.Damage;
float currentWeaponReload = 1f / currentWeaponConfig.ReloadTime;
float currentWeaponFireRate = 1f / currentWeaponConfig.FireRate;
SetStatIndicator(damage, currentWeaponConfig.Damage, damageArrow);
SetStatIndicator(critMultiplier, currentWeaponCrit, critArrow);
SetStatIndicator(config.BulletSpread, currentWeaponConfig.BulletSpread, spreadArrow, true);
SetStatIndicator(reloadMultiplier, currentWeaponReload, reloadSpeedArrow);
SetStatIndicator(config.FireRate, currentWeaponFireRate, fireRateArrow);
SetStatIndicator(config.consumptionRate, currentWeaponConfig.consumptionRate, magSizeArrow, true);
}
private void SetOuterGlow(Rarity rarity)
{
ParticleSystem.MainModule main = mainSystem.main;
ParticleSystem.MainModule subMain = subSystem.main;
switch (rarity)
{
case Rarity.Common:
main.startColor = new ParticleSystem.MinMaxGradient(Color.grey);
subMain.startColor = new ParticleSystem.MinMaxGradient(Color.grey);
break;
case Rarity.Rare:
main.startColor = new ParticleSystem.MinMaxGradient(blueRarity);
subMain.startColor = new ParticleSystem.MinMaxGradient(blueRarity);
weaponName.color = blueRarity;
break;
case Rarity.VeryRare:
main.startColor = new ParticleSystem.MinMaxGradient(purpleRarity);
subMain.startColor = new ParticleSystem.MinMaxGradient(purpleRarity);
weaponName.color = purpleRarity;
break;
case Rarity.Epic:
main.startColor = new ParticleSystem.MinMaxGradient(redRarity);
subMain.startColor = new ParticleSystem.MinMaxGradient(redRarity);
weaponName.color = redRarity;
break;
case Rarity.Legendary:
main.startColor = new ParticleSystem.MinMaxGradient(goldRarity);
subMain.startColor = new ParticleSystem.MinMaxGradient(goldRarity);
weaponName.color = goldRarity;
break;
}
}
private void SetStatIndicator(float newStat, float currentStat, Image img, bool lowerIsBetter = false)
{
img.sprite = newStat == currentStat ? line : arrow;
if (newStat > currentStat || newStat < currentStat && lowerIsBetter)
{
SetImageFlipY(img, true);
img.color = Color.green;
}
else if (newStat < currentStat || newStat > currentStat && lowerIsBetter)
{
SetImageFlipY(img, false);
img.color = Color.red;
}
else
{
SetImageFlipY(img, false);
img.color = Color.white;
}
}
private void SetImageFlipY(Image img, bool flipY)
{
Vector3 scale = img.transform.localScale;
scale.y = flipY ? -1 : 1;
img.transform.localScale = scale;
}
private void Update()
{
Vector3 targetDirection = (transform.position - PlayerStats.Instance.GetCameraPosition()).normalized;
targetDirection.y = 0;
transform.rotation = Quaternion.LookRotation(targetDirection);
}
}