Hypothesis: Idx/WarHammer.idx points objects into bitmap data in Anim/WarHammer.ani We can use WH40K_TD.exe and investigate reads of .idx followed by reads of .ani to test this. WH40K_TD.exe opens files in this order: 1. Data/USEng.dta 1. WH40K_TD.exe (?) 1. Cursor/Cursors.cur 1. pread64(fd, 23, 0) = 23 1. _llseek(fd, 0, [0], SEEK_CUR) = 0 1. _llseek(fd, 0, [0], SEEK_CUR) = 0 1. _llseek(fd, 40666, [40666], SEEK_SET) = 0 1. _llseek(fd, 0, [0], SEEK_SET) = 0 1. close(fd) = 0 1. read(fd, "\x26\x00\x00\x00\x20\x00\x00\x00\x30\x01\x00\x00\x50\x01\x00\x00\x8a\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 32) = 32 1. (...) 1. _llseek(15, 39868, [39868], SEEK_SET) = 0 1. read(15, "...", 798) = 798 1. (some statting of Idx/WarHammer.idx, no reading that I saw) 1. Anim/WarHammer.ani 1. read(15, "...", 32) = 32 1. (some clones of child procs, I didn't follow them) 1. Sounds/wh40k.ds 1. pread64(31, "...", 23, 0) = 23 1. read(31, "...", 417792) = 417792 1. read(31, "...", 4096) = 4096 1. Data/Sounds.dat 1. pread64(34, "#**********************", 23, 0) = 23 1. ... 1. Pic/wh40k.pcx 1. read(34, "...", 168509) = 168509 1. Sets/* 1. (lots of statting these) 1. Data/Randchar.dat 1. pread64(34, "#**********************", 23, 0) = 23 1. read(34, "#***************************************************************"..., 4096) = 4096 1. ... 1. Data/WeapDef.dat 1. pread64(35, "#**********************", 23, 0) = 23 1. read(35, "#***************************************************************"..., 4096) = 4096 1. ... 1. Data/SpellDef.dat 1. pread64(35, "#**********************", 23, 0) = 23 1. read(35, "#***************************************************************"..., 4096) = 4096 1. ... 1. Data/AniObDef.dat 1. pread64(35, "# ******** ANIMATED OBJ", 23, 0) = 23 1. read(35, "# ******** ANIMATED OBJECT DEFINITIONS **************\r\n#\t\t0 : **"..., 4096) = 4096 1. ... 1. Data/VehicDef.dat 1. pread64(35, "# ******** VEHICLE DEFI", 23, 0) = 23 1. read(35, "# ******** VEHICLE DEFINITIONS **************\r\n#\t\t0 : *** VEHICL"..., 4096) = 4096 1. ... 1. Data/StdWeap.dat 1. pread64(35, "# ******** SQUAD STANDA", 23, 0) = 23 1. read(35, "# ******** SQUAD STANDARD WEAPONS **************\r\n#\t\t0 : *** SQU"..., 4096) = 4096 1. ... 1. Data/Ultnames.dat 1. Data/Chanames.dat 1. Data/keymap.dta 1. Filters/wh40k.flt 1. _llseek(35, 0, [0], SEEK_SET) = 0 1. read(35, "\x01\x00\x00\x00", 4) = 4 1. _llseek(35, 4, [4], SEEK_SET) = 0 1. read(35, "...", 72) = 72 1. _llseek(35, 1444, [1444], SEEK_SET) = 0 1. read(35, "...", 327680) = 327680 1. Misc/occlusio.lis 1. pread64(35, "62 # Number of Absol", 23, 0) = 23 1. read(35, "62 # Number of Absolute Deltas.\r\n # These Deltas are off"..., 4096) = 982 1. read(35, "", 3114) = 0 1. Data/GDestroy.dat 1. (stat Obj/destroy.obj) 1. Data/minimap.dat 1. Misc/occlusio.list 1. Obj/specials.obj 1. Obj/Man_Shadow.obj 1. Sets/map01.set 1. Data/Defs.dat 1. [`Assign/jungtil.asn`](docs/formats/obj.md#assign) 1. [`Obj/jungtil.obj`](docs/formats/obj.md) 1. (more assign + obj pairs) 1. Data/Cycle.cyc Adding a Librarian to the mission builder performs these seeks and reads: _llseek(15, 509440, [509440], SEEK_SET) = 0 read(15, "\fM\266\th\16\0\0", 8) = 8 _llseek(15, 509448, [509448], SEEK_SET) = 0 read(15, "t[\266\t\376\16\0\0", 8) = 8 _llseek(15, 509456, [509456], SEEK_SET) = 0 read(15, "rj\266\tg\17\0\0", 8) = 8 _llseek(15, 509464, [509464], SEEK_SET) = 0 read(15, "\331y\266\t\251\17\0\0", 8) = 8 _llseek(15, 509472, [509472], SEEK_SET) = 0 read(15, "\202\211\266\t\273\17\0\0", 8) = 8 _llseek(15, 509480, [509480], SEEK_SET) = 0 read(15, "=\231\266\t\10\20\0\0", 8) = 8 _llseek(15, 509488, [509488], SEEK_SET) = 0 read(15, "E\251\266\t\321\17\0\0", 8) = 8 _llseek(15, 509496, [509496], SEEK_SET) = 0 read(15, "\26\271\266\t\1\17\0\0", 8) = 8 _llseek(15, 509504, [509504], SEEK_SET) = 0 read(15, "\27\310\266\t\304\16\0\0", 8) = 8 _llseek(15, 509512, [509512], SEEK_SET) = 0 read(15, "\333\326\266\t\343\16\0\0", 8) = 8 _llseek(15, 509520, [509520], SEEK_SET) = 0 read(15, "\276\345\266\t\f\17\0\0", 8) = 8 _llseek(15, 509528, [509528], SEEK_SET) = 0 read(15, "\312\364\266\tA\17\0\0", 8) = 8 _llseek(15, 509536, [509536], SEEK_SET) = 0 read(15, "\v\4\267\t\246\17\0\0", 8) = 8 _llseek(15, 509440, [509440], SEEK_SET) = 0 read(15, "\fM\266\th\16\0\0", 8) = 8 _llseek(15, 164448540, [164448540], SEEK_SET) = 0 read(15, "\367\0\n\0015\0T\0\0\0\0\0P\16\0\0\324q;\1\0\0\0\0\200\23\207**+*+"..., 3688) = 3688 _llseek(15, 509448, [509448], SEEK_SET) = 0 read(15, "t[\266\t\376\16\0\0", 8) = 8 _llseek(15, 164452228, [164452228], SEEK_SET) = 0 read(15, "\365\0\10\0017\0W\0\0\0\0\0\346\16\0\0\324q;\1\0\0\0\0\200\25\3*\212+*,"..., 3838) = 3838 _llseek(15, 509456, [509456], SEEK_SET) = 0 read(15, "rj\266\tg\17\0\0", 8) = 8 _llseek(15, 164456066, [164456066], SEEK_SET) = 0 read(15, "\364\0\10\0019\0Z\0\0\0\0\0O\17\0\0\324q;\1\0\0\0\0\200\30\201*\5+\200\33"..., 3943) = 3943 _llseek(15, 509464, [509464], SEEK_SET) = 0 read(15, "\331y\266\t\251\17\0\0", 8) = 8 _llseek(15, 164460009, [164460009], SEEK_SET) = 0 read(15, "\356\0\7\1B\0[\0\0\0\0\0\221\17\0\0\324q;\1\0\0\0\0\200\"\201*\200\37\0\200"..., 4009) = 4009 _llseek(15, 509472, [509472], SEEK_SET) = 0 read(15, "\202\211\266\t\273\17\0\0", 8) = 8 _llseek(15, 164464018, [164464018], SEEK_SET) = 0 read(15, "\356\0\n\1C\0\\\0\0\0\0\0\243\17\0\0\324q;\1\0\0\0\0\200#\3)\3+\200\32"..., 4027) = 4027 _llseek(15, 509480, [509480], SEEK_SET) = 0 read(15, "=\231\266\t\10\20\0\0", 8) = 8 _llseek(15, 164468045, [164468045], SEEK_SET) = 0 read(15, "\354\0\t\1C\0Z\0\0\0\0\0\360\17\0\0\324q;\1\0\0\0\0\200$\201*\200\36\0\200"..., 4104) = 4104 _llseek(15, 509488, [509488], SEEK_SET) = 0 read(15, "E\251\266\t\321\17\0\0", 8) = 8 _llseek(15, 164472149, [164472149], SEEK_SET) = 0 read(15, "\356\0\t\1?\0V\0\0\0\0\0\271\17\0\0\324q;\1\0\0\0\0\200\35\212&&H)*"..., 4049) = 4049 _llseek(15, 509496, [509496], SEEK_SET) = 0 read(15, "\26\271\266\t\1\17\0\0", 8) = 8 _llseek(15, 164476198, [164476198], SEEK_SET) = 0 read(15, "\366\0\10\0015\0[\0\0\0\0\0\351\16\0\0\324q;\1\0\0\0\0\200\20\201*\4+\206*"..., 3841) = 3841 _llseek(15, 509504, [509504], SEEK_SET) = 0 read(15, "\27\310\266\t\304\16\0\0", 8) = 8 _llseek(15, 164480039, [164480039], SEEK_SET) = 0 read(15, "\367\0\7\0013\0[\0\0\0\0\0\254\16\0\0\324q;\1\0\0\0\0\200\33\210+,+,,"..., 3780) = 3780 _llseek(15, 509512, [509512], SEEK_SET) = 0 read(15, "\333\326\266\t\343\16\0\0", 8) = 8 _llseek(15, 164483819, [164483819], SEEK_SET) = 0 read(15, "\370\0\7\1A\0_\0\0\0\0\0\313\16\0\0\324q;\1\0\0\0\0\200\34\203,,*\200\""..., 3811) = 3811 _llseek(15, 509520, [509520], SEEK_SET) = 0 read(15, "\276\345\266\t\f\17\0\0", 8) = 8 _llseek(15, 164487630, [164487630], SEEK_SET) = 0 read(15, "\370\0\7\1H\0`\0\0\0\0\0\364\16\0\0\324q;\1\0\0\0\0\200\35\201,\200*\0\200"..., 3852) = 3852 _llseek(15, 509528, [509528], SEEK_SET) = 0 read(15, "\312\364\266\tA\17\0\0", 8) = 8 _llseek(15, 164491482, [164491482], SEEK_SET) = 0 read(15, "\373\0\10\1;\0Z\0\0\0\0\0)\17\0\0\324q;\1\0\0\0\0\200\36\202+,\200\33\0"..., 3905) = 3905 _llseek(15, 509536, [509536], SEEK_SET) = 0 read(15, "\v\4\267\t\246\17\0\0", 8) = 8 _llseek(15, 164495387, [164495387], SEEK_SET) = 0 read(15, "\366\0\n\0018\0Y\0\0\0\0\0\216\17\0\0\324q;\1\0\0\0\0\200\32\t+\205*\4,"..., 4006) = 4006