NeoSSF is a SSF/TLK editor for several Aurora/Odyssey engine games.
NeoSSF owns SSF editing and SSF/TLK patch-package logic. Native TLK parsing, editing, encoding, and save behavior come from the shared neoshared::tlk target.
This repository consumes shared code from the separate neoshared repository. Clone the repositories as siblings:
workspace/
neoshared/
NeoSSF/
CMake automatically detects ../neoshared. For another layout, pass --neoshared-root /path/to/neoshared to build.sh, -NeoSharedRoot C:\path\to\neoshared to build.ps1, or set NEOSHARED_ROOT directly.
Linux GUI build:
./scripts/build.sh --wx ON --require-wx ON --jobs "$(nproc)"Linux CLI/core-only build:
./scripts/build.sh --wx OFF --jobs "$(nproc)"Windows GUI build with static wxWidgets from vcpkg:
.\scripts\build.ps1 `
-Wx ON `
-RequireWx ON `
-VcpkgRoot C:\vcpkg `
-VcpkgTriplet x64-windows-static `
-Parallel ([Environment]::ProcessorCount)Use -Wx OFF on Windows for a CLI/core-only build. The default build directory is build/.
NeoSSF opens and saves the three SSF layouts currently used by the supported games:
- KotOR / KotOR II
SSF V1.1StrRef-only tables. - Neverwinter Nights / NWN EE
SSF V1.0sound ResRef + StrRef tables with 16-byte sound ResRefs. - Neverwinter Nights 2
SSF V1.1sound ResRef + StrRef tables with 32-byte sound ResRefs.
Loading a TLK is optional. Without a TLK, StrRefs remain editable as numbers and NWN/NWN2 direct SoundFile ResRefs remain visible and editable. Loading a TLK only fills the preview text/sound columns and enables creating new TLK entries from the SSF editor.
neossf provides Import and Export menus, filtering, and StrRef-cell copy/paste. Semantic XML/JSON export is intentionally complete and unfiltered; use CSV/TSV to export a filtered visible row set. XML and JSON use complete semantic SSF sound records and carry the same native format at the document root. NWN/NWN2 direct SoundFile ResRefs are exported explicitly. The Text and Sound columns in CSV/TSV are resolved TLK preview values and are ignored on import; SSF fields are StrRef for KotOR and SoundFile for NWN/NWN2.
TSLPatcher and HoloPatcher both support KotOR SSF V1.1 patching through [SSFList]. They also allow an SSF slot to use a StrRefN token produced by [TLKList], so a new line can be appended to the user's dialog.tlk and assigned to the SSF without relying on a fixed final StrRef.
The GUI command is:
Export -> Export TSLPatcher/HoloPatcher SSF + TLK Package...
The workflow is:
- Open the SSF that you are editing.
- Load the appropriate
dialog.tlkwhen TLK preview/entry creation is needed. - Use NeoSSF's Add TLK Entry operation. NeoSSF records the TLK row count present when the TLK was loaded.
- Select Export TSLPatcher/HoloPatcher SSF + TLK Package....
- Choose the clean original SSF, the target SSF filename, and the destination
tslpatchdatafolder.
Rows added after the active tab loaded its TLK are written to append.tlk. Any SSF slot that references one of those rows is written as a dynamic token such as:
[TLKList]
StrRef0=0
[SSFList]
File0=my_soundset.ssf
[my_soundset.ssf]
Battlecry 1=StrRef0
Unknown (29)=StrRef0The installer resolves StrRef0 to the actual destination StrRef assigned in the user's TLK. The same package is usable by stock TSLPatcher and HoloPatcher.
For file-to-file or automated preparation, provide clean and modified TLKs to the CLI:
neossf-cli --diff-tslpatcher original.ssf modified.ssf tslpatchdata \
--filename my_soundset.ssf \
--original-tlk dialog_original.tlk \
--modified-tlk dialog_modified.tlkThe combined SSF/TLK workflow always creates a complete package because append.tlk contains the actual strings and cannot be represented by an INI fragment alone. SSF-only package or fragment output remains available:
Compatibility and safety rules:
- All 40 KotOR SSF slots are addressable, including the exact TSLPatcher keys
Unknown (29)throughUnknown (40). - NWN and NWN2 direct sound ResRef fields are not patchable through
[SSFList]; distribute those SSFs as whole files. - NeoSSF's combined exporter is append-only for TLK data. Existing TLK-row edits, deletions, and language-ID changes are rejected. Use NeoTLK's HoloPatcher package export for existing-entry replacements.
- The clean SSF is staged only when SSF slots changed, allowing the patcher to create the target file if the user has no existing Override copy.
- TLK entries added in the active tab but no longer referenced by an SSF slot are retained in
append.tlkand reported as a warning.
Patcher generation accepts imported modified-side SSF data through --modified-format csv|tsv|xml|json|ssf|kotor|native|auto or --diff-tslpatcher-import. CSV/TSV use the flat slot table; XML/JSON use the semantic SSF formats.
Stock [SSFList] patch generation is limited to KotOR SSF V1.1. NWN/NWN2 SSFs retain full native and interchange editing support, but their direct sound ResRefs are not representable by the KotOR patcher handler.