73 lines
2.2 KiB
C#
73 lines
2.2 KiB
C#
using System;
|
|
using JetBrains.Annotations;
|
|
using SharpUI.Source.Common.UI.Elements.Progress;
|
|
using SharpUI.Source.Common.UI.Elements.Toggle;
|
|
using SharpUI.Source.Common.UI.Util;
|
|
using UnityEngine;
|
|
|
|
namespace SharpUI.Source.Common.UI.Elements.SkillTrees
|
|
{
|
|
public class SkillProgressLine : ProgressBar, ISkillProgressLine
|
|
{
|
|
[SerializeField,CanBeNull] public SkillProgressLine parent;
|
|
[SerializeField] public ToggleButton checkPointToggle;
|
|
[SerializeField] public int requiredLevelsAmount;
|
|
|
|
private readonly IUiUtil _uiUtil = new UiUtil();
|
|
private int _unlockAtSkillAmount;
|
|
private int _totalAmount;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
CalculateUnlockAmount();
|
|
OnSkillAmountChanged(0);
|
|
}
|
|
|
|
public int GetUnlockAtSkillAmount() => _unlockAtSkillAmount;
|
|
|
|
public int GetTotalAmount() => _totalAmount;
|
|
|
|
public void OnSkillAmountChanged(int totalAmount)
|
|
{
|
|
_totalAmount = totalAmount;
|
|
var percentageAmount = GetPercentageFromAmount();
|
|
UpdatePercentage(percentageAmount);
|
|
UpdateCheckPoint();
|
|
}
|
|
|
|
private void CalculateUnlockAmount()
|
|
{
|
|
_unlockAtSkillAmount = 0;
|
|
var parentProgress = parent;
|
|
while (parentProgress != null)
|
|
{
|
|
_unlockAtSkillAmount += parentProgress.requiredLevelsAmount;
|
|
parentProgress = parentProgress.parent;
|
|
}
|
|
}
|
|
|
|
private bool IsUnlocked() => _totalAmount >= _unlockAtSkillAmount;
|
|
|
|
private bool IsFilled() => _totalAmount >= _unlockAtSkillAmount + requiredLevelsAmount;
|
|
|
|
private float GetPercentageFromAmount()
|
|
{
|
|
if (!IsUnlocked()) return 0f;
|
|
|
|
float amount = Math.Min(_totalAmount - _unlockAtSkillAmount, requiredLevelsAmount);
|
|
return _uiUtil.ToPercentage(amount / requiredLevelsAmount);
|
|
|
|
}
|
|
|
|
private void UpdateCheckPoint()
|
|
{
|
|
if (checkPointToggle == null) return;
|
|
|
|
if (IsFilled())
|
|
checkPointToggle.ToggleOn();
|
|
else
|
|
checkPointToggle.ToggleOff();
|
|
}
|
|
}
|
|
} |