For some time it has puzzled me that the only way to merge objects in Morrowind is by using "TESTool". This is because TESTool is notoriously prone to crashing during a merge -- the only way most people can get it to behave is to ensure no more than 10-20 mods are enabled when it runs. I suspect this means most people don't bother merging objects.
Because I haven't been able to find "merge objects" functionality anywhere else, I have started to write it myself. Esper is the result. Esper is written in Common Lisp.
The latest version is available at: http://bitbucket.org/eeeickythump/esper/
See the README there for the most up to date description of esper's capabilities and command line options (more up to date than this post).
Zipped Windows XP executable: http://bitbucket.org/eeeickythump/esper/downloads/
FallenWizard has kindly compiled a native executable for 64-bit machines: http://www.4shared.com/file/258967438/967b2769/esper64_Beta16.html
A discussion thread is http://www.gamesas.com/bgsforums/index.php?showtopic=1067443&st=20. It is probably best to discuss bugs and glitches there.
Currently, Esper successfully parses Morrowind.esm and the two addon esm's, and all the plugin files I've tried. It also writes Morrowind.esm to, and reads it from, ESTXT format (see below for what this means). The TES construction set seems to load the merged plugin files OK. Several people have reported that the plugin produced by esper works in-game.
Esper can also read and write files in a format called "ESTXT". This is a plain-text file containing lisp expressions, one for each record, slightly simplified to be more readable. If you specify an output file whose name ends in ".estxt", output will be in this format rather than binary. Similarly if any of the input filenames end in .estxt, they will be treated as these text files.
Example of an ESTXT record (currently does not expunge null characters from strings):
(CREA 486 (CREA NAME 23 (STRING-VALUE "winged twilight_summon")) (CREA MODL 21 (STRING-VALUE "r\\WingedTwilight.NIF")) (CREA FNAM 16 (STRING-VALUE "Winged Twilight")) (CREA NPDT 96 (CREATURE-TYPE AEDRA) (CREATURE-LEVEL 15) (CREATURE-STRENGTH 50) (CREATURE-INTELLIGENCE 50) (CREATURE-WILLPOWER 100) (CREATURE-AGILITY 50) (CREATURE-SPEED 8) (CREATURE-ENDURANCE 50) (CREATURE-PERSONALITY 50) (CREATURE-LUCK 50) (CREATURE-HEALTH 220) (CREATURE-SPELL-POINTS 210) (CREATURE-FATIGUE 800) (CREATURE-SOUL 300) (CREATURE-COMBAT 70) (CREATURE-MAGIC 90) (CREATURE-STEALTH 20) (CREATURE-ATTACKMIN1 15) (CREATURE-ATTACKMAX1 45) (CREATURE-ATTACKMIN2 15) (CREATURE-ATTACKMAX2 45) (CREATURE-ATTACKMIN3 15) (CREATURE-ATTACKMAX3 45) (CREATURE-GOLD 0)) (CREA FLAG 4 (CREATURE-FLAGS (:NONE? :WALKS))) (CREA NPCO 36 (ITEM-COUNT 3) (ITEM-NAME "random_void_salts")) (CREA NPCS 32 (STRING-VALUE "resist fire_50")) (CREA NPCS 32 (STRING-VALUE "resist frost_50")) (CREA NPCS 32 (STRING-VALUE "resist poison_75")) (CREA NPCS 32 (STRING-VALUE "resist shock_50")) (CREA NPCS 32 (STRING-VALUE "reflect_20")) (CREA AIDT 12 (AI-HELLO 0) (AI-UNKNOWN1 0) (AI-FIGHT 50) (AI-FLEE 20) (AI-ALARM 0) (AI-UNKNOWN2 0) (AI-UNKNOWN3 0) (AI-UNKNOWN4 0) (AI-FLAGS NIL)) (CREA AI_W 14 (AI-DISTANCE 1000) (AI-DURATION 5) (AI-TIME-OF-DAY 0) (AI-IDLE (0 50 50 0 0 0 0 0 0 1))))
Usage:
ESPER can be used from any directory, but it's easiest to put it in your "Data Files" directory; then you won't need to give paths to esp/esm files.
Basic usage:
esper [OPTIONS] [FILE...]
Options:
--help, -h
Show help
--output
Save output to
--merge-plugins, -p
Mode = merge plugins
--merge-records, -r
Mode = merge records from plugins
--list-active, -l
Mode = list active plugins and masters in Morrowind.ini
--check-resources
Scan plugins for names of texture/icon/sound/model files, then look in appropriate directories and active BSA files. Report if the files cannot be found.
--find-conflicts
Reports names of all records which are modified by more than one plugin (along with names of plugins).
--mwdir
Morrowind.ini directory is
--all, -a
Use *ALL* active plugins when merging (!)
--debug
Usually esper just exits if an error occurs. Using --debug makes esper enter the lisp debugger instead.
--batchfile
Where
Note: you must use -B or --batchfile; -b does not work.
Notes
"PGRD" records are not parsed at all, simply treated as binary "blobs".
Record types that are currently treated as mergeable:
"CLAS" "RACE" "FACT" "SOUN" "SKIL" "MGEF" "REGN" "BSGN" "STAT" "DOOR" "MISC" "WEAP" "CONT" "SPEL" "CREA" "BODY" "LIGH" "ENCH" "NPC_" "ARMO" "CLOT" "REPA" "ACTI" "APPA" "LOCK" "PROB" "INGR" "BOOK" "ALCH"
Note that esper does not currently merge levelled lists.
Examples of usage:
See usage information with:
esper --help
List all active plugins in order of loading with:
esper -l
Merge plugin1 and plugin2.esp into `output.esp': (this works like the TES
construction set facility of the same name)
esper -p plugin1.esp plugin2.esp
The wildcard '*' can be used, but if you do this you must surround the 'wildcard expression' in quotes:
esper -p "LGNPC_*.esp"
Merge RECORDS (objects, NPCS, etc) from plugin1 and plugin2 into merged-objects.esp:
esper -r plugin1.esp plugin2.esp -o merged-objects.esp
Merge records from all plugins into an ESTXT file:
esper -a -r -o bigmerge.estxt
Please test Esper out! It has been tested by at least half a dozen people and the resulting plugin seems to work for most people. Still, the occasional bug does pop up. The first thing to try if a particular Morrowind plugin causes problems is to try re-downloading the plugin -- several people have reported that this has solved their problem. It seems that some other Morrowind utilities can sometimes corrupt plugins (Enchanted Editor has been involved more than once).