2.5 update
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
using BumpCombat.Core;
|
||||
using System;
|
||||
using BumpCombat.Constants;
|
||||
using BumpCombat.Player;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -10,19 +9,26 @@ namespace BumpCombat.Progression
|
||||
public sealed class ExperienceSystem : MonoBehaviour
|
||||
{
|
||||
private PlayerStats playerStats;
|
||||
private float fractionalExperience;
|
||||
private ExperienceProgress progress;
|
||||
|
||||
public event Action<int, int, int> OnExperienceChanged;
|
||||
public event Action<int> OnLevelGained;
|
||||
public event Action OnExperienceOrbPickedUp;
|
||||
|
||||
public int Level { get; private set; } = 1;
|
||||
public int CurrentExperience { get; private set; }
|
||||
public int RequiredExperience => RequiredExperienceForLevel(Level);
|
||||
public int Level => progress != null ? progress.Level : 1;
|
||||
public int CurrentExperience => progress != null
|
||||
? progress.CurrentExperience
|
||||
: 0;
|
||||
public int RequiredExperience => progress != null
|
||||
? progress.RequiredExperience
|
||||
: RequiredExperienceForLevel(1);
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
playerStats = GetComponent<PlayerStats>();
|
||||
progress = new ExperienceProgress();
|
||||
progress.ExperienceChanged += HandleProgressExperienceChanged;
|
||||
progress.LevelGained += HandleProgressLevelGained;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
@@ -48,31 +54,31 @@ namespace BumpCombat.Progression
|
||||
|
||||
private void AddExperienceInternal(int amount)
|
||||
{
|
||||
fractionalExperience += Mathf.Max(0f, playerStats.Evaluate(
|
||||
float evaluatedAmount = playerStats.Evaluate(
|
||||
CharacterStat.ExperienceGain,
|
||||
Mathf.Max(0, amount)));
|
||||
int wholeExperience = Mathf.FloorToInt(
|
||||
fractionalExperience + 0.0001f);
|
||||
fractionalExperience = Mathf.Max(
|
||||
0f,
|
||||
fractionalExperience - wholeExperience);
|
||||
CurrentExperience += wholeExperience;
|
||||
while (CurrentExperience >= RequiredExperience)
|
||||
{
|
||||
CurrentExperience -= RequiredExperience;
|
||||
Level++;
|
||||
OnLevelGained?.Invoke(Level);
|
||||
}
|
||||
Mathf.Max(0, amount));
|
||||
progress.AddEvaluated(evaluatedAmount);
|
||||
}
|
||||
|
||||
OnExperienceChanged?.Invoke(CurrentExperience, RequiredExperience, Level);
|
||||
private void HandleProgressExperienceChanged(
|
||||
int currentExperience,
|
||||
int requiredExperience,
|
||||
int level)
|
||||
{
|
||||
OnExperienceChanged?.Invoke(
|
||||
currentExperience,
|
||||
requiredExperience,
|
||||
level);
|
||||
}
|
||||
|
||||
private void HandleProgressLevelGained(int level)
|
||||
{
|
||||
OnLevelGained?.Invoke(level);
|
||||
}
|
||||
|
||||
public static int RequiredExperienceForLevel(int level)
|
||||
{
|
||||
LevelUpConstants tuning = GameplayConstants.Current.LevelUp;
|
||||
return tuning.BaseExperienceToNextLevel
|
||||
+ (Mathf.Max(1, level) - 1)
|
||||
* tuning.AdditionalExperiencePerLevel;
|
||||
return ExperienceProgress.RequiredExperienceForLevel(level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user