Skip to content

Commit fcb195c

Browse files
committed
Fix condition swaps
1 parent a7056f0 commit fcb195c

6 files changed

Lines changed: 38 additions & 39 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.20)
22
set(NAME "po3_BaseObjectSwapper" CACHE STRING "")
3-
set(VERSION 3.1.0 CACHE STRING "")
3+
set(VERSION 3.1.1 CACHE STRING "")
44
set(VR_VERSION 1)
55
set(AE_VERSION 1)
66

src/ConditionalData.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "ConditionalData.h"
22

3-
ConditionFilters::ConditionFilters(std::vector<std::string>& a_conditions)
3+
ConditionFilters::ConditionFilters(std::string a_conditionID, std::vector<std::string>& a_conditions) :
4+
conditionID(std::move(a_conditionID))
45
{
56
NOT.reserve(a_conditions.size());
67
MATCH.reserve(a_conditions.size());

src/ConditionalData.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,35 @@ struct ConditionFilters
44
{
55
public:
66
ConditionFilters() = default;
7-
ConditionFilters(std::vector<std::string>& a_conditions);
7+
ConditionFilters(std::string a_conditionID, std::vector<std::string>& a_conditions);
88

9-
// members
10-
std::vector<FormIDStr> NOT{};
11-
std::vector<FormIDStr> MATCH{};
12-
};
9+
bool operator==(const ConditionFilters& a_rhs) const
10+
{
11+
return conditionID == a_rhs.conditionID;
12+
}
1313

14-
template <class T>
15-
struct ConditionalData
16-
{
17-
public:
18-
ConditionalData() = default;
19-
ConditionalData(const ConditionFilters& a_filters, const T& a_data) :
20-
filters(a_filters)
14+
bool operator<(const ConditionFilters& a_rhs) const
2115
{
22-
data.push_back(a_data);
16+
return conditionID < a_rhs.conditionID;
2317
}
2418

2519
// members
26-
ConditionFilters filters;
27-
std::vector<T> data;
20+
std::string conditionID{}; // path|condition1,condition2
21+
std::vector<FormIDStr> NOT{};
22+
std::vector<FormIDStr> MATCH{};
2823
};
2924

25+
template <class T>
26+
using ConditionalData = std::map<ConditionFilters, std::vector<T>>;
27+
3028
struct ConditionalInput
3129
{
3230
ConditionalInput(const RE::TESObjectREFR* a_ref, const RE::TESForm* a_form) :
3331
ref(a_ref),
3432
base(a_form),
3533
currentCell(a_ref->GetSaveParentCell()),
3634
currentLocation(a_ref->GetCurrentLocation()),
37-
currentRegionList(currentCell ? currentCell->GetRegionList(false): nullptr)
35+
currentRegionList(currentCell ? currentCell->GetRegionList(false) : nullptr)
3836
{}
3937

4038
[[nodiscard]] bool IsValid(RE::FormID a_formID) const;

src/Manager.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace FormSwap
4747

4848
logger::info("\treading [{}] : {} conditions", splitSection[0], conditions.size());
4949

50-
ConditionFilters processedConditions(conditions);
50+
ConditionFilters processedConditions(path.substr(5) + "|" + splitSection[1], conditions);
5151

5252
CSimpleIniA::TNamesDepend values;
5353
ini.GetAllKeys(section.c_str(), values);
@@ -58,14 +58,14 @@ namespace FormSwap
5858
logger::info("\t\t\t{} form swaps found", values.size());
5959
for (const auto& key : values) {
6060
SwapFormData::GetForms(path, key.pItem, [&](const RE::FormID a_baseID, const SwapFormData& a_swapData) {
61-
swapFormsConditional[a_baseID].emplace_back(processedConditions, a_swapData);
61+
swapFormsConditional[a_baseID][processedConditions].emplace_back(a_swapData);
6262
});
6363
}
6464
} else {
6565
logger::info("\t\t\t{} ref property overrides found", values.size());
6666
for (const auto& key : values) {
6767
ObjectData::GetProperties(path, key.pItem, [&](const RE::FormID a_baseID, const ObjectData& a_objectData) {
68-
refPropertiesConditional[a_baseID].emplace_back(processedConditions, a_objectData);
68+
refPropertiesConditional[a_baseID][processedConditions].emplace_back(a_objectData);
6969
});
7070
}
7171
}
@@ -158,12 +158,12 @@ namespace FormSwap
158158
if (const auto it = swapFormsConditional.find(a_base->GetFormID()); it != swapFormsConditional.end()) {
159159
const ConditionalInput input(a_ref, a_base);
160160

161-
auto result = std::ranges::find_if(it->second | std::views::reverse, [&](auto& conditionalData) { return input.IsValid(conditionalData.filters); });
162-
163-
if (result != it->second.rend()) {
164-
for (auto& swapData : result->data | std::ranges::views::reverse) {
165-
if (auto swapObject = swapData.GetSwapBase(a_ref)) {
166-
return { swapObject, swapData.properties };
161+
for (auto& [filters, swapDataVec] : it->second | std::ranges::views::reverse) {
162+
if (input.IsValid(filters)) {
163+
for (auto& swapData : swapDataVec | std::ranges::views::reverse) {
164+
if (auto swapObject = swapData.GetSwapBase(a_ref)) {
165+
return { swapObject, swapData.properties };
166+
}
167167
}
168168
}
169169
}
@@ -177,12 +177,12 @@ namespace FormSwap
177177
if (const auto it = refPropertiesConditional.find(a_base->GetFormID()); it != refPropertiesConditional.end()) {
178178
const ConditionalInput input(a_ref, a_base);
179179

180-
auto result = std::ranges::find_if(it->second | std::views::reverse, [&](auto& conditionalData) { return input.IsValid(conditionalData.filters); });
181-
182-
if (result != it->second.rend()) {
183-
for (auto& objectData : result->data | std::ranges::views::reverse) {
184-
if (objectData.HasValidProperties(a_ref)) {
185-
return objectData.properties;
180+
for (auto& [filters, objectDataVec] : it->second | std::ranges::views::reverse) {
181+
if (input.IsValid(filters)) {
182+
for (auto& objectData : objectDataVec | std::ranges::views::reverse) {
183+
if (objectData.HasValidProperties(a_ref)) {
184+
return objectData.properties;
185+
}
186186
}
187187
}
188188
}

src/Manager.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ namespace FormSwap
2222
void LoadForms();
2323

2424
// members
25-
FormIDMap<SwapFormDataVec> swapRefs{};
26-
FormIDMap<std::vector<SwapFormDataConditional>> swapFormsConditional{};
27-
FormIDMap<SwapFormDataVec> swapForms{};
25+
FormIDMap<SwapFormDataVec> swapRefs{};
26+
FormIDMap<SwapFormDataConditional> swapFormsConditional{};
27+
FormIDMap<SwapFormDataVec> swapForms{};
2828

29-
FormIDMap<ObjectDataVec> refProperties{};
30-
FormIDMap<std::vector<ObjectDataConditional>> refPropertiesConditional{};
29+
FormIDMap<ObjectDataVec> refProperties{};
30+
FormIDMap<ObjectDataConditional> refPropertiesConditional{};
3131

3232
Set<RE::FormID> swappedLeveledItemRefs{};
3333

vcpkg.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "base-object-swapper",
3-
"version-string": "3.1.0",
3+
"version-string": "3.1.1",
44
"description": "Base Object Swapper",
55
"homepage": "",
66
"license": "MIT",

0 commit comments

Comments
 (0)