XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

DeathMod

【Terraria】DeathMod (now aka Soul Harvest)

公开
关注 0 Fork 0 Star 0
UTF-8
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);
    }
}