Files
OTG_8/Assets/_Scripts/Stats/LevelSystem.cs
T
2026-06-04 23:22:13 +03:00

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();
}
}
}