diff options
Diffstat (limited to 'Valheim_v202102/Valheim/assembly_valheim/Skills.cs')
-rw-r--r-- | Valheim_v202102/Valheim/assembly_valheim/Skills.cs | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/Valheim_v202102/Valheim/assembly_valheim/Skills.cs b/Valheim_v202102/Valheim/assembly_valheim/Skills.cs new file mode 100644 index 0000000..642f867 --- /dev/null +++ b/Valheim_v202102/Valheim/assembly_valheim/Skills.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +public class Skills : MonoBehaviour +{ + public enum SkillType + { + None = 0, + Swords = 1, + Knives = 2, + Clubs = 3, + Polearms = 4, + Spears = 5, + Blocking = 6, + Axes = 7, + Bows = 8, + FireMagic = 9, + FrostMagic = 10, + Unarmed = 11, + Pickaxes = 12, + WoodCutting = 13, + Jump = 100, + Sneak = 101, + Run = 102, + Swim = 103, + All = 999 + } + + [Serializable] + public class SkillDef + { + public SkillType m_skill = SkillType.Swords; + + public Sprite m_icon; + + public string m_description = ""; + + public float m_increseStep = 1f; + } + + public class Skill + { + public SkillDef m_info; + + public float m_level; + + public float m_accumulator; + + public Skill(SkillDef info) + { + m_info = info; + } + + public bool Raise(float factor) + { + if (m_level >= 100f) + { + return false; + } + float num = m_info.m_increseStep * factor; + m_accumulator += num; + float nextLevelRequirement = GetNextLevelRequirement(); + if (m_accumulator >= nextLevelRequirement) + { + m_level += 1f; + m_level = Mathf.Clamp(m_level, 0f, 100f); + m_accumulator = 0f; + return true; + } + return false; + } + + private float GetNextLevelRequirement() + { + return Mathf.Pow(m_level + 1f, 1.5f) * 0.5f + 0.5f; + } + + public float GetLevelPercentage() + { + if (m_level >= 100f) + { + return 0f; + } + float nextLevelRequirement = GetNextLevelRequirement(); + return Mathf.Clamp01(m_accumulator / nextLevelRequirement); + } + } + + private const int dataVersion = 2; + + private const float randomSkillRange = 0.15f; + + private const float randomSkillMin = 0.4f; + + public const float m_maxSkillLevel = 100f; + + public const float m_skillCurve = 2f; + + public bool m_useSkillCap; + + public float m_totalSkillCap = 600f; + + public List<SkillDef> m_skills = new List<SkillDef>(); + + public float m_DeathLowerFactor = 0.25f; + + private Dictionary<SkillType, Skill> m_skillData = new Dictionary<SkillType, Skill>(); + + private Player m_player; + + public void Awake() + { + m_player = GetComponent<Player>(); + } + + public void Save(ZPackage pkg) + { + pkg.Write(2); + pkg.Write(m_skillData.Count); + foreach (KeyValuePair<SkillType, Skill> skillDatum in m_skillData) + { + pkg.Write((int)skillDatum.Value.m_info.m_skill); + pkg.Write(skillDatum.Value.m_level); + pkg.Write(skillDatum.Value.m_accumulator); + } + } + + public void Load(ZPackage pkg) + { + int num = pkg.ReadInt(); + m_skillData.Clear(); + int num2 = pkg.ReadInt(); + for (int i = 0; i < num2; i++) + { + SkillType skillType = (SkillType)pkg.ReadInt(); + float level = pkg.ReadSingle(); + float accumulator = ((num >= 2) ? pkg.ReadSingle() : 0f); + if (IsSkillValid(skillType)) + { + Skill skill = GetSkill(skillType); + skill.m_level = level; + skill.m_accumulator = accumulator; + } + } + } + + private bool IsSkillValid(SkillType type) + { + return Enum.IsDefined(typeof(SkillType), type); + } + + public float GetSkillFactor(SkillType skillType) + { + if (skillType == SkillType.None) + { + return 0f; + } + return GetSkill(skillType).m_level / 100f; + } + + public void GetRandomSkillRange(out float min, out float max, SkillType skillType) + { + float skillFactor = GetSkillFactor(skillType); + float num = Mathf.Lerp(0.4f, 1f, skillFactor); + min = Mathf.Clamp01(num - 0.15f); + max = Mathf.Clamp01(num + 0.15f); + } + + public float GetRandomSkillFactor(SkillType skillType) + { + float skillFactor = GetSkillFactor(skillType); + float num = Mathf.Lerp(0.4f, 1f, skillFactor); + float a = Mathf.Clamp01(num - 0.15f); + float b = Mathf.Clamp01(num + 0.15f); + return Mathf.Lerp(a, b, UnityEngine.Random.value); + } + + public void CheatRaiseSkill(string name, float value) + { + foreach (SkillType value2 in Enum.GetValues(typeof(SkillType))) + { + if (value2.ToString().ToLower() == name) + { + Skill skill = GetSkill(value2); + skill.m_level += value; + skill.m_level = Mathf.Clamp(skill.m_level, 0f, 100f); + if (m_useSkillCap) + { + RebalanceSkills(value2); + } + m_player.Message(MessageHud.MessageType.TopLeft, "Skill incresed " + skill.m_info.m_skill.ToString() + ": " + (int)skill.m_level, 0, skill.m_info.m_icon); + Console.instance.Print("Skill " + value2.ToString() + " = " + skill.m_level); + return; + } + } + Console.instance.Print("Skill not found " + name); + } + + public void CheatResetSkill(string name) + { + foreach (SkillType value in Enum.GetValues(typeof(SkillType))) + { + if (value.ToString().ToLower() == name) + { + ResetSkill(value); + Console.instance.Print("Skill " + value.ToString() + " reset"); + return; + } + } + Console.instance.Print("Skill not found " + name); + } + + public void ResetSkill(SkillType skillType) + { + m_skillData.Remove(skillType); + } + + public void RaiseSkill(SkillType skillType, float factor = 1f) + { + if (skillType == SkillType.None) + { + return; + } + Skill skill = GetSkill(skillType); + float level = skill.m_level; + if (skill.Raise(factor)) + { + if (m_useSkillCap) + { + RebalanceSkills(skillType); + } + m_player.OnSkillLevelup(skillType, skill.m_level); + MessageHud.MessageType type = (((int)level != 0) ? MessageHud.MessageType.TopLeft : MessageHud.MessageType.Center); + m_player.Message(type, "$msg_skillup $skill_" + skill.m_info.m_skill.ToString().ToLower() + ": " + (int)skill.m_level, 0, skill.m_info.m_icon); + GoogleAnalyticsV4.instance.LogEvent("Game", "Levelup", skillType.ToString(), (int)skill.m_level); + } + } + + private void RebalanceSkills(SkillType skillType) + { + if (GetTotalSkill() < m_totalSkillCap) + { + return; + } + float level = GetSkill(skillType).m_level; + float num = m_totalSkillCap - level; + float num2 = 0f; + foreach (KeyValuePair<SkillType, Skill> skillDatum in m_skillData) + { + if (skillDatum.Key != skillType) + { + num2 += skillDatum.Value.m_level; + } + } + foreach (KeyValuePair<SkillType, Skill> skillDatum2 in m_skillData) + { + if (skillDatum2.Key != skillType) + { + skillDatum2.Value.m_level = skillDatum2.Value.m_level / num2 * num; + } + } + } + + public void Clear() + { + m_skillData.Clear(); + } + + public void OnDeath() + { + LowerAllSkills(m_DeathLowerFactor); + } + + public void LowerAllSkills(float factor) + { + foreach (KeyValuePair<SkillType, Skill> skillDatum in m_skillData) + { + float num = skillDatum.Value.m_level * factor; + skillDatum.Value.m_level -= num; + skillDatum.Value.m_accumulator = 0f; + } + m_player.Message(MessageHud.MessageType.TopLeft, "$msg_skills_lowered"); + } + + private Skill GetSkill(SkillType skillType) + { + if (m_skillData.TryGetValue(skillType, out var value)) + { + return value; + } + value = new Skill(GetSkillDef(skillType)); + m_skillData.Add(skillType, value); + return value; + } + + private SkillDef GetSkillDef(SkillType type) + { + foreach (SkillDef skill in m_skills) + { + if (skill.m_skill == type) + { + return skill; + } + } + return null; + } + + public List<Skill> GetSkillList() + { + List<Skill> list = new List<Skill>(); + foreach (KeyValuePair<SkillType, Skill> skillDatum in m_skillData) + { + list.Add(skillDatum.Value); + } + return list; + } + + public float GetTotalSkill() + { + float num = 0f; + foreach (KeyValuePair<SkillType, Skill> skillDatum in m_skillData) + { + num += skillDatum.Value.m_level; + } + return num; + } + + public float GetTotalSkillCap() + { + return m_totalSkillCap; + } +} |