Switch to unscope enumeration
This commit is contained in:
parent
cba8300b55
commit
240fcbaa4a
3 changed files with 34 additions and 34 deletions
|
|
@ -34,7 +34,7 @@ struct WeatherFlags {
|
|||
};
|
||||
|
||||
namespace SlotPolicy {
|
||||
enum class Preference: std::uint8_t {
|
||||
enum Mode: std::uint8_t {
|
||||
XXXX, XXXE, XXXO, XXOX, XXOE, XXOO, XEXX, XEXE, XEXO, XEOX, XEOE, XEOO, MAX
|
||||
};
|
||||
|
||||
|
|
@ -51,17 +51,17 @@ namespace SlotPolicy {
|
|||
}
|
||||
};
|
||||
|
||||
extern std::array<Metadata, static_cast<std::uint8_t>(Preference::MAX)> g_policiesMetadata;
|
||||
extern std::array<Metadata, MAX> g_policiesMetadata;
|
||||
|
||||
inline constexpr std::uint32_t firstSlot = RE::BIPED_OBJECTS::kHead;
|
||||
inline constexpr std::uint32_t numSlots = RE::BIPED_OBJECTS::kEditorTotal;
|
||||
|
||||
Selection select(Preference policy, bool hasEquipped, bool hasOutfit);
|
||||
Selection select(Mode policy, bool hasEquipped, bool hasOutfit);
|
||||
}
|
||||
|
||||
struct Outfit {
|
||||
Outfit() {};// we shouldn't need this, really, but std::unordered_map is a brat
|
||||
Outfit(const char* n) : name(n), isFavorite(false), slotPolicy(SlotPolicy::Preference::XXOO) {};
|
||||
Outfit(const char* n) : name(n), isFavorite(false), slotPolicy(SlotPolicy::Mode::XXOO) {};
|
||||
Outfit(const Outfit& other) = default;
|
||||
Outfit(const char* n, const Outfit& other) : name(n), isFavorite(false) {
|
||||
this->armors = other.armors;
|
||||
|
|
@ -71,17 +71,17 @@ struct Outfit {
|
|||
std::string name;// can't be const; prevents assigning to Outfit vars
|
||||
std::unordered_set<RE::TESObjectARMO*> armors;
|
||||
bool isFavorite;
|
||||
std::map<RE::BIPED_OBJECT, SlotPolicy::Preference> slotPolicies;
|
||||
SlotPolicy::Preference slotPolicy;
|
||||
std::map<RE::BIPED_OBJECT, SlotPolicy::Mode> slotPolicies;
|
||||
SlotPolicy::Mode slotPolicy;
|
||||
|
||||
bool conflictsWith(RE::TESObjectARMO*) const;
|
||||
bool hasShield() const;
|
||||
std::unordered_set<RE::TESObjectARMO*> computeDisplaySet(const std::unordered_set<RE::TESObjectARMO*>& equippedSet);
|
||||
|
||||
SlotPolicy::Preference effectivePolicyForSlot(RE::BIPED_OBJECT slot);
|
||||
void setSlotPolicy(RE::BIPED_OBJECT slot, std::optional<SlotPolicy::Preference> policy);
|
||||
SlotPolicy::Mode effectivePolicyForSlot(RE::BIPED_OBJECT slot);
|
||||
void setSlotPolicy(RE::BIPED_OBJECT slot, std::optional<SlotPolicy::Mode> policy);
|
||||
void setDefaultSlotPolicy();
|
||||
void setAllSlotPolicy(SlotPolicy::Preference policy);
|
||||
void setAllSlotPolicy(SlotPolicy::Mode policy);
|
||||
|
||||
void load(const proto::Outfit& proto, const SKSE::SerializationInterface*);
|
||||
void load_legacy(const SKSE::SerializationInterface* intfc, std::uint32_t version);// can throw ArmorAddonOverrideService::load_error
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ bool Outfit::hasShield() const {
|
|||
return false;
|
||||
};
|
||||
|
||||
SlotPolicy::Preference Outfit::effectivePolicyForSlot(RE::BIPED_OBJECT slot) {
|
||||
SlotPolicy::Mode Outfit::effectivePolicyForSlot(RE::BIPED_OBJECT slot) {
|
||||
auto policy = slotPolicies.find(slot);
|
||||
if (policy != slotPolicies.end()) return policy->second;
|
||||
return slotPolicy;
|
||||
|
|
@ -42,26 +42,26 @@ SlotPolicy::Preference Outfit::effectivePolicyForSlot(RE::BIPED_OBJECT slot) {
|
|||
|
||||
void Outfit::setDefaultSlotPolicy() {
|
||||
slotPolicies.clear();
|
||||
slotPolicies[RE::BIPED_OBJECTS::kShield] = SlotPolicy::Preference::XEXO;
|
||||
slotPolicy = SlotPolicy::Preference::XXOO;
|
||||
slotPolicies[RE::BIPED_OBJECTS::kShield] = SlotPolicy::Mode::XEXO;
|
||||
slotPolicy = SlotPolicy::Mode::XXOO;
|
||||
}
|
||||
|
||||
void Outfit::setAllSlotPolicy(SlotPolicy::Preference preference) {
|
||||
if (preference >= SlotPolicy::Preference::MAX) {
|
||||
LOG(err, "Invalid slot preference {}.", static_cast<std::uint8_t>(preference));
|
||||
void Outfit::setAllSlotPolicy(SlotPolicy::Mode preference) {
|
||||
if (preference >= SlotPolicy::Mode::MAX) {
|
||||
LOG(err, "Invalid slot preference {}.", preference);
|
||||
return;
|
||||
}
|
||||
slotPolicy = preference;
|
||||
}
|
||||
|
||||
void Outfit::setSlotPolicy(RE::BIPED_OBJECT slot, std::optional<SlotPolicy::Preference> policy) {
|
||||
void Outfit::setSlotPolicy(RE::BIPED_OBJECT slot, std::optional<SlotPolicy::Mode> policy) {
|
||||
if (slot >= SlotPolicy::numSlots) {
|
||||
LOG(err, "Invalid slot {}.", static_cast<std::uint32_t>(slot));
|
||||
return;
|
||||
}
|
||||
if (policy.has_value()) {
|
||||
if (policy.value() >= SlotPolicy::Preference::MAX) {
|
||||
LOG(err, "Invalid slot preference {}.", static_cast<std::uint8_t>(policy.value()));
|
||||
if (policy.value() >= SlotPolicy::Mode::MAX) {
|
||||
LOG(err, "Invalid slot preference {}.", policy.value());
|
||||
return;
|
||||
}
|
||||
slotPolicies[slot] = policy.value();
|
||||
|
|
@ -97,7 +97,7 @@ std::unordered_set<RE::TESObjectARMO*> Outfit::computeDisplaySet(const std::unor
|
|||
// Someone before us already got this slot.
|
||||
if (occupiedMask & (1 << slot)) continue;
|
||||
// Select the slot's policy, falling back to the outfit's policy if none.
|
||||
SlotPolicy::Preference preference = slotPolicy;
|
||||
SlotPolicy::Mode preference = slotPolicy;
|
||||
auto slotSpecificPolicy = slotPolicies.find(static_cast<RE::BIPED_OBJECT>(slot));
|
||||
if (slotSpecificPolicy != slotPolicies.end()) preference = slotSpecificPolicy->second;
|
||||
auto selection = SlotPolicy::select(preference, equipped[slot], outfit[slot]);
|
||||
|
|
@ -154,18 +154,18 @@ void Outfit::load(const proto::Outfit& proto, const SKSE::SerializationInterface
|
|||
this->isFavorite = proto.is_favorite();
|
||||
for (const auto& pair : proto.slot_policies()) {
|
||||
auto slot = static_cast<RE::BIPED_OBJECT>(pair.first);
|
||||
auto policy = static_cast<SlotPolicy::Preference>(pair.second);
|
||||
auto policy = static_cast<SlotPolicy::Mode>(pair.second);
|
||||
if (slot >= SlotPolicy::numSlots) {
|
||||
LOG(err, "Invalid slot {}.", static_cast<std::uint32_t>(slot));
|
||||
continue;
|
||||
}
|
||||
if (policy >= SlotPolicy::Preference::MAX) {
|
||||
LOG(err, "Invalid slot preference {}", static_cast<std::uint8_t>(policy));
|
||||
if (policy >= SlotPolicy::Mode::MAX) {
|
||||
LOG(err, "Invalid slot preference {}", policy);
|
||||
continue;
|
||||
}
|
||||
slotPolicies[slot] = policy;
|
||||
}
|
||||
slotPolicy = static_cast<SlotPolicy::Preference>(proto.slot_policy());
|
||||
slotPolicy = static_cast<SlotPolicy::Mode>(proto.slot_policy());
|
||||
}
|
||||
|
||||
proto::Outfit Outfit::save() const {
|
||||
|
|
@ -587,7 +587,7 @@ void ArmorAddonOverrideService::dump() const {
|
|||
}
|
||||
|
||||
// Negative values mean "advanced option"
|
||||
std::array<SlotPolicy::Metadata, static_cast<std::uint8_t>(SlotPolicy::Preference::MAX)> SlotPolicy::g_policiesMetadata = {
|
||||
std::array<SlotPolicy::Metadata, SlotPolicy::MAX> SlotPolicy::g_policiesMetadata = {
|
||||
SlotPolicy::Metadata{"XXXX", 100, true}, // Never show anything
|
||||
SlotPolicy::Metadata{"XXXE", 101, true}, // If outfit and equipped, show equipped
|
||||
SlotPolicy::Metadata{"XXXO", 2, false}, // If outfit and equipped, show outfit (require equipped, no passthrough)
|
||||
|
|
@ -602,20 +602,20 @@ std::array<SlotPolicy::Metadata, static_cast<std::uint8_t>(SlotPolicy::Preferenc
|
|||
SlotPolicy::Metadata{"XEOO", 108, true} // If only equipped, show equipped. If only outfit, show outfit. If both, show outfit
|
||||
};
|
||||
|
||||
SlotPolicy::Selection SlotPolicy::select(SlotPolicy::Preference policy, bool hasEquipped, bool hasOutfit) {
|
||||
if (policy < Preference::XXXX || policy >= Preference::MAX) {
|
||||
LOG(err, "Invalid slot preference {}", static_cast<std::uint8_t>(policy));
|
||||
policy = Preference::XXXX;
|
||||
SlotPolicy::Selection SlotPolicy::select(SlotPolicy::Mode policy, bool hasEquipped, bool hasOutfit) {
|
||||
if (policy >= Mode::MAX) {
|
||||
LOG(err, "Invalid slot preference {}", policy);
|
||||
policy = Mode::XXXX;
|
||||
}
|
||||
char out = 'X';
|
||||
if (!hasEquipped && !hasOutfit) {
|
||||
out = g_policiesMetadata[static_cast<std::uint8_t>(policy)].code[0];
|
||||
out = g_policiesMetadata[policy].code[0];
|
||||
} else if (hasEquipped && !hasOutfit) {
|
||||
out = g_policiesMetadata[static_cast<std::uint8_t>(policy)].code[1];
|
||||
out = g_policiesMetadata[policy].code[1];
|
||||
} else if (!hasEquipped && hasOutfit) {
|
||||
out = g_policiesMetadata[static_cast<std::uint8_t>(policy)].code[2];
|
||||
out = g_policiesMetadata[policy].code[2];
|
||||
} else if (hasEquipped && hasOutfit) {
|
||||
out = g_policiesMetadata[static_cast<std::uint8_t>(policy)].code[3];
|
||||
out = g_policiesMetadata[policy].code[3];
|
||||
}
|
||||
if (out == 'X') {
|
||||
return SlotPolicy::Selection::EMPTY;
|
||||
|
|
|
|||
|
|
@ -405,7 +405,7 @@ namespace OutfitSystem {
|
|||
return first.code == codeString;
|
||||
});
|
||||
if (found == SlotPolicy::g_policiesMetadata.end()) return;
|
||||
outfit.setSlotPolicy(static_cast<RE::BIPED_OBJECT>(slot), static_cast<SlotPolicy::Preference>(found - SlotPolicy::g_policiesMetadata.begin()));
|
||||
outfit.setSlotPolicy(static_cast<RE::BIPED_OBJECT>(slot), static_cast<SlotPolicy::Mode>(found - SlotPolicy::g_policiesMetadata.begin()));
|
||||
}
|
||||
}
|
||||
void SetAllBodySlotPoliciesForOutfit(RE::BSScript::IVirtualMachine* registry,
|
||||
|
|
@ -421,7 +421,7 @@ namespace OutfitSystem {
|
|||
return first.code == codeString;
|
||||
});
|
||||
if (found == SlotPolicy::g_policiesMetadata.end()) return;
|
||||
outfit.setAllSlotPolicy(static_cast<SlotPolicy::Preference>(found - SlotPolicy::g_policiesMetadata.begin()));
|
||||
outfit.setAllSlotPolicy(static_cast<SlotPolicy::Mode>(found - SlotPolicy::g_policiesMetadata.begin()));
|
||||
}
|
||||
void SetBodySlotPolicyToDefaultForOutfit(RE::BSScript::IVirtualMachine* registry,
|
||||
std::uint32_t stackId,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue