86 lines
2.3 KiB
C#
86 lines
2.3 KiB
C#
using System;
|
|
using OTGIntegrated.Core;
|
|
using OTGIntegrated.Talents;
|
|
using UnityEngine;
|
|
|
|
namespace OTGIntegrated.Stats
|
|
{
|
|
public sealed class LevelSystem : MonoBehaviour
|
|
{
|
|
[Header("Progression")]
|
|
public int level = 1;
|
|
public int currentExp = 0;
|
|
public int expToNextLevel = 100;
|
|
|
|
private TalentManager talentManager;
|
|
|
|
public event Action OnExperienceChanged;
|
|
public event Action OnLevelChanged;
|
|
|
|
public void Initialize(TalentManager talentManager)
|
|
{
|
|
this.talentManager = talentManager;
|
|
level = Mathf.Max(1, level);
|
|
currentExp = Mathf.Max(0, currentExp);
|
|
expToNextLevel = Mathf.Max(1, expToNextLevel);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.X))
|
|
{
|
|
AddExperience(50);
|
|
}
|
|
}
|
|
|
|
public void AddExperience(int amount)
|
|
{
|
|
if (amount <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
currentExp += amount;
|
|
GameEvents.RaiseExperienceGained(amount);
|
|
GameEvents.RaiseNotification($"Получено опыта: {amount}");
|
|
|
|
while (currentExp >= expToNextLevel)
|
|
{
|
|
currentExp -= expToNextLevel;
|
|
LevelUp();
|
|
}
|
|
|
|
OnExperienceChanged?.Invoke();
|
|
}
|
|
|
|
public void LevelUp()
|
|
{
|
|
level = Mathf.Max(1, level + 1);
|
|
expToNextLevel = Mathf.Max(1, Mathf.RoundToInt(expToNextLevel * 1.25f + 25f));
|
|
|
|
if (talentManager != null)
|
|
{
|
|
talentManager.AddTalentPoints(1);
|
|
}
|
|
|
|
GameEvents.RaiseLevelUp(level);
|
|
GameEvents.RaiseNotification($"Уровень повышен: {level}");
|
|
OnLevelChanged?.Invoke();
|
|
}
|
|
|
|
public float GetNormalizedExp()
|
|
{
|
|
return expToNextLevel <= 0 ? 0f : Mathf.Clamp01((float)currentExp / expToNextLevel);
|
|
}
|
|
|
|
public void SetProgress(int savedLevel, int savedExp, int savedExpToNext)
|
|
{
|
|
level = Mathf.Max(1, savedLevel);
|
|
currentExp = Mathf.Max(0, savedExp);
|
|
expToNextLevel = Mathf.Max(1, savedExpToNext);
|
|
OnExperienceChanged?.Invoke();
|
|
OnLevelChanged?.Invoke();
|
|
}
|
|
}
|
|
}
|