Need suggestions for FMOD Banks and a game that supports Mods

I’m working on a game that supports game mods. Are there any implications to the game loading the Master Bank and it’s string file, plus an extra bank I’ve created (both from my dev Fmod Project file), and then on top of that, a player made bank and strings that was generated from a separate Fmod Project file?

Is there an ideal way to have this configured?

There is no single ideal way to handle DLC, as every project has different requirements and goals. Still, here’s some general information on handling DLC that should be useful:

All DLC projects must use the same GUID for their master bus as your game project does, to ensure that all content eventually routes into that bus. In addition, if you want your players to be able to route their events into your projects’ buses, those buses (with the same GUIDs) will have to be included in their projects as well. If you want them to be able to create new buses of their own, you’ll need your players to build their master banks as well as their content banks so that the new buses they create can be loaded in your game.

Often easiest way to achieve this is to make a copy of your project, strip out all the events, and then give that skeletal project to your players for them to create new events in.

Once you have banks created from multiple different versions of your project, all you need to do is load them at the same time as your existing ones in order to use content from multiple banks.

When loading multiple versions of the same bus or event due to that content being present in more than one loaded bank, the version that was loaded first will be used.

Incidentally, there is no limit to the number of banks from the same project that may be simultaneously in memory, besides that imposed by the available resources of your target platform.

1 Like

Thanks for the info Joseph!

So I tried this but didn’t have good results (I got non-descript fmod load errors telling me to contact support) and I think it’s because I’m not understanding something properly. I’m going to ask a bunch of questions…

My main project has a Master Bank and an extra bank called Bank1. I notice when I do a build, the master bank also builds a strings file, but there isn’t one for bank1. Why is this?

Do we need a strings file from each new bank that a modder creates?

When a modder makes their own bank, do they need to generate the master bank with the strings file again? If this template project has it’s own master bank, and they rename it to “rocket”, fmod will generate the rocket.bank and a rocket strings file. Do we need to load this strings file too?

Thanks for your help.

The strings file contains a lookup table of the GUIDs and names and paths of all the events in your project, regardless of the banks to which those events are assigned. This allows your game code to call events by name and path, instead of only by GUID. Many audio programmers find that calling events by path and name makes their games’ code easier to read and maintain, but this practice is technically optional; if your code only ever calls events by GUID, you can safely exclude the strings file from your game.

Because the master bank’s strings file already contains the name and path of every event in your project, it’s not necessary to generate strings files for the other banks.

You will need strings files for content created by your modders only if you want those modders to be able to call their events by name and path. That said, because the master bank contains a project’s routing information, modders will need to build their own master banks even if they will not use the strings file.

As I mentioned in my earlier answer, there is no problem caused by loading more than one master bank at the same time. If you do this, the mixers from all the master banks will be merged into one. If there are buses with the same GUID in multiple mixers, the version loaded first is the one that will be used in-game.

Ok, so just to clarify…if we want the modders to be able to create their own sounds events named whatever they like, (the game will try to trigger an event named after the mod they’ve made) they need to have my original “Master Bank” in the template project that I’ve given them, and then they make their own unique bank. Then when we load all of the data, we load my master bank, and then the modders master bank, and then their extra bank which has their sounds in it.

Have I got that right?

I’ve tried generating a second master bank from the template and a unique modder bank, but the game gives us an fmod error saying “the specified bank has already been loaded”.

Oh! Sorry, I forgot an important step: The modder’s master bank must have a different GUID to your master bank. The easiest way to generate a new GUID for the master bank is is as follows:

  1. Navigate to where the master bus file is stored on your hard drive (it’ll be in the project’s “Metadata\Bank” subdirectory) and delete it. If you’re having trouble telling which file in the master bank, locate the file in FMOD Studio’s banks browser, then right-click on it and select “Copy GUID” to copy the bank’s GUID to the clipboard; the master bank will be the file whose filename matches this GUID.
  2. Load the project in Studio (or if it’s already loaded, select “Revert to Saved…” from the “File” menu). Studio will pop up a dialog saying that it encountered issues loading your project and prompting you to recover it; click on the “recover” button and Studio will automatically generate a new master bank with a new GUID.
    Note that deleting and regenerating the master bank will cause any events assigned to that bank prior to deletion to no longer be assigned to it; you will have to assign them again manually.

We’re aware that this workflow is somewhat cumbersome, and are working on replacing it with a simple menu item in FMOD Studio 1.11.00.

Ahhh! Thank you, that worked :slight_smile:

So in the end we’re loading…

Default Game Banks:
Master Bank.bank
Master Bank.strings.bank
Extra Bank.bank

then…

Modder Banks:
Master Bank.bank (with different GUID)
Master Bank.strings.bank
Modder’s Mod.bank