mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-28 20:32:18 -05:00
Audio Editor Lock Button and Cleanup (#3140)
* Changed Audio Editor buttons to use FontAwesome icons instead of words. Added the locked/unlocked button. * Added functionality to lock button. "Randomize All" respects the lock, individual shuffle buttons bypass and the lock and unlock the sound. Added tooltips to all the FA buttons. Shrunk right side of Audio Editor window to match width of new buttons. Unified all references to the randomized value and lock to two functions that automatically applied prefix and suffix. Changed "Reset All" to clear the cvars instead of changing them to default. * Fixed bug where individual randomize button didn't change the BGM if randomizing current sequence. * Added check for unchanged BGM in Reset All and Randomize All to account for lock button blocking changes.
This commit is contained in:
parent
0f41b25918
commit
3d0075e6ef
@ -307,6 +307,14 @@ AudioCollection::AudioCollection() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string AudioCollection::GetCvarKey(std::string sfxKey) {
|
||||||
|
return "gAudioEditor.ReplacedSequences." + sfxKey + ".value";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string AudioCollection::GetCvarLockKey(std::string sfxKey) {
|
||||||
|
return "gAudioEditor.ReplacedSequences." + sfxKey + ".locked";
|
||||||
|
}
|
||||||
|
|
||||||
void AudioCollection::AddToCollection(char* otrPath, uint16_t seqNum) {
|
void AudioCollection::AddToCollection(char* otrPath, uint16_t seqNum) {
|
||||||
std::string fileName = std::filesystem::path(otrPath).filename().string();
|
std::string fileName = std::filesystem::path(otrPath).filename().string();
|
||||||
std::vector<std::string> splitFileName = StringHelper::Split(fileName, "_");
|
std::vector<std::string> splitFileName = StringHelper::Split(fileName, "_");
|
||||||
@ -332,7 +340,7 @@ uint16_t AudioCollection::GetReplacementSequence(uint16_t seqId) {
|
|||||||
// for Hyrule Field instead. Otherwise, leave it alone, so that without any sfx editor modifications we will
|
// for Hyrule Field instead. Otherwise, leave it alone, so that without any sfx editor modifications we will
|
||||||
// play the normal track as usual.
|
// play the normal track as usual.
|
||||||
if (seqId == NA_BGM_FIELD_MORNING) {
|
if (seqId == NA_BGM_FIELD_MORNING) {
|
||||||
if (CVarGetInteger("gAudioEditor.ReplacedSequences.NA_BGM_FIELD_LOGIC", NA_BGM_FIELD_LOGIC) != NA_BGM_FIELD_LOGIC) {
|
if (CVarGetInteger("gAudioEditor.ReplacedSequences.NA_BGM_FIELD_LOGIC.value", NA_BGM_FIELD_LOGIC) != NA_BGM_FIELD_LOGIC) {
|
||||||
seqId = NA_BGM_FIELD_LOGIC;
|
seqId = NA_BGM_FIELD_LOGIC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -342,7 +350,7 @@ uint16_t AudioCollection::GetReplacementSequence(uint16_t seqId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto& sequenceInfo = sequenceMap.at(seqId);
|
const auto& sequenceInfo = sequenceMap.at(seqId);
|
||||||
const std::string cvarKey = "gAudioEditor.ReplacedSequences." + sequenceInfo.sfxKey;
|
const std::string cvarKey = GetCvarKey(sequenceInfo.sfxKey);
|
||||||
int replacementSeq = CVarGetInteger(cvarKey.c_str(), seqId);
|
int replacementSeq = CVarGetInteger(cvarKey.c_str(), seqId);
|
||||||
if (!sequenceMap.contains(replacementSeq)) {
|
if (!sequenceMap.contains(replacementSeq)) {
|
||||||
replacementSeq = seqId;
|
replacementSeq = seqId;
|
||||||
|
@ -62,6 +62,8 @@ class AudioCollection {
|
|||||||
const char* GetSequenceName(uint16_t seqId);
|
const char* GetSequenceName(uint16_t seqId);
|
||||||
bool HasSequenceNum(uint16_t seqId);
|
bool HasSequenceNum(uint16_t seqId);
|
||||||
size_t SequenceMapSize();
|
size_t SequenceMapSize();
|
||||||
|
std::string GetCvarKey(std::string sfxKey);
|
||||||
|
std::string GetCvarLockKey(std::string sfxKey);
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum);
|
void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum);
|
||||||
|
@ -54,8 +54,6 @@ size_t AuthenticCountBySequenceType(SeqType type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Grabs the current BGM sequence ID and replays it
|
// Grabs the current BGM sequence ID and replays it
|
||||||
// which will lookup the proper override, or reset back to vanilla
|
// which will lookup the proper override, or reset back to vanilla
|
||||||
void ReplayCurrentBGM() {
|
void ReplayCurrentBGM() {
|
||||||
@ -94,8 +92,10 @@ void RandomizeGroup(SeqType type) {
|
|||||||
}
|
}
|
||||||
Shuffle(values);
|
Shuffle(values);
|
||||||
for (const auto& [seqId, seqData] : AudioCollection::Instance->GetAllSequences()) {
|
for (const auto& [seqId, seqData] : AudioCollection::Instance->GetAllSequences()) {
|
||||||
const std::string cvarKey = "gAudioEditor.ReplacedSequences." + seqData.sfxKey;
|
const std::string cvarKey = AudioCollection::Instance->GetCvarKey(seqData.sfxKey);
|
||||||
if (seqData.category & type) {
|
const std::string cvarLockKey = AudioCollection::Instance->GetCvarLockKey(seqData.sfxKey);
|
||||||
|
// don't randomize locked entries
|
||||||
|
if ((seqData.category & type) && CVarGetInteger(cvarLockKey.c_str(), 0) == 0) {
|
||||||
// Only save authentic sequence CVars
|
// Only save authentic sequence CVars
|
||||||
if (((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && seqData.sequenceId >= MAX_AUTHENTIC_SEQID) {
|
if (((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && seqData.sequenceId >= MAX_AUTHENTIC_SEQID) {
|
||||||
continue;
|
continue;
|
||||||
@ -114,23 +114,27 @@ void ResetGroup(const std::map<u16, SequenceInfo>& map, SeqType type) {
|
|||||||
if (seqData.category == SEQ_FANFARE && defaultValue >= MAX_AUTHENTIC_SEQID) {
|
if (seqData.category == SEQ_FANFARE && defaultValue >= MAX_AUTHENTIC_SEQID) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const std::string cvarKey = "gAudioEditor.ReplacedSequences." + seqData.sfxKey;
|
const std::string cvarKey = AudioCollection::Instance->GetCvarKey(seqData.sfxKey);
|
||||||
CVarSetInteger(cvarKey.c_str(), defaultValue);
|
const std::string cvarLockKey = AudioCollection::Instance->GetCvarLockKey(seqData.sfxKey);
|
||||||
|
if (CVarGetInteger(cvarLockKey.c_str(), 0) == 0) {
|
||||||
|
CVarClear(cvarKey.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequenceType) {
|
void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequenceType) {
|
||||||
const std::string cvarKey = "gAudioEditor.ReplacedSequences." + sfxKey;
|
const std::string cvarKey = AudioCollection::Instance->GetCvarKey(sfxKey);
|
||||||
const std::string hiddenKey = "##" + cvarKey;
|
const std::string hiddenKey = "##" + cvarKey;
|
||||||
const std::string stopButton = " Stop " + hiddenKey;
|
const std::string stopButton = ICON_FA_STOP + hiddenKey;
|
||||||
const std::string previewButton = "Preview" + hiddenKey;
|
const std::string previewButton = ICON_FA_PLAY + hiddenKey;
|
||||||
|
|
||||||
if (CVarGetInteger("gAudioEditor.Playing", 0) == sequenceId) {
|
if (CVarGetInteger("gAudioEditor.Playing", 0) == sequenceId) {
|
||||||
if (ImGui::Button(stopButton.c_str())) {
|
if (ImGui::Button(stopButton.c_str())) {
|
||||||
func_800F5C2C();
|
func_800F5C2C();
|
||||||
CVarSetInteger("gAudioEditor.Playing", 0);
|
CVarSetInteger("gAudioEditor.Playing", 0);
|
||||||
}
|
}
|
||||||
|
UIWidgets::Tooltip("Stop Preview");
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::Button(previewButton.c_str())) {
|
if (ImGui::Button(previewButton.c_str())) {
|
||||||
if (CVarGetInteger("gAudioEditor.Playing", 0) != 0) {
|
if (CVarGetInteger("gAudioEditor.Playing", 0) != 0) {
|
||||||
@ -149,6 +153,7 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
UIWidgets::Tooltip("Play Preview");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,17 +164,23 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) {
|
|||||||
const std::string resetAllButton = "Reset All" + hiddenTabId;
|
const std::string resetAllButton = "Reset All" + hiddenTabId;
|
||||||
const std::string randomizeAllButton = "Randomize All" + hiddenTabId;
|
const std::string randomizeAllButton = "Randomize All" + hiddenTabId;
|
||||||
if (ImGui::Button(resetAllButton.c_str())) {
|
if (ImGui::Button(resetAllButton.c_str())) {
|
||||||
|
auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
|
||||||
|
auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM);
|
||||||
ResetGroup(map, type);
|
ResetGroup(map, type);
|
||||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
||||||
if (type == SEQ_BGM_WORLD) {
|
auto curReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM);
|
||||||
|
if (type == SEQ_BGM_WORLD && prevReplacement != curReplacement) {
|
||||||
ReplayCurrentBGM();
|
ReplayCurrentBGM();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(randomizeAllButton.c_str())) {
|
if (ImGui::Button(randomizeAllButton.c_str())) {
|
||||||
|
auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
|
||||||
|
auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM);
|
||||||
RandomizeGroup(type);
|
RandomizeGroup(type);
|
||||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
||||||
if (type == SEQ_BGM_WORLD) {
|
auto curReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM);
|
||||||
|
if (type == SEQ_BGM_WORLD && prevReplacement != curReplacement) {
|
||||||
ReplayCurrentBGM();
|
ReplayCurrentBGM();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,7 +188,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) {
|
|||||||
ImGui::BeginTable(tabId.c_str(), 3, ImGuiTableFlags_SizingFixedFit);
|
ImGui::BeginTable(tabId.c_str(), 3, ImGuiTableFlags_SizingFixedFit);
|
||||||
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch);
|
||||||
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch);
|
||||||
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 190.0f);
|
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f);
|
||||||
for (const auto& [defaultValue, seqData] : map) {
|
for (const auto& [defaultValue, seqData] : map) {
|
||||||
if (~(seqData.category) & type) {
|
if (~(seqData.category) & type) {
|
||||||
continue;
|
continue;
|
||||||
@ -187,10 +198,13 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string cvarKey = "gAudioEditor.ReplacedSequences." + seqData.sfxKey;
|
const std::string cvarKey = AudioCollection::Instance->GetCvarKey(seqData.sfxKey);
|
||||||
|
const std::string cvarLockKey = AudioCollection::Instance->GetCvarLockKey(seqData.sfxKey);
|
||||||
const std::string hiddenKey = "##" + cvarKey;
|
const std::string hiddenKey = "##" + cvarKey;
|
||||||
const std::string resetButton = "Reset" + hiddenKey;
|
const std::string resetButton = ICON_FA_UNDO + hiddenKey;
|
||||||
const std::string randomizeButton = "Randomize" + hiddenKey;
|
const std::string randomizeButton = ICON_FA_RANDOM + hiddenKey;
|
||||||
|
const std::string lockedButton = ICON_FA_LOCK + hiddenKey;
|
||||||
|
const std::string unlockedButton = ICON_FA_UNLOCK + hiddenKey;
|
||||||
const int currentValue = CVarGetInteger(cvarKey.c_str(), defaultValue);
|
const int currentValue = CVarGetInteger(cvarKey.c_str(), defaultValue);
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
@ -221,13 +235,16 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) {
|
|||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::PushItemWidth(-FLT_MIN);
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue : currentValue, seqData.sfxKey, type);
|
DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue : currentValue, seqData.sfxKey, type);
|
||||||
|
auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1;
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::PushItemWidth(-FLT_MIN);
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
if (ImGui::Button(resetButton.c_str())) {
|
if (ImGui::Button(resetButton.c_str())) {
|
||||||
CVarSetInteger(cvarKey.c_str(), defaultValue);
|
CVarClear(cvarKey.c_str());
|
||||||
|
CVarClear(cvarLockKey.c_str());
|
||||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
||||||
UpdateCurrentBGM(defaultValue, seqData.category);
|
UpdateCurrentBGM(defaultValue, seqData.category);
|
||||||
}
|
}
|
||||||
|
UIWidgets::Tooltip("Reset to default");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::PushItemWidth(-FLT_MIN);
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
if (ImGui::Button(randomizeButton.c_str())) {
|
if (ImGui::Button(randomizeButton.c_str())) {
|
||||||
@ -242,10 +259,25 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) {
|
|||||||
auto it = validSequences.begin();
|
auto it = validSequences.begin();
|
||||||
const auto& seqData = *std::next(it, rand() % validSequences.size());
|
const auto& seqData = *std::next(it, rand() % validSequences.size());
|
||||||
CVarSetInteger(cvarKey.c_str(), seqData->sequenceId);
|
CVarSetInteger(cvarKey.c_str(), seqData->sequenceId);
|
||||||
|
if (locked) {
|
||||||
|
CVarClear(cvarLockKey.c_str());
|
||||||
|
}
|
||||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
||||||
UpdateCurrentBGM(seqData->sequenceId, type);
|
UpdateCurrentBGM(defaultValue, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
UIWidgets::Tooltip("Randomize this sound");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
|
if (ImGui::Button(locked ? lockedButton.c_str() : unlockedButton.c_str())) {
|
||||||
|
if (locked) {
|
||||||
|
CVarClear(cvarLockKey.c_str());
|
||||||
|
} else {
|
||||||
|
CVarSetInteger(cvarLockKey.c_str(), 1);
|
||||||
|
}
|
||||||
|
LUS::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
|
||||||
|
}
|
||||||
|
UIWidgets::Tooltip(locked ? "Sound locked" : "Sound unlocked");
|
||||||
}
|
}
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user