styyx-util 1.0
Utility Header for SKSE Plugin development
Loading...
Searching...
No Matches
st-perks.h
Go to the documentation of this file.
1#pragma once
2#include <unordered_set>
3
4namespace StyyxUtil
5{
6struct PerkUtil
7{
8
13 static constexpr std::array<RE::ActorValue, 18> kPlayableSkills = {
14 RE::ActorValue::kOneHanded, RE::ActorValue::kTwoHanded, RE::ActorValue::kArchery,
15 RE::ActorValue::kBlock, RE::ActorValue::kSmithing, RE::ActorValue::kHeavyArmor,
16 RE::ActorValue::kLightArmor, RE::ActorValue::kPickpocket, RE::ActorValue::kLockpicking,
17 RE::ActorValue::kSneak, RE::ActorValue::kAlchemy, RE::ActorValue::kSpeech,
18 RE::ActorValue::kAlteration, RE::ActorValue::kConjuration, RE::ActorValue::kDestruction,
19 RE::ActorValue::kIllusion, RE::ActorValue::kRestoration, RE::ActorValue::kEnchanting};
20
25 static void TraversePerkNode(RE::BGSSkillPerkTreeNode* node, std::unordered_set<RE::BGSPerk*>& set_out,
26 std::unordered_set<RE::BGSSkillPerkTreeNode*>& visited)
27 {
28 if (!node || !visited.insert(node).second)
29 return;
30
31 if (node->perk)
32 {
33 set_out.insert(node->perk);
34 }
35
36 for (auto* child : node->children)
37 {
38 TraversePerkNode(child, set_out, visited);
39 }
40 };
41
46 static std::unordered_set<RE::BGSPerk*> GetPerksForSkill(RE::ActorValue av)
47 {
48 std::unordered_set<RE::BGSPerk*> out;
49 if (!std::ranges::contains(kPlayableSkills.begin(), kPlayableSkills.end(), av))
50 return out;
51
52 std::unordered_set<RE::BGSSkillPerkTreeNode*> visited;
53 if (const auto avif = RE::ActorValueList::GetActorValueInfo(av); avif && avif->perkTree)
54 TraversePerkNode(avif->perkTree, out, visited);
55 return out;
56 }
57
60 static std::unordered_set<RE::BGSPerk*> GetAllPlayablePerks() { return GetPerksForSkills(kPlayableSkills); }
61
65 static std::unordered_set<RE::BGSPerk*> GetAllMagicPerks() { return GetPerksForSkills(kMageSkills); }
66
70 static std::unordered_set<RE::BGSPerk*> GetAllThiefPerks() { return GetPerksForSkills(kThiefSkills); }
71
75 static std::unordered_set<RE::BGSPerk*> GetAllWarriorPerks() { return GetPerksForSkills(kWarriorSkills); }
76
77 private:
78 static constexpr std::array<RE::ActorValue, 6> kWarriorSkills = {
79 RE::ActorValue::kOneHanded, RE::ActorValue::kTwoHanded, RE::ActorValue::kHeavyArmor,
80 RE::ActorValue::kArchery, RE::ActorValue::kSmithing, RE::ActorValue::kBlock};
81 static constexpr std::array<RE::ActorValue, 6> kThiefSkills = {
82 RE::ActorValue::kSpeech, RE::ActorValue::kAlchemy, RE::ActorValue::kLockpicking,
83 RE::ActorValue::kSneak, RE::ActorValue::kPickpocket, RE::ActorValue::kLightArmor};
84 static constexpr std::array<RE::ActorValue, 6> kMageSkills = {
85 RE::ActorValue::kAlteration, RE::ActorValue::kConjuration, RE::ActorValue::kDestruction,
86 RE::ActorValue::kIllusion, RE::ActorValue::kEnchanting, RE::ActorValue::kRestoration};
87
88 static std::unordered_set<RE::BGSPerk*> GetPerksForSkills(std::span<const RE::ActorValue> skills)
89 {
90 std::unordered_set<RE::BGSPerk*> out;
91 std::unordered_set<RE::BGSSkillPerkTreeNode*> visited;
92
93 for (const auto av : skills)
94 {
95 if (const auto avif = RE::ActorValueList::GetActorValueInfo(av); avif && avif->perkTree)
96 TraversePerkNode(avif->perkTree, out, visited);
97 }
98 return out;
99 }
100};
101} // namespace StyyxUtil
Definition st-actor.h:7
Definition st-perks.h:7
static std::unordered_set< RE::BGSPerk * > GetPerksForSkill(RE::ActorValue av)
Gets an unordered_set of all the perks from a given skill early return if skill is not part of Styy...
Definition st-perks.h:46
static std::unordered_set< RE::BGSPerk * > GetPerksForSkills(std::span< const RE::ActorValue > skills)
Definition st-perks.h:88
static std::unordered_set< RE::BGSPerk * > GetAllWarriorPerks()
Gets all perks belonging to warrior skills (One-Handed, Two-Handed, Archery, Block,...
Definition st-perks.h:75
static constexpr std::array< RE::ActorValue, 6 > kWarriorSkills
Definition st-perks.h:78
static constexpr std::array< RE::ActorValue, 6 > kMageSkills
Definition st-perks.h:84
static std::unordered_set< RE::BGSPerk * > GetAllPlayablePerks()
Definition st-perks.h:60
static void TraversePerkNode(RE::BGSSkillPerkTreeNode *node, std::unordered_set< RE::BGSPerk * > &set_out, std::unordered_set< RE::BGSSkillPerkTreeNode * > &visited)
recursively look through the perk tree nodes in an AVIF
Definition st-perks.h:25
static constexpr std::array< RE::ActorValue, 18 > kPlayableSkills
array of all skill relevant for the stats menu. Does not take any custom skill or the likes into acco...
Definition st-perks.h:13
static constexpr std::array< RE::ActorValue, 6 > kThiefSkills
Definition st-perks.h:81
static std::unordered_set< RE::BGSPerk * > GetAllThiefPerks()
Gets all perks belonging to thief skills (Pickpocket, Lockpicking, Light Armor, Alchemy,...
Definition st-perks.h:70
static std::unordered_set< RE::BGSPerk * > GetAllMagicPerks()
Gets all perks belonging to magic skills (Alteration, Conjuration, Destruction, Illusion,...
Definition st-perks.h:65