Author Topic: [FF7][WIP] Barrett's Hideout - 7th Heaven Mod Creation Tutorial  (Read 3855 times)


  • No life
  • *
  • Posts: 1992
  • Karma: 118
  • Prince of Model Editing
    • View Profile
Place holder for a 7th Heaven mod creation tutorial.

Do not post here!

I will try to capture up every function of 7th Heaven (from now on 7H) I'm aware of. If there is something I have missed please PM me instead of posting here. At the moment I plan to explain the functions of 7H and the way to create a working catalog.

7th Heaven Changelog:
Code: [Select]

-Fixes crashes with some vgmstream files

Not sure why the crash only with the mod from the catalog,
perhaps the .oggs in it are corrupt in some way ...
but off course it should not cause the game to crash. Should be fixed now.

Only one change: Accessing files in a .iro archive from FF7 is now a bit quicker.
The speed up seems especially large for loading .PNG files for Aali's driver; I did not see loading models get quicker,
but the delay to go into the world map when using the hi res world map textures is about twice as quick on my PC now.

-Fix progress bars on GDrive downloads
-Fix Mega downloads sometimes (often?) not working

-Fix crash in patch tool, hopefully
-Fix crash on high-us.lgp file
-Fix crash when importing mod without required fields in mod.xml

-Can list multiple programs for 'Also Launch' in config
-Fix crash when corrupt .iro file is in 7H folder - should show a proper error message
-Add some more command line parameters

There are some command line parameters you can use with 7H:

/PROFILE:<profilename>  - loads a particular profile
/LAUNCH - launches FF7 as soon as 7H is loaded
/QUIT - quits 7H

They happen in the order you list them so:
7thHeaven.exe /LAUNCH /QUIT
will launch the game and then exit straight away.
7thHeaven.exe /PROFILE:AllMods /LAUNCH
will load the AllMods profile, launch the game, but not quit 7H.

-Fix update check sometimes crashing
-Allow multiple patch links in mod
-Add PartyLeader variable (needs testing)

There is a PartyLeader variable in the .var file now.
The values it can be set to should match the character numbers in the save files -

-Fix: Mega downloads not working on some computers
-Fix: Mod generator was broken in 1.38
-New feature: Catalogs can specify mirrors/multiple download links for a mod.
 7H will try each download link so if one link fails to download it will try the next link instead.

To specify many links for a mod, you just need to add more <Link> tags inside the <LatestVersion> section of your mod details.
7H tries the links in the order they appear in the file so whichever link you put first is the one that will get used if possible.

-Improved logging and error messages
-Mega link generator tool

The mod generator tool on the new version, there is a tab to generate Mega links for you.
Paste the Mega folder ID into the text box, click "Load", and it will generate a link for every file in that Mega shared folder.
(To get the folder ID, right click the folder in Mega, ask for a link, and the folder ID is the part of the link beginning !#F )

-Small speed improvements in IRO archives
-Log file operations

...start the program, wait 30 seconds, and then send me the contents of your %APPDATA%\7thWorkshop\applog.txt file,
so I can see why autoupdate doesn't work for you...

-Minor GUI fixes
-Improve decompression speed for compressed IRO files
-Improve FF7 startup speed when loading mods with chunked files
-Add advanced patch create - create a patch without needing to create a 'full' IRO of the new version

For the last option you really need to be careful to set things up properly. If you create the patch by comparing two IRO file (old version and new version) that at least it is easy to test that both IROs work, and the patch (should!) automatically take account of all the differences between the versions.
For this version you have to make sure you put all the right files in all the right places.

To update your mod to a new version you need to add two new files (vgmstream\yufi.ogg, vgmstream\yufi2.ogg),
change two existing files (mod.xml and battle.lgp\rvaa) and delete one file from the IRO (battle.lgp\rvda)
 - perhaps you have realized you didn't need to change that file at all!

So set up a folder on your PC like this:

Point the new advanced patch create screen at the C:\temp folder.
Any files in here (so, mod.xml, battle.lgp\rvaa, ...) get put into the patch to add/replace files to the original IRO.
And in the 'deleted files' part of the patch create screen, type in 'battle.lgp\rvda' - so when the patch is applied,
it will delete that file from the original IRO.

-Minor GUI fixes
-Close IRO files quicker (easier to overwrite when testing)
-Settings checker: When you start 7H it will check if your settings make sense
 (e.g. if all the folders you chose actually exist) and if not, tell you and open the settings window to correct them.
-Download & patch option for mods

So the last change means that if you upload a new version of a mod, as well as adding a <Patch> entry in the catalog
so people who already have the mod can update using a small patch file,
you can also specify the 'main' download (for people who don't have it installed) as a combination of a normal download
plus one or more patch files.
Basically this is to make catalog/mod authors jobs easier.
If you make a small change to a 1GB mod, then you don't have to upload the new 1GB mod file.

Example, your catalog entry looks like this to start with:

Code: [Select]
      <Name>Test music/patching</Name>
      <Description>Testing music in a IRO archive</Description>

Then you release two updates which both fix a few things. The catalog entry can now look like this:

Code: [Select]
      <Name>Test music/patching</Name>
      <Description>Testing music in a IRO archive</Description>

      <Patch VerFrom="1.0" VerTo="1.1">iros://Url/http$</Patch>
      <Patch VerFrom="1.1" VerTo="1.2">iros://Url/http$</Patch>

So you have the <Patch> entries just like before which mean people who already have v1.0
can download the patch to update to v1.2. But instead of uploading a whole new v1.2 file for people
who don't have the mod installed already, you leave the download link still pointing to the v1.0 file
and add two <ApplyPatch> entries. Then if somebody new decides to download the mod,
7H will download the v1.0 file and the two patches and then apply the patches - so they will end up with v1.2 installed.

This means mod download/install takes a little bit longer, but with the large mods EQ2Alyza is uploading,
I can see it would be very slow to upload a complete new download for every single small change!

-Cancel option on downloads
-Fix/improve subscription link registration failing if not running as admin
-Show size of downloads - if catalog lists them

To specify the size of a download in a catalog add a <DownloadSize> entry to the mod version (latest version)
entry listing the size of the download in KB.


Code: [Select]
        <ReleaseNotes />

That mod will show in the catalog list with an estimated download size of 5000KB (will display as 4.9MB).

-Faster IRO creation (multi-threaded)
-Improve handling failed / incomplete downloads

-Fix reading certain compressed files from IRO archive
-Fix pictures for bool options not always loading properly
-Fix compressed file cache not working

-Fix auto update, again

-Fix: Small GDrive files sometimes didn't download
-Fix: IROP patches were not deleted after installing

-Fix: Catalog refresh didn't update UI straight away
-New: Compression support for IRO archives
-New: Patch support for IRO archives


1) Compression. When you create a IRO archive you can choose whether to compress the files in it.
This makes the IRO smaller (faster download or install, smaller disk space)
but COULD mean it slows things down when running the game - because it will have to wait for a file to be decompressed,
when it tries to access the file...

The options when creating a IRO are:

Never: Do not compress files at all.
Always: Always compress files. Probably not a good idea.
By Extension: Do not compress PNG, JPG, MP3, OGG files. Compress all other files.
Probably a good idea, there is no point trying to compress a file which is already quite well compressed.
By Content: TRY to compress every file, but if it saves < 10% size, then do not bother.
Will take longer to create the archive but should only compress files, which will actually benefit.

2) Patch support.

Imagine you have a big IRO file - music, movies, lots of PNGs, could be anything - and it is 1GB to download.
Well, OK, it has to be that big if the files are high quality/long.
Then you find a bug and want to release a new version - maybe a few of the PNGs need to be updated with a transparent fix.
It is not very good for everybody to download the new 1GB mod again, when you have only changed 5MB of PNG files...

So, what you can do now is:

-When you upload the first version of the mod, you upload the large 1GB IRO file
-Then you make a new version. You still probably upload a new 1GB IRO file with the latest version - for people
 who are downloading the mod for the first time - but 7H will also let you create a patch file.
 This is a smaller file that contains only the changes between the first IRO and the newer IRO,
 so if you have only updated 5MB of files, it will only be ~5MB in size.
-If you include a link to this patch file in your catalog,
 7H will automatically work out if the user has a version which can be patched,
 and if yes, it will download and apply the patch instead of downloading the whole thing again.

To make a patch file, there is a new tab on the IRO screen in 7H.
You tell it where the original IRO is, where the new version IRO is, and where to save the patch.
You also choose whether to compress files, same as creating a new IRO.

The catalog should look like this:

Code: [Select]
<?xml version="1.0"?>
  <UpdatedOn>2013-08-08 13:34</UpdatedOn>
      <Name>Test music/patching</Name>
      <Description>Testing music in a IRO archive</Description>
      <Patch VerFrom="1.0" VerTo="2.0">iros://Url/http$</Patch>

The "Patch" line says which version(s) the patch can update and what version it updates you to,
and has the link for downloading the patch file 7H has created.

-Fix Conditional folders using new ActiveWhen tags
-Add auto update feature

-Fix uninstalls, again, probably
-Add support for ActiveWhen to have multiple conditions

Now instead of ActiveWhen being specified as an attribute you can specify an ActiveWhen child node containing various conditions:
And, Or, Not, and Option (which actually checks an option)

Should fix some bugs - I think. The uninstall crash I hope is fixed, I got it to happen once,
but then not again ... new version may have solved this.

-Fix: mods not being added in compact mode even when compact mode ticked
-Fix: if 7H crashes after download/installing a mod, it did not remember that the mod was installed

-Fix .bin files not loading from archive
-Speed loading up a bit
-Fix error changing priority of mods in some situations

-Fix: controllers not working for some reason
-Update: OpenGL config XML with Kaldarasha's changes

-Fix: .iro files >4GB will hopefully work properly
-New feature: 7H can apply Hext patches
-New feature: OpenGL driver config editor

-Replacing vgmstream files from inside a .iro should work now
-Set a profile to use a different ff7_opengl configuration (see above. oops!)
-Debug mode - right click on Launch button to run in debug.
 Will log exactly which files the wrapper is looking for - this should help figure out why a mod isn't working properly, perhaps...

-Support replacing scene.bin (+ any other .bin files should work too now)
-Fix not able to edit subscriptions properly in settings screen
-Fix program crashing if invalid mod.xml or subscription file is loaded
-Allow adding extra folders to monitor inside FF7 folder, default "music"
 (i.e. by default will monitor FF7\music but you can add other folders to monitor as well)

-new menu option "Chunk tool"
 If you choose this, you can select a FLEVEL.LGP file, an output folder,
 and which chunks to extract (e.g. 1 for dialogue, 7 for encounter).
 So make your changes directly to FLEVEL.LGP and then extract the sections that need to be distributed,
 and package them into a mod.

-Fixed crash on certain locales
-Fix version number not being set against manually imported mod
-Right click on Launch button to run game with variable dump option active
-Add MetaVersion tag to catalog mod info

The MetaVersion tag can be set against a mod in a catalog file
so you can mark a mod as updated without changing the version number of the download.
I realized changing the version number of the download wouldn't really be accurate
if you were just updating the download URLs etc.
It's optional so doesn't need to be set, just available if necessary.

-Add CounterRnd variable to allow setting counter to a random number
-Fix crash when download from Mega URL fails
-Fix crash calculating paths for magic.lgp folders

As expected the code for magic.lgp was completely broken ...
not sure why nobody got error messages, because I did, but anyway - it should now be fixed.
Certainly the game runs now if I try to override magic.lgp
- but please test it to make sure all your mod files actually get applied.

-Add 'compact' display option to profile. Might add this for other tabs later...
-Fix error updating thumbnails against catalog entries
-Fix config options not picking up default values correctly some times

-Fixed iro size limit ... again
-Fixed auto-import option

I really hope iro files >2GB work this time...
The auto import wasn't working
(and even was it was working, it didn't bring in details like author/preview picture etc.)
That should be fixed now - if you just drop a folder (or a iro file) into your library,
next time you start 7thHeaven, it will automatically add them to the list.
You should remember that if you do use the 'uninstall'
right click option that DOES delete the mod from the disk, though.

-Fixes crash loading certain iro files
-Fixes crash loading large iro files

The problem with the unshaded models iro was that now I fixed the case sensitivity issue,
it's actually using the overrides for chocobo.lgp -
it triggered another bug to do with certain file sizes.
The bug was in the older versions, but it never happened
because it never used the chocobo.lgp files anyway...
Large iro files should be fine now.
I would recreate any iro files >2GB you've made with older versions to be sure
they'll work properly. Smaller iro files should be fine.
(Although there is still not much point packing movies into iro files.
The speed gains mostly come when you are overriding LGP files.
Standalone files like movies, kernel bins, etc. aren't so slow.
You still can do it, off course, if you want to pack it into a single file
for easier distribution.)

-Improve decompression speed for downloaded mods
-Add 'readme' option for mods installed in library
-Add movie path to settings & capture accesses in wrapper
-Fix case sensitivity when overriding LGPs
To put a readme file in a mod,
just include a file called 'readme.txt' in the top level of the mod folder
(i.e. same place as mod.xml). Should still work when packed into a iro file.

Adds pack/unpack iro functions back

-Import author/image from existing mods
-Fix download error with two mods sharing same image
-Fix .iro import (again)
-Update tags list after downloading new catalog
-Add select all option to tag list
-Fix crash on load if library folder missing
-Add command line parameters
-Add crash dialog so errors can be reported...

-Import mod copies instead of moving files
-Added .var file back in and load it into mods that use runtime vars correctly

I have remembered, if you have the 'auto import mods' option ticked,
then just putting a mod folder into the 7thHeaven is enough to make it show up,
so you don't need to import manually then.
But an import option is still needed to do it manually.

- First release of '7th Heaven'before it was 7th Wrapper.
« Last Edit: 2015-12-23 12:05:54 by EQ2Alyza »


  • No life
  • *
  • Posts: 1992
  • Karma: 118
  • Prince of Model Editing
    • View Profile
Re: [FF7][WIP] Barrett's Hideout
« Reply #1 on: 2015-03-05 05:14:26 »
Overview Chunks of the flevel.lgp:

1 - Field Script & Dialog
2 - Camera Matrix
3 - Model Loader
4 - Palette
5 - Walkmesh
6 - TileMap (Unused)
7 - Encounter
8 - Triggers
9 - Background

Read priority of the folder structure:
 <ModFolder Folder="" />
 <ModFolder Folder="" >  </ModFolder Folder>   - Used to activate/deactivate mods by settings in the mod configuration.
                    Sometimes it's also useful to activate a mod folder permanently with this,
                    which you want independent from the main **.lgp folder for an easier maintenance.

 <Conditional Folder="" > </Conditional> - Used to activate/deactivate mods by certain game conditions (and can also set through the mod configuration)

Priority - The higher mod folders has priority over the lower mod folders.

      <ModFolder Folder="A" />
      <ModFolder Folder="B" />
      The folder A will be read first and then the folder B will be read. Every file in B, which have the same name as the files in A, won't be read.

Folder activation commands:
<*Folder type* ActiveWhen="ID = Value"/>   - Activates/Deactivates mods by the ID's value.

      <ModFolder Folder="A" ActiveWhen="Example = 1"/>
      <ModFolder Folder="B" />
      If the ID 'Example' gets the value '1' then folder A will be active and will be read.
      If 'Example' has another value then '1' then A won't be active and every file in B will be active.

The advanced Command
<ActiveWhen> </ActiveWhen>   - can activate a folder through multiple IDs.

<And> </And>      - A set of ID values must be true
<Or> </Or>      - at last one of the IDs must be true
<Not> </Not>      - Define a exclusion. Good if the folder should be ever active except if an ID has a certain value.
<Option>ID = Value</Option>   - define the ID and its value to activate.

      <ModFolder Folder="A" ActiveWhen="Example = 1"/>
      <ModFolder Folder="B" >
              <Option>Example = 1</Option>
              <Option>Example2 = 1</Option>
      </ModFolder Folder>
      Now is the Folder B set against a setting condition. It defines when the folder should not be active.
      If 'Example' has the value 1 B will still be active, but if 'Example2' has also the value 1 the folder becomes inactive.
      <Not> checks only one condition, but with mixing the commands you can expand the functions here.

<RuntimeVar Var="" Values="" /> - This defines a game condition for the conditional folder.

      <Conditional Folder="A" ActiveWhen="Example = 1" >
         <RuntimeVar Var="PPV" Values="300..400" />
      <ModFolder Folder="B" >
              <Option>Example = 1</Option>
              <Option>Example2 = 1</Option>
      Now is folder A changed to a conditional folder, which only will be activated when Example is 1
      and the PPV (Player Progress Value or Game Moment) is equal or between 300 and 400.

Special Case - the random function
Haven't used it yet. I need to test it out my self to understand it entirely
« Last Edit: 2015-03-05 07:50:34 by Kaldarasha »


  • No life
  • *
  • Posts: 1992
  • Karma: 118
  • Prince of Model Editing
    • View Profile
Re: [FF7][WIP] Barrett's Hideout
« Reply #2 on: 2015-03-05 05:16:59 »