Explore FH2Mods
All tutorials
Modding

Convert Existing FH2 Addon Cars to Extra Options Modular Format

Illustrated Porsche 911 GT3 RS example: use Extra Options' mod_diff.py to convert existing addon databases, strings, and media into a modular mod folder.

By Refil10/31/2026

Converting Existing Addon Cars for the Extra Options Loader

This walkthrough shows how creators can migrate a finished FH2 addon car from the older mediapc / full-database replacement approach to the modular system in Extra Options. It does not cover creating, modeling, rigging or porting a car from scratch.

The examples use @Pixzl's Porsche 911 GT3 RS (992) from the ForzaMods Discord. This FH2Mods guide follows the sequence and screenshots of RokkuDayo's original GitHub Wiki tutorial, presented here in fresh wording.

Introduction

An Extra Options addon should not distribute an entire modified game database or entire language archives. Instead, the loader merges only the records and strings that your mod adds, updates or deletes relative to the unmodified game.

If your Porsche or other addon already works by replacing gamedbRC.slt and edited EN.zip, the conversion tools can generate the required JSON changes. Your existing car model and resources remain the starting point; this process changes how the mod is packaged and loaded.

Setting up the script

Download the helper files from Extra Options — tools:

•mod_diff.py — compares databases, carbin records and string tables.

•The accompanying batch-file launcher (described in the original guide as Addon Mod Generator.bat; the current repository lists Addon JSON Generator.cmd).

Keep both files in a convenient working directory. Add untouched copies of the original game's gamedbRC.slt and EN.zip as your baseline. For the tool, Python 3.10+ is supported, without third-party dependencies.

Preparing the files

Your previously working addon should already contain the car's ZIP archive, an edited gamedbRC.slt with its new car records, and any changed string tables for its display name or newly added manufacturer.

Copy the addon-specific database and language archive into your working folder and give them recognizable names:

•Original: gamedbRC.slt and EN.zip.

•Porsche changes: gamedbRC+porsche.slt and EN+porsche.zip.

Work from copies. Preserve your existing mod, vanilla data and game saves before comparing anything.

Renamed vanilla and Porsche database and language archive files
Renamed vanilla and Porsche database and language archive files

Diffing the files

You can invoke mod_diff.py from a terminal, but the batch launcher is the simplest Windows workflow. Hold Ctrl, select the vanilla gamedbRC.slt first, select gamedbRC+porsche.slt second, then drag both files onto the batch launcher.

Selecting the original and edited databases before dragging them onto the generator
Selecting the original and edited databases before dragging them onto the generator

The tool displays a series of choices. The original tutorial's screenshots below illustrate each one.

Diffing order

The unmodified database must be first. Check the prompt: if the order is already correct, press Enter. If the two paths are reversed, choose 2 to swap them, then confirm.

Database comparison order confirmation
Database comparison order confirmation

Table selection

To export all changes in the database, leave the table filter empty and press Enter. Filtering a particular table is possible, but for an addon car you will generally want all changed tables, since a working car may reference many related records.

Choosing which database tables to export
Choosing which database tables to export

Custom table keys

The next prompt controls how table row keys are selected. For a standard conversion, keep automatic key detection. Override a key only if you know a table's unique identifier and have a specific reason to use it.

Choosing automatic or custom table keys
Choosing automatic or custom table keys

Policies

The following options determine what happens when other mods modify overlapping data or reserve the same IDs. These choices matter especially when several car packs are installed together.

Value conflicts

A conflict can occur when two mods edit the same existing database value. You may choose whether to reject your addon on a mismatch or permit the mod with higher load-order priority to win.

In the batch prompt illustrated here:

•Option 1: reject the affected mod when expectations conflict.

•Option 2: allow the higher-priority edit to win and keep your mod enabled.

Use the strict choice when unintended compatibility changes would be harmful. Allowing override conflicts is an explicit decision, not a general guarantee that two mods work well together.

Selecting the value conflict policy
Selecting the value conflict policy

ID conflicts

Different addons can try to insert a new car, part or other record with an identical ID.

The menu offers:

•Option 1: keep the requested IDs according to priority, rejecting the conflicting insertion.

•Option 2: ask Extra Options to assign a nearby available ID and remap compatible references.

As the original guide cautions, automatic ID reassignment is especially useful for some car-part/carbin additions. Full addon cars have more interconnected records and can be less predictable after reassignment. Test carefully if you choose the nearest-ID policy.

Selecting the ID conflict policy
Selecting the ID conflict policy

Output

The generator then asks where the target database is located. For ordinary FH2 mods, keep the standard media/stripped/gamedbRC.slt target.

You can also specify the exported JSON destination. The default saves a file called database.json alongside the tool. An optional report helps inspect which rows or fields the comparison exported.

Choosing database target, JSON output and optional report
Choosing database target, JSON output and optional report

After completion you should have a database.json representing the existing addon's differences from vanilla. You can subsequently edit the JSON if you need to adjust specific records, rather than rerunning the whole comparison for every minor change.

Generated database JSON file
Generated database JSON file

If you prefer the command line, a basic comparison is:

powershell

python mod_diff.py database gamedbRC.slt "gamedbRC+porsche.slt" -o database.json

For edited values or intentional row removals, the tool also supports --updates override and --deletes include; only enable them when those changes are deliberate.

String table

Now convert the display strings. Drag the original EN.zip and modified EN+porsche.zip onto the launcher, as you did with the databases. The same general workflow works with other language archives.

Comparing vanilla and edited English language ZIP files
Comparing vanilla and edited English language ZIP files

Confirm that the vanilla ZIP comes first and the edited ZIP second. Swap them if the prompt has them reversed.

Confirming the order of language table archives
Confirming the order of language table archives

Choose the language code. When a ZIP archive has a recognizable language name, the tool can suggest the correct default; normally accept it for the English EN.zip comparison. Other languages can be exported similarly.

Choosing the language code for strings JSON
Choosing the language code for strings JSON

Choose the output name and location for strings.json. Once the comparison completes, you now have a modular string diff rather than a replacement copy of the game's full language tables.

Choosing the strings JSON output options
Choosing the strings JSON output options

The generated strings.json should include only your new or modified string values. Remember that string-table keys are localization IDs, not the same thing as car IDs.

Setting up your mod folder

With both JSON files ready, create the new directory inside Azimuth's `mods` folder. The Porsche example uses Porsche 911 GT3 RS (992).

Creating Porsche 911 GT3 RS (992) folder in the Azimuth mods directory
Creating Porsche 911 GT3 RS (992) folder in the Azimuth mods directory

Inside the new mod directory, create media and put database.json and strings.json next to it. These JSON files belong at the root of that individual addon folder.

Database JSON, strings JSON and media folder in the Porsche addon
Database JSON, strings JSON and media folder in the Porsche addon

A finished Porsche-style layout will look like this:

text

Azimuth/
  azimuth.exe
  mods/
    Porsche 911 GT3 RS (992)/
      mod.json
      database.json
      strings.json
      media/
        Cars/
          <Porsche-car-archive>.zip
        Stripped/
          RC0/
            <thumbnail-files>.swatchbin

The exact car archive name, RC subfolder and thumbnail filenames must match your existing mod assets and database references.

Mod.json

Create mod.json by hand. The file describes your mod's identity, author, version, optional dependencies and which files the loader should open.

This is an editable template for your own addon:

json

{
  "format_version": 1,
  "id": "your-mod",
  "name": "My Awesome Mod",
  "author": "My Awesome Name",
  "version": "1.0.0",
  "description": "An addon for Forza Horizon 2.",
  "database": "database.json",
  "media": "media",
  "dependencies": []
}

If a mod uses only database changes or only media assets, omit the field for the resource it does not use. A car like the Porsche example needs both database.json and media.

A dependency can keep a mod from loading when a required component is not present. The original guide uses ZephyrSkies' Forza Motorsport 5 packs as an example:

json

{
  "dependencies": [
    "fm5-zs-fm5-common"
  ]
}

That fragment belongs *inside* a complete mod.json; it is not intended to replace the entire manifest. Any dependency must already be available earlier in the mod load order.

The original Porsche example shows its completed mod.json here:

Finished mod.json for the Porsche addon
Finished mod.json for the Porsche addon

Media directory

Treat media as this addon's private version of the game's media directory. Keep the same relative file structure you had under vanilla media or the old mediapc / mediaoverride location. You do not need to replace the base game's content.

Media asset directory structure mirroring the FH2 game
Media asset directory structure mirroring the FH2 game

For thumbnails, you can keep the original compatible files loose inside the matching RC folder. There is no need to package the whole RC directory back into a ZIP. Use the archive identifier referenced by your addon's data.

Loose swatchbin thumbnails within the RC directory
Loose swatchbin thumbnails within the RC directory

Finally, place the existing addon-car ZIP in the Cars directory under the mod's media folder. Preserve its correct filename and the resources inside it.

Car addon ZIP placed inside the media Cars folder
Car addon ZIP placed inside the media Cars folder

End

With the database diff, string diff, metadata and car media all arranged under your new mod folder, launch Forza Horizon 2 with Extra Options enabled and check whether the car appears.

Converted Porsche 911 GT3 RS working in Forza Horizon 2
Converted Porsche 911 GT3 RS working in Forza Horizon 2

If it fails, inspect FH2_ExtraOptions.log and the mods/loadorder.txt file near Azimuth. Typical causes include a missing dependency, a conflicting database row/ID, a wrong media path or incomplete original car assets. Keep backups of any save that contains addon cars; uninstalling a car that a save still owns can prevent that save from loading.

Original instructions: Extra Options — Addon Car Tutorial.

Example addon: Porsche 911 GT3 RS (992) by @Pixzl (ForzaMods Discord).

Project and guide: RokkuDayo's Extra Options.

Acknowledgements: @NFSLYY, @Pixzl and @ZephyrSkies for test feedback on the loader.

Report outdated or inappropriate content