void __GlobalsImpl::mergeSettings(System::Settings& dest, System::Settings& source, System::Settings& priority) {
using JsonDom::Node;
owned_ref<Node> sourceGeneral(source.getKey(keyGeneral));
owned_ref<Node> destGeneral(dest.getKey(keyGeneral));
owned_ref<Node> prioGeneral(priority.getKey(keyGeneral));
// Simple properties
destGeneral->put(keyEnableScanlines, prioGeneral->getBool(keyEnableScanlines));
destGeneral->put(keyEnableHudOverlay, prioGeneral->getBool(keyEnableHudOverlay));
destGeneral->put(keyEngineVolume, prioGeneral->getInt(keyEngineVolume));
destGeneral->put(keySfxVolume, prioGeneral->getInt(keySfxVolume));
destGeneral->put(keyControlType, prioGeneral->getInt(keyControlType));
destGeneral->put(keyChosenPendant, prioGeneral->getInt(keyChosenPendant));
destGeneral->put(keyBestScore, sourceGeneral->getInt(keyBestScore));
destGeneral->put(keyBestScoreLevelId, sourceGeneral->getInt(keyBestScoreLevelId));
destGeneral->put(keyBestCash, sourceGeneral->getInt(keyBestCash));
destGeneral->put(keyBestCashLevelId, sourceGeneral->getInt(keyBestCashLevelId));
destGeneral->put(keyDoNotShowTutorial, prioGeneral->getBool(keyDoNotShowTutorial));
destGeneral->put(keyHideSettingsUpdateBubble, prioGeneral->getInt(keyHideSettingsUpdateBubble));
// Take max of money etc.
destGeneral->put(keyTotalMoney,
MAX(destGeneral->getInt(keyTotalMoney), sourceGeneral->getInt(keyTotalMoney)));
destGeneral->put(keyHrCoins,
MAX(destGeneral->getInt(keyHrCoins), sourceGeneral->getInt(keyHrCoins)));
// Now less general -- purchased times, we keep the most of the two
mergeBoolNodes(destGeneral->getOrCreate(keyPurchasedTimes), sourceGeneral->getSafe(keyPurchasedTimes));
mergeBoolNodes(destGeneral->getOrCreate(keyPurchasedPendants), sourceGeneral->getSafe(keyPurchasedPendants));
mergeBoolNodes(destGeneral->getOrCreate(keyPurchasedPasses), sourceGeneral->getSafe(keyPurchasedPasses));
dest.setKey(keyGeneral, destGeneral);
// Visited levels
auto destVisitedLevels = dest.getKey(keyVisitedLevels)->getOrCreate(keyClearedLevels);
auto sourceVisitedLevels = source.getKey(keyVisitedLevels)->getSafe(keyClearedLevels);
for (auto var = sourceVisitedLevels->begin(); var != sourceVisitedLevels->end(); ++var) {
// Keep the max of the two visited status
Node *sourceNode = *var;
Node *destNode = destVisitedLevels->getOrCreate(sourceNode->key);
int bestVisited = MAX(sourceNode->getInt("status"), destNode->getInt("status"));
destNode->put("status", bestVisited);
}
dest.setKey(keyVisitedLevels, destVisitedLevels);
}