Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using System.Collections.Generic;
using System.Data;
using Editors.Audio.AudioEditor.Core;
using Editors.Audio.AudioEditor.Core.AudioProjectMutation;
using Editors.Audio.AudioEditor.Presentation.Shared;
using Editors.Audio.AudioEditor.Presentation.Shared.Table;
using Editors.Audio.Shared.AudioProject.Models;
using Editors.Audio.Shared.Storage;
using HircSettings = Editors.Audio.Shared.AudioProject.Models.HircSettings;

namespace Editors.Audio.AudioEditor.Commands
{
public class AddDialogueEventByPasteCommand(
IAudioEditorStateService audioEditorStateService,
IAudioRepository audioRepository,
IDialogueEventService dialogueEventService) : IAudioProjectMutationUICommand
{
private readonly IAudioEditorStateService _audioEditorStateService = audioEditorStateService;
private readonly IAudioRepository _audioRepository = audioRepository;
private readonly IDialogueEventService _dialogueEventService = dialogueEventService;

public MutationType Action => MutationType.AddByPaste;
public AudioProjectTreeNodeType NodeType => AudioProjectTreeNodeType.DialogueEvent;

public void Execute(DataRow row)
{
var audioProject = _audioEditorStateService.AudioProject;
var copiedFromAudioProjectExplorerNode = _audioEditorStateService.CopiedFromAudioProjectExplorerNode;

HircSettings hircSettings = null;
var audioFiles = new List<AudioFile>();

var dialogueEventName = copiedFromAudioProjectExplorerNode.Name;
var dialogueEvent = _audioEditorStateService.AudioProject.GetDialogueEvent(dialogueEventName);
var statePathName = TableHelpers.GetStatePathNameFromRow(row, _audioRepository, dialogueEventName);
var statePath = dialogueEvent.GetStatePath(statePathName);
var soundBank = _audioEditorStateService.AudioProject.GetSoundBank(copiedFromAudioProjectExplorerNode.Parent.Parent.Name);

if (statePath.TargetHircTypeIsSound())
{
var sound = soundBank.GetSound(statePath.TargetHircId);
hircSettings = sound.HircSettings;
audioFiles.Add(audioProject.GetAudioFile(sound.SourceId));
}
else if (statePath.TargetHircTypeIsRandomSequenceContainer())
{
var randomSequenceContainer = soundBank.GetRandomSequenceContainer(statePath.TargetHircId);
hircSettings = randomSequenceContainer.HircSettings;
audioFiles = audioProject.GetAudioFiles(soundBank, randomSequenceContainer);
}

var statePathList = new List<KeyValuePair<string, string>>();
foreach (DataColumn dataColumn in row.Table.Columns)
{
var columnNameWithQualifier = TableHelpers.DeduplicateUnderscores(dataColumn.ColumnName);
var stateGroupName = TableHelpers.GetStateGroupFromStateGroupWithQualifier(_audioRepository, dialogueEventName, columnNameWithQualifier);
var stateName = TableHelpers.GetValueFromRow(row, dataColumn.ColumnName);
statePathList.Add(new KeyValuePair<string, string>(stateGroupName, stateName));
}

_dialogueEventService.AddStatePath(_audioEditorStateService.SelectedAudioProjectExplorerNode.Name, audioFiles, hircSettings, statePathList);
}
}
}
6 changes: 3 additions & 3 deletions Editors/Audio/AudioEditor/Commands/AddDialogueEventCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,17 @@ public void Execute(DataRow row)
var audioFiles = _audioEditorStateService.AudioFiles;
var settings = _audioEditorStateService.HircSettings;

var stateLookupByStateGroup = new Dictionary<string, string>();
var statePathList = new List<KeyValuePair<string, string>>();
var stateGroupsWithQualifiers = _audioRepository.QualifiedStateGroupByStateGroupByDialogueEvent[dialogueEventName];
foreach (var stateGroupWithQualifier in stateGroupsWithQualifiers)
{
var stateGroupName = TableHelpers.GetStateGroupFromStateGroupWithQualifier(_audioRepository, dialogueEventName, stateGroupWithQualifier.Key);
var columnName = TableHelpers.DuplicateUnderscores(stateGroupWithQualifier.Key);
var stateName = TableHelpers.GetValueFromRow(row, columnName);
stateLookupByStateGroup.Add(stateGroupName, stateName);
statePathList.Add(new KeyValuePair<string, string>(stateGroupName, stateName));
}

_dialogueEventService.AddStatePath(dialogueEventName, audioFiles, settings, stateLookupByStateGroup);
_dialogueEventService.AddStatePath(dialogueEventName, audioFiles, settings, statePathList);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace Editors.Audio.AudioEditor.Commands
public enum MutationType
{
Add,
AddByPaste,
Remove
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void Execute(List<DataRow> copiedRows)
var selectedAudioProjectExplorerNode = _audioEditorStateService.SelectedAudioProjectExplorerNode;
foreach (var row in copiedRows)
{
_audioProjectMutationUICommandFactory.Create(MutationType.Add, selectedAudioProjectExplorerNode.Type).Execute(row);
_audioProjectMutationUICommandFactory.Create(MutationType.AddByPaste, selectedAudioProjectExplorerNode.Type).Execute(row);
_eventHub.Publish(new ViewerTableRowAddRequestedEvent(row));
_eventHub.Publish(new EditorAddRowButtonEnablementUpdateRequestedEvent());
}
Expand Down
5 changes: 4 additions & 1 deletion Editors/Audio/AudioEditor/Core/AudioEditorFileService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,11 @@ public void Load(AudioProjectFile audioProject, string fileName, string filePath

var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);

// We add the Audio Project name as a suffix to all SoundBank names so if the Audio Project name has changed we need to update them
_audioEditorIntegrityService.UpdateSoundBankNames(audioProject, fileNameWithoutExtension);

// We create a 'dirty' Audio Project to display the whole model in the Audio Project Explorer rather than
// just the clean data from the loaded Audio Project as when it's saved any unused parts are removed.
// just the clean data from the loaded Audio Project as any unused parts are removed when it's saved
var currentGame = _applicationSettingsService.CurrentSettings.CurrentGame;
var dirtyAudioProject = AudioProjectFile.Create(audioProject, currentGame, fileNameWithoutExtension);

Expand Down
38 changes: 32 additions & 6 deletions Editors/Audio/AudioEditor/Core/AudioEditorIntegrityService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ namespace Editors.Audio.AudioEditor.Core
{
public interface IAudioEditorIntegrityService
{
void UpdateSoundBankNames(AudioProjectFile audioProject, string audioProjectNameWithoutExtension);
void CheckDialogueEventInformationIntegrity(List<Wh3DialogueEventDefinition> dialogueEventData);
void CheckAudioProjectDialogueEventIntegrity(AudioProjectFile audioProject);
void CheckAudioProjectWavFilesIntegrity(AudioProjectFile audioProject);
void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string audioProjectFileNameWithoutExtension);
void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string audioProjectNameWithoutExtension);
void CheckMergingSoundBanksIdIntegrity();
}

Expand All @@ -26,6 +27,20 @@ public class AudioEditorIntegrityService(IPackFileService packFileService, IAudi
private readonly IPackFileService _packFileService = packFileService;
private readonly IAudioRepository _audioRepository = audioRepository;

public void UpdateSoundBankNames(AudioProjectFile audioProject, string audioProjectNameWithoutExtension)
{
foreach (var soundBank in audioProject.SoundBanks)
{
var soundBankAudioProjectName = Wh3SoundBankInformation.GetAudioProjectNameFromSoundBankWithAudioProjectName(soundBank.Name);
if (audioProjectNameWithoutExtension != soundBankAudioProjectName)
{
var gameSoundBankName = Wh3SoundBankInformation.GetSoundBankNameFromSoundBankWithAudioProjectName(soundBank.Name);
var correctSoundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";
soundBank.Name = correctSoundBankName;
}
}
}

public void CheckDialogueEventInformationIntegrity(List<Wh3DialogueEventDefinition> information)
{
var exclusions = new List<string> { "New_Dialogue_Event", "Battle_Individual_Melee_Weapon_Hit" };
Expand Down Expand Up @@ -130,7 +145,7 @@ public void CheckAudioProjectWavFilesIntegrity(AudioProjectFile audioProject)
}
}

public void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string audioProjectFileNameWithoutExtension)
public void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string audioProjectNameWithoutExtension)
{
var usedHircIds = new HashSet<uint>();
var usedSourceIds = new HashSet<uint>();
Expand Down Expand Up @@ -200,7 +215,7 @@ public void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string

foreach (var soundBank in audioProject.SoundBanks)
{
ResolveSoundBankDataIntegrity(audioProject, audioProjectFileNameWithoutExtension, soundBank);
ResolveSoundBankDataIntegrity(audioProject, audioProjectNameWithoutExtension, soundBank);

if (soundBank.ActionEvents != null)
ResolveActionEventDataIntegrity(usedHircIds, usedSourceIds, soundBank);
Expand All @@ -215,17 +230,17 @@ public void CheckAudioProjectDataIntegrity(AudioProjectFile audioProject, string
ResolveStateGroupDataIntegrity(audioProject);
}

private static void ResolveSoundBankDataIntegrity(AudioProjectFile audioProject, string audioProjectFileNameWithoutExtension, SoundBank soundBank)
private static void ResolveSoundBankDataIntegrity(AudioProjectFile audioProject, string audioProjectNameWithoutExtension, SoundBank soundBank)
{
if (soundBank == null)
throw new InvalidOperationException("SoundBank should not be null.");

if (string.IsNullOrWhiteSpace(soundBank.Name))
throw new InvalidOperationException("SoundBank.Name should not be null or empty.");

var gameSoundBankName = Wh3SoundBankInformation.GetSoundBankNameFromPrefix(soundBank.Name);
var gameSoundBankName = Wh3SoundBankInformation.GetSoundBankNameFromSoundBankWithAudioProjectName(soundBank.Name);
var gameSoundBank = Wh3SoundBankInformation.GetSoundBank(gameSoundBankName);
var correctSoundBankName = $"{gameSoundBankName}_{audioProjectFileNameWithoutExtension}";
var correctSoundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";

if (soundBank.Name != correctSoundBankName)
throw new InvalidOperationException($"SoundBank.Name is incorrect. Expected '{correctSoundBankName}'.");
Expand Down Expand Up @@ -573,6 +588,17 @@ public void CheckMergingSoundBanksIdIntegrity()
hasClashes = true;
messageBuilder.AppendLine($"Language: {languageName}");

var conflictingBnks = clashingIdsById.Values
.SelectMany(bnkNames => bnkNames)
.Concat(clashingSourceIdsById.Values.SelectMany(bnkNames => bnkNames))
.Distinct(StringComparer.OrdinalIgnoreCase)
.OrderBy(name => name, StringComparer.OrdinalIgnoreCase);

foreach (var conflictingBnk in conflictingBnks)
messageBuilder.AppendLine(conflictingBnk);

messageBuilder.AppendLine();

foreach (var sourceBnk in idsByBnk.Keys
.Union(sourceIdsByBnk.Keys, StringComparer.OrdinalIgnoreCase)
.OrderBy(name => name, StringComparer.OrdinalIgnoreCase))
Expand Down
6 changes: 6 additions & 0 deletions Editors/Audio/AudioEditor/Core/AudioEditorStateService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public interface IAudioEditorStateService

// Audio Project Explorer
AudioProjectTreeNode SelectedAudioProjectExplorerNode { get; set; }
AudioProjectTreeNode CopiedFromAudioProjectExplorerNode { get; set; }

// Audio Project Editor
bool ShowModdedStatesOnly { get; set; }
Expand All @@ -30,6 +31,7 @@ public interface IAudioEditorStateService
public void StoreAudioProjectFileName(string audioProjectFileName);
public void StoreAudioProjectFilePath(string audioProjectFilePath);
void StoreSelectedAudioProjectExplorerNode(AudioProjectTreeNode node);
void StoreCopiedFromAudioProjectExplorerNode(AudioProjectTreeNode node);
void StoreModdedStatesOnly(bool moddedStatesOnly);
void StoreHircSettings(HircSettings hircSettings);
void StoreAudioFiles(List<AudioFile> audioFiles);
Expand All @@ -44,6 +46,7 @@ public class AudioEditorStateService : IAudioEditorStateService
public string AudioProjectFileName { get; set; }
public string AudioProjectFilePath { get; set; }
public AudioProjectTreeNode SelectedAudioProjectExplorerNode { get; set; }
public AudioProjectTreeNode CopiedFromAudioProjectExplorerNode { get; set; }
public bool ShowModdedStatesOnly { get; set; }
public HircSettings HircSettings { get; set; }
public List<AudioFile> AudioFiles { get; set; } = [];
Expand All @@ -58,6 +61,8 @@ public class AudioEditorStateService : IAudioEditorStateService

public void StoreSelectedAudioProjectExplorerNode(AudioProjectTreeNode node) => SelectedAudioProjectExplorerNode = node;

public void StoreCopiedFromAudioProjectExplorerNode(AudioProjectTreeNode node) => CopiedFromAudioProjectExplorerNode = node;

public void StoreModdedStatesOnly(bool showModdedStatesOnly) => ShowModdedStatesOnly = showModdedStatesOnly;

public void StoreHircSettings(HircSettings hircSettings) => HircSettings = hircSettings;
Expand All @@ -74,6 +79,7 @@ public void Reset()
AudioProjectFileName = null;
AudioProjectFilePath = null;
SelectedAudioProjectExplorerNode = null;
CopiedFromAudioProjectExplorerNode = null;
ShowModdedStatesOnly = false;
HircSettings = null;
AudioFiles.Clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public void AddActionEvent(string actionEventTypeName, string actionEventName, L
usedSourceIds.UnionWith(languageSourceIds);

var gameSoundBankName = Wh3SoundBankInformation.GetName(Wh3ActionEventInformation.GetSoundBank(actionEventTypeName));
var audioProjectFileNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectFileNameWithoutExtension}";
var audioProjectNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";
var soundBank = _audioEditorStateService.AudioProject.GetSoundBank(soundBankName);

var actionEventType = Wh3ActionEventInformation.GetActionEventType(actionEventTypeName);
Expand Down Expand Up @@ -104,8 +104,8 @@ public void RemoveActionEvent(string actionEventNodeName, string actionEventName
{
var audioProject = _audioEditorStateService.AudioProject;
var gameSoundBankName = Wh3SoundBankInformation.GetName(Wh3ActionEventInformation.GetSoundBank(actionEventNodeName));
var audioProjectFileNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectFileNameWithoutExtension}";
var audioProjectNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";

var soundBank = audioProject.GetSoundBank(soundBankName);
var actionEvent = soundBank.GetActionEvent(actionEventName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Editors.Audio.AudioEditor.Core.AudioProjectMutation
{
public interface IDialogueEventService
{
void AddStatePath(string dialogueEventName, List<AudioFile> audioFiles, HircSettings hircSettings, Dictionary<string, string> stateLookupByStateGroup);
void AddStatePath(string dialogueEventName, List<AudioFile> audioFiles, HircSettings hircSettings, List<KeyValuePair<string, string>> statePathList);
bool RemoveStatePath(string dialogueEventName, string statePathName);
}

Expand All @@ -22,7 +22,7 @@ public class DialogueEventService(IAudioEditorStateService audioEditorStateServi
private readonly IAudioRepository _audioRepository = audioRepository;
private readonly IStatePathFactory _statePathFactory = statePathFactory;

public void AddStatePath(string dialogueEventName, List<AudioFile> audioFiles, HircSettings hircSettings, Dictionary<string, string> stateLookupByStateGroup)
public void AddStatePath(string dialogueEventName, List<AudioFile> audioFiles, HircSettings hircSettings, List<KeyValuePair<string, string>> statePathList)
{
var usedHircIds = new HashSet<uint>();
var usedSourceIds = new HashSet<uint>();
Expand All @@ -41,13 +41,13 @@ public void AddStatePath(string dialogueEventName, List<AudioFile> audioFiles, H
usedSourceIds.UnionWith(languageSourceIds);

var gameSoundBankName = Wh3SoundBankInformation.GetName(Wh3DialogueEventInformation.GetSoundBank(dialogueEventName));
var audioProjectFileNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectFileNameWithoutExtension}";
var audioProjectNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";
var soundBank = _audioEditorStateService.AudioProject.GetSoundBank(soundBankName);

var dialogueEvent = _audioEditorStateService.AudioProject.GetDialogueEvent(dialogueEventName);
var actorMixerId = Wh3DialogueEventInformation.GetActorMixerId(dialogueEvent.Name);
var statePathFactoryResult = _statePathFactory.Create(stateLookupByStateGroup, audioFiles, hircSettings, usedHircIds, usedSourceIds, soundBank.Language, actorMixerId: actorMixerId);
var statePathFactoryResult = _statePathFactory.Create(statePathList, audioFiles, hircSettings, usedHircIds, usedSourceIds, soundBank.Language, actorMixerId: actorMixerId);
dialogueEvent.StatePaths.InsertAlphabetically(statePathFactoryResult.StatePath);

if (statePathFactoryResult.StatePath.TargetHircTypeIsSound())
Expand Down Expand Up @@ -88,8 +88,8 @@ public bool RemoveStatePath(string dialogueEventName, string statePathName)
{
var audioProject = _audioEditorStateService.AudioProject;
var gameSoundBankName = Wh3SoundBankInformation.GetName(Wh3DialogueEventInformation.GetSoundBank(dialogueEventName));
var audioProjectFileNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectFileNameWithoutExtension}";
var audioProjectNameWithoutExtension = Path.GetFileNameWithoutExtension(_audioEditorStateService.AudioProjectFileName);
var soundBankName = $"{gameSoundBankName}_{audioProjectNameWithoutExtension}";

var soundBank = audioProject.GetSoundBank(soundBankName);

Expand Down
Loading
Loading