From 83295b4117b5acb067e238336d36d899b3e1926c Mon Sep 17 00:00:00 2001 From: Sour Date: Sun, 25 Feb 2018 17:03:06 -0500 Subject: [PATCH] HD Packs: Allow all conditions to be inverted by using the ! operator --- Core/HdData.h | 4 ++++ Core/HdPackLoader.cpp | 25 ++++++++++++++++++++++--- Core/HdPackLoader.h | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Core/HdData.h b/Core/HdData.h index 0276c75d..8d5d67d4 100644 --- a/Core/HdData.h +++ b/Core/HdData.h @@ -152,6 +152,10 @@ struct HdPackCondition { if(_resultCache == -1) { bool result = InternalCheckCondition(screenInfo, x, y, tile); + if(Name[0] == '!') { + result = !result; + } + if(_useCache) { _resultCache = result ? 1 : 0; } diff --git a/Core/HdPackLoader.cpp b/Core/HdPackLoader.cpp index e38fa31c..188d6005 100644 --- a/Core/HdPackLoader.cpp +++ b/Core/HdPackLoader.cpp @@ -176,7 +176,8 @@ bool HdPackLoader::LoadPack() ProcessBackgroundTag(tokens, conditions); } else if(lineContent.substr(0, 11) == "") { tokens = StringUtilities::Split(lineContent.substr(11), ','); - ProcessConditionTag(tokens); + ProcessConditionTag(tokens, false); + ProcessConditionTag(tokens, true); } else if(lineContent.substr(0, 6) == "") { tokens = StringUtilities::Split(lineContent.substr(6), ','); ProcessTileTag(tokens, conditions); @@ -222,13 +223,25 @@ void HdPackLoader::InitializeGlobalConditions() hmirror->Name = "hmirror"; _data->Conditions.push_back(unique_ptr(hmirror)); + HdPackCondition* invHmirror = new HdPackHorizontalMirroringCondition(); + invHmirror->Name = "!hmirror"; + _data->Conditions.push_back(unique_ptr(invHmirror)); + HdPackCondition* vmirror = new HdPackVerticalMirroringCondition(); vmirror->Name = "vmirror"; _data->Conditions.push_back(unique_ptr(vmirror)); + HdPackCondition* invVmirror = new HdPackVerticalMirroringCondition(); + invVmirror->Name = "!vmirror"; + _data->Conditions.push_back(unique_ptr(invVmirror)); + HdPackCondition* bgpriority = new HdPackBgPriorityCondition(); bgpriority->Name = "bgpriority"; _data->Conditions.push_back(unique_ptr(bgpriority)); + + HdPackCondition* invBgpriority = new HdPackBgPriorityCondition(); + invBgpriority->Name = "!bgpriority"; + _data->Conditions.push_back(unique_ptr(invBgpriority)); } void HdPackLoader::ProcessOverscanTag(vector &tokens) @@ -366,12 +379,14 @@ void HdPackLoader::ProcessOptionTag(vector &tokens) } } -void HdPackLoader::ProcessConditionTag(vector &tokens) +void HdPackLoader::ProcessConditionTag(vector &tokens, bool createInvertedCondition) { checkConstraint(tokens.size() >= 4, "[HDPack] Condition tag should contain at least 4 parameters"); + checkConstraint(tokens[0].size() > 0, "[HDPack] Condition name may not be empty"); + checkConstraint(tokens[0].find_last_of('!') == string::npos, "[HDPack] Condition name may not contain '!' characters"); unique_ptr condition; - + if(tokens[1] == "tileAtPosition") { condition.reset(new HdPackTileAtPositionCondition()); } else if(tokens[1] == "tileNearby") { @@ -394,6 +409,10 @@ void HdPackLoader::ProcessConditionTag(vector &tokens) tokens[0].erase(tokens[0].find_last_not_of(" \n\r\t") + 1); condition->Name = tokens[0]; + if(createInvertedCondition) { + condition->Name = "!" + condition->Name; + } + int index = 2; if(dynamic_cast(condition.get())) { checkConstraint(tokens.size() >= 6, "[HDPack] Condition tag should contain at least 6 parameters"); diff --git a/Core/HdPackLoader.h b/Core/HdPackLoader.h index d4087afb..c876f824 100644 --- a/Core/HdPackLoader.h +++ b/Core/HdPackLoader.h @@ -34,7 +34,7 @@ private: bool ProcessImgTag(string src); void ProcessPatchTag(vector &tokens); void ProcessOverscanTag(vector &tokens); - void ProcessConditionTag(vector &tokens); + void ProcessConditionTag(vector &tokens, bool createInvertedCondition); void ProcessTileTag(vector &tokens, vector conditions); void ProcessBackgroundTag(vector &tokens, vector conditions); void ProcessOptionTag(vector& tokens);