Excellent.
I have one small request that may not be feasible. I've noticed that when you uninstall a mod, it restores the original files from the backup as last modified with the current date. Would it be possible to restore the original file last-modified dates? It is just confusing, since it seems to suggest those files were actually modified, when in reality, the previous versions should've been restored. Also, in the course of development or editing, you can end up with a lot of cruft in the override (e.g. pvrz decompression) that we should be able to clear out in one fell sweep without worrying about deleting files we actually need.
Also, CamDawg wanted to make sure you include the latest ALTER/CLONE/DELETE functions in the next build.
Finally, I have some fixes to the fj_functions as per diffs below. These are needed largely to support accurate platform identification and valid structure ordering (in the case of fj_are_structure).
In src\tppe.ml:
422a423
> let ee = f "monkfist.2da" in
In src\tph\include\fj_cre_validity.tpa:
82c82
< PATCH_IF (fv = 0) AND ENGINE_IS ~soa tob bgee bg2ee~ && do_eff BEGIN
---
> PATCH_IF (fv = 0) AND ENGINE_IS ~soa tob ee~ && do_eff BEGIN
85c85
< PATCH_IF (fv != 0) AND NOT ENGINE_IS ~soa tob bgee bg2ee~ && do_eff BEGIN
---
> PATCH_IF (fv != 0) AND NOT ENGINE_IS ~soa tob ee~ && do_eff BEGIN
In src\tph\include\fj_are_struct.tpa:
8c8
< is_bg2 = ENGINE_IS ~soa tob bgee bg2ee~
---
> is_bg2 = ENGINE_IS ~soa tob ee~
51,54c51,54
< fj_box_left = 0
< fj_box_top = 0
< fj_box_right = 0
< fj_box_bottom = 0
---
> fj_box_left = ` 0
> fj_box_top = ` 0
> fj_box_right = ` 0
> fj_box_bottom = ` 0
168c168
< // variables
---
> // common
266a267
> TEXT_SPRINT $struct(0xa0 0x9c 0x04 0x000) bitmask
271d271
< TEXT_SPRINT $struct(0xa0 0x9c 0x04 0x000) bitmask
317c317
< 0x54 0x5c 0x60 0x68 0x70 0x78 0x7c 0x84 0x88 0xa0 0xa8 0xb0 0xb8
---
> 0x54 0x5c 0x60 0x68 0x70 0x78 0x7c 0x84 0x88 0xa0 0xa8 0xb0 0xb8 0xbc 0xc0
525a526,529
> PATCH_IF fj_debug BEGIN PATCH_PRINT ~Writing key %key_0% value %fj_position%~ END
> PATCH_IF key_0 = 0xc4 BEGIN
> WRITE_LONG key+0 0
> END ELSE BEGIN
526a531
> END
723a729,740
> // bitmask
> PATCH_IF( fj_structure_type == 0xa0 )BEGIN
> PATCH_IF( FILE_EXISTS ~%fj_bitmask%~ )BEGIN
> SET key1 = BUFFER_LENGTH
> APPEND_FILE_EVALUATE ~%fj_bitmask%~
> WRITE_LONG 0x9c BUFFER_LENGTH - key1
> END ELSE BEGIN
> WRITE_LONG 0x9c 0x00
> END
> SET fj_position += LONG_AT 0x9c
> END ELSE
>
788,799d804
< END ELSE
<
< // bitmask
< PATCH_IF( fj_structure_type == 0xa0 )BEGIN
< PATCH_IF( FILE_EXISTS ~%fj_bitmask%~ )BEGIN
< SET key1 = BUFFER_LENGTH
< APPEND_FILE_EVALUATE ~%fj_bitmask%~
< WRITE_LONG 0x9c BUFFER_LENGTH - key1
< END ELSE BEGIN
< WRITE_LONG 0x9c 0x00
< END
< SET fj_position += LONG_AT 0x9c