/ifs_layeredfs

Live replace any file (including IFS contents) in Konmai games

Primary LanguageC++OtherNOASSERTION

IFS LayeredFS

Never repack textures again! IFS LayeredFS is a modding engine for Konami arcade games that use libavs (which is basically everything in the last 15 years).

It intercepts file accesses and replaces them with modded files in the data_mods folder, so mods don't have to be installed directly into the game folder.

For IFS files (a common texture container format) and texbin files (used instead of IFS in Gitadora, Jubeat and maybe some other games), it will take plain PNG images and automatically repack them into the game-specific format. This allows rapid development of texture mods, as the unergonomic texture packing process can be completely bypassed.

Installation

The DLLs go next to the other game DLLs. Pick the right DLL for your game - if 32 bit fails to load, try 64 bit. The data_mods folder goes next to the data folder.

For most games, you do not need to modify your gamestart.bat - the hook is loaded automatically by copying D3d9.dll to the install directory. For Jubeat and GFDM (not Gitadora), you'll need to use opengl32.dll instead. If neither of these work and the game is very new, try dxgi.dll. For Bombergirl, it has a special DLL loader that likes to break things. You will need to use dxgi_for_bombergirl.dll (renamed to dxgi.dll) AND copy dxgi.dll from C:\Windows\System32 (renamed to _dxgi.dll).

If you don't really care, you can copy all the injector DLLs into the game folder, it won't break anything.

For more control, load ifs_hook.dll using your launcher/injector of choice (eg: add -k ifs_hook.dll to the commandline)

Flags

If you can't work out to enable a flag, the release .zip contains DLLs that have certain useful combos pre-enabled. They can be found in the special_builds folder.

--layered-disable Disable layeredfs
--layered-verbose Print *tons* of info. Useful to find why your mods aren't
                  loaded
--layered-devmode Instead of caching, check the data_mods folder for every file.
                    A little slower, but lets you modify mods on-the-fly
--layered-allowlist=a,b,c,d
--layered-blocklist=a,b,c,d
                  If an allowlist is present, ONLY those folders in the
                  allowlist are included in the loaded mods list.
                  If a blocklist is present, folders in the blocklist are
                  excluded from the loaded mods list.
                  Folders cannot have "," in their name if using allow/blocklist
--layered-logfile=filename.log
                  Use a custom, separate logfile instead of the game's log.

Where to put mod files / how textures work / edge cases

See MOD_README.txt in the data_mods folder.

Logs

Info is logged to to the game's logging system. However, if something breaks before LayeredFS gets a chance to set this up, it will create ifs_hook.log with details. If something breaks, send the game log and ifs_hook.log (if it exists) to mon.

Building

This code has grown organically and is some of the worst C that I have ever distributed. The code itself is more or less fine, but the organisation leaves a lot to be desired. There are many vestigal remains of past AVS experiments.

Prior to version 3.0, it was built with Visual Studio 2017 with the 141_xp toolchain. However, in VS 2019 16.7, they broke this (it pulls in Vista-only APIs), so I gave up and moved to mingw-w64. I currently just have that installed in an Ubuntu install in WSL. If it ever breaks, I'll make a docker or nix image or something... Feel free to open an issue if you're struggling to build it.

As long as you have Meson and mingw-w64 installed, it should be as simple as running build.sh.

Contributing

I encourage pull requests, but might take a while to properly test them prior to merge. If you can show your PR works with SDVX/IIDX < 24/IIDX >= 25, I will probably accept it.

Please read the LICENSE. It is nonstandard.