using System; using System.IO; using Terraria.ModLoader.IO; namespace SoulHarvest.Common; public sealed class ReaperBranchState { private readonly byte[] skillLevels = new byte[ReaperDefinitions.SkillsPerBranch]; public ReaperStage Stage { get; internal set; } public int GetSkillLevel(int skillIndex) { return skillIndex >= 0 && skillIndex < skillLevels.Length ? skillLevels[skillIndex] : 0; } internal bool TryUpgradeSkill(int skillIndex) { if (skillIndex < 0 || skillIndex >= skillLevels.Length || skillIndex >= (int)Stage || skillLevels[skillIndex] <= 0 || skillLevels[skillIndex] >= ReaperDefinitions.MaximumSkillLevel) { return false; } skillLevels[skillIndex]++; return true; } internal void SetSkillLevel(int skillIndex, int level) { if (skillIndex < 0 || skillIndex >= skillLevels.Length) return; int maximumForStage = skillIndex < (int)Stage ? ReaperDefinitions.MaximumSkillLevel : 0; skillLevels[skillIndex] = (byte)Math.Clamp(level, 0, maximumForStage); } internal void EnsureStageSkills() { for (int index = 0; index < skillLevels.Length; index++) { if (index < (int)Stage && skillLevels[index] == 0) skillLevels[index] = 1; else if (index >= (int)Stage) skillLevels[index] = 0; else skillLevels[index] = (byte)Math.Clamp((int)skillLevels[index], 1, ReaperDefinitions.MaximumSkillLevel); } } internal void Reset() { Stage = ReaperStage.Locked; Array.Clear(skillLevels); } internal void CopySkillLevelsTo(byte[] destination, int destinationIndex) { Array.Copy(skillLevels, 0, destination, destinationIndex, skillLevels.Length); } }