Audio modding
After a long time, Audio modding is now possible (for Warhammer 3 at least!)
Wwise
The total war games uses an audio engine called Wwise. This is a very powerful, but complex system. If you want to audio modding, you also need to get a basic understanding of the tool.
WWise Naming
The first thing to understand, there is no names in wwise. When a wwise project is compiled (saved for use) the tool converts all the names into id strings. This is why the game has a ton of files called 9484940112.wem. At some point they were named Karl_Eating_Goblins.wem and so on, but that name is converted (hashed)
Wwise event structure
Everything in wwise starts with an event (apart from music).
There are two event types, Event and Dialog_event. After the event there is a chain of object that leads you to the actual audio played.
For example this basic event with will play a random sound from a collection of two.
Karl_Eating_Goblin_Event => Karl_Eating_Goblin_Event_ActionPlay => Random Container => Soundx.mp3, soundy.mp3.
They follow a basic pattern most of the time. Event => Action => Container (optional) => Sound(s)
The second event type is a dialog_Event. It has nothing to do with dialog, its a lookup table that results in container or sound object.
UnitVoiceActor | UnitType | SpottedFacton | Child |
---|---|---|---|
Orc_Female_1 | Ranged | Human | 123 |
Orc_Male_1 | Ranged | DarkElf | 456 |
OrC_Male2 | Melee | Orc | 678 |
When the even is triggered, the game sets a set of variables which are used to lookup the child node, which typically points to a Container which in turn points to sounds
Currently Dialog_Events can not be modded, but soon...
The last important bit is the ActorMixer object. This object controls who owns the sounds. Is it a UI sound, game sound, battle sound and so on. This is important to make the sound play as not all ActorMixer has their volume set at all times
Exploring Wwise in AssetEditor.
In AssetEditor there is a tool for exploring the audio data, called "Audio Explorer". This can be used to learn about how wwise works. It also allows you to find which ActorMixer Id you should use and what file to replace if you want to update the sound of something.
In the tool you get a list of all the events in the game. Under extra you can select if you want Events, Dialog_events or both. Picking one from the dropdown gives you the wwise object graph for the selected events.
In the example here, you see the "Evemt_battle_IND_Small_arms_dlc12_rattling_gun_fire_play_event". Somewhere in the game database or meta data files, there will be a reference to this name.
The event contains a play action, followed by a set of random containers. Why they are nested instead of one large, no one knows. But from this you can see all the sounds connected. If you want to replace a specific sound, this gives you the wav file to replace. The tool also allows you to preview the sounds.
Adding new Audio
We have tried to make adding new sounds as simple as possible. This is done using the Audio Compiler in AssetEditor. AssetEditor tries to fill out as much data as possible, to make it as simple as possible.
This is done using the Audio Compiler, which takes a textfile as an input. The format looks like this:
{ "Settings": { "Version": 1, "OutputGame": "Warhammer3", "BnkName": "campaign_diplomacy__ovn", "RootAudioMixer": "54848735", "Language": "English(uk)" }, "Events": [ { "Name": "Play_Foo", "Sound": "Audio\\WWise\\729867288.wem" }, { "Name": "Play_Bar", "Sound": "Audio\\WWise\\906470917.wem" }] }
Attribute | Description | Example Value |
---|---|---|
Settings.Version | The version of the project file | 1 |
Settings.OutputGame | The game to compile the audio project to. | Warhammer3 |
Settings.BnkName | The name of the created bnk file. Files can not be renamed as the file reference the name internally. | |
Settings.RootAudioMixer | The mixer the sounds should belong to | 54848735, which is the id for diplomacy lines |
Settings.Language | If the file is a language bnk, this needs to be set to the same name as one of the audio folders in the game | English(uk) |
Events | A list of all the events | |
Event.Name | The name which the game will use to find the sound | Play_Foo |
Event.Sound | The path to the audio file. At this point it needs to be imported manually and converted | Audio\\WWise\\906470917.wem |
Coming features:
- Audio file importer/converter
- Support for adding dialog_events
- Support for containers like random.
- Fixed names for known ActorMixers
File Types
Wem => The audio file format used by wwise
Bnk => The sound database used by wwise
Dat => A lookup table for connecting event names to wwise
Json => Projectfile for the audio compiler.