File information

Last updated

Original upload

Created by

alvazir

Uploaded by

alvazir

Virus scan

Safe to use

About this mod

Habasi will steal your precious plugins and stash them. It is a command line tool for TES3 plugin merging, e.g. it takes multiple plugins and creates one with their contents.

Requirements
Permissions and credits
Changelogs

Preface:
Spoiler:  
Show

Version 0.1.0 release announcement
Version 0.2.0 release announcement

I love khajiits. I've already presented Jobasha, that will perfectly organize all your lists in his library(Leveled List Tool). Now it's time for Habasi to step in.

Goals:
  • Overcome plugin quantity limit
  • Bring more order into mod lists

This program was created primarily to fight game limit of used plugins. "Morrowind.exe"(256), MWSE(1024), OpenMW(no limit from engine, though most operating systems have some kind of limit for simultaneously opened files per process). I use a lot of mods and hit the limit on MacOS(256), Linux(varies, 1024 default in case of Arch) and Android(1024). OpenMW opens lots of files besides plugins, so 1024 opened files limit was hit at around 600 plugins simultaneously on Linux and Android. It's easy to overcome the limit on MacOS and Linux, but it's somewhat hard on Android. It's easier to merge plugins.

I've used self-made tes3cmd scripts to merge half of my plugins for a year. It's faster and easier to merge plugins after updating them with scripts, than trying to do that in very slow construction set. Scripts were primitive though, so everything with external references, same cell references or many dialogues was off-limit. The program deals with all those things correctly and much faster. You just install, keep and update all your plugins in their own folders, run program and use merged plugins afterwards.

The only problem with merging is cell reference renumbering. You can not merge several references with the same id while keeping their ids intact. That means that you should not merge/remerge plugins that contain non-external references(most of the plugins) during the playthrough. I'd also generally not recommend merging 4 base ESMs(Morrowind, Tribunal, Bloodmoon, TR_Mainland) to allow leveled lists merging tools work correctly with deleted subrecords(only few tools are able to do it though, that's the main reason I've made Jobasha).

There are also record mergers: TES3Merge, Merged Lands, all the leveled lists mergers etc. I only use leveled lists merging, though I've made sure that most of those(tested with tes3cmd, TES3Merge, Jobasha) would continue working with merged plugins the same way as with unmerged. It's done by keeping different variants of mergeable records in a merged plugin by default.

Secondary reason to create the program was the desire to bring more order into mod lists of the users of my patches. Some of the files I've uploaded contain dozens of individual patches: "BTBGIsation" ~115, "BTBGI - Modular Patch" ~80, "Miscellaneous Patches" ~65, "Wares-base Expansion" ~38 etc. I offer merged versions, but in some cases only OpenMW users may use those versions due to "Morrowind.exe" limitations. It looks tidier to have needed patches merged into single files. Some mods may also benefit from merging IMO. Few come to mind: "Balmora Waterworks", "Repopulated Morrowind", "Mage Robes", "Wares", probably mighty "BCOM".

Usage:

Basic usage is simple. List plugins and run the tool. Merging process looks like this internally:
  • Record will be discarded if it's exactly the same as previously encountered record with the same type and id
  • (Default mode) Everything mergeable is stacked before the final version of the record to allow record mergers to work
  • (Replace mode) Newer record replace older records, e.g. default behaviour for both engines
  • Records types that are "really" merged are: CELL(references), LTEX + LAND(VTEX), master subrecords from the header

More uses of plugin merging appeared after the prototype was made:
  • Find outdated plugins(broken external references) when merging the whole load order.
    Version 0.2.0 update I've made this task easier, just run habasi -C
  • Create isolated single merged plugins for each playthrough. It should be easier to return back to that character paired with it's only plugin years later. Ideally there should be another mode or tool to scan your files and create accompanying single BSA archive with assets, but I don't have time to make it yet.
  • Improve plugins loading time(the least important, interesting though):
    My measurements of plugins loading time. Keep in mind, that it's only a part of the whole loading process. My grass takes around 5(4-6) seconds to load, so I've skipped it's measurements. I have around 650 plugins, 250 were already merged though. Two values listed: lin - 5 years old laptop with mobile Core-i5, and - 2 years old android smartphone:
    • and 9.0s, lin 9.9s: 398 plugins;
    • and 8.0s, lin 8.5s: 349 plugins;
    • and 8.0s, lin 8.5s: 349 plugins;
    • and 5.6s, lin 6.3s: 99 plugins;
    • and 4.2s, lin 5.1s: 49 plugins;
    • and 3.7s, lin 4.2s: 22 plugins;
    • and 1.5s, lin 3.3s: 1 plugin(including Morrowind.esm etc).
The last extreme example of the complete merge is interesting. OpenMW plays it correctly. I haven't tested with "Morrowind.exe" though. In my case the result looks like this(merged plugins and merged grass):
  • 464M[egabytes] United-ALL.esp
  • 238M[egabytes] United-GRS-ALL.esp

There are few points to remember if you decide to go this route:
Version 0.2.0 update I've made this task easier, just run habasi -O
  • Current release of Tamriel Rebuilt(23.02.03) requires to remove 1 record from the merged plugin. That happens because TR_Mainland adds "tr_m3_oe_esoldereward" GLOB, then TR_Hotfix marks it as deleted. As a result OpenMW doesn't know what to do with the lonely "deleted" record. Command should look like this(or similar action in any other tool, e.g. Enchanted Editor):
    tes3cmd delete --type glob --exact-id "tr_m3_oe_esoldereward" United-ALL.esp
  • Merged leveled lists would better be made in advance, then merged into with "strip_masters"(check example configuration).
  • Grass would also require stripping masters(check example configuration).


Version 0.2.0 update:
Initially I was not going to add load order scanning due to the nature of the program. It turned out to be a valuable addition for some tasks though. That's why I've implemented load order scanning and then built presets on top of it. Check Features further.

Description:
Habasi will steal your precious plugins and stash them. It is a command line tool for TES3 plugin merging, e.g. it takes multiple plugins and creates one with their contents.

Features:
  • Merge plugins
  • Keep mergeable records for record mergers(optional, enabled by default)
  • Show detailed information
  • Presets to quickly perform additional tasks(Morrowind engine Mod Organizer users would need ModOrganizer-to-OpenMW to generate openmw.cfg)
    • -T: "Turn Normal Grass" turns normal grass and kelp into groundcover(as in original Hemaris' mods: 1, 2) for your setup(Groundcoverify is an alternative utility for this task)
    • -C: "Check References" reports broken references(outdated plugins)
    • -O: "Merge Load Order" merges your whole load order(including groundcover) for many purposes, for example:
      • Pass merged plugins to The LawnMower for Morrowind to quickly remove clipping grass for all your plugins
      • Pass merged plugin to Waresifier to quickly generate Wares containers for all your plugins
      • Use instead of your load order on a potato phone for faster loading :-)

Usage:
  • Most basic usage: habasi -m out.esp plugin1.esp plugin2.esp to merge plugin1 and plugin2 into "out.esp"
    Spoiler:  
    Show

    The program is flexible and allows complicated scenarios, though basic usage is simple:

    1. To merge all plugins in current directory:

    habasi -m out.esp *.esp

    2. If you know what you do(after reading habasi -? --mode):

    habasi --mode complete_replace -m out.esp plugin1.esp plugin2.esp

    3. Only one input plugin is needed actually, though it rarely makes sense:

    habasi --mode grass -m out.esp Rem_WG_TR.esp

    4. Profiles are easy to use too. Merging your whole load order:

    habasi -O

    5. Almost everything may be done with command-line arguments, though settings file is the better way for advanced usage:

    To create settings file: habasi --settings-write

    To use it: habasi
  • Type command habasi -h for brief help
    Spoiler:  
    Show

    Habasi - TES3 plugin merging and utility tool

    Usage: habasi [OPTIONS]

    Options:
    -m, --merge <OUTPUT[, OPTIONS], LIST> List(s) of plugins to merge
    -l, --log <PATH> Name of the log file
    -L, --no-logDo not write log
    -s, --settings <PATH>Name of the program settings file
    --settings-write Write default program settings file and exit
    -g, --grass Process grass lists(enabled by default)
    -?, --help-option <OPTION> Print help for specific option
    -h, --help Print help (see more with '--help')
    -V, --version Print version

    Presets:
    -C, --preset-check-referencesCheck for missing references in the whole load order [aliases: check]
    -T, --preset-turn-normal-grass Turn Normal Grass and Kelp into Groundcover for the whole load order
    -O, --preset-merge-load-orderMerge the whole load order

    List options:
    -M, --mode <MODE> How to process possibly mergeable records
    -b, --base-dir <PATH>Base directory for plugin lists
    -d, --dry-run Do not write output plugin
    -u, --use-load-order Use plugins list from game config file
    -c, --config <PATH> Path to the game config file
    -a, --show-all-missing-refsShow all missing references
    -t, --turn-normal-grass Turn Normal Grass and Kelp into Groundcover
    -p, --prefer-loose-over-bsaGet mesh from BSA only when loose mesh not available
    -r, --reindex Reindex references twice
    -S, --strip-masters Strip masters when possible
    -B, --force-base-dir Force --base-dir usage with --use-load-order
    -E, --exclude-deleted-records Exclude deleted records with --use-load-order
    -A, --no-show-missing-refs Do not show missing references
    -D, --debug Enable additional debug mode
    -I, --no-ignore-errors Do not ignore non-important errors
    -P, --no-compare Do not compare output plugin with previous version
    --no-compare-secondary Do not compare output secondary plugin with previous version
    --dry-run-secondary Do not write secondary output plugin
    --dry-run-dismiss-statsDismiss stats with --dry-run
    --regex-case-sensitive Turn glob/regex patterns to case-sensitive mode
    --regex-sort-by-nameSort plugins from glob/regex patterns by name
    --force-dial-typeSet info records' type to dialogue's when they differ
    --ignore-important-errors Ignore non-critical errors
    --insufficient-mergeProcess only cell references(and statics with '-M grass' or '-t')
    --append-to-use-load-order <PATH> Append plugin path to --use-load-order list
    --skip-from-use-load-order <NAME> Skip plugin name from --use-load-order list

    Display output:
    -v, --verbose... Show more information
    -q, --quietDo not show anything
    -w, --show-plugins Show list of plugins to merge(handy when using wildcard/glob/regex patterns)

  • Type command habasi --help for extended help
  • Type command habasi --help-option <OPTION> to get extended help for a specific option
  • Example display output
    Spoiler:  
    Show

    $ ./habasi
    Log is being written into "/home/alvazir/__OMW/habasi.log"
    Output plugin "mods/Patches/Habasi/0/united/United-GRS.esp" was written
    Output plugin "mods/Patches/Habasi/0/united/United-100.esp" was written. It contains reindexed references most likely, so new game is recommended.
    Output plugin "mods/Patches/Habasi/0/united/United-200.esp" was written. It contains reindexed references most likely, so new game is recommended.
    Output plugin "mods/Patches/Habasi/0/united/United-700.esp" was written. It contains reindexed references most likely, so new game is recommended.
    Combined plugin lists stats:
    input(625 plugins): 219277 processed, 5111 removed(dup), 6307 merged, 1718 replaced, 7923 instances filtered(grass)
    output(4 plugins): 208570 total, 206141 unique, 2237 mergeable(unique), 2429 mergeable(total), 5.413s duration

Changelog:
Spoiler:  
Show

  • 0.3.8
    • Bug fixes
      • Fix error that prevented CELL's AMBI field update sometimes.
    • Fixes
      • Show error and quit when settings file passed with --settings option doesn't exist. Previously program silently ignored the error.
  • 0.3.7
    • Fixes
      • Fix comparison to previous output plugin. Negative zero coordinates(-0.0) were considered different due to recently changed rust's float logic(NaN != NaN).
  • 0.3.6
    • Fixes
      • Fix settings file errors caused by libraries update in 0.3.4.
      • Show warning about missing data= lines in openmw.cfg only when lines are missing :-)
    • Miscellaneous
      • Code refactoring, update settings version.
  • 0.3.5
    • Fixes
      • Make --force-base-dir(-B) work with --preset-merge-load-order(-O).
  • 0.3.4
    • New features
      • Add --force-dial-type to set INFO's dialogue type to parent DIAL's thanks to Willtor's report(resolve Issue-5). That's designed primarily to overcome rare bug in plugins made with OpenMW-CS 0.48(and probably previous versions, fixed in 0.49).
    • Miscellaneous
      • Add armv7 Android build.
      • Code refactoring, update settings version.
  • 0.3.3
    • New features
      • Add --force-base-dir(-B) to override directory with plugins when using game configuration files with --use-load-order(-u). It may be useful for MO2's "Use profile-specific Game INI files" or testing playground. Use together with --base-dir(-b):
        • habasi -m out.esp -uBb another_dir
    • Fixes
      • Fix passing options to presets and merge lists with --use-load-order.
    • Miscellaneous
      • Improve log messages.
      • Update dependencies, settings version, MSRV to 1.75.0.
      • Code refactoring.
  • 0.3.2
    • Fixes
      • Allow specifying plugin names with comma in their name by escaping(prepending with backspace) in --merge option thanks to Lucius Martius' report(resolve Issue-6).
    • Miscellaneous
      • Massive code refactoring(mostly based on non-default clippy lints).
      • Fix text errors in --help and README.md.
      • Slightly improve logging:
        • Compact TNG two-line logs into one-liners.
        • Make TNG meshes log lines order consistent between runs by sorting.
      • State proper MSRV in Cargo.toml and README instead of current Rust version.
      • Binary downloads page:
        • Add Win7 Windows build to be used with Windows 7+ because Rust 1.78+ requires Windows 10+).
        • Drop GNU Windows build because it's not needed.
        • Remove -msvc suffix from Windows 10+ build's folder.
  • 0.3.1
    • Miscellaneous
      • Add musl Linux build to be used when glibc shipped with OS is old.
      • Rename instead of copy for backups to preserve timestamps.
      • All backups now have .backup file extension.
      • Reword several messages.
  • 0.3.0
    • New features
      • Add alternative form of --merge option to allow use of shell's file name completion and wildcards.
        • habasi -m out.esp plugin1.esp plugin2.esp
      • Add different types of plugin name patterns:
        • Wildcard. Usually provided by shell, otherwise by the program(Windows). It's handy for one-shot merges despite several limitations.
          • habasi -m out.esp plugin*
        • Glob. Improved version of wildcard. Defined by prepending pattern with "glob:". Allows using "**" to get plugins from multiple subdirectories("glob:**/*.esp").
          • habasi -m "out.esp, glob:plugin*"
        • Regex. The most powerful pattern type, though lacks glob's multi-directory access. Defined by prepending pattern with "regex:".
          • habasi -m out.esp "regex:^plugin.*"
      • Add --show-plugins option to display resulting list of plugins to merge(handy when using wildcard/glob/regex patterns).
      • Add --regex-case-sensitive option to turn glob/regex patterns to case-sensitive mode(case-insensitive by default).
      • Add --regex-sort-by-name option to sort plugins from glob/regex patterns by name(sorted by modification time by default).
  • 0.2.12
    • New features
      • Add "hidden" OpenMW-CS data directory to the list of plugin directories(resolve Issue-3).
    • Fixes
      • Skip list if all it's plugins were skipped.
      • Allow --ignore-important-errors to ignore unexpected tag errors thanks to magicaldave's report(regression, resolve Issue-2).
      • Ignore plugins that contain non-TES3 record types(CELL::XSCL) automatically thanks to magicaldave's report(resolve Issue-2).
      • Ignore plugins that contain non-TES3 record types(TES3::FORM) automatically thanks to magicaldave's report(resolve Issue-4).
  • 0.2.11
    • Fixes
      • Ignore plugins that contain non-TES3 record types(LUAL) automatically thanks to GeneralUlfric's report.
  • 0.2.10
    • Miscellaneous
      • Change license from dual MIT and UNLICENSE to GNU GPLv3.
      • Rename program from "Habasi - TES3 plugin merging tool" to "Habasi - TES3 plugin merging and utility tool".
      • Improve filesystem-related error messages.
      • Add system requirements to description.
      • Fix typos in several places.
  • 0.2.9
    • Fixes
      • Remove error when encountering omwscripts plugin, auto-skip processing of omwscripts plugins(or any other type of plugins via setting guts.plugin_extensions_to_ignore).
    • Miscellaneous
      • Slightly improve default display output by moving "Skipped plugin processing ..." messages to verbose mode.
      • Update versions of rust and all dependencies, notably tes3 library to latest commit(2fae07a0).
  • 0.2.8
    • Feature enhancements
      • Output plugin with only size of master(s) changed is now considered equal to previous version.
    • Fixes
      • Assign ID to SSCR records with empty IDs. New ID is a CRC64 of script name. This solves very rare problem when using multiple plugins(created with OpenMW-CS) with empty ID SSCR in Morrowind.exe. Check log for new IDs or run with -vv.
      • Assign ID to SNDG records with empty IDs. New ID is a creature name and sound type data id padded with three zeros, e.g. alit0006 for alit scream. This solves very rare problem when several SNDG records with emptry IDs overwrite each other even if they are for different creatures. Check log for new IDs or run with -vv.
  • 0.2.5
    • Bug fixes
      • Move Journal records in front of all the other dialogue types. Morrowind.exe and TES-CS drop journal conditions from dialogues(INFO records) if corresponding Journal records are defined after. Thanks to AstralJam8 for finding the issue and thorough investigating!
    • Feature enhancements
      • Remove XSCL(scale) subrecord from deleted instances. Most files produced are now slightly slimer, which in turn leads to a bit faster loading. Turn Normal Grass -CONTENT plugins get considerable ~20% decrease in size.
      • Remove deleted non-external instances from merged plugin.
    • Fixes
      • Introduce keep_only_last_info_ids mechanic(configurable in settings) to exclude 1 problematic INFO record when merging plugis LGNPC_GnaarMok and LGNPC_SecretMasters.
      • Remove AMBI, WHGT from deleted cells. This fixes OpenMW-CS(and probably OpenMW) error "Loading failed: ESM Error: Previous record contains unread bytes" on loading a cell with both deleted flag(0x0020) and DELE subrecord.
  • 0.2.0
    • Breaking changes
      • Several option names has been changed.
      • References sorting is now better. Merged plugins' contents is almost identical to TES-CS produced plugins. This means that recreating previously made merged plugins may require new game. Habasi would warn you if that's the case.
      • Habasi is incompatible with OpenMW 0.47 and earlier starting from this version.
        • OpenMW 0.48 is now stable and contains fix to the long standing bug #6067. I've fought the bug previously, but it's not needed anymore.
        • I've uploaded "legacy" 0.2.0 version just in case. It contains changes to make it work with legacy OpenMW versions. Habasi 0.1.0 is also fully functional.
    • New features
      • Presets:
        • -T: "Turn Normal Grass" turns normal grass and kelp into groundcover(as in original Hemaris' mods: 1, 2) for your setup.
        • -C: "Check References" reports broken references, which usually highlight outdated plugins.
        • -O: "Merge Load Order" merges your whole load order including groundcover. This preset may be used for many purposes, for example:
          • Pass merged plugins to The LawnMower for Morrowind to quickly remove clipping grass for all your plugins.
          • Pass merged plugins to Waresifier to quickly generate Wares containers for all your plugins.
          • Use instead of your load order for faster loading on potato phone :-) Also it's no longer needed to delete one record from the output plugin when TR_Mainland and TR_Hotfix are among plugins merged. All DELETED records are auto-removed from the result with this preset.
        • Note: Presets utilize newly added option --use-load-order which imposes specific requirement(explained further).
        • Note: Presets may be combined. For example habasi -CTO performs all three available presets at once and produces slimer results.
      • Options:
        • --use-load-order: Uses your game configuration file and also reports some configuration errors, e.g. missing plugins. Requires either "old style" Morrowind modding way(dump everything into Data Files) or openmw.cfg. This restriction is due to Morrowind.ini's lack of paths to different mod directories. Morrowind's Mod Organizer users may produce openmw.cfg with ModOrganizer-to-OpenMW, then point Habasi to it with --config option.
        • --config: Provide path to alternative game configuration file or main configuration file in case auto-detection fails.
        • --ignore-important-errors: Ignore missing or corrupted plugins. This option has been requested by sunhawken.
        • -?: Get help for individual option, because extended help habasi --help became too long to quickly find something.
        • Few more minor options.
    • Performance improvements
      • Comparison of newly created and previous version of merged plugin is now slighly faster.
      • Grass processing also became slightly faster.
    • Feature enhancements
      • Grass processing produces slimer output. Non-grass statics, empty and interior cells are automatically excluded.
      • Slightly improved output plugin description with the number of plugins merged.
      • There is now message telling first difference to previous version of output plugin.
      • Display and log output became slightly better.
      • Auto-backup of previous log and settings files.
      • Debug mode no longer skips duplicate records.
      • Add references count to stats to provide visual explanation why some plugin lists take more time to be processed.
      • All list options are now available as global and per list options, allowing more flexibility by combining them.
      • More forgiving argument names processing. For example --dry_run would be treated as correct form of --dry-run, per list option DRY-RUN would also be treated as the correct form of dry_run.
    • Fixes
      • Reword --mode help section slightly, add note about DeltaPlugin. I made a mistake when wrote that DeltaPlugin would work with keep or replace modes the same way as if it worked with unmerged plugins. DeltaPlugin processes records the same way as both engines, e.g. discards different variants of mergeable records except the last one. Possible way to use both utilities is to make additional openmw.cfg file with paths to unmerged plugins, then run delta_plugin -c openmw.cfg, then run habasi.
    • Miscellaneous
      • Almost half of the initial code has been edited, the amount of code added is roughly equal to initial. That means bugs probability has been increased :-)
    • Nexus specific
      • Slightly rework configuration examples, strip default values, add tutorial_turn_normal_grass example.
      • Repeat TES3Merge and DeltaPlugin in Leveled Lists list of utilities for clarity(according to C3pa's comment).
      • Add note about DeltaPlugin and Habasi working together.
  • 0.1.0
    • Initial release


Files:
Download file contains configuration examples and executables for all platforms I've decided to target(tell me if you need another platform):
Spoiler:  
Show

  • _configuration_examples
    Spoiler:  
    Show
    • habasi.toml: This is the config I use at the moment of publishing
    • tutorial_turn_normal_grass.toml: This is a tutorial showing how to:
      • Recreate "Turn Normal Grass and Kelp into Groundcover" and "Stirk Performance Improver" by Hemaris
      • Recreate both original mods in one pair of plugins, adding STotSP and PfP on top
      • Create similar plugins for your whole load order
    • android.toml: Example configuration to be run on Android
    • complete-convenient.toml: Recreation of 3 profiles used together in a short command habasi -CTO
    • complete-manual.toml: Same as previous, but with file listing(better in the long run)
    • complete-manual-windows.toml: Example configuration to make "complete" merge on Windows(practical example of dealing with Windows' backslashes)
  • Linux_x86-64
    Spoiler:  
    Show
    • Testing status:OK
    • Tested on Arch, though it should work everywhere else.
  • Linux_x86-64_MUSL
    Spoiler:  
    Show
    • Only use MUSL build when regular version doesn't work due to old GLIBC(MUSL version is slower).
    • Testing status:OK
    • Tested on Arch, though it should work everywhere else.
  • Android_AArch64
    Spoiler:  
    Show
    • Testing status:OK
  • Android_ARMv7
    Spoiler:  
    Show
    • Testing status:UNKNOWN
    • Check memory requirements section. Consider using "-P" option if you encounter out of memory errors.
  • Windows_x86-64
    Spoiler:  
    Show
    • Testing status:OK(WINE)
    • Windows 10+.
  • Windows_x86-64_Win7
    Spoiler:  
    Show
    • Testing status:OK(WINE)
    • Windows 7+.
  • macOS_x86-64
    Spoiler:  
    Show
    • Testing status:Runs
    • This build is for Intel CPUs. Better use AArch64 build with ARM Macs, though this build also works(through Rosetta I suppose).
    • MacOS will warn you that application is not signed, so either make following steps or build application yourself(it's easy):
      • You'll see message trying to run application:
        “habasi” can’t be opened because Apple cannot check it for malicious software.
      • Click [OK]
      • Go to System Preferences -> Security & Privacy -> click [Allow Anyway]
      • Run application again and click [Open]
  • macOS_AArch64
    Spoiler:  
    Show
    • Testing status:Runs
    • This build is for ARM CPUs(M1 etc).
    • MacOS will warn you that application is not signed, so either make following steps or build application yourself(it's easy):
      • You'll see message trying to run application:
        “habasi” can’t be opened because Apple cannot check it for malicious software.
      • Click [OK]
      • Go to System Preferences -> Security & Privacy -> click [Allow Anyway]
      • Run application again and click [Open]


System requirements:
  • OS: non-ancient(10-15 years old or younger): Linux kernel 3.2+, Android 4.4(KitKat)+, Windows 7+, macOS 12.3(Monterey)+.
  • Memory: depends. Typical usage requires negligible amounts of memory. You should have enough memory for extreme merges if you can run Morrowind :-) Consider using "-P" option if you encounter out of memory errors.
    Spoiler:  
    Show
    • Estimated peak memory usage: x8(x14 for grass plugins) the combined size of merged plugins. Consider using "-P" option to drop it to x5(x8 for grass). Grass plugins have higher ratio because memory usage mainly depends on the amount of cell references(and size of the plugins in turn).
    • Most plugins are small, so the memory usage is negligible in most cases. Examples:
      • 266 plugins merged with combined size of 18MB = 126MB(72MB with "-P") RAM usage,
      • 70 plugins merged with combined size of 20MB = 162MB(90MB with "-P") RAM usage,
      • 277 plugins merged with combined size of 110MB = 896MB(536MB with "-P") RAM usage.
    • Large plugins are rare. Morrowind.esm is one of the largest(77MB), TR_Mainland.esm is the largest(167MB). Few examples of merging large plugins:
      • Base game master plugins: 91MB in total, 665MB(447MB with "-P") RAM usage:
        ./habasi -m "out.esp, Morrowind.esm, Tribunal.esm, Bloodmoon.esm",
      • Most popular ESMs: 340MB in total, 2880MB(1918MB with "-P") RAM usage.
        ./habasi -m "out.esp, Morrowind.esm, Tribunal.esm, Bloodmoon.esm, Patch for Purists.esm, Tamriel_Data.esm, TR_Mainland.esm, OAAB_Data.esm, Sky_Main.esm, Cyr_Main.esm",
      • Merging grass for most landmass mods: 255MB in total, 3658MB(2039MB with "-P") RAM usage:
        Grass for Morrowind, STotSP, TR, SHotN, Cyrodiil, Havish, Lokken, Wyrmhaven, Chemua etc.
    • The most extreme cases of merging everything:
      • Heavy modded setup of ~650 plugins: 750MB in total(with grass), 5770MB(2673MB with "-P") RAM usage.
Repository:
GitHub

License:
Licensed under the GNU GPLv3.
Image of Sugar-Lips Habasi comes from UESP under the Attribution-ShareAlike 2.5 License

Acknowledgments:
This project came to life thanks to the awesome tes3 library by Greatness7(GitHub).

Record merging tools that should work great alongside Habasi:
  • Leveled lists(LEVC, LEVI):
  • Landscape(LAND):
  • Most types of records:
    (*) DeltaPlugin processes records the same way as both engines, e.g. discards different variants of mergeable records except the last one. Possible way to use both utilities is to make additional openmw.cfg file with paths to unmerged plugins, then run delta_plugin -c openmw.cfg, then run habasi.

My other projects:
  • alvazir's various patches - Collection of compatibility patches, fixes, mod expansions and tiny mods.
  • BTBGIsation - BTBGI balance changes for Project Tamriel and other mods.
  • Jobasha - TES3 leveled list merging and deleveling tool. Jobasha will perfectly organize all your lists in his library.